natureco-cli 5.40.0 → 5.42.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/CHANGELOG.md CHANGED
@@ -2,6 +2,32 @@
2
2
 
3
3
  All notable changes to NatureCo CLI will be documented in this file.
4
4
 
5
+ ## [5.42.0] - 2026-07-08 — "TOKEN OPTIMİZASYONU: her istekte ~18K token israfı → ~4.5K (%76 azalma)"
6
+
7
+ Kullanıcı token maliyetini sordu; ölçüm yapıldı ve ciddi bir israf bulundu: basit bir "merhaba" bile **18,763 token** prompt gönderiyordu. Kök neden: `skill-index.js` her sysMsg'e YÜZLERCE skill'in TAM `description`'ını gömüyordu (satır 75 `- name: description`), her istekte tekrar.
8
+
9
+ ### ⚡ Token verimliliği (doğrudan maliyet + kullanıcı tercihi)
10
+ - **skill index kompaktlaştırıldı**: eskiden ~200 skill × ~350 char (tam açıklama) = ~75K char = ~18K token HER istekte. Bu progressive-disclosure'a da aykırıydı (skill_view zaten tam açıklama+içerik veriyor). Artık: çok skill (>60) → **kompakt isim-listesi** (kategorili, virgüllü); az skill → isim + kısa açıklama (88 char, kelime sınırı). Uzun "mandatory scan" yönergesi sadeleştirildi.
11
+ - **Yeni env kontrolü** `NATURECO_SKILL_INDEX`: `off` (index hiç gönderilmez, en düşük token) / `names` (sadece isimler) / `full` (kısa açıklamalı, çok skill'de bile).
12
+ - **Ölçülen etki** (gerçek MiniMax usage, monkeypatch ile): basit selam **18,763 → 4,456 token** (%76↓); tek-araç görevi 38,601 → 9,987 token. Çok-iterasyonlu görevlerde tasarruf katlanır (sysMsg her iterasyonda gider).
13
+
14
+ 538 test yeşil (skill-index token regresyonu +5: `_shorten`, off-mode, skill-başına-char sınırı), ESLint temiz. Provider-bağımsız (tüm sysMsg'ler `buildSkillIndex` kullanır).
15
+
16
+ ## [5.41.0] - 2026-07-08 — "sub-agent orchestration + plan modu PHANTOM idi, açıldı"
17
+
18
+ Kullanıcının "sub-agent orchestration ve plan modunda açık kalmasın" talebiyle: ikisi de mevcut+çalışır kod (`sub_agent.js`, `plan.js`) AMA agentic-runner `DEFAULT_ALLOWED`'da ve workflow sysMsg'inde YOKTU → agent bunları çağıramıyordu (klasik phantom-tool deseni).
19
+
20
+ ### ✨ Açılan yetenekler (kod vardı, agent erişemiyordu)
21
+ - **sub_agent** (orchestration): agent bir alt-görevi bağımsız bir alt-agent'a devreder (kendi LLM çağrısı, sonucu döner). Birden fazla çağırarak paralel/çok-parçalı orchestration yapar. Güvenli (sadece LLM çağrısı, shell/dosya yok) → safe-mode allowlist'e eklendi.
22
+ - **plan** (plan modu): karmaşık görev için önce plan çıkarır (SADECE metin + `~/.natureco/plans/*.md`, hiçbir işlem yapmaz). safe-mode allowlist'e eklendi.
23
+ - Her ikisi de workflow sysMsg'de tanıtıldı (agent ne zaman/nasıl kullanacağını bilir). Provider-bağımsız (MiniMax/Gemini/OpenAI endpoint routing içeriyor).
24
+
25
+ ### ✓ Doğrulama (agent yolu E2E, MiniMax)
26
+ - plan: agent `plan` aracıyla 10-adımlık detaylı React todo planı çıkardı.
27
+ - sub_agent: agent alt-agent spawn edip "list comprehension nedir" sordurup yanıtı iletti.
28
+ - **çoklu orchestration**: agent İKİ ayrı alt-agent'a iki görev delege etti (5!=120, HTTP 404) ve ikisini özetledi.
29
+ - 533 test yeşil (sub_agent+plan phantom regresyon kilidi), ESLint temiz.
30
+
5
31
  ## [5.40.0] - 2026-07-08 — "CROSS-SESSION HAFIZA bozulması düzeltildi (gerçek macOS SSH testinde bulundu)"
6
32
 
7
33
  Gerçek MacBook'a SSH ile bağlanıp canlı test yapılırken bulundu: kullanıcı "projemin gizli kod adı ONYX-7'yi hatırla" dediğinde, yeni oturumda HATIRLANMIYORDU. Kök neden zincirleme çözüldü.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "natureco-cli",
3
- "version": "5.40.0",
3
+ "version": "5.42.0",
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"
@@ -25,6 +25,8 @@ const DEFAULT_ALLOWED = [
25
25
  'write_file', 'read_file', 'edit_file', 'skill_view', 'bash', 'file_search', 'list_dir', 'grep_search',
26
26
  'memory_write', 'memory_tree', 'cron_create', 'duckduckgo', 'web_search', 'todo_write',
27
27
  'git', 'http_request', 'notebook_edit', 'clarify', 'code_execution',
28
+ // orchestration + planlama (guvenli: sub_agent = alt-LLM cagrisi, plan = metin+.md; shell/sistem yok)
29
+ 'sub_agent', 'plan',
28
30
  // macOS asistan yetenekleri (Windows'ta zarafetle "sadece macOS" der; kullanıcının Mac'inde çalışır)
29
31
  'calendar_add', 'reminder_add', 'notes_add', 'mac_notify',
30
32
  // medya (kullanıcının kendi provider/API'siyle)
@@ -271,6 +271,8 @@ async function workflow(params) {
271
271
  '- git: git islemi. parametreler: operation (status/diff/log/branches/add/commit), args, message (commit icin). (Basit git icin bunu kullan.)',
272
272
  '- http_request: HTTP istegi at (API cagrisi, webhook, veri cekme). parametreler: url, method, headers, body.',
273
273
  '- code_execution: kod parcasi calistir (sandboxli). parametreler: code, language (python/node/bash).',
274
+ '- sub_agent: bir ALT-GOREVI bagimsiz bir alt-agent\'a devret (kendi LLM cagrisini yapar, sonucu doner). parametreler: task (zorunlu), context (ops.), maxTokens (ops.). Paralel arastirma, odakli alt-problem, ya da ana gorevi bolup parcalari delege etmek icin. Birden fazla cagirarak orchestrate edebilirsin.',
275
+ '- plan: karmasik/cok-adimli bir gorev icin ONCE plan cikar (SADECE plan metni uretir, HICBIR islem yapmaz; ~/.natureco/plans/ altina kaydeder). parametreler: action ("create" veya "list"), task (create icin), depth ("minimal"/"detailed"). Kullanici "plan yap / once planla / adimlari cikar / yol haritasi" derse bunu kullan.',
274
276
  '- notebook_edit: Jupyter (.ipynb) hucre duzenle. parametreler: filePath, ...',
275
277
  '- clarify: kullaniciya netlestirme sorusu sor (belirsizlik varsa). parametreler: question, options.',
276
278
  '- calendar_add / reminder_add / notes_add / mac_notify: macOS Takvim/Hatirlatici/Notlar/bildirim (kullanici macOS ise; degilse arac "sadece macOS" der).',
@@ -58,25 +58,46 @@ function _discoverSkills() {
58
58
  return skills;
59
59
  }
60
60
 
61
+ /**
62
+ * v5.42 TOKEN OPTIMIZASYONU: eskiden her skill'in TAM `description`'i (frontmatter,
63
+ * ~200-500 char) sysMsg'e gomuluyordu → yuzlerce skill'de ~18K token HER istekte
64
+ * (basit "merhaba" bile). Progressive-disclosure'a da aykiri: skill_view zaten tam
65
+ * aciklama+icerik veriyor. Artik index'te KISA aciklama (cok skill varsa daha da kisa);
66
+ * ajan ismi+ozeti gorur, ilgiliyse skill_view(name) ile tam detayi ceker.
67
+ * NATURECO_SKILL_INDEX=names → sadece isimler (en dusuk token); =off → index yok.
68
+ */
69
+ function _shorten(d, max) {
70
+ if (!d) return '';
71
+ const clean = d.replace(/\s+/g, ' ').trim();
72
+ if (clean.length <= max) return clean;
73
+ return clean.slice(0, max).replace(/\s+\S*$/, '') + '…';
74
+ }
75
+
61
76
  function buildSkillIndex() {
77
+ const mode = String(process.env.NATURECO_SKILL_INDEX || '').toLowerCase();
78
+ if (mode === 'off') return '';
62
79
  const skills = _discoverSkills();
63
80
  if (skills.length === 0) return '';
81
+ // Cok skill (>60) → KOMPAKT isim-listesi (kategorili, virgullu): en dusuk token.
82
+ // Az skill → isim + kisa aciklama. Kullanici 'full'/'names' ile ezebilir.
83
+ const many = skills.length > 60;
84
+ const compact = mode === 'names' || (many && mode !== 'full');
64
85
  const byCategory = {};
65
86
  for (const s of skills) {
66
87
  if (!byCategory[s.category]) byCategory[s.category] = [];
67
88
  byCategory[s.category].push(s);
68
89
  }
69
- const lines = ['## Skills (mandatory)'];
70
- lines.push('Before replying, scan the skills below. If a skill matches or is even partially relevant to your task, you MUST load it with skill_view(name) and follow its instructions. Err on the side of loading — it is always better to have context you do not need than to miss critical steps, pitfalls, or established workflows.');
90
+ const lines = ['## Skills (görevinle ilgiliyse skill_view(name) ile yükle — tam açıklama/içerik oradadır)'];
71
91
  lines.push('<available_skills>');
72
92
  for (const [cat, catSkills] of Object.entries(byCategory)) {
73
- lines.push(` ${cat}:`);
74
- for (const s of catSkills) {
75
- lines.push(` - ${s.name}: ${s.description}`);
93
+ if (compact) {
94
+ lines.push(` ${cat}: ${catSkills.map(s => s.name).join(', ')}`);
95
+ } else {
96
+ lines.push(` ${cat}:`);
97
+ for (const s of catSkills) lines.push(` - ${s.name}: ${_shorten(s.description, 88)}`);
76
98
  }
77
99
  }
78
100
  lines.push('</available_skills>');
79
- lines.push('Only proceed without loading a skill if genuinely none are relevant.');
80
101
  return lines.join('\n');
81
102
  }
82
103
 
@@ -124,4 +145,4 @@ function skillsList(category) {
124
145
  });
125
146
  }
126
147
 
127
- module.exports = { buildSkillIndex, skillLookup, skillView, skillsList };
148
+ module.exports = { buildSkillIndex, skillLookup, skillView, skillsList, _shorten, _discoverSkills };