@weppy/ralph 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -0
- package/dist/cli.js +2248 -0
- package/dist/index.js +28 -0
- package/package.json +43 -0
- package/specs/00-/352/260/234/354/232/224.md +40 -0
- package/specs/10-/354/225/204/355/202/244/355/205/215/354/262/230.md +89 -0
- package/specs/20-/354/203/201/355/203/234/354/231/200-/354/213/244/355/226/211.md +161 -0
- package/specs/30-/354/235/270/355/204/260/355/216/230/354/235/264/354/212/244.md +137 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// src/shared/constants/index.ts
|
|
2
|
+
var packageName = "@weppy/ralph";
|
|
3
|
+
var version = "0.1.0";
|
|
4
|
+
|
|
5
|
+
// src/cli/catalog/index.ts
|
|
6
|
+
var commandCatalog = [
|
|
7
|
+
"start",
|
|
8
|
+
"status",
|
|
9
|
+
"resume",
|
|
10
|
+
"cancel",
|
|
11
|
+
"result",
|
|
12
|
+
"mcp"
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
// src/mcp/tools/index.ts
|
|
16
|
+
var mcpToolCatalog = [
|
|
17
|
+
"start_job",
|
|
18
|
+
"get_status",
|
|
19
|
+
"get_result",
|
|
20
|
+
"resume_job",
|
|
21
|
+
"cancel_job"
|
|
22
|
+
];
|
|
23
|
+
export {
|
|
24
|
+
commandCatalog,
|
|
25
|
+
mcpToolCatalog,
|
|
26
|
+
packageName,
|
|
27
|
+
version
|
|
28
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@weppy/ralph",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Independent Ralph orchestrator with CLI and MCP entrypoints.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"bin": {
|
|
9
|
+
"ralph": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"specs"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "node build.mjs",
|
|
18
|
+
"check": "tsc --noEmit",
|
|
19
|
+
"test": "npm run build && node --test test/**/*.test.mjs",
|
|
20
|
+
"prepublishOnly": "npm run check && npm run build"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/hope1026/aiagent-plugins",
|
|
25
|
+
"directory": "ralph-package"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20.0.0"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"agent",
|
|
32
|
+
"orchestrator",
|
|
33
|
+
"cli",
|
|
34
|
+
"mcp",
|
|
35
|
+
"codex",
|
|
36
|
+
"claude"
|
|
37
|
+
],
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^24.0.0",
|
|
40
|
+
"esbuild": "^0.25.0",
|
|
41
|
+
"typescript": "^5.8.0"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# 개요
|
|
2
|
+
|
|
3
|
+
이 문서는 `@weppy/ralph`의 목적, 범위, 용어를 정의한다. 구조, 상태 모델, 실행 규칙, 인터페이스 계약의 상세 내용은 다른 문서가 단일 출처로 소유한다.
|
|
4
|
+
|
|
5
|
+
## 목적
|
|
6
|
+
|
|
7
|
+
`@weppy/ralph`는 특정 프로젝트 구조나 특정 AI 에이전트 대화 세션에 종속되지 않는 독립 실행 오케스트레이터다. 사용자는 Ralph에 작업 문서와 요구사항을 넘기고, Ralph는 이를 job으로 등록한 뒤 계획 수립, task 분해, 반복 실행, 검증, 재시도, 완료 판정, 최종 결과 정리를 끝까지 담당한다.
|
|
8
|
+
|
|
9
|
+
## 핵심 목표
|
|
10
|
+
|
|
11
|
+
- Ralph 자체는 독립 프로세스로 동작한다.
|
|
12
|
+
- 실행 에이전트는 `codex`, `claude-code` 등 adapter로 교체 가능하다.
|
|
13
|
+
- 상태는 대화 컨텍스트가 아니라 파일 기반 저장소에 영속화된다.
|
|
14
|
+
- 기본 상태 저장소는 agent 작업 경로 아래 `.ralph-cache/`이며 필요 시 별도 경로로 override 가능하다.
|
|
15
|
+
- 각 iteration은 fresh context로 실행된다.
|
|
16
|
+
- validation, retry, completion 판정은 Ralph가 직접 수행한다.
|
|
17
|
+
- 사람용 CLI와 상위 agent용 MCP가 같은 core를 공유한다.
|
|
18
|
+
|
|
19
|
+
## 비목표
|
|
20
|
+
|
|
21
|
+
- 특정 IDE 플러그인 전용 구현
|
|
22
|
+
- 특정 프로젝트 구조를 전제한 설계
|
|
23
|
+
- 장기 메모리를 LLM 대화창에 의존하는 구조
|
|
24
|
+
- MVP 단계의 병렬 분산 실행기
|
|
25
|
+
- MVP 단계의 원격 큐 또는 멀티 워커
|
|
26
|
+
|
|
27
|
+
## 용어
|
|
28
|
+
|
|
29
|
+
- `job`: 사용자가 Ralph에 등록한 전체 작업 단위
|
|
30
|
+
- `phase`: 여러 task를 묶는 상위 실행 단계
|
|
31
|
+
- `task`: 한 iteration에서 하나의 에이전트에게 맡기는 최소 실행 단위
|
|
32
|
+
- `run`: 한 번의 에이전트 실행과 그 결과물
|
|
33
|
+
- `validation`: Ralph가 직접 수행하는 검증 단계
|
|
34
|
+
- `adapter`: 특정 에이전트 CLI와 Ralph core 사이를 연결하는 실행 계층
|
|
35
|
+
|
|
36
|
+
## 문서 맵
|
|
37
|
+
|
|
38
|
+
- 전체 구조와 실행 계층은 [아키텍처](./10-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98.md)에서 정의한다.
|
|
39
|
+
- 상태 저장 구조와 iteration 규칙은 [상태와 실행](./20-%EC%83%81%ED%83%9C%EC%99%80-%EC%8B%A4%ED%96%89.md)에서 정의한다.
|
|
40
|
+
- CLI, MCP, adapter, result contract는 [인터페이스](./30-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4.md)에서 정의한다.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# 아키텍처
|
|
2
|
+
|
|
3
|
+
이 문서는 `@weppy/ralph`의 전체 구조와 각 계층의 책임을 정의한다. 상태 파일 구조나 상태 전이 규칙은 여기서 반복하지 않고 [상태와 실행](./20-%EC%83%81%ED%83%9C%EC%99%80-%EC%8B%A4%ED%96%89.md)을 단일 출처로 참조한다.
|
|
4
|
+
|
|
5
|
+
## 최상위 구조
|
|
6
|
+
|
|
7
|
+
`@weppy/ralph`는 하나의 독립 패키지 안에 core와 두 개의 access layer를 포함한다.
|
|
8
|
+
|
|
9
|
+
- CLI: 사람이 직접 호출하거나 상위 자동화가 shell command로 사용할 수 있는 인터페이스
|
|
10
|
+
- MCP: Codex, Claude 같은 상위 AI agent가 구조화된 tool 호출로 사용할 수 있는 인터페이스
|
|
11
|
+
|
|
12
|
+
두 인터페이스는 공통 core를 공유하며, 상태 판정 규칙이나 validation 로직을 별도로 구현하지 않는다.
|
|
13
|
+
|
|
14
|
+
## src 구조 원칙
|
|
15
|
+
|
|
16
|
+
`src/`는 레이어보다 기능 기준으로 구분한다.
|
|
17
|
+
|
|
18
|
+
- `shared/`: 여러 기능이 공통으로 사용하는 타입, 상수, 에러, 유틸
|
|
19
|
+
- `job/`: job 생성, 로드, 상태 조회, 취소, 재개
|
|
20
|
+
- `planning/`: 입력 정규화, planning prompt, plan 파싱, dependency 생성
|
|
21
|
+
- `execution/`: next task 선택, iteration 실행, retry, completion 판정
|
|
22
|
+
- `validation/`: command, file, custom validation과 phase gate 계산
|
|
23
|
+
- `adapters/`: 에이전트별 adapter 구현과 공통 실행 계약
|
|
24
|
+
- `state/`: 파일 시스템 저장소, atomic write, run artifact 관리
|
|
25
|
+
- `reporting/`: final summary, user checks, blocked report, handoff
|
|
26
|
+
- `cli/`: CLI 진입점과 command handler
|
|
27
|
+
- `mcp/`: MCP 서버와 tool handler
|
|
28
|
+
|
|
29
|
+
## 책임 분리
|
|
30
|
+
|
|
31
|
+
### Core
|
|
32
|
+
|
|
33
|
+
Core는 다음 기능을 소유한다.
|
|
34
|
+
|
|
35
|
+
- job lifecycle 관리
|
|
36
|
+
- plan과 task graph 생성
|
|
37
|
+
- iteration orchestration
|
|
38
|
+
- validation 실행
|
|
39
|
+
- retry와 blocked 전환
|
|
40
|
+
- completion 판정
|
|
41
|
+
- 최종 결과 문서 생성
|
|
42
|
+
|
|
43
|
+
### State Storage
|
|
44
|
+
|
|
45
|
+
- 기본 상태 저장소 root는 agent 작업 경로인 `workspacePath` 아래의 `.ralph-cache/`다.
|
|
46
|
+
- 호출자는 CLI 또는 MCP 입력 파라미터로 상태 저장소 root를 override할 수 있다.
|
|
47
|
+
- core는 항상 resolved absolute state path를 기준으로 상태 파일을 읽고 써야 한다.
|
|
48
|
+
- 입력 reference는 path metadata로 저장하며, 원본 파일 내용을 상태 저장소나 실행 프롬프트에 복사하지 않는다.
|
|
49
|
+
|
|
50
|
+
### Access Layer
|
|
51
|
+
|
|
52
|
+
CLI와 MCP는 core를 호출하는 얇은 계층이어야 한다.
|
|
53
|
+
|
|
54
|
+
- CLI는 사람이 읽기 쉬운 출력과 JSON 출력 모드를 제공한다.
|
|
55
|
+
- MCP는 구조화된 DTO만 반환한다.
|
|
56
|
+
- CLI와 MCP는 상태 파일을 직접 수정하지 않는다.
|
|
57
|
+
|
|
58
|
+
### Adapter Layer
|
|
59
|
+
|
|
60
|
+
Adapter는 에이전트별 프로세스 실행 차이만 처리한다.
|
|
61
|
+
|
|
62
|
+
- prompt 조립 입력값 수신
|
|
63
|
+
- CLI 프로세스 실행
|
|
64
|
+
- stdout/stderr 수집
|
|
65
|
+
- 결과 파일 경로 전달
|
|
66
|
+
- 에러 정규화
|
|
67
|
+
- 입력 file/image path reference 전달
|
|
68
|
+
|
|
69
|
+
Adapter 계약 상세는 [인터페이스](./30-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4.md)를 따른다.
|
|
70
|
+
|
|
71
|
+
## 실행 흐름
|
|
72
|
+
|
|
73
|
+
1. 사용자가 CLI 또는 MCP로 job을 시작한다.
|
|
74
|
+
2. Ralph가 입력 문서를 정규화하고 plan과 task graph를 만든다.
|
|
75
|
+
3. Ralph가 현재 실행 가능한 최소 task를 고른다.
|
|
76
|
+
4. Ralph가 실행 시작 전에 `running` 상태와 run placeholder artifact를 먼저 기록한다.
|
|
77
|
+
5. Ralph가 선택된 adapter로 에이전트를 fresh context에서 한 번 실행한다.
|
|
78
|
+
6. Ralph가 `result.json`을 읽고 validation을 수행한다.
|
|
79
|
+
7. Ralph가 task 완료, retry, follow-up task 생성, blocked 전환 중 하나를 결정한다.
|
|
80
|
+
8. 모든 phase gate가 통과하면 최종 summary를 생성하고 job을 완료한다.
|
|
81
|
+
|
|
82
|
+
상세 상태 전이와 iteration 규칙은 [상태와 실행](./20-%EC%83%81%ED%83%9C%EC%99%80-%EC%8B%A4%ED%96%89.md)을 따른다.
|
|
83
|
+
|
|
84
|
+
## 배포 원칙
|
|
85
|
+
|
|
86
|
+
- 패키지명은 `@weppy/ralph`
|
|
87
|
+
- CLI 엔트리는 `ralph`
|
|
88
|
+
- MCP는 같은 패키지 내부에서 `ralph mcp` 또는 내부 bootstrap 모듈로 제공한다
|
|
89
|
+
- 배포는 npm public registry를 기준으로 한다
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# 상태와 실행
|
|
2
|
+
|
|
3
|
+
이 문서는 `.ralph-cache/` 기본 상태 저장 구조, 핵심 persisted file, 상태 전이, iteration loop, validation 및 completion 규칙의 단일 출처다.
|
|
4
|
+
|
|
5
|
+
## 상태 저장 위치
|
|
6
|
+
|
|
7
|
+
- 기본 상태 저장소 root는 `workspacePath/.ralph-cache`다.
|
|
8
|
+
- `workspacePath`는 Ralph가 adapter를 통해 AI agent를 실행하고 validation을 수행하는 작업 경로다.
|
|
9
|
+
- 호출자는 CLI `--state-dir <path>` 또는 MCP의 동등한 입력 필드로 상태 저장소 root를 override할 수 있다.
|
|
10
|
+
- override가 있으면 아래 구조는 override된 directory를 root로 사용한다.
|
|
11
|
+
|
|
12
|
+
## 상태 저장 구조
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
.ralph-cache/
|
|
16
|
+
├── current-job.txt
|
|
17
|
+
└── jobs/
|
|
18
|
+
└── {job-id}/
|
|
19
|
+
├── job.json
|
|
20
|
+
├── inputs.json
|
|
21
|
+
├── spec.md
|
|
22
|
+
├── plan.md
|
|
23
|
+
├── tasks.json
|
|
24
|
+
├── runtime.json
|
|
25
|
+
├── final-summary.md
|
|
26
|
+
├── user-checks.md
|
|
27
|
+
├── validations/
|
|
28
|
+
│ └── validation-*.json
|
|
29
|
+
├── runs/
|
|
30
|
+
│ └── run-001/
|
|
31
|
+
│ ├── prompt.md
|
|
32
|
+
│ ├── result.json
|
|
33
|
+
│ ├── run-record.json
|
|
34
|
+
│ ├── stdout.log
|
|
35
|
+
│ └── stderr.log
|
|
36
|
+
└── artifacts/
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 핵심 파일
|
|
40
|
+
|
|
41
|
+
### `job.json`
|
|
42
|
+
|
|
43
|
+
- `id`
|
|
44
|
+
- `title`
|
|
45
|
+
- `requestedAgent`
|
|
46
|
+
- `status`
|
|
47
|
+
- `workspacePath`
|
|
48
|
+
- `stateDirectoryPath`
|
|
49
|
+
- `inputDocuments`
|
|
50
|
+
- `validationProfile`
|
|
51
|
+
- `retryPolicy`
|
|
52
|
+
- `createdAt`
|
|
53
|
+
- `updatedAt`
|
|
54
|
+
|
|
55
|
+
### `inputs.json`
|
|
56
|
+
|
|
57
|
+
- `path`
|
|
58
|
+
- `kind`
|
|
59
|
+
- Ralph가 agent에게 직접 열어보라고 전달할 입력 reference 목록
|
|
60
|
+
- 입력 파일의 본문이나 이미지 binary를 복사해 저장하지 않는다
|
|
61
|
+
|
|
62
|
+
### `tasks.json`
|
|
63
|
+
|
|
64
|
+
- `phases`
|
|
65
|
+
- `tasks`
|
|
66
|
+
- `dependencies`
|
|
67
|
+
- `retryCounts`
|
|
68
|
+
- `evidenceLinks`
|
|
69
|
+
- `phaseGateStatus`
|
|
70
|
+
|
|
71
|
+
### `runtime.json`
|
|
72
|
+
|
|
73
|
+
- `currentPhaseId`
|
|
74
|
+
- `currentTaskId`
|
|
75
|
+
- `remainingTaskCount`
|
|
76
|
+
- `lastRunId`
|
|
77
|
+
- `nextAction`
|
|
78
|
+
- `blockedReason`
|
|
79
|
+
- `lastValidationStatus`
|
|
80
|
+
|
|
81
|
+
### run artifact 규칙
|
|
82
|
+
|
|
83
|
+
- `result.json`은 agent가 반환한 구조화된 결과 계약만 저장한다.
|
|
84
|
+
- `run-record.json`은 Ralph가 계산한 run 메타데이터, exit code, signal, error code를 저장한다.
|
|
85
|
+
- `stdout.log`, `stderr.log`는 adapter process의 raw output을 저장한다.
|
|
86
|
+
- agent 실행 직전 `run-record.json`, `stdout.log`, `stderr.log`, `prompt.md`는 placeholder를 먼저 기록한다.
|
|
87
|
+
|
|
88
|
+
## 상태 전이 원칙
|
|
89
|
+
|
|
90
|
+
### Job 상태
|
|
91
|
+
|
|
92
|
+
- `draft`
|
|
93
|
+
- `planned`
|
|
94
|
+
- `running`
|
|
95
|
+
- `blocked`
|
|
96
|
+
- `completed`
|
|
97
|
+
- `failed`
|
|
98
|
+
- `cancelled`
|
|
99
|
+
|
|
100
|
+
### Task 상태
|
|
101
|
+
|
|
102
|
+
- `pending`
|
|
103
|
+
- `running`
|
|
104
|
+
- `completed`
|
|
105
|
+
- `partial`
|
|
106
|
+
- `blocked`
|
|
107
|
+
- `failed`
|
|
108
|
+
- `cancelled`
|
|
109
|
+
|
|
110
|
+
### Phase Gate 상태
|
|
111
|
+
|
|
112
|
+
- `pending`
|
|
113
|
+
- `failed`
|
|
114
|
+
- `passed`
|
|
115
|
+
|
|
116
|
+
## Iteration Loop
|
|
117
|
+
|
|
118
|
+
각 iteration은 짧고 독립적이어야 한다.
|
|
119
|
+
|
|
120
|
+
1. Ralph가 현재 상태를 로드한다.
|
|
121
|
+
2. 현재 phase에서 실행 가능한 next task를 선택한다.
|
|
122
|
+
3. agent 실행 전에 job과 current task를 `running`으로 기록하고 `runs/run-xxx/` placeholder artifact를 먼저 생성한다.
|
|
123
|
+
4. adapter를 통해 에이전트를 fresh context로 1회 실행한다.
|
|
124
|
+
5. `runs/run-xxx/result.json`을 읽는다.
|
|
125
|
+
6. Ralph가 validation을 실행한다.
|
|
126
|
+
7. validation 결과와 run 결과를 반영해 task 상태를 갱신한다.
|
|
127
|
+
8. 남은 task가 있으면 다음 iteration으로 이동한다.
|
|
128
|
+
9. 더 진행할 수 없으면 `blocked`, 모두 충족되면 `completed`로 종료한다.
|
|
129
|
+
|
|
130
|
+
## Validation 소유권
|
|
131
|
+
|
|
132
|
+
Validation은 Ralph 소유다.
|
|
133
|
+
|
|
134
|
+
- 에이전트는 validation hint만 남길 수 있다.
|
|
135
|
+
- 실제 `build`, `test`, `lint`, file check, custom script 실행은 Ralph가 수행한다.
|
|
136
|
+
- 에이전트가 자연어로 완료를 선언해도 validation 실패 시 완료로 처리하지 않는다.
|
|
137
|
+
|
|
138
|
+
## Retry 규칙
|
|
139
|
+
|
|
140
|
+
- 결과 파일이 없으면 iteration 실패로 간주한다.
|
|
141
|
+
- `partial` 결과는 follow-up task 또는 retry 판단 대상이다.
|
|
142
|
+
- `blocked` 결과는 blocker reason이 필수다.
|
|
143
|
+
- 동일 task의 retry 횟수가 한도를 넘으면 job 또는 task는 `blocked` 또는 `failed`로 전환된다.
|
|
144
|
+
|
|
145
|
+
## Completion 규칙
|
|
146
|
+
|
|
147
|
+
다음 조건이 모두 충족될 때만 job을 완료 처리한다.
|
|
148
|
+
|
|
149
|
+
- 모든 필수 task가 `completed`
|
|
150
|
+
- 현재 phase gate가 모두 `passed`
|
|
151
|
+
- 필수 validation이 성공
|
|
152
|
+
- 남은 blocker가 없음
|
|
153
|
+
|
|
154
|
+
## 파일 쓰기 규칙
|
|
155
|
+
|
|
156
|
+
- JSON 파일은 atomic write를 사용한다.
|
|
157
|
+
- 중간 실패 후에도 기존 유효 상태를 복구할 수 있어야 한다.
|
|
158
|
+
- 각 run artifact는 iteration별로 분리 저장한다.
|
|
159
|
+
- `--input`으로 받은 파일이나 이미지의 내용은 프롬프트 본문에 인라인하지 않고 path reference로만 전달한다.
|
|
160
|
+
|
|
161
|
+
실행 인터페이스와 `result.json` 계약은 [인터페이스](./30-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4.md)에서 정의한다.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# 인터페이스
|
|
2
|
+
|
|
3
|
+
이 문서는 adapter contract, `result.json` contract, CLI contract, MCP contract의 단일 출처다. 아키텍처 개요는 [아키텍처](./10-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98.md), 상태 전이와 저장 구조는 [상태와 실행](./20-%EC%83%81%ED%83%9C%EC%99%80-%EC%8B%A4%ED%96%89.md)을 참조한다.
|
|
4
|
+
|
|
5
|
+
## Result Contract
|
|
6
|
+
|
|
7
|
+
에이전트는 자연어 선언 대신 구조화된 `result.json`을 남겨야 한다.
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"status": "completed",
|
|
12
|
+
"task_id": "TASK-003",
|
|
13
|
+
"summary": "Implemented retry-safe task runner",
|
|
14
|
+
"changed_files": [
|
|
15
|
+
"src/execution/run-iteration/index.ts"
|
|
16
|
+
],
|
|
17
|
+
"artifacts": [],
|
|
18
|
+
"follow_up_tasks": [],
|
|
19
|
+
"user_checks": [],
|
|
20
|
+
"validation_hints": [],
|
|
21
|
+
"blockers": []
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 허용 상태
|
|
26
|
+
|
|
27
|
+
- `completed`
|
|
28
|
+
- `partial`
|
|
29
|
+
- `blocked`
|
|
30
|
+
- `failed`
|
|
31
|
+
|
|
32
|
+
### 규칙
|
|
33
|
+
|
|
34
|
+
- `completed`라도 Ralph validation이 실패하면 실제 완료가 아니다.
|
|
35
|
+
- `blocked`면 blocker reason이 필요하다.
|
|
36
|
+
- 결과 JSON이 없으면 malformed result로 간주한다.
|
|
37
|
+
|
|
38
|
+
## Adapter Contract
|
|
39
|
+
|
|
40
|
+
각 adapter는 최소 다음 기능을 제공해야 한다.
|
|
41
|
+
|
|
42
|
+
- `preparePrompt(context)`
|
|
43
|
+
- `execute(runContext)`
|
|
44
|
+
- `normalizeError(error)`
|
|
45
|
+
|
|
46
|
+
### 표준 에러 분류
|
|
47
|
+
|
|
48
|
+
- `timeout`
|
|
49
|
+
- `cli_missing`
|
|
50
|
+
- `auth_required`
|
|
51
|
+
- `malformed_result`
|
|
52
|
+
- `execution_failed`
|
|
53
|
+
|
|
54
|
+
### 초기 adapter 범위
|
|
55
|
+
|
|
56
|
+
- `codex`
|
|
57
|
+
- `claude-code`
|
|
58
|
+
- `custom-command`
|
|
59
|
+
|
|
60
|
+
### 현재 실행 방식
|
|
61
|
+
|
|
62
|
+
- `codex` adapter는 `codex exec`를 사용한다.
|
|
63
|
+
- `claude-code` adapter는 `claude -p`를 사용한다.
|
|
64
|
+
- `custom-command` adapter는 `RALPH_CUSTOM_AGENT_COMMAND` shell command를 실행한다.
|
|
65
|
+
- `custom-command`는 `RALPH_OUTPUT_PATH`에 `result.json` 계약을 만족하는 JSON을 기록해야 한다.
|
|
66
|
+
- adapter prompt는 입력 파일의 내용 복사본 대신 absolute path reference를 포함해야 한다.
|
|
67
|
+
- 이미지 입력도 설명문으로 변환하지 않고 path reference로 넘기고 agent가 직접 확인해야 한다.
|
|
68
|
+
|
|
69
|
+
## CLI Contract
|
|
70
|
+
|
|
71
|
+
초기 CLI command는 다음과 같다.
|
|
72
|
+
|
|
73
|
+
- `ralph start`
|
|
74
|
+
- `ralph status`
|
|
75
|
+
- `ralph resume`
|
|
76
|
+
- `ralph cancel`
|
|
77
|
+
- `ralph result`
|
|
78
|
+
- `ralph mcp`
|
|
79
|
+
|
|
80
|
+
### 공통 입력 규칙
|
|
81
|
+
|
|
82
|
+
- `--workspace <path>`: Ralph가 AI agent 실행과 validation의 working directory로 사용하는 작업 경로. `start`에서 필수, 나머지에서는 `--state-dir`와 둘 중 하나 필수
|
|
83
|
+
- `--state-dir <path>`: 상태 저장소 root override. 생략 시 기본값은 `{workspacePath}/.ralph-cache`
|
|
84
|
+
- `--job <id>`: 대상 job ID. 생략 시 `current-job.txt`에 기록된 현재 job을 사용한다
|
|
85
|
+
- `--input <path>`: agent가 직접 확인할 입력 file/image/directory reference. Ralph는 path metadata만 저장하고 본문은 프롬프트에 인라인하지 않는다. `start`에서만 사용
|
|
86
|
+
- `--validate-cmd <command>`: validation 단계에서 workspace 기준으로 실행할 shell command. repeatable. `start`에서만 사용
|
|
87
|
+
- `--max-retries <n>`: task별 최대 retry 횟수. `start`에서만 사용
|
|
88
|
+
- `--max-iterations <n>`: `resume` 한 번 호출에서 실행할 최대 iteration 수. `resume`에서만 사용
|
|
89
|
+
- `--json`: JSON 형식으로 출력. 모든 커맨드에서 사용 가능
|
|
90
|
+
|
|
91
|
+
### 예시
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
ralph start --title "Implement auth flow" --agent codex --workspace /path/to/project --input docs/spec.md
|
|
95
|
+
ralph start --title "Implement auth flow" --agent codex --workspace /path/to/project --state-dir /tmp/ralph-auth-cache --input docs/spec.md
|
|
96
|
+
ralph start --title "Implement auth flow" --agent custom-command --workspace /path/to/project --validate-cmd "npm test" --max-retries 2
|
|
97
|
+
ralph status --workspace /path/to/project --job job-20260307-auth
|
|
98
|
+
ralph resume --workspace /path/to/project --job job-20260307-auth --max-iterations 5
|
|
99
|
+
ralph result --workspace /path/to/project --job job-20260307-auth
|
|
100
|
+
ralph cancel --workspace /path/to/project --job job-20260307-auth
|
|
101
|
+
ralph status --state-dir /tmp/ralph-auth-cache
|
|
102
|
+
ralph mcp
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## MCP Contract
|
|
106
|
+
|
|
107
|
+
MCP는 CLI와 다른 접근 계층이지만 같은 core를 사용한다.
|
|
108
|
+
|
|
109
|
+
### 초기 tool 범위
|
|
110
|
+
|
|
111
|
+
- `start_job`
|
|
112
|
+
- `get_status`
|
|
113
|
+
- `get_result`
|
|
114
|
+
- `resume_job`
|
|
115
|
+
- `cancel_job`
|
|
116
|
+
|
|
117
|
+
### 입력 규칙
|
|
118
|
+
|
|
119
|
+
- `start_job`은 `workspace_path`를 필수로 받고 `state_dir`를 optional로 받을 수 있다.
|
|
120
|
+
- `get_status`, `get_result`, `resume_job`, `cancel_job`은 `workspace_path` 또는 `state_dir` 중 최소 하나를 필수로 받는다.
|
|
121
|
+
- `state_dir`가 없으면 기본 상태 저장소는 `{workspace_path}/.ralph-cache`다.
|
|
122
|
+
- `job_id`는 모든 조회/실행 tool에서 optional이며, 생략 시 `current-job.txt`의 현재 job을 사용한다.
|
|
123
|
+
- `validation_commands`는 repeatable shell validation command 목록이다.
|
|
124
|
+
- `max_retries_per_task`와 `max_iterations`를 각각 `start_job`, `resume_job`에서 받을 수 있다.
|
|
125
|
+
|
|
126
|
+
### 설계 원칙
|
|
127
|
+
|
|
128
|
+
- MCP tool은 thin wrapper여야 한다.
|
|
129
|
+
- core를 직접 호출해야 하며 CLI subprocess를 재호출하지 않는다.
|
|
130
|
+
- 반환값은 항상 구조화된 DTO여야 한다.
|
|
131
|
+
- polling 기반 상태 조회를 기본으로 한다.
|
|
132
|
+
|
|
133
|
+
## CLI와 MCP의 관계
|
|
134
|
+
|
|
135
|
+
- CLI와 MCP는 같은 job 상태 저장소를 읽고 쓴다.
|
|
136
|
+
- validation, retry, completion 판정은 공통 core가 수행한다.
|
|
137
|
+
- 출력 형식만 다르고 실행 규칙은 동일하다.
|