natureco-cli 2.23.32 → 4.4.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/AUDIT.md +178 -0
- package/CHANGELOG.md +422 -0
- package/DEPLOY_v2.0.0.md +400 -0
- package/README.md +159 -1
- package/bin/natureco.js +170 -8
- package/package.json +43 -11
- package/skills/code-review/SKILL.md +0 -0
- package/skills/summarize/SKILL.md +0 -0
- package/skills/translate/SKILL.md +0 -0
- package/src/commands/acp.js +0 -0
- package/src/commands/admin-rpc.js +0 -0
- package/src/commands/agent.js +0 -0
- package/src/commands/agents.js +0 -0
- package/src/commands/approvals.js +0 -0
- package/src/commands/ask.js +0 -0
- package/src/commands/audit.js +209 -0
- package/src/commands/backup.js +0 -0
- package/src/commands/bonjour.js +0 -0
- package/src/commands/bots.js +0 -0
- package/src/commands/browser.js +0 -0
- package/src/commands/capability.js +0 -0
- package/src/commands/channels.js +0 -0
- package/src/commands/chat.js +0 -0
- package/src/commands/clawbot.js +0 -0
- package/src/commands/clickclack.js +0 -0
- package/src/commands/code.js +0 -0
- package/src/commands/commands.js +0 -0
- package/src/commands/commitments.js +0 -0
- package/src/commands/completion.js +0 -0
- package/src/commands/config.js +0 -0
- package/src/commands/configure.js +0 -0
- package/src/commands/cost.js +210 -0
- package/src/commands/crestodian.js +0 -0
- package/src/commands/cron.js +0 -0
- package/src/commands/daemon.js +0 -0
- package/src/commands/dashboard.js +126 -45
- package/src/commands/device-pair.js +0 -0
- package/src/commands/devices.js +0 -0
- package/src/commands/directory.js +0 -0
- package/src/commands/discord.js +0 -0
- package/src/commands/dns.js +0 -0
- package/src/commands/docs.js +0 -0
- package/src/commands/doctor.js +134 -15
- package/src/commands/exec-policy.js +0 -0
- package/src/commands/gateway-server.js +0 -0
- package/src/commands/gateway.js +0 -0
- package/src/commands/git.js +0 -0
- package/src/commands/health.js +0 -0
- package/src/commands/help.js +0 -0
- package/src/commands/hooks.js +0 -0
- package/src/commands/imessage.js +0 -0
- package/src/commands/infer.js +0 -0
- package/src/commands/init.js +0 -0
- package/src/commands/irc.js +0 -0
- package/src/commands/login.js +0 -0
- package/src/commands/logout.js +0 -0
- package/src/commands/logs.js +0 -0
- package/src/commands/mattermost.js +0 -0
- package/src/commands/mcp.js +0 -0
- package/src/commands/medium.js +206 -0
- package/src/commands/memory-cmd.js +0 -0
- package/src/commands/memory.js +0 -0
- package/src/commands/message.js +0 -0
- package/src/commands/migrate.js +0 -0
- package/src/commands/models.js +0 -0
- package/src/commands/naturehub.js +156 -0
- package/src/commands/node.js +0 -0
- package/src/commands/nodes.js +0 -0
- package/src/commands/oc-path.js +0 -0
- package/src/commands/onboard.js +0 -0
- package/src/commands/open-prose.js +0 -0
- package/src/commands/pairing.js +0 -0
- package/src/commands/path.js +0 -0
- package/src/commands/plugins.js +0 -0
- package/src/commands/policy.js +0 -0
- package/src/commands/proxy.js +0 -0
- package/src/commands/qr.js +0 -0
- package/src/commands/reset.js +0 -0
- package/src/commands/run.js +0 -0
- package/src/commands/sandbox.js +0 -0
- package/src/commands/secrets.js +0 -0
- package/src/commands/security.js +0 -0
- package/src/commands/seo.js +268 -0
- package/src/commands/sessions.js +0 -0
- package/src/commands/setup.js +6 -6
- package/src/commands/signal.js +0 -0
- package/src/commands/skills.js +82 -1
- package/src/commands/slack.js +0 -0
- package/src/commands/sms.js +0 -0
- package/src/commands/status.js +0 -0
- package/src/commands/system.js +0 -0
- package/src/commands/tasks.js +0 -0
- package/src/commands/team.js +171 -0
- package/src/commands/telegram.js +0 -0
- package/src/commands/terminal.js +0 -0
- package/src/commands/thread-ownership.js +0 -0
- package/src/commands/transcripts.js +0 -0
- package/src/commands/tui.js +0 -0
- package/src/commands/ultrareview.js +0 -0
- package/src/commands/uninstall.js +0 -0
- package/src/commands/update.js +0 -0
- package/src/commands/voice.js +0 -0
- package/src/commands/vydra.js +0 -0
- package/src/commands/web-fetch.js +0 -0
- package/src/commands/webhooks.js +0 -0
- package/src/commands/whatsapp.js +0 -0
- package/src/commands/wiki.js +0 -0
- package/src/commands/workboard.js +0 -0
- package/src/commands/xp.js +194 -0
- package/src/tools/audio_understanding.js +0 -0
- package/src/tools/bash.js +0 -0
- package/src/tools/browser.js +0 -0
- package/src/tools/canvas.js +0 -0
- package/src/tools/document_extract.js +0 -0
- package/src/tools/duckduckgo.js +0 -0
- package/src/tools/exa_search.js +0 -0
- package/src/tools/filesystem.js +0 -0
- package/src/tools/firecrawl.js +0 -0
- package/src/tools/git.js +0 -0
- package/src/tools/http.js +0 -0
- package/src/tools/image_generation.js +0 -0
- package/src/tools/list_dir.js +0 -0
- package/src/tools/llm_task.js +43 -11
- package/src/tools/media_understanding.js +0 -0
- package/src/tools/music_generation.js +0 -0
- package/src/tools/parallel_search.js +0 -0
- package/src/tools/phone_control.js +0 -0
- package/src/tools/phone_control_enhanced.js +0 -0
- package/src/tools/read_file.js +0 -0
- package/src/tools/searxng.js +0 -0
- package/src/tools/speech_to_text.js +0 -0
- package/src/tools/text_to_speech.js +0 -0
- package/src/tools/thread_ownership.js +0 -0
- package/src/tools/video_generation.js +0 -0
- package/src/tools/web_readability.js +0 -0
- package/src/tools/web_search.js +0 -0
- package/src/tools/write_file.js +0 -0
- package/src/utils/agents-md.js +0 -0
- package/src/utils/agents.js +0 -0
- package/src/utils/api.js +5 -1
- package/src/utils/approvals.js +0 -0
- package/src/utils/audit.js +199 -0
- package/src/utils/background.js +0 -0
- package/src/utils/baileys.js +0 -0
- package/src/utils/branding.js +136 -0
- package/src/utils/commands.js +0 -0
- package/src/utils/config.js +0 -0
- package/src/utils/cost-tracker.js +360 -0
- package/src/utils/cron.js +0 -0
- package/src/utils/dashboard-server.js +284 -0
- package/src/utils/errors.js +0 -0
- package/src/utils/format.js +7 -10
- package/src/utils/gateway-ws.js +0 -0
- package/src/utils/headless.js +0 -0
- package/src/utils/history.js +0 -0
- package/src/utils/hooks.js +0 -0
- package/src/utils/inquirer-wrapper.js +0 -0
- package/src/utils/mcp-client.js +0 -0
- package/src/utils/mcp.js +0 -0
- package/src/utils/memory.js +0 -0
- package/src/utils/parallel-tools.js +0 -0
- package/src/utils/path-utils.js +0 -0
- package/src/utils/pattern-detector.js +314 -0
- package/src/utils/plugin-registry.js +0 -0
- package/src/utils/secret-scanner.js +204 -0
- package/src/utils/secrets.js +0 -0
- package/src/utils/sessions.js +0 -0
- package/src/utils/skills.js +0 -0
- package/src/utils/sub-agent.js +6 -0
- package/src/utils/token-budget.js +0 -0
- package/src/utils/tool-adapter.js +0 -0
- package/src/utils/tool-runner.js +0 -0
- package/src/utils/tui.js +750 -0
- package/src/utils/web-fetch.js +0 -0
package/bin/natureco.js
CHANGED
|
@@ -34,6 +34,13 @@ const vydra = require('../src/commands/vydra');
|
|
|
34
34
|
const agent = require('../src/commands/agent');
|
|
35
35
|
const approvals = require('../src/commands/approvals');
|
|
36
36
|
const backup = require('../src/commands/backup');
|
|
37
|
+
const audit = require('../src/commands/audit');
|
|
38
|
+
const cost = require('../src/commands/cost');
|
|
39
|
+
const naturehub = require('../src/commands/naturehub');
|
|
40
|
+
const medium = require('../src/commands/medium');
|
|
41
|
+
const seo = require('../src/commands/seo');
|
|
42
|
+
const xp = require('../src/commands/xp');
|
|
43
|
+
const team = require('../src/commands/team');
|
|
37
44
|
const capability = require('../src/commands/capability');
|
|
38
45
|
const commitments = require('../src/commands/commitments');
|
|
39
46
|
const completion = require('../src/commands/completion');
|
|
@@ -567,6 +574,55 @@ program
|
|
|
567
574
|
modelsCmd(allArgs);
|
|
568
575
|
});
|
|
569
576
|
|
|
577
|
+
program
|
|
578
|
+
.command('audit [action] [params...]')
|
|
579
|
+
.description('Audit log görüntüleyici (today|stats|show|search|files|cleanup|tail)')
|
|
580
|
+
.action((action, params) => {
|
|
581
|
+
audit(action ? [action, ...(params || [])] : ['today']);
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
program
|
|
585
|
+
.command('cost [action] [params...]')
|
|
586
|
+
.description('Maliyet takibi (today|week|month|all|budget|set|model|prices)')
|
|
587
|
+
.action((action, params) => {
|
|
588
|
+
cost(action ? [action, ...(params || [])] : ['today']);
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
program
|
|
592
|
+
.command('naturehub [action] [params...]')
|
|
593
|
+
.description('Nature Hub\'a içerik yayınla (post|list|trending|config)')
|
|
594
|
+
.action((action, params) => {
|
|
595
|
+
naturehub(action ? [action, ...(params || [])] : []);
|
|
596
|
+
});
|
|
597
|
+
|
|
598
|
+
program
|
|
599
|
+
.command('medium [action] [params...]')
|
|
600
|
+
.description('Medium makale yayınla (draft|publish|list)')
|
|
601
|
+
.action((action, params) => {
|
|
602
|
+
medium(action ? [action, ...(params || [])] : []);
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
program
|
|
606
|
+
.command('seo [action] [params...]')
|
|
607
|
+
.description('SEO analizi (audit|meta|speed)')
|
|
608
|
+
.action((action, params) => {
|
|
609
|
+
seo(action ? [action, ...(params || [])] : []);
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
program
|
|
613
|
+
.command('xp [action]')
|
|
614
|
+
.description('NatureCo XP/Level sistemi')
|
|
615
|
+
.action((action) => {
|
|
616
|
+
xp(action ? [action] : []);
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
program
|
|
620
|
+
.command('team [action] [params...]')
|
|
621
|
+
.description('Multi-agent orkestrasyon (list|status|spawn|parallel)')
|
|
622
|
+
.action((action, params) => {
|
|
623
|
+
team(action ? [action, ...(params || [])] : []);
|
|
624
|
+
});
|
|
625
|
+
|
|
570
626
|
program
|
|
571
627
|
.command('memory [action] [params...]')
|
|
572
628
|
.description('Manage memory (status|list|search|show|clear|index|export|import|semantic|wiki)')
|
|
@@ -895,14 +951,120 @@ program
|
|
|
895
951
|
program
|
|
896
952
|
.command('help')
|
|
897
953
|
.description('Show help information')
|
|
898
|
-
.action(help);
|
|
954
|
+
.action(help);
|
|
955
|
+
|
|
956
|
+
// Yardım çıktısı için colors
|
|
957
|
+
program.configureHelp({
|
|
958
|
+
sortSubcommands: true,
|
|
959
|
+
showGlobalOptions: true,
|
|
960
|
+
});
|
|
961
|
+
|
|
962
|
+
// Global options
|
|
963
|
+
program
|
|
964
|
+
.option('--no-splash', 'Splash animasyonunu atla')
|
|
965
|
+
.option('--plain', 'Düz metin (renk ve animasyon yok)')
|
|
966
|
+
.option('--profile <name>', 'Farklı profil kullan (multi-account)')
|
|
967
|
+
.allowUnknownOption(); // kendi custom option'larımız için
|
|
968
|
+
|
|
969
|
+
// ════════════════════════════════════════════════════════════
|
|
970
|
+
// First-run akışı: setup yoksa otomatik wizard'a yönlendir
|
|
971
|
+
// ════════════════════════════════════════════════════════════
|
|
972
|
+
const path = require('path');
|
|
973
|
+
const fs = require('fs');
|
|
974
|
+
const os = require('os');
|
|
975
|
+
const brand = require('../src/utils/branding');
|
|
976
|
+
const tui = require('../src/utils/tui');
|
|
977
|
+
tui.init();
|
|
978
|
+
const { firstRunScreen } = brand;
|
|
979
|
+
|
|
980
|
+
const argv = process.argv.slice(2);
|
|
981
|
+
|
|
982
|
+
// Global option'ları filtrele — bunlar command değil
|
|
983
|
+
const GLOBAL_FLAGS = ['--no-splash', '--plain', '--profile'];
|
|
984
|
+
const realArgs = argv.filter(a => !GLOBAL_FLAGS.includes(a) && !a.startsWith('--profile='));
|
|
985
|
+
const hasCommand = realArgs.length > 0;
|
|
986
|
+
const CONFIG_DIR = path.join(os.homedir(), '.natureco');
|
|
987
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
|
988
|
+
|
|
989
|
+
// Yardım/versiyon için asla first-run'a sokma
|
|
990
|
+
const skipFirstRun = argv.includes('--help') || argv.includes('-h')
|
|
991
|
+
|| argv.includes('--version') || argv.includes('-V')
|
|
992
|
+
|| argv[0] === 'help' || argv[0] === 'setup' || argv[0] === 'update'
|
|
993
|
+
|| argv[0] === 'doctor' || argv[0] === 'uninstall';
|
|
994
|
+
|
|
995
|
+
// --no-splash flag'i ile splash atlanabilsin
|
|
996
|
+
const noSplash = argv.includes('--no-splash') || process.env.NATURECO_NO_SPLASH;
|
|
997
|
+
|
|
998
|
+
function needsFirstRun() {
|
|
999
|
+
try {
|
|
1000
|
+
if (!fs.existsSync(CONFIG_FILE)) return true;
|
|
1001
|
+
const cfg = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
|
|
1002
|
+
return !cfg.setupCompleted;
|
|
1003
|
+
} catch {
|
|
1004
|
+
return true;
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
899
1007
|
|
|
900
|
-
|
|
901
|
-
if (!
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
1008
|
+
async function handleNoArgs() {
|
|
1009
|
+
if (!hasCommand) {
|
|
1010
|
+
// Splash animasyonu (sadece TTY'de ve --no-splash yoksa)
|
|
1011
|
+
if (!noSplash && tui.CAPS.isTTY && !process.env.CI) {
|
|
1012
|
+
await tui.splash({
|
|
1013
|
+
title: 'NatureCo CLI',
|
|
1014
|
+
version: packageJson.version,
|
|
1015
|
+
subtitle: 'OpenClaw\'dan daha güvenli, daha hızlı, daha ucuz',
|
|
1016
|
+
duration: 1200,
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
if (!skipFirstRun && needsFirstRun()) {
|
|
1021
|
+
if (tui.CAPS.isTTY && !noSplash) {
|
|
1022
|
+
console.log('\n' + tui.C.amber(' ⌥ İlk kurulum hoş geldin! Hızlıca ayarlayalım.\n'));
|
|
1023
|
+
} else {
|
|
1024
|
+
console.log(firstRunScreen());
|
|
1025
|
+
}
|
|
1026
|
+
const setup = require('../src/commands/setup');
|
|
1027
|
+
await setup(['wizard']);
|
|
1028
|
+
console.log('\n');
|
|
1029
|
+
const userName = require('os').userInfo().username;
|
|
1030
|
+
console.log(tui.welcomeCard({
|
|
1031
|
+
version: packageJson.version,
|
|
1032
|
+
user: { name: userName },
|
|
1033
|
+
status: tui.C.green('✓ Aktif'),
|
|
1034
|
+
tips: brand.pickDailyTip(),
|
|
1035
|
+
}));
|
|
1036
|
+
return;
|
|
1037
|
+
}
|
|
1038
|
+
// Normal kullanım — welcome card
|
|
1039
|
+
const userName = require('os').userInfo().username;
|
|
1040
|
+
let loginStatus = 'ok';
|
|
1041
|
+
try {
|
|
1042
|
+
if (fs.existsSync(CONFIG_FILE)) {
|
|
1043
|
+
const cfg = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
|
|
1044
|
+
if (!cfg.providerApiKey && !cfg.apiKey) loginStatus = 'needed';
|
|
1045
|
+
} else {
|
|
1046
|
+
loginStatus = 'needed';
|
|
1047
|
+
}
|
|
1048
|
+
} catch { loginStatus = 'unknown'; }
|
|
1049
|
+
console.log('\n' + tui.welcomeCard({
|
|
1050
|
+
version: packageJson.version,
|
|
1051
|
+
user: { name: userName },
|
|
1052
|
+
status: loginStatus === 'ok' ? tui.C.green('✓ Aktif') : tui.C.amber('⚠ API key gerekli'),
|
|
1053
|
+
tips: brand.pickDailyTip(),
|
|
1054
|
+
}));
|
|
1055
|
+
return;
|
|
1056
|
+
}
|
|
1057
|
+
// Global option'ları filtrele (--no-splash, --plain, --profile) ve parse et
|
|
1058
|
+
const opts = program.opts();
|
|
1059
|
+
if (opts.profile) {
|
|
1060
|
+
process.env.NATURECO_PROFILE = opts.profile;
|
|
1061
|
+
// TODO: profile dizinini değiştir
|
|
1062
|
+
}
|
|
1063
|
+
if (opts.plain) {
|
|
1064
|
+
process.env.FORCE_COLOR = '0';
|
|
1065
|
+
process.env.NATURECO_NO_SPLASH = '1';
|
|
1066
|
+
}
|
|
907
1067
|
program.parse(process.argv);
|
|
908
1068
|
}
|
|
1069
|
+
|
|
1070
|
+
handleNoArgs();
|
package/package.json
CHANGED
|
@@ -1,30 +1,65 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "natureco-cli",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "4.4.0",
|
|
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"
|
|
7
7
|
},
|
|
8
8
|
"files": [
|
|
9
9
|
"bin/",
|
|
10
10
|
"src/",
|
|
11
|
-
"skills/"
|
|
11
|
+
"skills/",
|
|
12
|
+
"README.md",
|
|
13
|
+
"CHANGELOG.md",
|
|
14
|
+
"AUDIT.md",
|
|
15
|
+
"DEPLOY_v2.0.0.md"
|
|
12
16
|
],
|
|
13
17
|
"scripts": {
|
|
14
18
|
"test": "node bin/natureco.js help",
|
|
15
|
-
"test:unit": "
|
|
16
|
-
"test:watch": "
|
|
17
|
-
"test:coverage": "
|
|
19
|
+
"test:unit": "node --check bin/natureco.js && node -e \"console.log('All files OK')\"",
|
|
20
|
+
"test:watch": "node --watch bin/natureco.js",
|
|
21
|
+
"test:coverage": "node --check bin/natureco.js",
|
|
22
|
+
"postinstall": "node bin/natureco.js doctor || true",
|
|
23
|
+
"prepublishOnly": "node --check bin/natureco.js"
|
|
18
24
|
},
|
|
19
25
|
"keywords": [
|
|
20
26
|
"natureco",
|
|
21
27
|
"ai",
|
|
28
|
+
"ai-agent",
|
|
22
29
|
"bot",
|
|
23
30
|
"cli",
|
|
24
|
-
"terminal"
|
|
31
|
+
"terminal",
|
|
32
|
+
"openclaw-alternative",
|
|
33
|
+
"claude-code-alternative",
|
|
34
|
+
"multi-agent",
|
|
35
|
+
"self-evolving-skills",
|
|
36
|
+
"audit-log",
|
|
37
|
+
"cost-optimization",
|
|
38
|
+
"seo",
|
|
39
|
+
"türkçe",
|
|
40
|
+
"turkish",
|
|
41
|
+
"whatsapp-bot",
|
|
42
|
+
"telegram-bot",
|
|
43
|
+
"discord-bot",
|
|
44
|
+
"natureco-me"
|
|
25
45
|
],
|
|
26
|
-
"author":
|
|
46
|
+
"author": {
|
|
47
|
+
"name": "Gencay Olgun",
|
|
48
|
+
"email": "hello@natureco.me",
|
|
49
|
+
"url": "https://natureco.me"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://natureco.me/cli",
|
|
52
|
+
"repository": {
|
|
53
|
+
"type": "git",
|
|
54
|
+
"url": "git+https://github.com/natureco/natureco-cli.git"
|
|
55
|
+
},
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/natureco/natureco-cli/issues"
|
|
58
|
+
},
|
|
27
59
|
"license": "MIT",
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=18.0.0"
|
|
62
|
+
},
|
|
28
63
|
"dependencies": {
|
|
29
64
|
"@inquirer/prompts": "^8.5.0",
|
|
30
65
|
"@whiskeysockets/baileys": "^7.0.0-rc10",
|
|
@@ -38,9 +73,6 @@
|
|
|
38
73
|
"semver": "^7.8.1",
|
|
39
74
|
"ws": "^8.20.0"
|
|
40
75
|
},
|
|
41
|
-
"engines": {
|
|
42
|
-
"node": ">=18.0.0"
|
|
43
|
-
},
|
|
44
76
|
"devDependencies": {
|
|
45
77
|
"vitest": "^4.1.9"
|
|
46
78
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/src/commands/acp.js
CHANGED
|
File without changes
|
|
File without changes
|
package/src/commands/agent.js
CHANGED
|
File without changes
|
package/src/commands/agents.js
CHANGED
|
File without changes
|
|
File without changes
|
package/src/commands/ask.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* natureco audit — Audit log görüntüleyici ve yönetimi (Phase 2)
|
|
3
|
+
*
|
|
4
|
+
* Kullanım:
|
|
5
|
+
* natureco audit Bugünkü log'ları göster (son 50)
|
|
6
|
+
* natureco audit today Bugünkü tüm loglar
|
|
7
|
+
* natureco audit stats Son 24 saat istatistik
|
|
8
|
+
* natureco audit show <date> Belirli bir günün logları (YYYY-MM-DD)
|
|
9
|
+
* natureco audit cleanup 30 günden eski logları sil
|
|
10
|
+
* natureco audit tail Canlı log akışı
|
|
11
|
+
* natureco audit search <q> Action veya data içinde ara
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const chalk = require('chalk');
|
|
15
|
+
const tui = require('../utils/tui');
|
|
16
|
+
const F = require('../utils/format');
|
|
17
|
+
const fs = require('fs');
|
|
18
|
+
const path = require('path');
|
|
19
|
+
const audit = require('../utils/audit');
|
|
20
|
+
|
|
21
|
+
const SEVERITY_COLORS = {
|
|
22
|
+
command: chalk.cyan,
|
|
23
|
+
approval: chalk.yellow,
|
|
24
|
+
tool: chalk.magenta,
|
|
25
|
+
auth: chalk.green,
|
|
26
|
+
secret: chalk.red.bold,
|
|
27
|
+
config: chalk.blue,
|
|
28
|
+
cron: chalk.gray,
|
|
29
|
+
skill: chalk.green,
|
|
30
|
+
error: chalk.red,
|
|
31
|
+
info: chalk.white,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
function colorizeAction(action) {
|
|
35
|
+
if (!action) return chalk.gray('?');
|
|
36
|
+
const prefix = action.split('.')[0];
|
|
37
|
+
const colorFn = SEVERITY_COLORS[prefix] || chalk.white;
|
|
38
|
+
return colorFn(action);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function formatEntry(entry) {
|
|
42
|
+
const ts = entry.ts ? entry.ts.slice(11, 19) : '--:--:--';
|
|
43
|
+
const action = colorizeAction(entry.action);
|
|
44
|
+
// data içinden en anlamlı alanı çıkar
|
|
45
|
+
const data = { ...entry };
|
|
46
|
+
delete data.ts; delete data.pid; delete data.ppid; delete data.user;
|
|
47
|
+
delete data.cwd; delete data.argv; delete data.action;
|
|
48
|
+
const dataStr = Object.keys(data).length > 0
|
|
49
|
+
? ' ' + chalk.gray(JSON.stringify(data).slice(0, 100))
|
|
50
|
+
: '';
|
|
51
|
+
return `${chalk.gray(ts)} ${action}${dataStr}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function showEntries(entries, limit = 50) {
|
|
55
|
+
if (entries.length === 0) {
|
|
56
|
+
console.log(tui.C.muted('\n Kayıt yok.\n'));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const slice = entries.slice(-limit);
|
|
60
|
+
console.log(tui.styled(`\n 📋 ${entries.length} kayıt${limit < entries.length ? ` (son ${limit})` : ''}`, { color: tui.PALETTE.primary, bold: true }));
|
|
61
|
+
|
|
62
|
+
// Yeni TUI tablo
|
|
63
|
+
const rows = slice.map(e => ({
|
|
64
|
+
ts: e.ts ? e.ts.slice(11, 19) : '--:--:--',
|
|
65
|
+
action: e.action,
|
|
66
|
+
data: Object.keys(e).filter(k => !['ts', 'pid', 'ppid', 'user', 'cwd', 'argv', 'action'].includes(k)).length > 0
|
|
67
|
+
? JSON.stringify(Object.fromEntries(Object.entries(e).filter(([k]) => !['ts', 'pid', 'ppid', 'user', 'cwd', 'argv', 'action'].includes(k)))).slice(0, 80)
|
|
68
|
+
: '',
|
|
69
|
+
}));
|
|
70
|
+
|
|
71
|
+
console.log('\n' + tui.table(rows, [
|
|
72
|
+
{ key: 'ts', label: 'Saat', minWidth: 10, render: r => tui.C.muted(r.ts) },
|
|
73
|
+
{ key: 'action', label: 'Action', minWidth: 22, render: r => colorizeAction(r.action) },
|
|
74
|
+
{ key: 'data', label: 'Veri', minWidth: 30, render: r => tui.C.dim(r.data) },
|
|
75
|
+
], { borderStyle: 'round', zebra: true }));
|
|
76
|
+
console.log('');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function audit_cmd(args) {
|
|
80
|
+
const [action, ...params] = args || [];
|
|
81
|
+
|
|
82
|
+
if (!action || action === 'today') {
|
|
83
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
84
|
+
const entries = audit.readLog(today);
|
|
85
|
+
showEntries(entries);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (action === 'stats') {
|
|
90
|
+
const stats = audit.stats24h();
|
|
91
|
+
console.log('\n' + tui.styled(' 📊 Son 24 Saat Audit İstatistiği', { color: tui.PALETTE.primary, bold: true }));
|
|
92
|
+
console.log(tui.styled(' ' + '─'.repeat(56), { color: tui.PALETTE.border }));
|
|
93
|
+
console.log('\n ' + tui.C.muted('Dönem: ') + tui.C.text(stats.period));
|
|
94
|
+
console.log(' ' + tui.C.muted('Toplam kayıt: ') + tui.styled(String(stats.total), { color: tui.PALETTE.primary, bold: true }));
|
|
95
|
+
console.log('');
|
|
96
|
+
|
|
97
|
+
// TUI tablo ile
|
|
98
|
+
const rows = Object.entries(stats.byAction)
|
|
99
|
+
.sort((a, b) => b[1] - a[1])
|
|
100
|
+
.map(([act, count]) => {
|
|
101
|
+
const max = Math.max(...Object.values(stats.byAction));
|
|
102
|
+
const bar = tui.progressBar(count / max, 1, { width: 20, showPercent: false });
|
|
103
|
+
return { action: act, count: String(count), bar };
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
if (rows.length > 0) {
|
|
107
|
+
console.log(tui.table(rows, [
|
|
108
|
+
{ key: 'action', label: 'Action', minWidth: 22, render: r => colorizeAction(r.action) },
|
|
109
|
+
{ key: 'count', label: 'Sayı', minWidth: 6, render: r => tui.styled(r.count, { color: tui.PALETTE.secondary, bold: true }) },
|
|
110
|
+
{ key: 'bar', label: 'Dağılım', minWidth: 22, render: r => tui.styled(r.bar, { color: tui.PALETTE.primary }) },
|
|
111
|
+
], { borderStyle: 'round', zebra: true }));
|
|
112
|
+
}
|
|
113
|
+
console.log('');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (action === 'show') {
|
|
118
|
+
const date = params[0] || new Date().toISOString().slice(0, 10);
|
|
119
|
+
const entries = audit.readLog(date);
|
|
120
|
+
if (entries.length === 0) {
|
|
121
|
+
console.log(chalk.yellow(`\n ⚠️ ${date} için kayıt yok.\n`));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
showEntries(entries, 9999);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (action === 'cleanup') {
|
|
129
|
+
const removed = audit.cleanup();
|
|
130
|
+
console.log(chalk.green(`\n ✓ ${removed} eski log dosyası temizlendi (30 gün+).\n`));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (action === 'tail') {
|
|
135
|
+
console.log(chalk.cyan('\n 📡 Canlı audit log (Ctrl+C ile çık)...\n'));
|
|
136
|
+
let lastSize = 0;
|
|
137
|
+
const todayFile = audit.listLogFiles()[0];
|
|
138
|
+
const interval = setInterval(() => {
|
|
139
|
+
const current = audit.listLogFiles()[0];
|
|
140
|
+
if (current !== todayFile) {
|
|
141
|
+
console.log(chalk.gray(`\n ── yeni gün: ${current} ──`));
|
|
142
|
+
}
|
|
143
|
+
const file = path.join(audit.AUDIT_DIR, audit.listLogFiles()[0]);
|
|
144
|
+
try {
|
|
145
|
+
const stat = fs.statSync(file);
|
|
146
|
+
if (stat.size > lastSize) {
|
|
147
|
+
// Son eklenen satırları oku
|
|
148
|
+
const fd = fs.openSync(file, 'r');
|
|
149
|
+
const buf = Buffer.alloc(stat.size - lastSize);
|
|
150
|
+
fs.readSync(fd, buf, 0, buf.length, lastSize);
|
|
151
|
+
fs.closeSync(fd);
|
|
152
|
+
const lines = buf.toString('utf8').trim().split('\n');
|
|
153
|
+
for (const line of lines) {
|
|
154
|
+
try {
|
|
155
|
+
const entry = JSON.parse(line);
|
|
156
|
+
console.log(' ' + formatEntry(entry));
|
|
157
|
+
} catch {}
|
|
158
|
+
}
|
|
159
|
+
lastSize = stat.size;
|
|
160
|
+
}
|
|
161
|
+
} catch {}
|
|
162
|
+
}, 1000);
|
|
163
|
+
process.on('SIGINT', () => { clearInterval(interval); process.exit(0); });
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (action === 'search') {
|
|
168
|
+
const query = params.join(' ').toLowerCase();
|
|
169
|
+
if (!query) {
|
|
170
|
+
console.log(chalk.red('\n ❌ Arama terimi gerekli: natureco audit search <query>\n'));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
174
|
+
const yesterday = new Date(Date.now() - 86400000).toISOString().slice(0, 10);
|
|
175
|
+
const all = [...audit.readLog(today), ...audit.readLog(yesterday)];
|
|
176
|
+
const matches = all.filter(e =>
|
|
177
|
+
(e.action && e.action.toLowerCase().includes(query)) ||
|
|
178
|
+
JSON.stringify(e).toLowerCase().includes(query)
|
|
179
|
+
);
|
|
180
|
+
showEntries(matches, 200);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (action === 'files') {
|
|
185
|
+
const files = audit.listLogFiles();
|
|
186
|
+
console.log(chalk.bold('\n 📁 Audit log dosyaları:\n'));
|
|
187
|
+
for (const f of files) {
|
|
188
|
+
const stat = fs.statSync(path.join(audit.AUDIT_DIR, f));
|
|
189
|
+
const size = (stat.size / 1024).toFixed(1);
|
|
190
|
+
console.log(` ${chalk.cyan(f.padEnd(40))} ${chalk.gray(size + ' KB')}`);
|
|
191
|
+
}
|
|
192
|
+
console.log('');
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Yardım
|
|
197
|
+
console.log(chalk.yellow('\n Kullanım:'));
|
|
198
|
+
console.log(chalk.gray(' natureco audit Bugünkü logları göster'));
|
|
199
|
+
console.log(chalk.gray(' natureco audit today Bugünkü tüm loglar'));
|
|
200
|
+
console.log(chalk.gray(' natureco audit stats 24 saat istatistik'));
|
|
201
|
+
console.log(chalk.gray(' natureco audit show <date> Belirli gün (YYYY-MM-DD)'));
|
|
202
|
+
console.log(chalk.gray(' natureco audit search <q> Log ara'));
|
|
203
|
+
console.log(chalk.gray(' natureco audit files Dosya listesi'));
|
|
204
|
+
console.log(chalk.gray(' natureco audit cleanup 30 günden eski logları sil'));
|
|
205
|
+
console.log(chalk.gray(' natureco audit tail Canlı akış'));
|
|
206
|
+
console.log('');
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
module.exports = audit_cmd;
|
package/src/commands/backup.js
CHANGED
|
File without changes
|
package/src/commands/bonjour.js
CHANGED
|
File without changes
|
package/src/commands/bots.js
CHANGED
|
File without changes
|
package/src/commands/browser.js
CHANGED
|
File without changes
|
|
File without changes
|
package/src/commands/channels.js
CHANGED
|
File without changes
|
package/src/commands/chat.js
CHANGED
|
File without changes
|
package/src/commands/clawbot.js
CHANGED
|
File without changes
|
|
File without changes
|
package/src/commands/code.js
CHANGED
|
File without changes
|
package/src/commands/commands.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/src/commands/config.js
CHANGED
|
File without changes
|
|
File without changes
|