ralph-mem 0.1.6 → 0.1.10
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/.claude-plugin/plugin.json +1 -1
- package/README.ko.md +459 -0
- package/README.md +176 -162
- package/dist/{chunk-rcnembz5.js → chunk-amcg7jx0.js} +1 -1
- package/dist/{chunk-gy7xx0jv.js → chunk-t37nwt93.js} +1 -1
- package/dist/chunk-th418jrx.js +345 -0
- package/dist/hooks/post-tool-use.js +1 -2
- package/dist/hooks/session-end.js +2 -3
- package/dist/hooks/session-start.js +2 -3
- package/dist/hooks/stop.js +1 -2
- package/dist/hooks/user-prompt-submit.js +3 -4
- package/dist/index.js +3 -4
- package/dist/skills/mem-forget.js +3 -3
- package/dist/skills/mem-inject.js +0 -2
- package/dist/skills/mem-search.js +2 -3
- package/dist/skills/mem-status.js +0 -1
- package/dist/skills/ralph-config.js +0 -1
- package/dist/skills/ralph.js +1 -2
- package/hooks/hooks.json +2 -2
- package/package.json +5 -9
- package/dist/chunk-jz140n5a.js +0 -1116
- package/dist/chunk-ns0dgdnb.js +0 -21
package/README.ko.md
ADDED
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
# ralph-mem
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/ralph-mem)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://www.typescriptlang.org/)
|
|
6
|
+
[](https://bun.sh/)
|
|
7
|
+
|
|
8
|
+
Claude Code를 위한 Ralph Loop 기반 지속적 컨텍스트 관리 플러그인
|
|
9
|
+
|
|
10
|
+
## 개요
|
|
11
|
+
|
|
12
|
+
ralph-mem은 [Geoffrey Huntley](https://ghuntley.com/)의 [Ralph Loop](https://ghuntley.com/ralph/)와 [thedotmack](https://github.com/thedotmack)의 [claude-mem](https://github.com/thedotmack/claude-mem)에서 영감을 받아 시작된 프로젝트입니다.
|
|
13
|
+
|
|
14
|
+
Ralph Loop의 "성공할 때까지 반복" 철학과 claude-mem의 "지능적 컨텍스트 관리"를 결합하여 Claude Code를 위한 지속적 메모리 관리 플러그인을 구현했습니다.
|
|
15
|
+
|
|
16
|
+
### 해결하는 문제
|
|
17
|
+
|
|
18
|
+
| 문제 | 설명 |
|
|
19
|
+
| ----------------- | -------------------------------------------- |
|
|
20
|
+
| **Context Rot** | 누적된 불필요한 정보로 인한 모델 성능 저하 |
|
|
21
|
+
| **Compaction** | context window 60-70% 초과 시 출력 품질 급락 |
|
|
22
|
+
| **Forgetfulness** | 세션 간 작업 맥락 손실 |
|
|
23
|
+
| **One-shot 실패** | 복잡한 작업에서 단일 시도 성공률 저조 |
|
|
24
|
+
|
|
25
|
+
## 핵심 기능
|
|
26
|
+
|
|
27
|
+
### 1. Ralph Loop Engine
|
|
28
|
+
|
|
29
|
+
성공 기준 달성까지 자동으로 반복 실행합니다.
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
/ralph start "Add user authentication with JWT"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```mermaid
|
|
36
|
+
flowchart LR
|
|
37
|
+
A[Prompt + Context] --> B[Agent Execute]
|
|
38
|
+
B --> C{Success?}
|
|
39
|
+
C -->|YES| D[Done]
|
|
40
|
+
C -->|NO| E[Append Result]
|
|
41
|
+
E --> A
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**지원하는 성공 기준:**
|
|
45
|
+
|
|
46
|
+
- `test_pass` - 테스트 통과 (`npm test`, `pytest`)
|
|
47
|
+
- `build_success` - 빌드 성공
|
|
48
|
+
- `lint_clean` - Lint 오류 없음
|
|
49
|
+
- `type_check` - 타입 체크 통과
|
|
50
|
+
- `custom` - 사용자 정의 명령
|
|
51
|
+
|
|
52
|
+
### 2. Persistent Memory
|
|
53
|
+
|
|
54
|
+
세션 간 컨텍스트를 자동으로 저장하고 복원합니다.
|
|
55
|
+
|
|
56
|
+
```mermaid
|
|
57
|
+
flowchart TB
|
|
58
|
+
A[새 세션 시작] --> B[관련 메모리 검색]
|
|
59
|
+
B --> C[이전 작업 컨텍스트 주입]
|
|
60
|
+
C --> D[세션 진행]
|
|
61
|
+
D --> E[관찰 기록]
|
|
62
|
+
E --> F[세션 종료]
|
|
63
|
+
F --> G[요약 생성 및 저장]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Lifecycle Hooks:**
|
|
67
|
+
|
|
68
|
+
- `SessionStart` - 관련 메모리 자동 주입
|
|
69
|
+
- `PostToolUse` - 도구 사용 결과 기록
|
|
70
|
+
- `Stop` - 세션 강제 종료 시 정리 작업
|
|
71
|
+
- `SessionEnd` - 세션 요약 생성 및 저장
|
|
72
|
+
|
|
73
|
+
### 3. Progressive Disclosure
|
|
74
|
+
|
|
75
|
+
토큰 효율적인 3계층 검색으로 약 10배 토큰 절약:
|
|
76
|
+
|
|
77
|
+
| Layer | 내용 | 토큰 |
|
|
78
|
+
| ------- | -------------------------- | --------------- |
|
|
79
|
+
| Layer 1 | Index (ID + 점수) | 50-100/result |
|
|
80
|
+
| Layer 2 | Timeline (시간순 컨텍스트) | 200-300/result |
|
|
81
|
+
| Layer 3 | Full Details | 500-1000/result |
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
/mem-search "authentication error" # Layer 1
|
|
85
|
+
/mem-search --layer 3 obs-a1b2 # Layer 3
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 설치
|
|
89
|
+
|
|
90
|
+
### npm
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npm install ralph-mem
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### yarn
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
yarn add ralph-mem
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### pnpm
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
pnpm add ralph-mem
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### bun
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
bun add ralph-mem
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Claude Code 플러그인
|
|
115
|
+
|
|
116
|
+
Claude Code에서 플러그인으로 사용하려면 [roboco-io/plugins](https://github.com/roboco-io/plugins) 마켓플레이스를 통해 설치합니다:
|
|
117
|
+
|
|
118
|
+
1. 마켓플레이스 추가
|
|
119
|
+
```
|
|
120
|
+
/plugin marketplace add roboco-io/plugins
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
2. 플러그인 설치
|
|
124
|
+
```
|
|
125
|
+
/plugin install ralph-mem@roboco-plugins
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
또는 `/plugin` 명령으로 플러그인 매니저를 열어 UI에서 설치할 수 있습니다.
|
|
129
|
+
|
|
130
|
+
### 플러그인 업데이트
|
|
131
|
+
|
|
132
|
+
1. 마켓플레이스 업데이트
|
|
133
|
+
```
|
|
134
|
+
claude plugin marketplace update roboco-plugins
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
2. 플러그인 업데이트
|
|
138
|
+
```
|
|
139
|
+
claude plugin update ralph-mem@roboco-plugins
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
업데이트 후 Claude Code를 재시작하면 변경 사항이 적용됩니다.
|
|
143
|
+
|
|
144
|
+
## 사용법
|
|
145
|
+
|
|
146
|
+
### Ralph Loop
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# Loop 시작 (기본: 테스트 통과까지)
|
|
150
|
+
/ralph start "Implement feature X"
|
|
151
|
+
|
|
152
|
+
# 커스텀 성공 기준으로 시작
|
|
153
|
+
/ralph start "Fix lint errors" --criteria lint_clean
|
|
154
|
+
|
|
155
|
+
# Loop 상태 확인
|
|
156
|
+
/ralph status
|
|
157
|
+
|
|
158
|
+
# Loop 중단
|
|
159
|
+
/ralph stop
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Memory 검색
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# 키워드 검색
|
|
166
|
+
/mem-search "JWT authentication"
|
|
167
|
+
|
|
168
|
+
# 특정 관찰 상세 조회
|
|
169
|
+
/mem-search --layer 3 <observation-id>
|
|
170
|
+
|
|
171
|
+
# 시간 범위 검색
|
|
172
|
+
/mem-search "database" --since 7d
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Memory 관리
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# 메모리 상태 확인
|
|
179
|
+
/mem-status
|
|
180
|
+
|
|
181
|
+
# 수동 컨텍스트 주입
|
|
182
|
+
/mem-inject "이 프로젝트는 Express + Prisma 기반"
|
|
183
|
+
|
|
184
|
+
# 특정 메모리 제거
|
|
185
|
+
/mem-forget <observation-id>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 4. Privacy 기능
|
|
189
|
+
|
|
190
|
+
민감한 정보를 메모리에서 제외합니다.
|
|
191
|
+
|
|
192
|
+
**`<private>` 태그:**
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# 태그로 감싼 내용은 저장되지 않습니다
|
|
196
|
+
My API key is <private>sk-1234567890</private>
|
|
197
|
+
# 저장됨: My API key is [PRIVATE]
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**설정 기반 제외:**
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
privacy:
|
|
204
|
+
exclude_patterns:
|
|
205
|
+
- "*.env"
|
|
206
|
+
- "*password*"
|
|
207
|
+
- "*secret*"
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### 5. MCP 도구
|
|
211
|
+
|
|
212
|
+
스킬 외에 MCP(Model Context Protocol) 도구로도 메모리에 접근할 수 있습니다.
|
|
213
|
+
|
|
214
|
+
| 도구 | 설명 |
|
|
215
|
+
|------|------|
|
|
216
|
+
| `ralph_mem_search` | Progressive Disclosure 기반 검색 |
|
|
217
|
+
| `ralph_mem_timeline` | 특정 관찰 주변 시간순 컨텍스트 |
|
|
218
|
+
| `ralph_mem_get` | 관찰 ID로 전체 상세 조회 |
|
|
219
|
+
|
|
220
|
+
## 설정
|
|
221
|
+
|
|
222
|
+
`~/.config/ralph-mem/config.yaml`:
|
|
223
|
+
|
|
224
|
+
```yaml
|
|
225
|
+
ralph:
|
|
226
|
+
max_iterations: 10 # 최대 반복 횟수
|
|
227
|
+
context_budget: 0.6 # context window 사용률 상한
|
|
228
|
+
cooldown_ms: 1000 # 반복 간 대기 시간
|
|
229
|
+
success_criteria:
|
|
230
|
+
- type: test_pass
|
|
231
|
+
command: "npm test"
|
|
232
|
+
|
|
233
|
+
memory:
|
|
234
|
+
auto_inject: true # 세션 시작 시 자동 주입
|
|
235
|
+
max_inject_tokens: 2000 # 주입 최대 토큰
|
|
236
|
+
retention_days: 30 # 메모리 보관 기간
|
|
237
|
+
|
|
238
|
+
privacy:
|
|
239
|
+
exclude_patterns: # 저장 제외 패턴
|
|
240
|
+
- "*.env"
|
|
241
|
+
- "*password*"
|
|
242
|
+
- "*secret*"
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## 동작 원리
|
|
246
|
+
|
|
247
|
+
ralph-mem은 크게 두 가지 모드로 동작합니다:
|
|
248
|
+
|
|
249
|
+
1. **자동 모드 (Lifecycle Hooks)**: 사용자 개입 없이 백그라운드에서 동작
|
|
250
|
+
2. **명시적 모드 (Skills/Commands)**: 사용자가 슬래시 명령어로 직접 제어
|
|
251
|
+
|
|
252
|
+
### Lifecycle Hooks
|
|
253
|
+
|
|
254
|
+
플러그인이 설치되면 Claude Code의 lifecycle에 자동으로 연결되어 동작합니다.
|
|
255
|
+
|
|
256
|
+
```mermaid
|
|
257
|
+
sequenceDiagram
|
|
258
|
+
participant CC as Claude Code
|
|
259
|
+
participant Hook as Hook Layer
|
|
260
|
+
participant Core as Core Layer
|
|
261
|
+
participant DB as SQLite
|
|
262
|
+
|
|
263
|
+
CC->>Hook: SessionStart
|
|
264
|
+
Hook->>Core: 관련 메모리 검색
|
|
265
|
+
Core->>DB: FTS5 + Embedding 검색
|
|
266
|
+
DB-->>Core: 이전 컨텍스트
|
|
267
|
+
Core-->>Hook: 검색 결과
|
|
268
|
+
Hook-->>CC: 컨텍스트 자동 주입
|
|
269
|
+
|
|
270
|
+
CC->>Hook: UserPromptSubmit
|
|
271
|
+
Hook->>Core: 쿼리 관련 검색
|
|
272
|
+
Core-->>Hook: 관련 메모리 알림
|
|
273
|
+
Hook-->>CC: 알림 표시 (주입 X)
|
|
274
|
+
|
|
275
|
+
CC->>Hook: PostToolUse
|
|
276
|
+
Hook->>Core: 도구 사용 결과 기록
|
|
277
|
+
Core->>DB: Observation 저장
|
|
278
|
+
|
|
279
|
+
CC->>Hook: SessionEnd
|
|
280
|
+
Hook->>Core: 세션 요약 생성
|
|
281
|
+
Core->>DB: 요약 저장
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
| Hook | 시점 | 동작 |
|
|
285
|
+
|------|------|------|
|
|
286
|
+
| `SessionStart` | 세션 시작 | 프로젝트 관련 이전 컨텍스트 자동 주입 |
|
|
287
|
+
| `UserPromptSubmit` | 프롬프트 제출 | 관련 메모리 알림 (토큰 절약을 위해 주입하지 않음) |
|
|
288
|
+
| `PostToolUse` | 도구 사용 후 | 쓰기 도구, Bash 명령 결과를 Observation으로 기록 |
|
|
289
|
+
| `SessionEnd` | 세션 종료 | 세션 요약 생성 및 저장 |
|
|
290
|
+
|
|
291
|
+
### Ralph Loop 동작
|
|
292
|
+
|
|
293
|
+
`/ralph start` 명령으로 활성화되며, 성공 기준 달성까지 자동 반복합니다.
|
|
294
|
+
|
|
295
|
+
```mermaid
|
|
296
|
+
flowchart LR
|
|
297
|
+
A[Task + Context] --> B[Claude 실행]
|
|
298
|
+
B --> C{성공 판단}
|
|
299
|
+
C -->|YES| D[완료]
|
|
300
|
+
C -->|NO| E[결과 추가]
|
|
301
|
+
E --> F{중단 조건?}
|
|
302
|
+
F -->|NO| A
|
|
303
|
+
F -->|YES| G[실패 + 롤백 안내]
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**성공 판단**: Claude가 테스트/빌드 출력을 분석하여 성공 여부를 판단합니다.
|
|
307
|
+
|
|
308
|
+
**Overbaking 방지**: 무한 반복을 방지하기 위한 중단 조건:
|
|
309
|
+
|
|
310
|
+
| 조건 | 기본값 | 설명 |
|
|
311
|
+
|------|--------|------|
|
|
312
|
+
| `maxIterations` | 10 | 최대 반복 횟수 |
|
|
313
|
+
| `maxDurationMs` | 30분 | 최대 실행 시간 |
|
|
314
|
+
| `noProgressThreshold` | 3회 | 진척 없음 허용 횟수 |
|
|
315
|
+
|
|
316
|
+
**스냅샷**: Loop 시작 시 변경 파일을 스냅샷으로 저장하여 실패 시 롤백 가능.
|
|
317
|
+
|
|
318
|
+
### 검색 엔진
|
|
319
|
+
|
|
320
|
+
2단계 검색으로 최적의 결과를 반환합니다:
|
|
321
|
+
|
|
322
|
+
1. **FTS5 전문 검색** (기본): SQLite FTS5를 사용한 빠른 텍스트 검색
|
|
323
|
+
2. **Embedding 유사도** (폴백): FTS5 결과가 부족할 때 의미 기반 검색
|
|
324
|
+
|
|
325
|
+
**Embedding 모델**: `paraphrase-multilingual-MiniLM-L12-v2`
|
|
326
|
+
- 로컬 실행 (API 호출 없음)
|
|
327
|
+
- 50+ 언어 지원 (한국어, 영어 포함)
|
|
328
|
+
- 384차원, ~278MB
|
|
329
|
+
|
|
330
|
+
### 데이터 흐름
|
|
331
|
+
|
|
332
|
+
```mermaid
|
|
333
|
+
flowchart TB
|
|
334
|
+
subgraph Input["입력"]
|
|
335
|
+
Tool[도구 사용 결과]
|
|
336
|
+
Prompt[사용자 프롬프트]
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
subgraph Process["처리"]
|
|
340
|
+
Privacy[Privacy 필터]
|
|
341
|
+
Compress[압축기]
|
|
342
|
+
Embed[Embedding 생성]
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
subgraph Storage["저장"]
|
|
346
|
+
Obs[(Observations)]
|
|
347
|
+
Session[(Sessions)]
|
|
348
|
+
FTS[(FTS5 Index)]
|
|
349
|
+
Vec[(Embedding)]
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
Tool --> Privacy
|
|
353
|
+
Privacy --> Compress
|
|
354
|
+
Compress --> Obs
|
|
355
|
+
Obs --> FTS
|
|
356
|
+
Obs --> Embed
|
|
357
|
+
Embed --> Vec
|
|
358
|
+
|
|
359
|
+
Prompt --> FTS
|
|
360
|
+
Prompt --> Vec
|
|
361
|
+
FTS --> Result[검색 결과]
|
|
362
|
+
Vec --> Result
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Observation 타입
|
|
366
|
+
|
|
367
|
+
도구 사용 결과는 타입별로 분류되어 저장됩니다:
|
|
368
|
+
|
|
369
|
+
| 타입 | 설명 | 기록 대상 |
|
|
370
|
+
|------|------|----------|
|
|
371
|
+
| `tool_use` | 도구 사용 결과 | Edit, Write 등 쓰기 도구 |
|
|
372
|
+
| `bash` | 명령 실행 결과 | Bash 명령어 |
|
|
373
|
+
| `error` | 에러 발생 | 모든 에러 (높은 중요도) |
|
|
374
|
+
| `success` | 성공 기록 | 테스트 통과, 빌드 성공 |
|
|
375
|
+
| `note` | 수동 메모 | `/mem-inject`로 주입된 내용 |
|
|
376
|
+
|
|
377
|
+
**중요도 자동 산정**:
|
|
378
|
+
- 에러 발생: 1.0 (최고)
|
|
379
|
+
- 테스트 통과/실패: 0.9
|
|
380
|
+
- 파일 생성/수정: 0.7
|
|
381
|
+
- 일반 명령: 0.5
|
|
382
|
+
|
|
383
|
+
## 아키텍처
|
|
384
|
+
|
|
385
|
+
```mermaid
|
|
386
|
+
flowchart TB
|
|
387
|
+
subgraph Plugin["ralph-mem Plugin"]
|
|
388
|
+
subgraph Interface["Interface Layer"]
|
|
389
|
+
Hooks[Hooks]
|
|
390
|
+
Skills[Skills]
|
|
391
|
+
Loop[Loop Engine]
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
subgraph Core["Core Service"]
|
|
395
|
+
Store[Memory Store]
|
|
396
|
+
Search[Search Engine]
|
|
397
|
+
Compress[Compressor]
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
subgraph Storage["Storage"]
|
|
401
|
+
DB[(SQLite + FTS5)]
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
Hooks --> Core
|
|
405
|
+
Skills --> Core
|
|
406
|
+
Loop --> Core
|
|
407
|
+
Core --> DB
|
|
408
|
+
end
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
## 프로젝트 구조
|
|
412
|
+
|
|
413
|
+
```text
|
|
414
|
+
ralph-mem/
|
|
415
|
+
├── src/
|
|
416
|
+
│ ├── hooks/ # Lifecycle hooks
|
|
417
|
+
│ ├── skills/ # Slash commands
|
|
418
|
+
│ ├── loop/ # Ralph Loop engine
|
|
419
|
+
│ ├── memory/ # Memory store & search
|
|
420
|
+
│ └── db/ # SQLite + FTS5
|
|
421
|
+
├── prompts/ # AI 프롬프트
|
|
422
|
+
├── docs/
|
|
423
|
+
│ └── PRD.md # Product Requirements
|
|
424
|
+
└── tests/
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
## 기술 스택
|
|
428
|
+
|
|
429
|
+
- **Runtime**: Bun
|
|
430
|
+
- **Language**: TypeScript
|
|
431
|
+
- **Database**: SQLite + FTS5
|
|
432
|
+
- **Testing**: Vitest
|
|
433
|
+
|
|
434
|
+
## 개발
|
|
435
|
+
|
|
436
|
+
```bash
|
|
437
|
+
# 의존성 설치
|
|
438
|
+
bun install
|
|
439
|
+
|
|
440
|
+
# 개발 모드
|
|
441
|
+
bun run dev
|
|
442
|
+
|
|
443
|
+
# 테스트
|
|
444
|
+
bun test
|
|
445
|
+
|
|
446
|
+
# 빌드
|
|
447
|
+
bun run build
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
## 참고 자료
|
|
451
|
+
|
|
452
|
+
- [Ralph Loop - Geoffrey Huntley](https://ghuntley.com/ralph/)
|
|
453
|
+
- [claude-mem](https://github.com/thedotmack/claude-mem)
|
|
454
|
+
- [Inventing the Ralph Wiggum Loop (Podcast)](https://linearb.io/dev-interrupted/podcast/inventing-the-ralph-wiggum-loop)
|
|
455
|
+
- [The Brief History of Ralph](https://www.humanlayer.dev/blog/brief-history-of-ralph)
|
|
456
|
+
|
|
457
|
+
## 라이선스
|
|
458
|
+
|
|
459
|
+
MIT
|