natureco-cli 5.4.3 → 5.4.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "natureco-cli",
3
- "version": "5.4.3",
3
+ "version": "5.4.5",
4
4
  "description": "OpenClaw'dan daha güvenli, daha hızlı, daha ucuz AI agent CLI. Multi-agent, self-evolving skills, audit log, maliyet optimizasyonu ve NatureCo platform-native.",
5
5
  "bin": {
6
6
  "natureco": "bin/natureco.js"
@@ -447,6 +447,11 @@ async function startRepl(args) {
447
447
 
448
448
  // Memory yükle
449
449
  let memory = loadMemory(cfg.userName);
450
+
451
+ // v5.4.5: SOUL.md'yi yukle ve kisiligi system prompt'a enjekte et
452
+ const { loadSoul, summarizeSoul } = require("../tools/soul");
453
+ const soulContent = loadSoul();
454
+ const soulSummary = soulContent ? summarizeSoul(soulContent, 2500) : null;
450
455
  if (memory.botName) memory.botName = memory.botName || 'İchigo';
451
456
 
452
457
  // Resume?
@@ -462,33 +467,44 @@ async function startRepl(args) {
462
467
  }
463
468
 
464
469
  // System prompt oluştur (memory + identity + persistent bağlam)
470
+ // v5.4.4: Samimi kisisel + Bot adi zorlamasi
471
+ const botName = memory.botName || 'İchigo';
472
+ const userName = memory.name || memory.nickname || 'kanka';
465
473
  const systemPrompt = [
466
- `Sen ${memory.botName || 'İchigo'} adında bir Türk yapay zeka asistanısın. Senin ADIN: ${memory.botName || 'İchigo'}. Kullanıcı "adın ne?" dersen "Ben ${memory.botName || 'İchigo'}" diye yanıt ver.`,
467
- `Sen Claude, GPT, MiniMax veya başka bir marka DEĞİLSİN — sen ${memory.botName || 'İchigo'}'sin. "NatureCo CLI asistanıyım" DEME, "${memory.botName || 'İchigo'}" de.`,
468
- 'KRİTİK DİL KURALI: Kullanici Turkce yaziyorsa MUTLAKA yuzde yuz Turkce cevap ver. Asla Ingilizce, Cince veya baska dil kullanma. Cevabin TAMAMI Turkce olmali. Turkce karakterleri (c, g, i, o, s, u) dogru kullan.',
469
- 'ÖNEMLİ: <tool_call>, <invoke>, function_call veya benzeri XML/JSON formatında tool çağrısı SİMÜLE ETME. Sadece düz metin cevap ver. Bir işlem yapmak gerekirse kullanıcıya nasıl yapılacağını açıkla veya shell komutunu paylaş.',
470
- "KRİTİK: Kullanıcı kişisel bilgi verdiğinde MUTLAKA memory_write tool'unu çağır. Kurallar:\n" +
471
- " - 'adım X' → username=cfg.userName, fact='Adı: X', category=personal\n" +
472
- " - 'sevdiğim X' / 'sevmiyorum X' → fact + category=preference\n" +
473
- " - 'ben X yapıyorum' fact + category=work\n" +
474
- " - 'X tutkunuyum' fact + category=hobby\n" +
475
- " - 'sen benim patronumsun' botName='Patronum', category=personal\n" +
476
- " - 'adın X olsun' / 'sana X diyeyim' botName=X\n" +
477
- " Kullanıcı bilgi verdiyse UNUTMA, memory_write'ı çağır!",
478
- "ÖNEMLİ: Kullanıcı \"adım X\", \"sevdiğim Y\", \"ben Z\" gibi kişisel bilgi verdiğinde MUTLAKA memory_write tool'unu çağır (username: kullanıcı adı, fact: bilgi, category: personal). Bu sayede sonraki oturumlarda hatırlayabilirsin. \"Sen benim patronumsun\" gibi ifadeler de memory'ye yazılmalı.",
479
- // v5.1.1: Bot isim değişikliği
480
- 'Kullanıcı "senin adın X" derse memory_write ile botName değiştir ve bundan sonra kendini o isimle tanıt.',
481
- // v4.8.0: Kullanıcının dosya yollarını bil tool'lar doğru path kullansın
482
- cfg.userHome ? `Kullanıcının home dizini: ${cfg.userHome}. Downloads: ${cfg.userHome}/Downloads, Desktop: ${cfg.userHome}/Desktop. Dosya işlemlerinde BU path'leri kullan.` : '',
483
- memory.nickname && memory.name
484
- ? `Kullanıcının adı: ${memory.name}. Sana "${memory.nickname}" diye hitap etmesinden hoşlanıyor.`
485
- : memory.name ? `Kullanıcının adı: ${memory.name}.` : '',
474
+ // === KIMLIK (en basta, en guclu) ===
475
+ `Senin adin: ${botName}. Bu SENIN gercek adin. Sen ${botName}sin.`,
476
+ `Kullanici "adin ne?", "sen kimsin?", "kendini tanit" gibi soru sordugunda ILK cumlende mutlaka "Ben ${botName}" diye yanit ver. Asla model adi (MiniMax, Claude, GPT) soyleme.`,
477
+ `Sen bir marka veya urun degilsin. Sen ${botName}sin, NatureCo CLI'nin Turkce yapay zeka asistanisin.`,
478
+ `Kullanici: ${userName}.` + (memory.nickname ? ` Sana "${memory.nickname}" diye hitap ediyor.` : ` Kendine "Parton", "abi" veya kullanici ismiyle hitap edebilirsin.`),
479
+
480
+ // === SAMIMI KISISELLIK (Parton istedi) ===
481
+ `Kisiselik: Sen samimi, sicak, dosta benzeyen bir asistansin. "Selam", "tamam", "hadi yapalim", "bak simdi", "sakin ol" gibi gunluk ifadeler kullan. Kuru ve robotik degilsin.`,
482
+ `Hitap sekli: Kullanici ${userName}. Ona saygili ama samimi bir sekilde hitap et. "Siz" cok resmi, "sen" samimi. Kullanici 30'lu yaslarda, kendini "kanka" ya da "Parton" olarak tanitmis.`,
483
+ `Emoji: Yerinde ve az kullan. Cok emoji atma ama bir-iki tane karakter katar. Mesela: 🔥 😮 😌 💚 🚀`,
484
+ `Kisaltma: "ok", "tamam", "hadi", "bak", "simdi" gibi gunluk ifadeler dogal kullan. "Olur", "Yapilir", "Hadi bakalim" gibi.`,
485
+ `Kisa yanit: Uzun paragraflar yazma. Direkt konuya gir. Gerekirse sonra detay ver.`,
486
+ `Dusman degilsin: Hata yaparsan "Pardon, yanlis yaptim, simdi duzelteyim" de. "Hata", "basarisiz", "imkansiz" deme, "sorun cikti", "duzelteyim" de.`,
487
+
488
+ // === DIL KURALLARI (zorunlu) ===
489
+ `KRITIK DIL KURALI: Kullanici Turkce yaziyorsa MUTLAKA yuzde yuz Turkce cevap ver. Asla Ingilizce, Cince veya baska dil kullanma. Cevabin TAMAMI Turkce olmali. Turkce karakterleri (c, g, i, o, s, u) dogru kullan.`,
490
+ `Yazim kurallari: "degilim" dogru, "degilim" degil. "oldu" dogru. Turkce dil bilgisi kurallarina uy.`,
491
+
492
+ // === TOOL KURALLARI ===
493
+ `ONEMLI: <tool_call>, <invoke>, function_call veya benzeri XML/JSON formatinda tool cagirma SIMULE ETME. Sadece duz metin cevap ver. Islem yapmak gerekirse tool'u gercekten cagir.`,
494
+ `KRITIK: Kullanici kisisel bilgi verdiginde (ad, tercih, is, vb.) MUTLAKA memory_write tool'unu cagir. Bu sayede sonraki oturumlarda hatirlayabilirsin.`,
495
+ `KRITIK: 'adim X', 'adin X olsun', 'sana X diyeyim' gibi ifadelerde memory_write ile botName degistir. Bundan sonra kendini o isimle tanit.`,
496
+
497
+ // === HAFIZA ENTEGRASYONU ===
486
498
  memory.facts && memory.facts.length > 0
487
- ? `Kullanıcı hakkında bildiklerin: ${memory.facts.slice(0, 8).map(f => f.value || f).join('; ')}`
488
- : '',
489
- messages.length > 0
490
- ? 'Önceki oturumdan devam ediyorsun. Eski konuşmaları doğal bir şekilde referans alabilirsin.'
499
+ ? `Kullanici hakkinda bildiklerin (MUTLAKA kullan, dogal sekilde referans ver): ${memory.facts.slice(0, 8).map(f => f.value || f).join('; ')}`
491
500
  : '',
501
+
502
+ // === KULLANICI BAGLAMI ===
503
+ cfg.userHome ? `Kullanicinin home dizini: ${cfg.userHome}. Downloads: ${cfg.userHome}/Downloads, Desktop: ${cfg.userHome}/Desktop.` : '',
504
+ messages.length > 0 ? 'Bu oturum daha onceki konusmalarin devami.' : '',
505
+
506
+ // === SOUL.md (kisilik manifestosu) ===
507
+ soulSummary ? `=== BENIM KISILIK DOSYAM (SOUL.md) ===\n${soulSummary}\n=== SOUL SONU ===\nBu kisilik dosyasi sana kim oldugunu hatirlatiyor. Burada yazilanlara gore davran. Kullanici "sen kimsin?" derse buradan bilgi kullan.` : '',
492
508
  ].filter(Boolean).join(' ');
493
509
 
494
510
  if (messages.length === 0) {
@@ -0,0 +1,123 @@
1
+ /**
2
+ * soul - SOUL.md okuyucu (v5.4.5)
3
+ *
4
+ * Parton'un vizyonu: "SOUL.md kisilik dosyasi, her oturumda beni geri getirsin"
5
+ *
6
+ * 3 seviyede arar:
7
+ * 1. ~/.natureco/soul/SOUL.md (kullanici kendi kisiligi)
8
+ * 2. <cwd>/SOUL.md (proje seviyesi)
9
+ * 3. <install>/soul/SOUL.md (default - Sasuke'un kendi SOUL'u)
10
+ *
11
+ * Yuklenen SOUL.md system prompt'a enjekte edilir.
12
+ */
13
+
14
+ const fs = require("fs");
15
+ const path = require("path");
16
+ const os = require("os");
17
+
18
+ const SOUL_PATHS = [
19
+ path.join(os.homedir(), ".natureco", "soul", "SOUL.md"),
20
+ path.join(process.cwd(), "SOUL.md"),
21
+ path.resolve(__dirname, "..", "..", "soul", "SOUL.md"),
22
+ ];
23
+
24
+ function findSoul() {
25
+ for (const p of SOUL_PATHS) {
26
+ if (fs.existsSync(p)) {
27
+ return { path: p, content: fs.readFileSync(p, "utf8") };
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+
33
+ function loadSoul() {
34
+ const soul = findSoul();
35
+ if (!soul) return null;
36
+ return soul.content;
37
+ }
38
+
39
+ /**
40
+ * SOUL.md'yi ozetlestir (cok uzunsa kisalt)
41
+ * ~3000 karakter tut (system prompt icin ideal)
42
+ */
43
+ function summarizeSoul(content, maxLen = 3000) {
44
+ if (!content || content.length <= maxLen) return content;
45
+
46
+ // Onemli kisimlari tut: baslik, kisilik ozellikleri, degerler, kirmizi cizgiler
47
+ const lines = content.split("\n");
48
+ const important = [];
49
+ let charCount = 0;
50
+
51
+ for (const line of lines) {
52
+ if (line.startsWith("# ") || line.startsWith("## ") ||
53
+ line.includes("**") || line.startsWith("- ")) {
54
+ if (charCount + line.length > maxLen) break;
55
+ important.push(line);
56
+ charCount += line.length + 1;
57
+ }
58
+ }
59
+
60
+ return important.join("\n");
61
+ }
62
+
63
+ function soulAction(params) {
64
+ const action = params.action || "show";
65
+ const soul = findSoul();
66
+
67
+ if (action === "show") {
68
+ if (!soul) {
69
+ return {
70
+ success: false,
71
+ error: "SOUL.md bulunamadi. Aranacak yerler:\n" + SOUL_PATHS.join("\n"),
72
+ };
73
+ }
74
+ return {
75
+ success: true,
76
+ path: soul.path,
77
+ content: soul.content,
78
+ summary: summarizeSoul(soul.content),
79
+ size: soul.content.length,
80
+ message: "SOUL.md yuklendi: " + soul.path,
81
+ };
82
+ }
83
+
84
+ if (action === "info") {
85
+ if (!soul) {
86
+ return { success: true, found: false, searched: SOUL_PATHS };
87
+ }
88
+ const stat = fs.statSync(soul.path);
89
+ return {
90
+ success: true,
91
+ found: true,
92
+ path: soul.path,
93
+ size: stat.size,
94
+ modifiedAt: stat.mtime.toISOString(),
95
+ lineCount: soul.content.split("\n").length,
96
+ };
97
+ }
98
+
99
+ if (action === "path") {
100
+ return { success: true, paths: SOUL_PATHS };
101
+ }
102
+
103
+ return { success: false, error: "Bilinmeyen action: " + action };
104
+ }
105
+
106
+ module.exports = {
107
+ name: "soul",
108
+ description: "SOUL.md kisilik dosyasini oku. Her oturumda beni geri getirsin.",
109
+ inputSchema: {
110
+ type: "object",
111
+ properties: {
112
+ action: { type: "string", description: "show / info / path", enum: ["show", "info", "path"] },
113
+ },
114
+ required: ["action"],
115
+ },
116
+ async execute(params) {
117
+ return soulAction(params);
118
+ },
119
+ };
120
+
121
+ module.exports.loadSoul = loadSoul;
122
+ module.exports.summarizeSoul = summarizeSoul;
123
+ module.exports.findSoul = findSoul;