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 +11 -0
- package/bin/natureco.js +3 -0
- package/package.json +1 -1
- package/src/commands/skills.js +7 -4
- package/src/commands/status.js +22 -0
- package/src/utils/update-check.js +91 -0
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.
|
|
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"
|
package/src/commands/skills.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
211
|
-
console.log(chalk.
|
|
212
|
-
console.log(chalk.gray('
|
|
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
|
|
package/src/commands/status.js
CHANGED
|
@@ -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 } };
|