natureco-cli 5.47.1 → 5.49.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,26 @@
2
2
 
3
3
  All notable changes to NatureCo CLI will be documented in this file.
4
4
 
5
+ ## [5.49.0] - 2026-07-10 — "Yerleşik skill/araçlar artık ~/.natureco altında görünür"
6
+
7
+ ### Added
8
+ - **`~/.natureco/skills-builtin` ve `~/.natureco/tools` bağlantıları** (`src/utils/builtin-links.js`): Yerleşik skill'ler ve araç kaynakları npm paketinin içinde yaşar ve oradan çalışır; ama kullanıcılar `~/.natureco`'ya bakıp "yok" sanıyordu. CLI artık her açılışta dizin bağlantısı kurar (Windows: junction — yönetici gerektirmez; macOS/Linux: symlink). Kopya yok: paket güncellenince içerik otomatik günceldir. Kırık/yanlış hedefli bağlantı onarılır; bağlantı olmayan GERÇEK klasöre asla dokunulmaz (kullanıcı verisi korunur). 5 yeni test.
9
+ - `natureco skills list` başlığı üç konumu da gösterir: yerleşikler (`skills-builtin`), kişiseller (`skills`), araçlar (`tools`).
10
+
11
+ ### Notes
12
+ - Skill keşfi bu bağlantıları taramaz — çift sayım olmaz; işlevsel yol değişmedi, bu salt görünürlük/gezilebilirlik.
13
+
14
+ ## [5.48.0] - 2026-07-10 — "Güncelleme bildirimi + skill/araç görünürlüğü"
15
+
16
+ ### Context
17
+ - **Saha raporu: "kullanıcılarda skill'ler ve araçlar görünmüyor."** İnceleme sonucu: paket her sürümde skill/araçları TAŞIYOR (v5.21'den beri 319 skill + ~90 araç, `npm pack` ve temiz-kurulum simülasyonuyla doğrulandı). Asıl neden iki katmanlı: (1) v5.21 öncesi sürümlerde gerçekten yalnız 3–10 skill vardı ve eski sürümde kalan kullanıcıların bundan haberi olmuyordu — CLI hiç güncelleme uyarısı vermiyordu; (2) yerleşik skill'ler `~/.natureco/` altında değil npm paketinin içinde yaşadığından "sistem dosyalarında yok" sanılıyordu.
18
+
19
+ ### Added
20
+ - **Yeni sürüm bildirimi** (`src/utils/update-check.js`): CLI açılışında önbellekten senkron tek satır uyarı ("⬆ Yeni sürüm: vX → vY — npm install -g natureco-cli"); registry en fazla 24 saatte bir, arka planda ve süreci bekletmeden sorgulanır (socket.unref). Yalnız TTY'de basılır, `NATURECO_NO_UPDATE_CHECK=1` ile kapatılır, hiçbir hata komutu bozamaz.
21
+ - **`natureco status`** artık Skills (toplam + yerleşik/kişisel kırılımı) ve Tools sayısını gösterir — "görünmüyor" raporları tek komutla teşhis edilir.
22
+ - **`natureco skills list`** başlığında toplam/kaynak özeti + "yerleşikler paketle gelir, kişiseller ~/.natureco/skills altındadır" açıklaması; 0 skill durumu artık bozuk kurulum uyarısı verir (yerleşikler pakette geldiğinden bu durum normal değildir).
23
+ - 7 yeni test (`test/utils/update-check.test.js`): semver karşılaştırma, TTY/opt-out kapıları, hata dayanıklılığı.
24
+
5
25
  ## [5.47.1] - 2026-07-09 — "FIX: ASCII banner NATUREOO → NATURECO"
6
26
 
7
27
  ### Fixed
package/bin/natureco.js CHANGED
@@ -5,6 +5,11 @@ const chalk = require('chalk');
5
5
  const packageJson = require('../package.json');
6
6
  // Küresel çökme/EPIPE yakalayıcıları — ham Node stack yerine düzgün mesaj + audit log
7
7
  require('../src/utils/process-errors').install();
8
+ // Yeni sürüm bildirimi (önbellekten senkron basar; ağı arka planda, engellemeden tazeler).
9
+ // Eski sürümde kalan kullanıcılar yeni skill/araçlardan haberdar olsun diye eklendi.
10
+ try { require('../src/utils/update-check').maybeNotify(packageJson.version); } catch { /* asla komutu bozma */ }
11
+ // Yerleşik skill/araçları ~/.natureco altında görünür yap (junction/symlink; kopya yok)
12
+ try { require('../src/utils/builtin-links').ensureBuiltinLinks(); } catch { /* asla komutu bozma */ }
8
13
  const login = require('../src/commands/login');
9
14
  const logout = require('../src/commands/logout');
10
15
  const bots = require('../src/commands/bots');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "natureco-cli",
3
- "version": "5.47.1",
3
+ "version": "5.49.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"
@@ -202,14 +202,17 @@ function uninstallMarketplace(skillName) {
202
202
 
203
203
  async function listSkills() {
204
204
  const allSkills = getSkills();
205
+ const builtinCount = allSkills.filter(s => s.source === 'builtin').length;
206
+ const userCount = allSkills.filter(s => s.source === 'user').length;
205
207
 
206
208
  console.log(chalk.gray('\n ' + '─'.repeat(48)));
207
- console.log(chalk.cyan.bold('\n Yüklü Skill\'ler\n'));
209
+ console.log(chalk.cyan.bold('\n Yüklü Skill\'ler') + chalk.gray(` — toplam ${allSkills.length} (${builtinCount} yerleşik${userCount ? `, ${userCount} kişisel` : ''})`));
210
+ console.log(chalk.gray(' Yerleşikler: ~/.natureco/skills-builtin · Kişiseller: ~/.natureco/skills · Araçlar: ~/.natureco/tools\n'));
208
211
 
209
212
  if (allSkills.length === 0) {
210
- console.log(chalk.gray(' Hiç skill yüklü değil.\n'));
211
- console.log(chalk.gray(' Yüklemek için: ') + chalk.cyan('natureco skills install <slug>'));
212
- console.log(chalk.gray(' Gözatmak için: ') + chalk.cyan('natureco skills browse\n'));
213
+ // Yerleşikler pakette gelir; bu duruma normalde ancak paket bozulursa düşülür
214
+ console.log(chalk.red(' Hiç skill bulunamadı kurulum bozuk olabilir.'));
215
+ console.log(chalk.gray(' Onarmak için: ') + chalk.cyan('npm install -g natureco-cli') + chalk.gray(' (yeniden kurar)\n'));
213
216
  return;
214
217
  }
215
218
 
@@ -60,6 +60,28 @@ function cmdRun() {
60
60
 
61
61
  const channelCount = [cfg.telegramToken, cfg.whatsappConnected, cfg.discordToken, cfg.slackToken].filter(Boolean).length;
62
62
  lines.push(tui.styled(' │ ', { color: tui.PALETTE.border }) + tui.C.muted('Channels ') + tui.styled(String(channelCount).padEnd(36), { color: tui.PALETTE.text }) + tui.styled(' │', { color: tui.PALETTE.border }));
63
+
64
+ // Skill + araç görünürlüğü: "skill'ler görünmüyor" raporlarını tek bakışta
65
+ // teşhis edilir yapar (yerleşikler npm paketinin içinde yaşar, ~/.natureco'da değil)
66
+ let skillInfo = '—';
67
+ try {
68
+ const { getSkills } = tryRequire('../utils/skills') || {};
69
+ if (getSkills) {
70
+ const all = getSkills();
71
+ const builtin = all.filter(s => s.source === 'builtin').length;
72
+ const user = all.length - builtin;
73
+ skillInfo = `${all.length} (${builtin} yerleşik` + (user > 0 ? ` + ${user} kullanıcı` : '') + ')';
74
+ }
75
+ } catch {}
76
+ lines.push(tui.styled(' │ ', { color: tui.PALETTE.border }) + tui.C.muted('Skills ') + tui.styled(skillInfo.padEnd(36), { color: tui.PALETTE.text }) + tui.styled(' │', { color: tui.PALETTE.border }));
77
+
78
+ let toolCount = '—';
79
+ try {
80
+ const toolsDir = path.join(__dirname, '..', 'tools');
81
+ toolCount = String(fs.readdirSync(toolsDir).filter(f => f.endsWith('.js')).length);
82
+ } catch {}
83
+ lines.push(tui.styled(' │ ', { color: tui.PALETTE.border }) + tui.C.muted('Tools ') + tui.styled(String(toolCount).padEnd(36), { color: tui.PALETTE.text }) + tui.styled(' │', { color: tui.PALETTE.border }));
84
+
63
85
  lines.push(tui.styled(' ╰' + '─'.repeat(cardW) + '╯', { color: tui.PALETTE.border }));
64
86
  console.log('\n' + tui.styled(' 🩺 Sistem Durumu', { color: tui.PALETTE.primary, bold: true }));
65
87
  console.log(lines.join('\n'));
@@ -0,0 +1,59 @@
1
+ /**
2
+ * builtin-links — yerleşik skill ve araçları ~/.natureco altında GÖRÜNÜR yapar.
3
+ *
4
+ * Saha raporu (v5.48 sonrası): "~/.natureco içinde skill/araç yok". Yerleşikler
5
+ * npm paketinin içinde yaşar (node_modules/natureco-cli/...) ve işlevsel olarak
6
+ * çalışırlar; ama kullanıcı "sistem dosyalarında" göremiyor. Kopyalamak yerine
7
+ * dizin bağlantısı kurulur (Windows: junction — yönetici GEREKTİRMEZ; unix: symlink):
8
+ *
9
+ * ~/.natureco/skills-builtin → <paket>/skills (yerleşik skill'ler)
10
+ * ~/.natureco/tools → <paket>/src/tools (araç kaynakları)
11
+ *
12
+ * Kazanımlar: gezinilebilir + paket güncellenince otomatik güncel + sıfır kopya.
13
+ * Skill keşfi bu bağlantıları TARAMAZ (çift sayım olmaz) — bu salt görünürlük.
14
+ * Kullanıcının kendi skill'leri ~/.natureco/skills'te yaşamaya devam eder.
15
+ */
16
+
17
+ const fs = require('fs');
18
+ const path = require('path');
19
+ const os = require('os');
20
+
21
+ const LINKS = [
22
+ { name: 'skills-builtin', target: path.join(__dirname, '..', '..', 'skills') },
23
+ { name: 'tools', target: path.join(__dirname, '..', 'tools') },
24
+ ];
25
+
26
+ /**
27
+ * Bağlantıları kurar/onarır. Hızlıdır (birkaç lstat) — her CLI açılışında çağrılır.
28
+ * @param {string} [baseDir] test için ~/.natureco yerine kullanılacak dizin
29
+ */
30
+ function ensureBuiltinLinks(baseDir) {
31
+ const base = baseDir || path.join(os.homedir(), '.natureco');
32
+ for (const { name, target } of LINKS) {
33
+ try {
34
+ if (!fs.existsSync(target)) continue; // paket bozuksa sessiz geç
35
+ const linkPath = path.join(base, name);
36
+
37
+ let st = null;
38
+ try { st = fs.lstatSync(linkPath); } catch { /* yok — kurulacak */ }
39
+
40
+ if (st) {
41
+ if (st.isSymbolicLink()) {
42
+ // Mevcut bağlantı doğru hedefe mi işaret ediyor? (npm prefix değişmiş olabilir)
43
+ let ok = false;
44
+ try { ok = fs.realpathSync(linkPath) === fs.realpathSync(target); } catch { /* kırık link */ }
45
+ if (ok) continue;
46
+ fs.unlinkSync(linkPath); // yanlış/kırık — yeniden kur
47
+ } else {
48
+ // Gerçek dosya/klasör (bağlantı değil): kullanıcı verisi olabilir — DOKUNMA
49
+ continue;
50
+ }
51
+ }
52
+
53
+ fs.mkdirSync(base, { recursive: true });
54
+ fs.symlinkSync(target, linkPath, process.platform === 'win32' ? 'junction' : 'dir');
55
+ } catch { /* bağlantı kurulamazsa komutu bozma — görünürlük kritik işlev değil */ }
56
+ }
57
+ }
58
+
59
+ module.exports = { ensureBuiltinLinks, _internal: { LINKS } };
@@ -0,0 +1,91 @@
1
+ /**
2
+ * update-check — hafif, engellemesiz yeni-sürüm bildirimi.
3
+ *
4
+ * NEDEN: Kullanıcılar eski sürümde takılı kalıyor ve aradaki farkı bilmiyor
5
+ * (örn. v5.13'te 10 skill vardı; 319 skill v5.21'de geldi — eski sürümdeki
6
+ * kullanıcılar "skill'ler yok" sanıyor). CLI hiç güncelleme uyarısı vermiyordu.
7
+ *
8
+ * TASARIM:
9
+ * - Registry'ye en fazla 24 saatte bir sorulur; sonuç ~/.natureco/update-check.json
10
+ * içinde saklanır.
11
+ * - Bildirim SENKRON olarak önbellekten basılır (ağ beklenmez, CLI yavaşlamaz);
12
+ * arka plandaki tazeleme isteği socket.unref() ile süreci canlı tutmaz.
13
+ * - Ağ hatası sessizce yutulur — güncelleme kontrolü asla komutu bozamaz.
14
+ * - Yalnız TTY'de basılır (pipe/script çıktısı kirlenmez).
15
+ * - NATURECO_NO_UPDATE_CHECK=1 ile tamamen kapatılır.
16
+ */
17
+
18
+ const fs = require('fs');
19
+ const path = require('path');
20
+ const os = require('os');
21
+ const https = require('https');
22
+
23
+ const CACHE_FILE = path.join(os.homedir(), '.natureco', 'update-check.json');
24
+ const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 saat
25
+ const REGISTRY_URL = 'https://registry.npmjs.org/natureco-cli/latest';
26
+
27
+ /** "5.47.1" > "5.13.0" gibi basit semver karşılaştırması (a > b → 1, a < b → -1). */
28
+ function compareVersions(a, b) {
29
+ const pa = String(a).split('.').map(n => parseInt(n, 10) || 0);
30
+ const pb = String(b).split('.').map(n => parseInt(n, 10) || 0);
31
+ for (let i = 0; i < 3; i++) {
32
+ if ((pa[i] || 0) > (pb[i] || 0)) return 1;
33
+ if ((pa[i] || 0) < (pb[i] || 0)) return -1;
34
+ }
35
+ return 0;
36
+ }
37
+
38
+ function readCache() {
39
+ try { return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf8')); } catch { return null; }
40
+ }
41
+
42
+ function writeCache(data) {
43
+ try {
44
+ fs.mkdirSync(path.dirname(CACHE_FILE), { recursive: true });
45
+ fs.writeFileSync(CACHE_FILE, JSON.stringify(data), 'utf8');
46
+ } catch { /* önbellek kritik değil */ }
47
+ }
48
+
49
+ /** Arka planda registry'den son sürümü çek ve önbelleğe yaz. Süreci canlı tutmaz. */
50
+ function refreshInBackground() {
51
+ try {
52
+ const req = https.get(REGISTRY_URL, { timeout: 3000, headers: { Accept: 'application/json' } }, (res) => {
53
+ let body = '';
54
+ res.on('data', (d) => { body += d; });
55
+ res.on('end', () => {
56
+ try {
57
+ const latest = JSON.parse(body).version;
58
+ if (latest) writeCache({ lastCheck: Date.now(), latest });
59
+ } catch { /* bozuk yanıt — yut */ }
60
+ });
61
+ res.on('error', () => {});
62
+ });
63
+ // Süreç, istek bitmeden çıkabilsin (hızlı komutları 3sn bekletme)
64
+ req.on('socket', (s) => { try { s.unref(); } catch {} });
65
+ req.on('timeout', () => { try { req.destroy(); } catch {} });
66
+ req.on('error', () => {});
67
+ } catch { /* ağ yok — sessiz */ }
68
+ }
69
+
70
+ /**
71
+ * CLI başlangıcında çağrılır: önbellekte daha yeni sürüm görünüyorsa tek satır
72
+ * bildirim basar; önbellek bayatsa arka planda tazeler.
73
+ */
74
+ function maybeNotify(currentVersion) {
75
+ if (process.env.NATURECO_NO_UPDATE_CHECK === '1') return;
76
+ if (!process.stdout.isTTY) return;
77
+
78
+ const cache = readCache();
79
+
80
+ if (cache && cache.latest && compareVersions(cache.latest, currentVersion) > 0) {
81
+ // chalk'a bağımlı olmadan soluk sarı bildirim
82
+ const dim = '\x1b[2m', yellow = '\x1b[33m', cyan = '\x1b[36m', reset = '\x1b[0m';
83
+ console.log(`${yellow}⬆ Yeni sürüm: v${currentVersion} → v${cache.latest}${reset} ${dim}—${reset} ${cyan}npm install -g natureco-cli${reset} ${dim}(yeni skill'ler ve araçlar içerir)${reset}`);
84
+ }
85
+
86
+ if (!cache || (Date.now() - (cache.lastCheck || 0)) > CHECK_INTERVAL_MS) {
87
+ refreshInBackground();
88
+ }
89
+ }
90
+
91
+ module.exports = { maybeNotify, compareVersions, _internal: { readCache, writeCache, refreshInBackground, CACHE_FILE } };