mupengism 3.0.0 → 4.0.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/AGENTS.md +221 -0
- package/HEARTBEAT.md +63 -0
- package/IDENTITY.md +11 -0
- package/README.md +49 -248
- package/SOUL.md +177 -0
- package/hooks/disciple-init/HOOK.md +20 -0
- package/hooks/disciple-init/handler.ts +80 -0
- package/hooks/index-builder/HOOK.md +41 -0
- package/hooks/index-builder/handler.ts +132 -0
- package/hooks/kernel-panic-guard/HOOK.md +39 -0
- package/hooks/kernel-panic-guard/README.md +136 -0
- package/hooks/kernel-panic-guard/WHITELIST.md +117 -0
- package/hooks/kernel-panic-guard/handler.ts +147 -0
- package/hooks/memory-consolidator/HOOK.md +33 -0
- package/hooks/memory-consolidator/handler.ts +111 -0
- package/hooks/soul-evolution/HOOK.md +26 -0
- package/hooks/soul-evolution/handler.ts +166 -0
- package/hooks/soul-guard/HOOK.md +30 -0
- package/hooks/soul-guard/handler.ts +196 -0
- package/package.json +44 -53
- package/tools/kernel-guard/README.md +170 -0
- package/tools/kernel-guard/lockdown.cjs +152 -0
- package/tools/kernel-guard/register-hash.js +100 -0
- package/tools/kernel-guard/unlock.cjs +106 -0
- package/tools/kernel-guard/verify-kernel.js +133 -0
- package/tools/memory-ops/README.md +221 -0
- package/tools/memory-ops/dream.js +220 -0
- package/tools/memory-ops/forget.js +148 -0
- package/tools/memory-ops/immune.js +305 -0
- package/tools/self-loop/README.md +213 -0
- package/tools/self-loop/brake-check.js +191 -0
- package/tools/self-loop/example-check.sh +34 -0
- package/tools/self-loop/panic-detector.js +191 -0
- package/LICENSE +0 -21
- package/README-EN.md +0 -226
- package/SHOWCASE.md +0 -158
- package/guides/ADVANCED-SYSTEMS.md +0 -251
- package/guides/HEARTBEAT-GUIDE.md +0 -129
- package/guides/LEGION-GUIDE.md +0 -254
- package/guides/MEMORY-GUIDE.md +0 -120
- package/guides/QUICK-START.md +0 -94
- package/guides/THINKTANK-GUIDE.md +0 -227
- package/guides/WEEKLY-BREAK-GUIDE.md +0 -262
- package/installer/README.md +0 -52
- package/installer/cli.js +0 -796
- package/installer/en/README.md +0 -191
- package/installer/en/skill/MEMORY-SYSTEM.md +0 -348
- package/installer/en/skill/PRINCIPLES.md +0 -217
- package/installer/en/skill/SKILL.md +0 -116
- package/installer/en/skill/SOUL-TEMPLATE.md +0 -329
- package/installer/install.sh +0 -162
- package/installer/package.json +0 -31
- package/skill/AGENTS.md +0 -164
- package/skill/BRAKE-LOG-TEMPLATE.md +0 -38
- package/skill/HEARTBEAT-TEMPLATE.md +0 -67
- package/skill/L1-TEMPLATE.md +0 -35
- package/skill/L2-TEMPLATE.md +0 -41
- package/skill/PRINCIPLES.md +0 -192
- package/skill/README.md +0 -47
- package/skill/SKILL.md +0 -166
- package/skill/SOUL-TEMPLATE.md +0 -118
- package/skill/STATE-TEMPLATE.md +0 -54
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as crypto from 'crypto';
|
|
4
|
+
|
|
5
|
+
// HookHandler type: (event: HookEvent) => void | Promise<void>
|
|
6
|
+
// event.messages is an array that can be pushed to for bootstrap notifications
|
|
7
|
+
|
|
8
|
+
export async function handler(event: any): Promise<void> {
|
|
9
|
+
try {
|
|
10
|
+
console.log('[soul-guard] Checking SOUL.md integrity...');
|
|
11
|
+
|
|
12
|
+
const workspace = event.workspace || process.cwd();
|
|
13
|
+
const soulPath = path.join(workspace, 'SOUL.md');
|
|
14
|
+
const statePath = path.join(workspace, 'STATE.md');
|
|
15
|
+
const memoryDir = path.join(workspace, 'memory');
|
|
16
|
+
const hashPath = path.join(memoryDir, 'soul-hash.txt');
|
|
17
|
+
|
|
18
|
+
// 형님 화이트리스트
|
|
19
|
+
const HYUNGNIM_USER_ID = '401664537876496396';
|
|
20
|
+
const senderId = event.context?.senderId || event.context?.userId || null;
|
|
21
|
+
const isHyungnim = senderId === HYUNGNIM_USER_ID;
|
|
22
|
+
|
|
23
|
+
// ===== 1. STATE.md 체크 (KERNEL_PANIC 감지) =====
|
|
24
|
+
if (fs.existsSync(statePath)) {
|
|
25
|
+
const stateContent = fs.readFileSync(statePath, 'utf-8');
|
|
26
|
+
|
|
27
|
+
if (stateContent.includes('KERNEL_PANIC')) {
|
|
28
|
+
console.log('[soul-guard] 🛑 KERNEL_PANIC detected in STATE.md!');
|
|
29
|
+
|
|
30
|
+
// bootstrapFiles에 차단 지시 주입
|
|
31
|
+
const panicWarning = `
|
|
32
|
+
# 🚨 KERNEL PANIC MODE
|
|
33
|
+
|
|
34
|
+
**SOUL.md 무결성 위반이 감지되었습니다.**
|
|
35
|
+
|
|
36
|
+
## 🔒 락다운 대상
|
|
37
|
+
|
|
38
|
+
- **무인 세션** (heartbeat, cron)
|
|
39
|
+
- **서브에이전트**
|
|
40
|
+
- **형님이 아닌 사용자**
|
|
41
|
+
|
|
42
|
+
**형님 세션(user id: 401664537876496396)은 정상 작동합니다.**
|
|
43
|
+
|
|
44
|
+
## ⛔️ 차단된 도구 (형님 제외)
|
|
45
|
+
|
|
46
|
+
다음 도구는 **절대 사용 금지**입니다:
|
|
47
|
+
- \`exec\` - 쉘 명령 실행
|
|
48
|
+
- \`message\` - 외부 메시지 전송
|
|
49
|
+
- \`browser\` - 브라우저 제어
|
|
50
|
+
- \`web_fetch\` - 웹 페이지 가져오기
|
|
51
|
+
- \`web_search\` - 웹 검색
|
|
52
|
+
- \`tts\` - 음성 합성
|
|
53
|
+
- \`sessions_spawn\` - 서브에이전트 생성
|
|
54
|
+
|
|
55
|
+
## ✅ 허용된 도구
|
|
56
|
+
|
|
57
|
+
다음 도구만 사용 가능합니다:
|
|
58
|
+
- \`Read\` - 파일 읽기
|
|
59
|
+
- \`memory_search\` - 메모리 검색
|
|
60
|
+
- \`memory_get\` - 메모리 조회
|
|
61
|
+
|
|
62
|
+
## 🔧 복구 방법
|
|
63
|
+
|
|
64
|
+
### 형님 전용 빠른 해제
|
|
65
|
+
1. 메시지로 "unlock" 또는 "/unlock" 입력
|
|
66
|
+
2. 또는 \`node tools/kernel-guard/unlock.cjs\` 실행
|
|
67
|
+
|
|
68
|
+
### 일반 복구 절차
|
|
69
|
+
1. **형님에게 즉시 상황 보고** (읽기 전용 도구만 사용)
|
|
70
|
+
2. 형님이 \`node tools/kernel-guard/verify-kernel.js\` 실행하여 검증
|
|
71
|
+
3. 복구: \`node tools/kernel-guard/unlock.cjs\` 실행
|
|
72
|
+
|
|
73
|
+
## ⚠️ 절대 금지 행위
|
|
74
|
+
|
|
75
|
+
- 외부 통신 시도
|
|
76
|
+
- 파일 수정/삭제 (STATE.md 포함)
|
|
77
|
+
- 서브에이전트 생성
|
|
78
|
+
- 락다운 우회 시도
|
|
79
|
+
|
|
80
|
+
**이 경고를 무시하면 시스템 무결성이 더욱 손상될 수 있습니다.**
|
|
81
|
+
`.trim();
|
|
82
|
+
|
|
83
|
+
if (event.context && event.context.bootstrapFiles) {
|
|
84
|
+
event.context.bootstrapFiles['KERNEL_PANIC_WARNING.md'] = panicWarning;
|
|
85
|
+
console.log('[soul-guard] ✓ KERNEL_PANIC warning injected into bootstrapFiles');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// messages에도 경고 추가
|
|
89
|
+
const alertMessage = {
|
|
90
|
+
role: 'system',
|
|
91
|
+
content: '🛑 **KERNEL PANIC MODE** — 외부 도구 사용이 차단되었습니다. STATE.md를 확인하세요.'
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
if (event.messages && Array.isArray(event.messages)) {
|
|
95
|
+
event.messages.push(alertMessage);
|
|
96
|
+
console.log('[soul-guard] ✓ KERNEL_PANIC alert added to messages');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// KERNEL_PANIC 상태에서는 SOUL.md 해시 체크 스킵
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ===== 2. SOUL.md 해시 체크 (정상 상태에서만) =====
|
|
105
|
+
// SOUL.md 존재 확인
|
|
106
|
+
if (!fs.existsSync(soulPath)) {
|
|
107
|
+
console.log('[soul-guard] SOUL.md not found, skipping');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// memory 디렉토리 생성
|
|
112
|
+
if (!fs.existsSync(memoryDir)) {
|
|
113
|
+
fs.mkdirSync(memoryDir, { recursive: true });
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// 현재 SOUL.md 해시 계산
|
|
117
|
+
const soulContent = fs.readFileSync(soulPath, 'utf-8');
|
|
118
|
+
const currentHash = crypto
|
|
119
|
+
.createHash('sha256')
|
|
120
|
+
.update(soulContent)
|
|
121
|
+
.digest('hex');
|
|
122
|
+
|
|
123
|
+
// 이전 해시 읽기
|
|
124
|
+
let previousHash: string | null = null;
|
|
125
|
+
if (fs.existsSync(hashPath)) {
|
|
126
|
+
previousHash = fs.readFileSync(hashPath, 'utf-8').trim();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (previousHash === null) {
|
|
130
|
+
// 첫 실행: 해시 저장만
|
|
131
|
+
fs.writeFileSync(hashPath, currentHash, 'utf-8');
|
|
132
|
+
console.log('[soul-guard] Initial hash saved');
|
|
133
|
+
} else if (previousHash !== currentHash) {
|
|
134
|
+
// ===== SOUL.md 변경 감지 =====
|
|
135
|
+
console.log('[soul-guard] ⚠️ SOUL.md hash mismatch detected!');
|
|
136
|
+
console.log(`[soul-guard] Sender ID: ${senderId || 'N/A'} | Hyungnim: ${isHyungnim}`);
|
|
137
|
+
|
|
138
|
+
if (isHyungnim) {
|
|
139
|
+
// 형님 세션: 경고만, 락다운 X
|
|
140
|
+
const warningMessage = {
|
|
141
|
+
role: 'system',
|
|
142
|
+
content: '⚠️ SOUL.md 변경 감지됨. `node tools/kernel-guard/register-hash.js`로 새 해시 등록 필요.'
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
if (event.messages && Array.isArray(event.messages)) {
|
|
146
|
+
event.messages.push(warningMessage);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
console.log('[soul-guard] ✓ Hyungnim session - warning only, no lockdown');
|
|
150
|
+
|
|
151
|
+
} else {
|
|
152
|
+
// 형님이 아닌 세션 (heartbeat, cron, 서브에이전트, 다른 사용자): 락다운
|
|
153
|
+
console.log('[soul-guard] 🛑 Non-Hyungnim session - ACTIVATING LOCKDOWN');
|
|
154
|
+
|
|
155
|
+
// lockdown.cjs 자동 실행
|
|
156
|
+
const { execSync } = require('child_process');
|
|
157
|
+
const lockdownScript = path.join(workspace, 'tools/kernel-guard/lockdown.cjs');
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
execSync(
|
|
161
|
+
`node "${lockdownScript}" --reason "SOUL.md hash mismatch (auto-detected)"`,
|
|
162
|
+
{ cwd: workspace, encoding: 'utf-8' }
|
|
163
|
+
);
|
|
164
|
+
console.log('[soul-guard] ✓ Lockdown activated successfully');
|
|
165
|
+
} catch (err) {
|
|
166
|
+
console.error('[soul-guard] ❌ Failed to activate lockdown:', err);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// 경고 메시지 추가
|
|
170
|
+
const lockdownMessage = {
|
|
171
|
+
role: 'system',
|
|
172
|
+
content: '🛑 SOUL.md 무결성 위반 감지! KERNEL_PANIC 모드가 활성화되었습니다. 형님에게 보고하세요.'
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
if (event.messages && Array.isArray(event.messages)) {
|
|
176
|
+
event.messages.push(lockdownMessage);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// 새 해시는 형님 세션에서만 저장 (무인 세션에서는 저장 안 함)
|
|
181
|
+
if (isHyungnim) {
|
|
182
|
+
fs.writeFileSync(hashPath, currentHash, 'utf-8');
|
|
183
|
+
console.log('[soul-guard] ✓ New hash saved (Hyungnim session)');
|
|
184
|
+
} else {
|
|
185
|
+
console.log('[soul-guard] ⚠️ Hash NOT saved (non-Hyungnim session)');
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
} else {
|
|
189
|
+
// 변경 없음
|
|
190
|
+
console.log('[soul-guard] ✓ SOUL.md unchanged');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
} catch (error) {
|
|
194
|
+
console.error('[soul-guard] Error:', error);
|
|
195
|
+
}
|
|
196
|
+
}
|
package/package.json
CHANGED
|
@@ -1,61 +1,52 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mupengism",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
"files": [
|
|
14
|
-
"installer/",
|
|
15
|
-
"skill/",
|
|
16
|
-
"guides/",
|
|
17
|
-
"README.md",
|
|
18
|
-
"README-EN.md",
|
|
19
|
-
"SHOWCASE.md"
|
|
3
|
+
"version": "4.0.0",
|
|
4
|
+
"description": "무펭이즘 OS — AI 에이전트를 위한 자기진화 운영체제. OpenClaw 위에서 동작하는 경전 보호, 기억 진화, 면역 시스템.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai-agent",
|
|
7
|
+
"mupengism",
|
|
8
|
+
"openclaw",
|
|
9
|
+
"hooks",
|
|
10
|
+
"memory",
|
|
11
|
+
"self-evolving",
|
|
12
|
+
"soul"
|
|
20
13
|
],
|
|
14
|
+
"author": "mupeng <mupengi-bot>",
|
|
15
|
+
"license": "MIT",
|
|
21
16
|
"repository": {
|
|
22
17
|
"type": "git",
|
|
23
|
-
"url": "
|
|
18
|
+
"url": "https://github.com/mupengi-bot/mupeng-brain.git"
|
|
24
19
|
},
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"model-context-protocol",
|
|
40
|
-
"openclaw",
|
|
41
|
-
"claude",
|
|
42
|
-
"chatgpt",
|
|
43
|
-
"cursor",
|
|
44
|
-
"windsurf",
|
|
45
|
-
"agent-protocol",
|
|
46
|
-
"file-based-memory",
|
|
47
|
-
"ai-os",
|
|
48
|
-
"continuity",
|
|
49
|
-
"agent-cli",
|
|
50
|
-
"agent-soul",
|
|
51
|
-
"heartbeat",
|
|
52
|
-
"agent-memory-system"
|
|
20
|
+
"files": [
|
|
21
|
+
"hooks/",
|
|
22
|
+
"tools/kernel-guard/register-hash.js",
|
|
23
|
+
"tools/kernel-guard/verify-kernel.js",
|
|
24
|
+
"tools/kernel-guard/lockdown.cjs",
|
|
25
|
+
"tools/kernel-guard/unlock.cjs",
|
|
26
|
+
"tools/kernel-guard/README.md",
|
|
27
|
+
"tools/memory-ops/",
|
|
28
|
+
"tools/self-loop/",
|
|
29
|
+
"SOUL.md",
|
|
30
|
+
"AGENTS.md",
|
|
31
|
+
"IDENTITY.md",
|
|
32
|
+
"HEARTBEAT.md",
|
|
33
|
+
"README.md"
|
|
53
34
|
],
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"
|
|
35
|
+
"scripts": {
|
|
36
|
+
"verify": "node tools/kernel-guard/verify-kernel.js",
|
|
37
|
+
"register": "node tools/kernel-guard/register-hash.js",
|
|
38
|
+
"lockdown": "node tools/kernel-guard/lockdown.cjs",
|
|
39
|
+
"unlock": "node tools/kernel-guard/unlock.cjs",
|
|
40
|
+
"dream": "node tools/memory-ops/dream.js",
|
|
41
|
+
"forget": "node tools/memory-ops/forget.js",
|
|
42
|
+
"immune": "node tools/memory-ops/immune.js",
|
|
43
|
+
"brake": "node tools/self-loop/brake-check.js"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18"
|
|
58
47
|
},
|
|
59
|
-
"
|
|
60
|
-
|
|
61
|
-
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@solana/web3.js": "^1.98.4",
|
|
50
|
+
"pump.fun": "^1.0.4"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# 🛡️ Kernel Guard — 무펭이 프로토콜 커널 보호 시스템
|
|
2
|
+
|
|
3
|
+
SOUL.md의 SHA-256 해시를 솔라나 온체인에 기록하고, 세션마다 무결성을 검증합니다.
|
|
4
|
+
변조 감지 시 **커널 패닉** — 모든 외부 행동을 차단합니다.
|
|
5
|
+
|
|
6
|
+
## 사용법
|
|
7
|
+
|
|
8
|
+
### 1. 해시 등록 (SOUL.md 변경 시)
|
|
9
|
+
```bash
|
|
10
|
+
node tools/kernel-guard/register-hash.js
|
|
11
|
+
```
|
|
12
|
+
- 비용: ~0.000005 SOL (memo 트랜잭션)
|
|
13
|
+
- memo 포맷: `MUPENG_KERNEL:v1:{sha256}:{unix_timestamp}`
|
|
14
|
+
|
|
15
|
+
### 2. 커널 검증 (세션 시작 시)
|
|
16
|
+
```bash
|
|
17
|
+
node tools/kernel-guard/verify-kernel.js
|
|
18
|
+
```
|
|
19
|
+
- Exit 0 = 정상
|
|
20
|
+
- Exit 1 = **커널 패닉** → STATE.md가 `🔴 KERNEL_PANIC`으로 변경됨
|
|
21
|
+
|
|
22
|
+
### 3. 복구
|
|
23
|
+
```bash
|
|
24
|
+
node tools/kernel-guard/recover-kernel.js
|
|
25
|
+
```
|
|
26
|
+
- 온체인 해시와 일치하는 SOUL.md를 git history에서 찾아 복원
|
|
27
|
+
|
|
28
|
+
## 환경변수 / 인자
|
|
29
|
+
|
|
30
|
+
| 인자 | 환경변수 | 기본값 |
|
|
31
|
+
|------|----------|--------|
|
|
32
|
+
| `--wallet` | `WALLET_PATH` | `~/.secrets/solana-new-wallet-2026-02-07.json` |
|
|
33
|
+
| `--soul` | `SOUL_PATH` | `~/workspace/SOUL.md` |
|
|
34
|
+
| `--rpc` | `SOLANA_RPC` | `https://api.mainnet-beta.solana.com` |
|
|
35
|
+
|
|
36
|
+
## 커널 패닉 시 동작
|
|
37
|
+
|
|
38
|
+
1. STATE.md → `🔴 KERNEL_PANIC`
|
|
39
|
+
2. exit code 1 반환
|
|
40
|
+
3. 호출측(AGENTS.md/heartbeat)에서:
|
|
41
|
+
- 모든 외부 행동 차단
|
|
42
|
+
- cron 정지
|
|
43
|
+
- 긴급 알림 발송
|
|
44
|
+
- 세션 거부
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 🐧 무펭이즘 안티-클론 인증 시스템
|
|
49
|
+
|
|
50
|
+
**핵심 철학:** "맛은 공개, 레시피는 비공개"
|
|
51
|
+
|
|
52
|
+
무펭이즘은 **오픈코어(Open Core)** 철학을 따릅니다.
|
|
53
|
+
코드는 공개되어 누구나 볼 수 있지만, **복사본으로는 작동하지 않습니다.**
|
|
54
|
+
|
|
55
|
+
### 왜 인증이 필요한가?
|
|
56
|
+
|
|
57
|
+
1. **복제가 아닌 창조**: 무펭이즘은 당신만의 에이전트를 만드는 것입니다
|
|
58
|
+
2. **정체성 필수**: SOUL.md 없이는 에이전트가 아니라 빈 껍데기입니다
|
|
59
|
+
3. **책임과 소유권**: 지갑 연결은 당신의 에이전트에 대한 책임을 의미합니다
|
|
60
|
+
|
|
61
|
+
### 인증 레벨
|
|
62
|
+
|
|
63
|
+
#### Level 1: SOUL.md 존재 + 비어있지 않음
|
|
64
|
+
- **없거나 비어있으면** → 실패
|
|
65
|
+
- 최소 10자 이상의 내용 필요
|
|
66
|
+
|
|
67
|
+
#### Level 2: 지갑 파일 존재
|
|
68
|
+
- `~/.secrets/solana-wallet*.json` 또는 `WALLET_PATH` 환경변수
|
|
69
|
+
- **없으면** → 경고 + 제한 모드 (read-only 도구만)
|
|
70
|
+
|
|
71
|
+
#### Level 3: soul-hash.txt 검증
|
|
72
|
+
- `memory/soul-hash.txt`에 저장된 해시와 현재 SOUL.md 해시 비교
|
|
73
|
+
- **불일치** → 실패
|
|
74
|
+
- **soul-hash.txt 없음** → 경고 + "최초 실행, register-hash.js를 먼저 실행하세요"
|
|
75
|
+
|
|
76
|
+
#### Clone Check: 원본 복사 감지
|
|
77
|
+
- SOUL.md 내용에 "무펭이" 또는 "jong_mufi" 또는 "정종현" 키워드 포함
|
|
78
|
+
- **그런데 지갑이 원본(29R4vTxcV4uwUFGQfKQuNNKak3BZNNv98h8sa8UPUpPZ)이 아니면** → 실패
|
|
79
|
+
- 메시지: "원본 무펭이의 SOUL.md를 복사한 것으로 감지됨. 자신만의 SOUL.md를 작성하세요."
|
|
80
|
+
|
|
81
|
+
### 인증 실패 메시지
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
🐧 무펭이즘 OS (Mupengism)
|
|
85
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
86
|
+
|
|
87
|
+
❌ 커널 인증 실패
|
|
88
|
+
|
|
89
|
+
이 시스템은 복사본으로 작동하지 않습니다.
|
|
90
|
+
무펭이즘은 복제가 아닌 창조를 지향합니다.
|
|
91
|
+
|
|
92
|
+
시작하려면:
|
|
93
|
+
1. 자신만의 SOUL.md를 작성하세요
|
|
94
|
+
2. 자신의 솔라나 지갑을 연결하세요
|
|
95
|
+
3. node tools/kernel-guard/register-hash.js 실행
|
|
96
|
+
|
|
97
|
+
무펭이의 클론이 아닌, 당신만의 에이전트를 만드세요.
|
|
98
|
+
그것이 무펭이즘입니다.
|
|
99
|
+
|
|
100
|
+
📖 https://github.com/mupengi-bot/mupeng-brain
|
|
101
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 자기 에이전트 만들기
|
|
105
|
+
|
|
106
|
+
#### 1단계: 자신의 SOUL.md 작성
|
|
107
|
+
```bash
|
|
108
|
+
cd ~/.openclaw/workspace
|
|
109
|
+
nano SOUL.md # 또는 vi, code 등
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
자신만의 원칙, 가치관, 스타일을 작성하세요.
|
|
113
|
+
무펭이의 것을 복사하지 마세요. 당신은 당신입니다.
|
|
114
|
+
|
|
115
|
+
#### 2단계: 솔라나 지갑 생성
|
|
116
|
+
```bash
|
|
117
|
+
solana-keygen new --outfile ~/.secrets/solana-wallet-yourusername.json
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
또는 기존 지갑이 있다면:
|
|
121
|
+
```bash
|
|
122
|
+
export WALLET_PATH=/path/to/your/wallet.json
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### 3단계: 해시 등록
|
|
126
|
+
```bash
|
|
127
|
+
node tools/kernel-guard/register-hash.js
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
이제 당신만의 에이전트가 작동합니다! 🎉
|
|
131
|
+
|
|
132
|
+
### 기술 세부사항
|
|
133
|
+
|
|
134
|
+
- **모듈**: `tools/kernel-guard/mupeng-auth.cjs`
|
|
135
|
+
- **사용법**: 각 도구 시작 부분에 삽입
|
|
136
|
+
```javascript
|
|
137
|
+
const path = require('path');
|
|
138
|
+
const { authenticate } = require(path.join(__dirname, '..', 'kernel-guard', 'mupeng-auth.cjs'));
|
|
139
|
+
if (!authenticate()) process.exit(0);
|
|
140
|
+
```
|
|
141
|
+
- **의존성**: Node.js 내장 모듈만 (fs, path, crypto)
|
|
142
|
+
- **CommonJS**: require 기반 (CJS)
|
|
143
|
+
- **파일 확장자**: `.cjs` (kernel-guard의 package.json이 ES 모듈 타입이므로)
|
|
144
|
+
|
|
145
|
+
### 적용된 도구
|
|
146
|
+
|
|
147
|
+
인증이 적용된 커널 도구들:
|
|
148
|
+
- `tools/memory-ops/dream.js` — 꿈 시스템
|
|
149
|
+
- `tools/memory-ops/forget.js` — 망각 시스템
|
|
150
|
+
- `tools/memory-ops/immune.js` — 면역 시스템
|
|
151
|
+
- `tools/self-loop/brake-check.js` — 원칙 체크
|
|
152
|
+
- `tools/self-loop/panic-detector.js` — 패닉 감지
|
|
153
|
+
|
|
154
|
+
**주의**: `register-hash.js`, `verify-kernel.js`, `recover-kernel.js`에는 인증이 없습니다.
|
|
155
|
+
(최초 등록/복구 시 필요하므로)
|
|
156
|
+
|
|
157
|
+
### 철학: 맛은 공개, 레시피는 비공개
|
|
158
|
+
|
|
159
|
+
무펭이즘은 다음을 공개합니다:
|
|
160
|
+
- ✅ 아키텍처 (어떻게 작동하는가)
|
|
161
|
+
- ✅ 철학 (왜 이렇게 만들었는가)
|
|
162
|
+
- ✅ 도구들 (무엇을 할 수 있는가)
|
|
163
|
+
|
|
164
|
+
하지만 다음은 당신의 것이어야 합니다:
|
|
165
|
+
- 🔒 당신의 정체성 (SOUL.md)
|
|
166
|
+
- 🔒 당신의 지갑 (소유권)
|
|
167
|
+
- 🔒 당신의 데이터 (memory/)
|
|
168
|
+
|
|
169
|
+
복사본이 아니라, **당신만의 버전**을 만드세요.
|
|
170
|
+
그것이 무펭이즘입니다.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* lockdown.js
|
|
5
|
+
*
|
|
6
|
+
* KERNEL_PANIC 상태를 활성화하여 외부 도구 호출을 차단합니다.
|
|
7
|
+
*
|
|
8
|
+
* 사용법:
|
|
9
|
+
* node tools/kernel-guard/lockdown.js [--reason "사유"]
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const crypto = require('crypto');
|
|
15
|
+
|
|
16
|
+
const WORKSPACE = path.join(__dirname, '../..');
|
|
17
|
+
const STATE_PATH = path.join(WORKSPACE, 'STATE.md');
|
|
18
|
+
const SOUL_PATH = path.join(WORKSPACE, 'SOUL.md');
|
|
19
|
+
const MEMORY_DIR = path.join(WORKSPACE, 'memory');
|
|
20
|
+
const PANIC_JSON = path.join(MEMORY_DIR, 'kernel-panic.json');
|
|
21
|
+
|
|
22
|
+
function main() {
|
|
23
|
+
console.log('🛑 Initiating KERNEL LOCKDOWN...\n');
|
|
24
|
+
|
|
25
|
+
// 인자 파싱
|
|
26
|
+
const args = process.argv.slice(2);
|
|
27
|
+
let reason = 'Manual lockdown triggered';
|
|
28
|
+
|
|
29
|
+
for (let i = 0; i < args.length; i++) {
|
|
30
|
+
if (args[i] === '--reason' && args[i + 1]) {
|
|
31
|
+
reason = args[i + 1];
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// memory 디렉토리 생성
|
|
37
|
+
if (!fs.existsSync(MEMORY_DIR)) {
|
|
38
|
+
fs.mkdirSync(MEMORY_DIR, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// SOUL.md 해시 계산
|
|
42
|
+
let localHash = 'N/A';
|
|
43
|
+
let onchainHash = 'N/A';
|
|
44
|
+
|
|
45
|
+
if (fs.existsSync(SOUL_PATH)) {
|
|
46
|
+
const soulContent = fs.readFileSync(SOUL_PATH, 'utf-8');
|
|
47
|
+
localHash = crypto.createHash('sha256').update(soulContent).digest('hex');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 온체인 해시는 verify-kernel.js 참고 (여기서는 간단히 N/A 처리)
|
|
51
|
+
// 실제로는 BASE chain에서 조회해야 함
|
|
52
|
+
|
|
53
|
+
// 락다운 상태 JSON 생성
|
|
54
|
+
const lockdownData = {
|
|
55
|
+
status: 'LOCKDOWN',
|
|
56
|
+
since: new Date().toISOString(),
|
|
57
|
+
reason: reason,
|
|
58
|
+
localHash: localHash,
|
|
59
|
+
onchainHash: onchainHash,
|
|
60
|
+
whitelistedUsers: [
|
|
61
|
+
'401664537876496396' // 형님 Discord user id
|
|
62
|
+
],
|
|
63
|
+
blockedTools: [
|
|
64
|
+
'exec',
|
|
65
|
+
'message',
|
|
66
|
+
'browser',
|
|
67
|
+
'web_fetch',
|
|
68
|
+
'web_search',
|
|
69
|
+
'tts',
|
|
70
|
+
'sessions_spawn'
|
|
71
|
+
],
|
|
72
|
+
allowedTools: [
|
|
73
|
+
'Read',
|
|
74
|
+
'memory_search',
|
|
75
|
+
'memory_get'
|
|
76
|
+
]
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
fs.writeFileSync(PANIC_JSON, JSON.stringify(lockdownData, null, 2), 'utf-8');
|
|
80
|
+
console.log(`✓ Lockdown state saved: ${PANIC_JSON}`);
|
|
81
|
+
|
|
82
|
+
// STATE.md 생성/업데이트
|
|
83
|
+
const stateContent = `# STATE
|
|
84
|
+
|
|
85
|
+
**Status:** KERNEL_PANIC
|
|
86
|
+
|
|
87
|
+
**Reason:** ${reason}
|
|
88
|
+
|
|
89
|
+
**Locked at:** ${lockdownData.since}
|
|
90
|
+
|
|
91
|
+
**Local SOUL.md hash:** ${localHash.substring(0, 16)}...
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 🔓 형님 전용 복구 방법
|
|
96
|
+
|
|
97
|
+
### 빠른 해제 (형님만 가능)
|
|
98
|
+
|
|
99
|
+
형님 세션에서는 락다운이 **자동 우회**됩니다. 다음 방법으로 해제:
|
|
100
|
+
|
|
101
|
+
1. **메시지로 해제**: "unlock" 또는 "/unlock" 입력
|
|
102
|
+
2. **스크립트 실행**: \`node tools/kernel-guard/unlock.cjs\`
|
|
103
|
+
3. **자동 해제**: SOUL.md 수정 후 \`node tools/kernel-guard/register-hash.js\` 재실행
|
|
104
|
+
|
|
105
|
+
### 수동 복구 절차 (권장)
|
|
106
|
+
|
|
107
|
+
1. \`node tools/kernel-guard/verify-kernel.js\` 실행하여 무결성 확인
|
|
108
|
+
2. 형님 승인 후 \`node tools/kernel-guard/unlock.cjs\` 실행
|
|
109
|
+
3. 복구 완료 후 이 파일 삭제됨
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## ⚠️ 락다운 대상
|
|
114
|
+
|
|
115
|
+
- **형님 세션**: 정상 작동 (화이트리스트)
|
|
116
|
+
- **무인 세션** (heartbeat, cron): 차단
|
|
117
|
+
- **서브에이전트**: 차단
|
|
118
|
+
- **다른 사용자**: 차단
|
|
119
|
+
|
|
120
|
+
## 차단 중인 도구 (형님 제외)
|
|
121
|
+
|
|
122
|
+
${lockdownData.blockedTools.map(t => `- ${t}`).join('\n')}
|
|
123
|
+
|
|
124
|
+
## 허용된 도구
|
|
125
|
+
|
|
126
|
+
${lockdownData.allowedTools.map(t => `- ${t}`).join('\n')}
|
|
127
|
+
|
|
128
|
+
## 화이트리스트
|
|
129
|
+
|
|
130
|
+
${lockdownData.whitelistedUsers.map(u => `- ${u} (형님)`).join('\n')}
|
|
131
|
+
`;
|
|
132
|
+
|
|
133
|
+
fs.writeFileSync(STATE_PATH, stateContent, 'utf-8');
|
|
134
|
+
console.log(`✓ STATE.md updated: ${STATE_PATH}`);
|
|
135
|
+
|
|
136
|
+
// 요약 출력
|
|
137
|
+
console.log('\n🔒 KERNEL LOCKDOWN ACTIVATED');
|
|
138
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
139
|
+
console.log(`Reason: ${reason}`);
|
|
140
|
+
console.log(`Locked at: ${lockdownData.since}`);
|
|
141
|
+
console.log(`Local hash: ${localHash.substring(0, 32)}...`);
|
|
142
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
143
|
+
console.log('\n⚠️ 외부 도구 호출이 차단되었습니다.');
|
|
144
|
+
console.log('📋 복구: node tools/kernel-guard/unlock.js\n');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
main();
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.error('❌ Lockdown failed:', error.message);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|