natureco-cli 5.47.1 → 5.48.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,17 @@
2
2
 
3
3
  All notable changes to NatureCo CLI will be documented in this file.
4
4
 
5
+ ## [5.48.0] - 2026-07-10 — "Güncelleme bildirimi + skill/araç görünürlüğü"
6
+
7
+ ### Context
8
+ - **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.
9
+
10
+ ### Added
11
+ - **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.
12
+ - **`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.
13
+ - **`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).
14
+ - 7 yeni test (`test/utils/update-check.test.js`): semver karşılaştırma, TTY/opt-out kapıları, hata dayanıklılığı.
15
+
5
16
  ## [5.47.1] - 2026-07-09 — "FIX: ASCII banner NATUREOO → NATURECO"
6
17
 
7
18
  ### Fixed
package/bin/natureco.js CHANGED
@@ -5,6 +5,9 @@ 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 */ }
8
11
  const login = require('../src/commands/login');
9
12
  const logout = require('../src/commands/logout');
10
13
  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.48.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şik skill\'ler paketle birlikte gelir; kişisel skill\'ler ~/.natureco/skills altında yaşar.\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,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 } };