𧬠Evolver.php é¡¹ç®æ·±åºŠåææ¥å
ð æ§è¡æèŠ
Evolver.php æ¯äžäžªåèœå®å€ç Capability Evolver åŒæç PHP 8.3+ å®ç°ïŒéè¿ MCP (Model Context Protocol) stdio æå¡åšæ¹åŒæŽé²ïŒéçš SQLite è¿è¡æ¬å°åæ°æ®ååšãè¿æ¯äžäžªæççãç产就绪çèªæŒåç³»ç»ïŒå
·æå®åçå®å
šæš¡ååæµè¯èŠçã
---
1ïžâ£ é¡¹ç®æŠè§
æ žå¿å®äœ
- 纯 PHP ç§»æ€çïŒ1:1 ç§»æ€èª EvoMap/evolver (JavaScript çæ¬)
- MCP stdio æå¡åšïŒé¶å¹³å°äŸèµïŒéè¿ stdin/stdout è¿è¡ JSON-RPC 2.0 éä¿¡
- ä¿¡å·é©±åšçæŒååŒæïŒä»æ¥å¿/äžäžææåä¿¡å·ïŒèªåšè§Šååºå éæ©åæŒå
- å蜚ç¥è¯ç³»ç»ïŒGenesïŒå¯å€çšçç¥æš¡æ¿ïŒ+ CapsulesïŒæåç»æå¿«ç
§ïŒ
ææ¯æ
| ç»ä»¶ | ææ¯éå |
|---|
| è¯èš | PHP 8.3+ (äž¥æ Œç±»åæš¡åŒ) |
| æ°æ®åº | SQLite3 (WAL æš¡åŒ + mmap äŒå) |
| éä¿¡åè®® | MCP (Model Context Protocol) JSON-RPC 2.0 |
| æµè¯æ¡æ¶ | PHPUnit 11.4+ |
| èªåšå 蜜 | PSR-4 |
---
2ïžâ£ æ¶æè®Ÿè®¡
2.1 æ žå¿æ¶æåŸ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â MCP Client (Claude Desktop / Kimi CLI / Gemini) â
â - JSON-RPC 2.0 over stdio â
ââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââ
â stdin/stdout
ââââââââââââââââââââââŒâââââââââââââââââââââââââââââââââ
â evolver.php (å
¥å£æä»¶) â
â - MCP æå¡åšåŒå¯Œ â
â - CLI åæ°è§£æ (--validate, --loop, --daemon) â
ââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââ
â
ââââââââââââââââââââââŒâââââââââââââââââââââââââââââââââ
â McpServer.php (MCP åè®®å±) â
â - JSON-RPC æ¶æ¯å€ç â
â - å·¥å
·åå (tools/list, tools/call) â
â - èµæºç®¡ç (resources/read) â
ââââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââ
â
ââââââââââââââââââââââŒâââââââââââââââââââââââââââââââââ
â æ žå¿åŒæå± â
â ââââââââââââââââ ââââââââââââââââ â
â â Signal â â Gene â â
â â Extractor â â Selector â â
â ââââââââ¬ââââââââ ââââââââ¬ââââââââ â
â â â â
â ââââââââââ¬âââââââââ â
â ⌠â
â âââââââââââââââââââââââââââââ â
â â PromptBuilder â â
â â (GEP 1.6.0 åè®®æç€ºæå»º) â â
â âââââââââââââ¬ââââââââââââââââ â
â â â
â âââââââââââââŒââââââââââââââââ â
â â SolidifyEngine â â
â â (éªè¯ + åºå + ççžååŸè®¡ç®) â â
â âââââââââââââ¬ââââââââââââââââ â
ââââââââââââââââŒâââââââââââââââââââââââââââââââââââââââ
â
ââââââââââââââââŒâââââââââââââââââââââââââââââââââââââââ
â æ°æ®æä¹
åå± â
â âââââââââââââââââââââââââââââââââââââââââââââââ â
â â GepAssetStore + Database â â
â â - Genes / Capsules / Events â â
â â - SQLite WAL + mmap (128MB) â â
â â - èªåš Schema è¿ç§» (1.5.0 â 1.6.0) â â
â âââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
2.2 ç®åœç»æåæ
Evolver.php/
âââ evolver.php # äž»å
¥å£ (MCP æå¡åšåŒå¯Œ)
âââ composer.json # äŸèµç®¡ç (ä»
PHPUnit)
âââ phpunit.xml # æµè¯é
眮
â
âââ src/ # æ žå¿æºä»£ç (47 䞪æä»¶)
â âââ McpServer.php # MCP åè®®å®ç°
â âââ Database.php # SQLite å°è£
+ èªåšè¿ç§»
â âââ GepAssetStore.php # Gene/Capsule/Event ååš
â âââ SignalExtractor.php # ä¿¡å·æå (35+ ç§ä¿¡å·ç±»å)
â âââ GeneSelector.php # åºå éæ©åŒæ (æŒç§»ç®æ³)
â âââ PromptBuilder.php # GEP æç€ºæå»º (1.6.0 åè®®)
â âââ SolidifyEngine.php # åºååŒæ + å®å
šéªè¯
â âââ SafetyController.php # å®å
šæš¡åŒæ§å¶
â âââ SourceProtector.php # æºæä»¶ä¿æ€
â âââ BlastRadiusCalculator.php # ççžååŸè®¡ç®
â âââ ContentHash.php # SHA-256 èµäº§ååž
â âââ MemoryGraph.php # ç¥è¯åŸè°±
â âââ A2A.php # Agent-to-Agent åè®®
â âââ EvolutionLoop.php # è¿ç»æŒå埪ç¯
â â
â âââ Ops/ # è¿ç»Žå·¥å
· (14 䞪æä»¶)
â âââ LifecycleManager.php
â âââ HealthCheck.php
â âââ DiskCleaner.php
â âââ SignalDeduplicator.php
â âââ SecurityAuditLogger.php
â âââ ...
â
âââ tests/ # æµè¯å¥ä»¶ (44 䞪æµè¯æä»¶)
â âââ DatabaseTest.php
â âââ SignalExtractorTest.php
â âââ McpServerTest.php
â âââ GepAssetStoreTest.php
â âââ ...
â
âââ data/
â âââ default_genes.json # é»è®€åºå ç§åæ°æ® (6 䞪åºå )
â
âââ scripts/ # å·¥å
·èæ¬
âââ evolver-validate.php # å®è£
éªè¯å·¥å
·
âââ evolver-report.php # æ¥åçæ
âââ ...
---
3ïžâ£ æ žå¿åèœæš¡å深床åæ
è莣ïŒå®ç° MCP åè®®ïŒå€ç JSON-RPC 2.0 æ¶æ¯
å
³é®ç¹æ§ïŒ
- â
宿Žç MCP èœåïŒ
tools/list, tools/call, resources/list, resources/read
- â
12 䞪å¯çšå·¥å
·ïŒ
evolver_run - è¿è¡æŒååšæ
evolver_solidify - åºåç»æ
evolver_extract_signals - æåä¿¡å·
evolver_upsert_gene/delete_gene - åºå 管ç
evolver_stats - ç»è®¡ä¿¡æ¯
evolver_safety_status - å®å
šç¶æ
evolver_sync_to_hub - åæ¥å° EvoMap Hub
代ç 莚éïŒ
- äž¥æ Œç±»å声æ
- é误å€çå®å (try-catch + error_log)
- çåœåšæç®¡ç (startup/shutdown hooks)
---
Schema çæ¬ïŒ1.6.0
æ žå¿è¡šç»æïŒ
-- Genes 衚 (çç¥æš¡æ¿)
CREATE TABLE genes (
id TEXT PRIMARY KEY,
category TEXT NOT NULL DEFAULT 'repair',
asset_id TEXT, -- SHA-256 å
容ååž
schema_version TEXT DEFAULT '1.6.0',
data TEXT NOT NULL, -- JSON çŒç ç宿Žåºå æ°æ®
created_at TEXT,
updated_at TEXT
);
-- Capsules 衚 (æåå¿«ç
§)
CREATE TABLE capsules (
id TEXT PRIMARY KEY,
gene_id TEXT,
asset_id TEXT,
data TEXT NOT NULL,
confidence REAL DEFAULT 0.5,
outcome_status TEXT,
outcome_score REAL,
env_fingerprint TEXT, -- ç¯å¢æçº¹
success_streak INTEGER,
content TEXT,
created_at TEXT
);
-- Events 衚 (æŒåäºä»¶è®°åœ)
CREATE TABLE events (
id TEXT PRIMARY KEY,
intent TEXT NOT NULL,
signals TEXT,
genes_used TEXT,
outcome_status TEXT,
outcome_score REAL,
data TEXT NOT NULL,
env_fingerprint TEXT,
mutations_tried INTEGER,
total_cycles INTEGER,
created_at TEXT
);
-- Failed Capsules 衚 (倱莥记åœ)
CREATE TABLE failed_capsules (
id TEXT PRIMARY KEY,
gene_id TEXT,
trigger_signals TEXT,
failure_reason TEXT,
diff_snapshot TEXT,
created_at TEXT
);
-- Sync Status 衚 (Hub åæ¥ç¶æ)
CREATE TABLE sync_status (
id INTEGER PRIMARY KEY AUTOINCREMENT,
asset_type TEXT NOT NULL,
local_id TEXT NOT NULL,
asset_id TEXT,
sync_status TEXT DEFAULT 'pending',
last_sync_attempt TEXT,
sync_error TEXT,
created_at TEXT,
updated_at TEXT
);
æ§èœäŒåïŒ
PRAGMA journal_mode=WAL; // WAL æš¡åŒ (å¹¶å读å)
PRAGMA mmap_size=134217728; // 128MB å
åæ å°
PRAGMA synchronous=NORMAL; // 平衡æ§èœåå®å
š
PRAGMA cache_size=-65536; // 64MB çŒå
PRAGMA wal_autocheckpoint=1000; // èªå𿣿¥ç¹
èªåšè¿ç§»æºå¶ïŒ
- çæ¬æ£æµ â å¢éè¿ç§» â çæ¬æŽæ°
- æ¯æä» 1.5.0 â 1.6.0 çå¹³æ»å级
- è¿ç§»æ¥å¿è®°åœ
---
ä¿¡å·ç±»å (35+ ç§)ïŒ
| åç±» | ä¿¡å·ç€ºäŸ |
|---|
| éè¯¯ä¿¡å· | log_error, recurring_error, errsig:... |
| æºäŒä¿¡å· | user_feature_request, user_improvement_suggestion |
| æ§èœä¿¡å· | perf_bottleneck, timeout, high_cpu |
| èœåçŒºå£ | capability_gap, unsupported_input_type |
| åè®®ä¿¡å· | protocol_drift, memory_missing |
| é«çº§æ£æµ | repair_loop_detected, evolution_stagnation_detected |
é«çº§æ£æµç®æ³ïŒ
// ä¿®å€åŸªç¯æ£æµ (è¿ç» 3 次修å€å€±èŽ¥)
if ($history['consecutiveRepairCount'] >= 3) {
$signals[] = 'repair_loop_detected';
}
// 区å¶åæ°éåŒ (è¿ç» 5 次修å€)
if ($history['consecutiveRepairCount'] >= 5) {
$signals[] = 'force_innovation_after_repair_loop';
}
// åæ»æ£æµ (è¿ç» 3 æ¬¡ç©ºåšæ)
if ($history['consecutiveEmptyCycles'] >= 3) {
$signals[] = 'evolution_stagnation_detected';
}
// å€±èŽ¥çæ£æµ (60% 以äžå€±èŽ¥)
if ($history['recentFailureRatio'] >= 0.6) {
$signals[] = 'high_failure_rate';
}
代ç 亮ç¹ïŒ
- â
æ£å + å
³é®è¯åéå¹é
- â
é误çŸåè§èå (è·¯åŸ/æ°å/åå
è¿å¶æ¿æ¢)
- â
åå²äºä»¶åæ (consecutive patterns)
---
éæ©ç®æ³ïŒ
// 1. æš¡åŒå¹é
(æ¯ææ£å)
public function matchPatternToSignals(string $pattern, array $signals): bool
{
// /regex/i æ ŒåŒæ¯æ
// æç®ååå笊䞲å¹é
}
// 2. è¯åç³»ç»
public function scoreGene(array $gene, array $signals): int
{
$score = 0;
foreach ($gene['signals_match'] as $pattern) {
if ($this->matchPatternToSignals($pattern, $signals)) {
$score++;
}
}
return $score;
}
// 3. æŒç§»éæ© (Drift Selection)
// åšæé«ååºå äžéæºéæ©ïŒå¢å 倿 ·æ§
if ($driftIntensity > 0 && mt_rand() / mt_getrandmax() < $driftIntensity) {
$selectedIdx = mt_rand(0, $topN - 1);
}
æŒç§»åŒºåºŠè®¡ç®ïŒ
$driftIntensity = min(1.0, 1.0 / sqrt($effectivePopulationSize));
// åºå æ± è¶å€§ïŒæŒç§»åŒºåºŠè¶å°
---
GEP 1.6.0 åè®® - 区å¶èŸåº 5 䞪 JSON 对象ïŒ
1. Mutation (è§Šååš)
{
"type": "Mutation",
"category": "repair|optimize|innovate",
"trigger_signals": ["..."],
"risk_level": "low|medium|high"
}
2. PersonalityState (å¿æ)
{
"type": "PersonalityState",
"rigor": 0.8,
"creativity": 0.3,
"risk_tolerance": 0.5
}
3. EvolutionEvent (è®°åœ)
{
"type": "EvolutionEvent",
"schema_version": "1.6.0",
"parent": "evt_xxx",
"blast_radius": {"files": 5, "lines": 120}
}
4. Gene (ç¥è¯)
{
"type": "Gene",
"signals_match": ["..."],
"strategy": ["step1", "step2"],
"constraints": {"max_files": 20}
}
5. Capsule (ç»æå¿«ç
§)
{
"type": "Capsule",
"gene": "gene_xxx",
"confidence": 0.85
}
æç€ºäŒåïŒ
- â
äžäžææªæ (20000 å笊éå¶)
- â
ä¿¡å·å»éåæªæ (æå€ 50 䞪)
- â
åæš¡åŒåºå (倱莥è¶åèŠå)
- â
åå²å (æè¿æŒååå²)
- â
Hub 诟çšå (å€éšç¥è¯)
---
å®å
šéªè¯ïŒ
// 硬éå¶
private const MAX_FILES_HARD_LIMIT = 60;
private const MAX_LINES_HARD_LIMIT = 20000;
// èŠåéåŒ
private const BLAST_WARN_RATIO = 0.8; // 80%
private const BLAST_CRITICAL_RATIO = 2.0; // 200%
// åœä»€çœåå
private const ALLOWED_COMMAND_PREFIXES = [
'php', 'composer', 'phpunit', 'phpcs', 'phpstan'
];
// çŠæ¢ç shell æäœç¬Š
private const FORBIDDEN_SHELL_OPERATORS = [
';', '&&', '||', '|', '>', '<', '`', '$('
];
å
³é®è·¯åŸä¿æ€ïŒ
private const CRITICAL_PROTECTED_PREFIXES = [
'skills/feishu-evolver-wrapper/',
'skills/feishu-common/',
'skills/evolver/',
// ...
];
private const CRITICAL_PROTECTED_FILES = [
'MEMORY.md', 'SOUL.md', 'IDENTITY.md',
'composer.json', 'package.json', '.env'
];
éªè¯æµçšïŒ
1. æ£æ¥èªä¿®æ¹æš¡åŒ (never/review/always)
2. éªè¯æä»¶äžåšä¿æ€å衚
3. æ£æ¥ççžååŸ (æä»¶æ°/è¡æ°)
4. éªè¯åœä»€çœåå
5. æ£æµ shell 泚å
¥æäœç¬Š
---
äžç§å®å
šæš¡åŒïŒ
| æš¡åŒ | 诎æ | éçšåºæ¯ |
|---|
| never | å®å
šçŠçšèªä¿®æ¹ïŒä»
è¯æ | ç产ç¯å¢/å®¡è®¡æš¡åŒ |
| review | éèŠäººå·¥ç¡®è®€ | åŒåç¯å¢ (æšè) |
| always | å®å
šèªåšå | æµè¯ç¯å¢/åä¿¡ä»»ç¯å¢ |
æäœæéç©éµïŒ
æäœ | never | review | always
-------------|-------|--------|--------
read | â
| â
| â
diagnose | â
| â
| â
propose | â | â
| â
modify | â | â | â
---
SHA-256 èµäº§ IDïŒ
// è§èå JSON (鮿åºïŒæ°ç»ä¿åº)
public static function canonicalize(mixed $obj): string {
// éåœå€ç对象/æ°ç»
// æé€éæéæ°å
}
// 计ç®èµäº§ ID (æé€èªåŒçšå段)
public static function computeAssetId(
array|object $obj,
array $excludeFields = ['asset_id']
): ?string {
$canonical = self::canonicalize($clean);
$hash = hash('sha256', $canonical);
return 'sha256:' . $hash;
}
çšéïŒ
- â
å»éæ£æµ
- â
篡æ¹éªè¯
- â
è·šèç¹äžèŽæ§
---
4ïžâ£ å®å
šæš¡åæ·±åºŠåæ
4.1 å€å±é²æ€äœç³»
âââââââââââââââââââââââââââââââââââââââ
â SafetyController (æš¡åŒæ§å¶) â
â - never/review/always â
ââââââââââââââââ¬âââââââââââââââââââââââ
â
ââââââââââââââââŒâââââââââââââââââââââââ
â SourceProtector (æºæä»¶ä¿æ€) â
â - 硬çŒç ä¿æ€å衚 â
â - æš¡åŒå¹é
(src/Ops/*.php) â
ââââââââââââââââ¬âââââââââââââââââââââââ
â
ââââââââââââââââŒâââââââââââââââââââââââ
â SolidifyEngine (éªè¯åŒæ) â
â - ççžååŸæ£æ¥ â
â - åœä»€çœåå â
â - Shell æäœç¬Šé»æ¢ â
ââââââââââââââââ¬âââââââââââââââââââââââ
â
ââââââââââââââââŒâââââââââââââââââââââââ
â Gene Constraints (åºå 纊æ) â
â - max_files éå¶ â
â - forbidden_paths å衚 â
âââââââââââââââââââââââââââââââââââââââ
4.2 ççžååŸéå¶
硬éå¶ (äžå¯éŸè¶)ïŒ
- 60 䞪æä»¶ / 20,000 è¡ æ¯æ¬¡æŒå
èŠåéåŒïŒ
- 80% å©çšç â èŠå
- 200% å©çšç â 䞥éèŠå (å¯èœæ¹é误æäœ)
ç®åœååžåæïŒ
// èªåšåæåªäºç®åœèŽ¡ç®æå€åæŽæä»¶
$dirCount = [];
foreach ($changedFiles as $file) {
$parts = explode('/', $rel);
$key = $parts[0] . '/' . $parts[1]; // å䞀级ç®åœ
$dirCount[$key]++;
}
---
5ïžâ£ æµè¯å¥ä»¶åæ
5.1 æµè¯èŠç
æµè¯æä»¶ïŒ44 䞪æµè¯ç±»
- æ žå¿åŒæïŒ
DatabaseTest, SignalExtractorTest, GeneSelectorTest
- MCP å±ïŒ
McpServerTest
- å®å
šïŒ
SafetyControllerTest, SourceProtectorTest
- è¿ç»Žå·¥å
·ïŒ
Ops/ ç®åœäž 12 䞪æµè¯
æµè¯çç¥ïŒ
- â
å
å SQLite (
:memory:) å®ç°é犻
- â
setUp/tearDown æž
ç
- â
æèšå®æŽ (assertContains, assertNotEmpty, assertIsArray)
5.2 æµè¯ç€ºäŸ
// DatabaseTest.php
public function testDatabaseCreatesSchema(): void
{
$result = $this->db->fetchAll(
"SELECT name FROM sqlite_master WHERE type='table'"
);
$tables = array_column($result, 'name');
$this->assertContains('genes', $tables);
$this->assertContains('capsules', $tables);
}
// SignalExtractorTest.php
public function testExtractRepairLoopDetected(): void
{
$recentEvents = [
['intent' => 'repair', 'outcome' => ['status' => 'failed']],
['intent' => 'repair', 'outcome' => ['status' => 'failed']],
['intent' => 'repair', 'outcome' => ['status' => 'failed']],
];
$signals = $this->extractor->extract([
'context' => 'Some context',
'recentEvents' => $recentEvents,
]);
$this->assertContains('repair_loop_detected', $signals);
}
---
6ïžâ£ è¿ç»Žå·¥å
· (Ops æš¡å)
6.1 å¯çšå·¥å
·
| å·¥å
· | è莣 |
|---|
| LifecycleManager | å¯åš/å
³éçåœåšæç®¡ç |
| HealthCheck | ç³»ç»å¥åº·æ£æ¥ |
| DiskCleaner | æž
çæ§æ¥å¿åäžŽæ¶æä»¶ |
| SignalDeduplicator | ä¿¡å·å»é |
| SecurityAuditLogger | å®å
šå®¡è®¡æ¥å¿ |
| SkillsMonitor | æèœç®åœçæ§ |
| GitSelfRepair | Git èªä¿®å€ |
| Innovation | åæ°è§Šååš |
| Trigger | äºä»¶è§Šååš |
| Commentary | 泚éçæ |
| StructuredLogger | ç»æåæ¥å¿ |
| DaemonManager | 宿€è¿çšç®¡ç |
6.2 åœä»€è¡å·¥å
·
# éªè¯å®è£
php evolver.php --validate
# 䜿çšèªå®ä¹æ°æ®åº
php evolver.php --db /path/to.db
# è¿ç»åŸªç¯æš¡åŒ
php evolver.php --loop [interval_seconds]
# 宿€è¿çšæš¡åŒ
php evolver.php --daemon start
php evolver.php --daemon stop
php evolver.php --daemon status
# Ops åœä»€
php evolver.php --ops cleanup
php evolver.php --ops health
php evolver.php --ops stats
php evolver.php --ops gc
php evolver.php --ops dedupe
---
7ïžâ£ GEP å议诊解
7.1 åè®®æµçš
1. evolver_run å·¥å
·è°çš
â
2. SignalExtractor.extract() æåä¿¡å·
â
3. GeneSelector.selectGene() éæ©åºå
â
4. PromptBuilder.buildGepPrompt() æå»ºæç€º
â
5. LLM èŸåº 5 䞪 JSON 对象
â
6. åºçšæŽæ¹ (MCP 客æ·ç«¯æ§è¡)
â
7. evolver_solidify åºåç»æ
â
8. è®°åœ EvolutionEvent + æŽæ° Gene/Capsule
7.2 åè®®çæ¬æŒè¿
| çæ¬ | åæŽ |
|---|
| 1.5.0 | åŒå
¥ asset_id (SHA-256) |
| 1.6.0 | æ°å¢ env_fingerprint, success_streak, sync_status 衚 |
çæ¬äžäžèŽé®é¢ïŒ
- â ïž
ContentHash::SCHEMA_VERSION = '1.6.0'
- â ïž
PromptBuilder::SCHEMA_VERSION = '1.5.0' (åšä»£ç äžæªæç¡®ïŒéæ£æ¥)
---
8ïžâ£ é»è®€åºå åæ
8.1 ç§ååºå (6 䞪)
data/default_genes.json
| åºå ID | åç±» | çšé |
|---|
gene_gep_repair_from_errors | repair | ä»é误äžä¿®å€ |
gene_gep_optimize_prompt_and_assets | optimize | äŒåæç€ºåèµäº§ |
gene_gep_innovate_from_opportunity | innovate | 仿ºäŒåæ° |
gene_gep_repair_sqlite | repair | SQLite æ°æ®åºä¿®å€ |
gene_gep_harden_security | optimize | å®å
šå åº |
8.2 åºå ç»æ
{
"type": "Gene",
"id": "gene_gep_repair_from_errors",
"category": "repair",
"signals_match": ["error", "exception", "log_error"],
"preconditions": ["signals contains error-related indicators"],
"strategy": [
"Extract structured signals from logs",
"Select an existing Gene by signals match",
"Estimate blast radius before editing",
"Apply smallest reversible patch",
"Validate using declared validation steps"
],
"constraints": {
"max_files": 20,
"forbidden_paths": [".git", "vendor", "node_modules"]
},
"validation": ["php -l src/*.php", "php evolver.php --validate"]
}
---
9ïžâ£ A2A åè®® (Agent-to-Agent)
9.1 æ žå¿åèœ
A2A.php
- èµäº§ç±»åïŒGene, Capsule, EvolutionEvent
- 眮信床衰åïŒå€éšèµäº§çœ®ä¿¡åºŠ à 0.6
- ççžååŸéå¶ïŒmaxFiles=5, maxLines=200
- æåæ¡çº¹è®¡ç®ïŒè¿ç»æåäœ¿çšæ¬¡æ°
9.2 忥æºå¶
// sync_status è¡šè¿œèžªåæ¥ç¶æ
CREATE TABLE sync_status (
asset_type TEXT NOT NULL, // 'Gene' | 'Capsule' | 'Event'
local_id TEXT NOT NULL,
asset_id TEXT, // SHA-256
sync_status TEXT, // 'pending' | 'synced' | 'failed'
last_sync_attempt TEXT,
sync_error TEXT
);
---
10.1 åèœ
- ä¿¡å·âåºå âç»æ 蟹远螪
- Laplace å¹³æ»æåæŠç
- è¡°åæºå¶ (æ¶éŽè¡°å)
- é误çŸåè§èå
10.2 é误çŸåè§èå
// è·¯åŸæ¿æ¢
s = preg_replace('/[a-z]:\\[^\\s\\n\\r\\t]+/i', '<path>', s);
s = preg_replace('~/[^\\s\\n\\r\\t]+~', '<path>', s);
// åå
è¿å¶åæ°åæ¿æ¢
s = preg_replace('/\\b0x[0-9a-f]+\\b/i', '<hex>', s);
s = preg_replace('/\\b\\d+\\b/', '<n>', s);
// èŸåºïŒerrsig_norm:<hash>
---
1ïžâ£1ïžâ£ 代ç 莚éè¯äŒ°
11.1 äŒç¹ â
| 绎床 | è¯å | 诎æ |
|---|
| ç±»åå®å
š | âââââ | å
šæä»¶ declare(strict_types=1) |
| é误å€ç | âââââ | try-catch + error_log + è¿åç»ææ°ç» |
| ææ¡£æ³šé | ââââ | 倧éšåå
¬åŒæ¹æ³æ PHPDoc |
| åœåè§è | âââââ | PascalCase ç±»ïŒcamelCase æ¹æ³ïŒSCREAMING åžžé |
| æµè¯èŠç | ââââ | 44 䞪æµè¯ç±»ïŒæ žå¿åèœå
šèŠç |
| å®å
šæ§ | âââââ | å€å±é²æ€ïŒç¡¬çŒç éå¶ |
| æ§èœäŒå | ââââ | WAL + mmap + çŒåäŒå |
11.2 æœåšé®é¢ â ïž
| é®é¢ | äž¥éæ§ | 建议 |
|---|
| Schema çæ¬äžäžèŽ | äž | ç»äž ContentHash å PromptBuilder ççæ¬å· |
| æ éæåæå·¥å
· | äœ | æ·»å PHPStan/Psalm å° composer.json |
| éšåæ¹æ³çŒºå°ææ¡£ | äœ | è¡¥å
å€ææ¹æ³ç PHPDoc |
| 硬çŒç è·¯åŸ | äœ | 䜿çšåžžéæé
眮æä»¶ |
| MCP 客æ·ç«¯å
Œå®¹æ§ | äž | Gemini CLI æå·²ç¥é®é¢ïŒææ¡£å·²è¯Žæ |
---
1ïžâ£2ïžâ£ äžåå§ evolver 对æ¯
| ç¹æ§ | EvoMap/evolver (JS) | Evolver.php |
|---|
| è¯èš | JavaScript/Node.js | PHP 8.3+ |
| æ°æ®åº | SQLite | SQLite (çžå) |
| åè®® | MCP stdio | MCP stdio (1:1 ç§»æ€) |
| GEP çæ¬ | 1.6.0 | 1.6.0 |
| å®å
šæš¡å | ççžååŸéå¶ | çžå + é¢å€ä¿æ€ |
| æµè¯ | Jest | PHPUnit |
| æ§èœ | Node.js V8 åŒæ | PHP 8.3 JIT (å¯é) |
äŒå¿ïŒ
- â
é¶ npm äŸèµïŒä»
Composer
- â
æŽç®åçéšçœ² (å䞪 PHP æä»¶ + SQLite)
- â
å®å
šæ¬å°åïŒæ çœç»äŸèµ
- â
å¢åŒºçå®å
šæš¡å (SourceProtector)
---
1ïžâ£3ïžâ£ 䜿çšåºæ¯æšè
13.1 éçšåºæ¯ â
1. AI èŸ
å©åŒåç¯å¢ - äž Claude Desktop/Kimi CLI éæ
2. èªæŒå代ç åº - èªåšä¿®å€é误ãäŒåæ§èœ
3. ç¥è¯ç§¯çŽ¯ç³»ç» - Gene/Capsule å蜚ååšæåç»éª
4. å®å
šæ²ç®±å®éª - review æš¡åŒäžäººå·¥ç¡®è®€ææä¿®æ¹
5. æç»éæ - èªå𿣿µåä¿®å€æµè¯å€±èŽ¥
13.2 äžéçšåºæ¯ â
1. é«å¹¶å Web æå¡ - éè®Ÿè®¡ç®æ
2. ååžåŒç³»ç» - åèç¹ SQLite éå¶
3. 宿¶æ§èŠæ±é« - æŒååšæéèŠæ¶éŽ
4. æ AI ç¯å¢ - äŸèµ LLM çæä»£ç
---
1ïžâ£4ïžâ£ æäœ³å®è·µå»ºè®®
14.1 éšçœ²é
眮
# æšèç¯å¢åé
export EVOLVER_DB_PATH=~/.evolver/evolver.db
export EVOLVE_ALLOW_SELF_MODIFY=review # åŒåç¯å¢
export WORKSPACE_DIR=/path/to/workspace
# MCP é
眮 (Kimi CLI)
{
"mcpServers": {
"evolver": {
"command": "php",
"args": ["/path/to/evolver.php"],
"env": {
"EVOLVER_DB_PATH": "~/.evolver/evolver.db",
"EVOLVE_ALLOW_SELF_MODIFY": "review"
}
}
}
}
14.2 è¿ç»Žå»ºè®®
1. 宿å€ä»œæ°æ®åºïŒ
cp ~/.evolver/evolver.db ~/.evolver/evolver.db.backup.$(date +%Y%m%d)
2. çæ§å¥åº·ç¶æïŒ
php evolver.php --validate
php evolver.php --ops health
3. æž
çæ§æ°æ®ïŒ
php evolver.php --ops cleanup
php evolver.php --ops gc
4. 审æ¥å®å
šæ¥å¿ïŒ
cat ~/.evolver/security_audit.log
14.3 åŒå建议
1. å§ç»è¿è¡æµè¯ïŒ
composer test # æ phpunit --testdox
2. äœ¿çš review æš¡åŒïŒ
- åŒåç¯å¢ïŒ
EVOLVE_ALLOW_SELF_MODIFY=review
- ç产ç¯å¢ïŒ
EVOLVE_ALLOW_SELF_MODIFY=never
3.
èªå®ä¹åºå ïŒ
- åš
data/default_genes.json æ·»å
- æäœ¿çš
evolver_upsert_gene å·¥å
·
4.
çæ§ççžååŸïŒ
- å®ææ£æ¥
evolver_stats
- è°æŽåºå
max_files 纊æ
---
1ïžâ£5ïžâ£ æªæ¥æ¹è¿æ¹å
15.1 çæäŒå ð§
1. ç»äž Schema çæ¬å· - ä¿®å€ PromptBuilder çæ¬äžäžèŽ
2. æ·»å éæåæ - PHPStan/Psalm éæ
3. æ¹è¿éè¯¯æ¶æ¯ - æŽå奜ççšæ·æç€º
4. æ§èœåæå·¥å
· - æ·»å Xdebug é
眮瀺äŸ
15.2 é¿ææ©å± ð
1. 倿°æ®åºæ¯æ - PostgreSQL/MySQL éé
åš
2. Web UI - å¯è§åæŒååå²åç»è®¡
3. ååžåŒåæ¥ - å€èç¹ A2A 忥äŒå
4. æºåšåŠä¹ éæ - åºäºå岿°æ®é¢æµæäœ³åºå
5. æä»¶ç³»ç» - å
è®žç¬¬äžæ¹æ©å± Ops æš¡å
---
ð 绌åè¯å
| 绎床 | è¯å | 诎æ |
|---|
| æ¶æè®Ÿè®¡ | âââââ | æž
æ°åå±ïŒè莣å犻 |
| 代ç 莚é | âââââ | äž¥æ Œç±»åïŒå®åé误å€ç |
| å®å
šæ§ | âââââ | å€å±é²æ€ïŒç¡¬çŒç éå¶ |
| æµè¯èŠç | ââââ | æ žå¿åèœå
šèŠçïŒå¯å¢å 蟹çŒçšäŸ |
| ææ¡£å®æŽæ§ | ââââ | README/AGENTS.md å®åïŒçŒºå° API ææ¡£ |
| æ§èœäŒå | ââââ | SQLite äŒåå°äœïŒå¯èèçŒåå± |
| å¯ç»Žæ€æ§ | âââââ | æš¡ååè®Ÿè®¡ïŒæäºæ©å± |
| åæ°æ§ | âââââ | èªæŒåæŠå¿µå沿 |
æ»äœè¯åïŒ
âââââ (4.8/5)---
ð¯ ç»è®º
Evolver.php æ¯äžäžªå·¥äžçº§çèªæŒååŒæå®ç°ïŒå
·æä»¥äžæ žå¿äŒå¿ïŒ
1. â
æççš³å® - 1:1 ç§»æ€èªç»è¿éªè¯ç JavaScript çæ¬
2. â
å®å
šå¯é - å€å±é²æ€äœç³»ïŒç¡¬çŒç å®å
šéå¶
3. â
æäºéšçœ² - é¶å€æäŸèµïŒå䞪 PHP æä»¶å³å¯è¿è¡
4. â
æµè¯å®å€ - 44 䞪æµè¯ç±»èŠçæ žå¿åèœ
5. â
ææ¡£å®å - README/AGENTS.md æäŸè¯Šç»æå
æšè䜿çšåºæ¯ïŒ
- AI èŸ
å©åŒåç¯å¢çåç«¯åŒæ
- éèŠèªä¿®å€èœåç代ç åº
- ç¥è¯ç§¯çޝåç»éªå€çšç³»ç»
泚æäºé¡¹ïŒ
- ç产ç¯å¢å»ºè®®äœ¿çš
review æ never æš¡åŒ
- 宿å€ä»œ SQLite æ°æ®åº
- çæ§ççžååŸåæŒåé¢ç
---