ccjk 12.0.7 → 12.0.8
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/package.json +1 -1
- package/dist/chunks/agent-teams.mjs +0 -136
- package/dist/chunks/agent.mjs +0 -1439
- package/dist/chunks/agents.mjs +0 -3778
- package/dist/chunks/api-cli.mjs +0 -132
- package/dist/chunks/api-providers.mjs +0 -129
- package/dist/chunks/api.mjs +0 -112
- package/dist/chunks/auto-bootstrap.mjs +0 -358
- package/dist/chunks/auto-init.mjs +0 -7584
- package/dist/chunks/auto-updater.mjs +0 -410
- package/dist/chunks/banner.mjs +0 -188
- package/dist/chunks/bash.mjs +0 -187
- package/dist/chunks/boost.mjs +0 -397
- package/dist/chunks/ccjk-agents.mjs +0 -414
- package/dist/chunks/ccjk-all.mjs +0 -1028
- package/dist/chunks/ccjk-config.mjs +0 -261
- package/dist/chunks/ccjk-hooks.mjs +0 -1074
- package/dist/chunks/ccjk-mcp.mjs +0 -761
- package/dist/chunks/ccjk-setup.mjs +0 -763
- package/dist/chunks/ccjk-skills.mjs +0 -514
- package/dist/chunks/ccr.mjs +0 -98
- package/dist/chunks/ccu.mjs +0 -40
- package/dist/chunks/check-updates.mjs +0 -108
- package/dist/chunks/claude-code-config-manager.mjs +0 -750
- package/dist/chunks/claude-code-incremental-manager.mjs +0 -623
- package/dist/chunks/claude-config.mjs +0 -236
- package/dist/chunks/claude-wrapper.mjs +0 -85
- package/dist/chunks/cleanup-migration.mjs +0 -20
- package/dist/chunks/cli-hook.mjs +0 -2285
- package/dist/chunks/cloud-sync.mjs +0 -29
- package/dist/chunks/codex-config-switch.mjs +0 -451
- package/dist/chunks/codex-provider-manager.mjs +0 -236
- package/dist/chunks/codex-uninstaller.mjs +0 -404
- package/dist/chunks/codex.mjs +0 -2077
- package/dist/chunks/commands.mjs +0 -108
- package/dist/chunks/commands2.mjs +0 -413
- package/dist/chunks/commit.mjs +0 -138
- package/dist/chunks/completion.mjs +0 -515
- package/dist/chunks/config-consolidator.mjs +0 -172
- package/dist/chunks/config-switch.mjs +0 -317
- package/dist/chunks/config.mjs +0 -379
- package/dist/chunks/config2.mjs +0 -477
- package/dist/chunks/config3.mjs +0 -470
- package/dist/chunks/constants.mjs +0 -133
- package/dist/chunks/context-loader.mjs +0 -343
- package/dist/chunks/context.mjs +0 -372
- package/dist/chunks/convoy-manager.mjs +0 -880
- package/dist/chunks/dashboard.mjs +0 -476
- package/dist/chunks/doctor.mjs +0 -964
- package/dist/chunks/evolution.mjs +0 -382
- package/dist/chunks/features.mjs +0 -698
- package/dist/chunks/fish.mjs +0 -181
- package/dist/chunks/fs-operations.mjs +0 -192
- package/dist/chunks/health-alerts.mjs +0 -304
- package/dist/chunks/health-check.mjs +0 -532
- package/dist/chunks/help.mjs +0 -340
- package/dist/chunks/hook-installer.mjs +0 -45
- package/dist/chunks/index.mjs +0 -24
- package/dist/chunks/index10.mjs +0 -1171
- package/dist/chunks/index11.mjs +0 -1008
- package/dist/chunks/index12.mjs +0 -193
- package/dist/chunks/index13.mjs +0 -218
- package/dist/chunks/index14.mjs +0 -663
- package/dist/chunks/index2.mjs +0 -19
- package/dist/chunks/index3.mjs +0 -19092
- package/dist/chunks/index4.mjs +0 -8
- package/dist/chunks/index5.mjs +0 -7600
- package/dist/chunks/index6.mjs +0 -171
- package/dist/chunks/index7.mjs +0 -3583
- package/dist/chunks/index8.mjs +0 -19
- package/dist/chunks/index9.mjs +0 -616
- package/dist/chunks/init.mjs +0 -1606
- package/dist/chunks/installer.mjs +0 -690
- package/dist/chunks/installer2.mjs +0 -179
- package/dist/chunks/interview.mjs +0 -2927
- package/dist/chunks/json-config.mjs +0 -60
- package/dist/chunks/linux.mjs +0 -3863
- package/dist/chunks/macos.mjs +0 -69
- package/dist/chunks/main.mjs +0 -635
- package/dist/chunks/manager.mjs +0 -1048
- package/dist/chunks/marketplace.mjs +0 -949
- package/dist/chunks/mcp-cli.mjs +0 -204
- package/dist/chunks/mcp-performance.mjs +0 -187
- package/dist/chunks/mcp.mjs +0 -1231
- package/dist/chunks/menu.mjs +0 -652
- package/dist/chunks/metrics-display.mjs +0 -153
- package/dist/chunks/migrator.mjs +0 -178
- package/dist/chunks/monitor.mjs +0 -1856
- package/dist/chunks/notification.mjs +0 -1864
- package/dist/chunks/onboarding.mjs +0 -385
- package/dist/chunks/package.mjs +0 -3
- package/dist/chunks/paradigm.mjs +0 -74
- package/dist/chunks/permission-manager.mjs +0 -132
- package/dist/chunks/permissions.mjs +0 -265
- package/dist/chunks/persistence-manager.mjs +0 -794
- package/dist/chunks/persistence.mjs +0 -667
- package/dist/chunks/platform.mjs +0 -391
- package/dist/chunks/plugin.mjs +0 -1936
- package/dist/chunks/powershell.mjs +0 -213
- package/dist/chunks/prompts.mjs +0 -241
- package/dist/chunks/providers.mjs +0 -260
- package/dist/chunks/quick-actions.mjs +0 -320
- package/dist/chunks/quick-provider.mjs +0 -682
- package/dist/chunks/quick-setup.mjs +0 -412
- package/dist/chunks/remote.mjs +0 -497
- package/dist/chunks/session.mjs +0 -878
- package/dist/chunks/sessions.mjs +0 -106
- package/dist/chunks/silent-updater.mjs +0 -396
- package/dist/chunks/simple-config.mjs +0 -98
- package/dist/chunks/skill.mjs +0 -117
- package/dist/chunks/skill2.mjs +0 -9003
- package/dist/chunks/skills-sync.mjs +0 -6460
- package/dist/chunks/skills.mjs +0 -567
- package/dist/chunks/slash-commands.mjs +0 -207
- package/dist/chunks/smart-defaults.mjs +0 -412
- package/dist/chunks/smart-guide.mjs +0 -194
- package/dist/chunks/startup.mjs +0 -487
- package/dist/chunks/stats.mjs +0 -410
- package/dist/chunks/status.mjs +0 -289
- package/dist/chunks/team.mjs +0 -63
- package/dist/chunks/thinking.mjs +0 -626
- package/dist/chunks/trace.mjs +0 -57
- package/dist/chunks/uninstall.mjs +0 -849
- package/dist/chunks/update.mjs +0 -167
- package/dist/chunks/upgrade-manager.mjs +0 -204
- package/dist/chunks/version-checker.mjs +0 -881
- package/dist/chunks/vim.mjs +0 -903
- package/dist/chunks/windows.mjs +0 -14
- package/dist/chunks/workflows.mjs +0 -633
- package/dist/chunks/wsl.mjs +0 -129
- package/dist/chunks/zero-config.mjs +0 -374
- package/dist/chunks/zsh.mjs +0 -182
- package/dist/cli.d.mts +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.mjs +0 -2199
- package/dist/i18n/locales/en/agent-teams.json +0 -18
- package/dist/i18n/locales/en/agentBrowser.json +0 -79
- package/dist/i18n/locales/en/agents.json +0 -135
- package/dist/i18n/locales/en/api.json +0 -63
- package/dist/i18n/locales/en/ccjk-agents.json +0 -33
- package/dist/i18n/locales/en/ccjk-all.json +0 -23
- package/dist/i18n/locales/en/ccjk-skills.json +0 -22
- package/dist/i18n/locales/en/ccjk.json +0 -276
- package/dist/i18n/locales/en/ccr.json +0 -65
- package/dist/i18n/locales/en/claude-md.json +0 -73
- package/dist/i18n/locales/en/cli.json +0 -152
- package/dist/i18n/locales/en/cloud-setup.json +0 -31
- package/dist/i18n/locales/en/cloud-sync.json +0 -147
- package/dist/i18n/locales/en/cloud.json +0 -40
- package/dist/i18n/locales/en/cloudPlugins.json +0 -118
- package/dist/i18n/locales/en/codex.json +0 -127
- package/dist/i18n/locales/en/cometix.json +0 -29
- package/dist/i18n/locales/en/common.json +0 -68
- package/dist/i18n/locales/en/config.json +0 -108
- package/dist/i18n/locales/en/configuration.json +0 -226
- package/dist/i18n/locales/en/context.json +0 -85
- package/dist/i18n/locales/en/dashboard.json +0 -78
- package/dist/i18n/locales/en/errors.json +0 -26
- package/dist/i18n/locales/en/evolution.json +0 -54
- package/dist/i18n/locales/en/hooks.json +0 -74
- package/dist/i18n/locales/en/hooksSync.json +0 -133
- package/dist/i18n/locales/en/installation.json +0 -83
- package/dist/i18n/locales/en/interview.json +0 -104
- package/dist/i18n/locales/en/language.json +0 -19
- package/dist/i18n/locales/en/lsp.json +0 -78
- package/dist/i18n/locales/en/marketplace.json +0 -116
- package/dist/i18n/locales/en/mcp.json +0 -178
- package/dist/i18n/locales/en/memory.json +0 -92
- package/dist/i18n/locales/en/menu.json +0 -143
- package/dist/i18n/locales/en/multi-config.json +0 -79
- package/dist/i18n/locales/en/notification.json +0 -307
- package/dist/i18n/locales/en/permissions.json +0 -95
- package/dist/i18n/locales/en/persistence.json +0 -127
- package/dist/i18n/locales/en/plugins.json +0 -146
- package/dist/i18n/locales/en/quick-actions.json +0 -78
- package/dist/i18n/locales/en/registry.json +0 -54
- package/dist/i18n/locales/en/remote.json +0 -93
- package/dist/i18n/locales/en/sandbox.json +0 -44
- package/dist/i18n/locales/en/setup.json +0 -44
- package/dist/i18n/locales/en/shencha.json +0 -14
- package/dist/i18n/locales/en/skills.json +0 -100
- package/dist/i18n/locales/en/skillsSync.json +0 -74
- package/dist/i18n/locales/en/smartGuide.json +0 -49
- package/dist/i18n/locales/en/stats.json +0 -20
- package/dist/i18n/locales/en/subagent.json +0 -69
- package/dist/i18n/locales/en/superpowers.json +0 -117
- package/dist/i18n/locales/en/team.json +0 -7
- package/dist/i18n/locales/en/thinking.json +0 -65
- package/dist/i18n/locales/en/tools.json +0 -42
- package/dist/i18n/locales/en/uninstall.json +0 -56
- package/dist/i18n/locales/en/updater.json +0 -29
- package/dist/i18n/locales/en/vim.json +0 -169
- package/dist/i18n/locales/en/workflow.json +0 -55
- package/dist/i18n/locales/en/workspace.json +0 -108
- package/dist/i18n/locales/zh-CN/agent-teams.json +0 -18
- package/dist/i18n/locales/zh-CN/agentBrowser.json +0 -79
- package/dist/i18n/locales/zh-CN/agents.json +0 -135
- package/dist/i18n/locales/zh-CN/api.json +0 -63
- package/dist/i18n/locales/zh-CN/ccjk-agents.json +0 -33
- package/dist/i18n/locales/zh-CN/ccjk-all.json +0 -23
- package/dist/i18n/locales/zh-CN/ccjk-skills.json +0 -22
- package/dist/i18n/locales/zh-CN/ccjk.json +0 -276
- package/dist/i18n/locales/zh-CN/ccr.json +0 -65
- package/dist/i18n/locales/zh-CN/claude-md.json +0 -73
- package/dist/i18n/locales/zh-CN/cli.json +0 -152
- package/dist/i18n/locales/zh-CN/cloud-setup.json +0 -31
- package/dist/i18n/locales/zh-CN/cloud-sync.json +0 -147
- package/dist/i18n/locales/zh-CN/cloud.json +0 -40
- package/dist/i18n/locales/zh-CN/cloudPlugins.json +0 -118
- package/dist/i18n/locales/zh-CN/codex.json +0 -127
- package/dist/i18n/locales/zh-CN/cometix.json +0 -29
- package/dist/i18n/locales/zh-CN/common.json +0 -68
- package/dist/i18n/locales/zh-CN/config.json +0 -108
- package/dist/i18n/locales/zh-CN/configuration.json +0 -224
- package/dist/i18n/locales/zh-CN/context.json +0 -85
- package/dist/i18n/locales/zh-CN/dashboard.json +0 -78
- package/dist/i18n/locales/zh-CN/errors.json +0 -26
- package/dist/i18n/locales/zh-CN/evolution.json +0 -54
- package/dist/i18n/locales/zh-CN/hooks.json +0 -74
- package/dist/i18n/locales/zh-CN/hooksSync.json +0 -133
- package/dist/i18n/locales/zh-CN/installation.json +0 -83
- package/dist/i18n/locales/zh-CN/interview.json +0 -104
- package/dist/i18n/locales/zh-CN/language.json +0 -19
- package/dist/i18n/locales/zh-CN/lsp.json +0 -78
- package/dist/i18n/locales/zh-CN/marketplace.json +0 -116
- package/dist/i18n/locales/zh-CN/mcp.json +0 -178
- package/dist/i18n/locales/zh-CN/memory.json +0 -92
- package/dist/i18n/locales/zh-CN/menu.json +0 -143
- package/dist/i18n/locales/zh-CN/multi-config.json +0 -79
- package/dist/i18n/locales/zh-CN/notification.json +0 -307
- package/dist/i18n/locales/zh-CN/permissions.json +0 -95
- package/dist/i18n/locales/zh-CN/persistence.json +0 -127
- package/dist/i18n/locales/zh-CN/plugins.json +0 -146
- package/dist/i18n/locales/zh-CN/quick-actions.json +0 -78
- package/dist/i18n/locales/zh-CN/registry.json +0 -54
- package/dist/i18n/locales/zh-CN/remote.json +0 -93
- package/dist/i18n/locales/zh-CN/sandbox.json +0 -44
- package/dist/i18n/locales/zh-CN/setup.json +0 -44
- package/dist/i18n/locales/zh-CN/shencha.json +0 -14
- package/dist/i18n/locales/zh-CN/skills.json +0 -100
- package/dist/i18n/locales/zh-CN/skillsSync.json +0 -74
- package/dist/i18n/locales/zh-CN/smartGuide.json +0 -49
- package/dist/i18n/locales/zh-CN/stats.json +0 -20
- package/dist/i18n/locales/zh-CN/subagent.json +0 -69
- package/dist/i18n/locales/zh-CN/superpowers.json +0 -117
- package/dist/i18n/locales/zh-CN/team.json +0 -7
- package/dist/i18n/locales/zh-CN/thinking.json +0 -65
- package/dist/i18n/locales/zh-CN/tools.json +0 -42
- package/dist/i18n/locales/zh-CN/uninstall.json +0 -56
- package/dist/i18n/locales/zh-CN/updater.json +0 -29
- package/dist/i18n/locales/zh-CN/vim.json +0 -169
- package/dist/i18n/locales/zh-CN/workflow.json +0 -55
- package/dist/i18n/locales/zh-CN/workspace.json +0 -108
- package/dist/index.d.mts +0 -5295
- package/dist/index.d.ts +0 -5295
- package/dist/index.mjs +0 -4941
- package/dist/shared/ccjk.B364Fu0N.mjs +0 -1819
- package/dist/shared/ccjk.BAGoDD49.mjs +0 -36
- package/dist/shared/ccjk.BBtCGd_g.mjs +0 -899
- package/dist/shared/ccjk.BFQ7yr5S.mjs +0 -16
- package/dist/shared/ccjk.BFxsJM0k.mjs +0 -599
- package/dist/shared/ccjk.BIxuVL3_.mjs +0 -25
- package/dist/shared/ccjk.BRZ9ww8S.mjs +0 -142
- package/dist/shared/ccjk.BoApaI4j.mjs +0 -28
- package/dist/shared/ccjk.BrPUmTqm.mjs +0 -266
- package/dist/shared/ccjk.BtB1e5jm.mjs +0 -171
- package/dist/shared/ccjk.BwfbSKN2.mjs +0 -1051
- package/dist/shared/ccjk.BxSmJ8B7.mjs +0 -243
- package/dist/shared/ccjk.Bx_rmYfN.mjs +0 -69
- package/dist/shared/ccjk.C2jHOZVP.mjs +0 -52
- package/dist/shared/ccjk.CL4Yat0G.mjs +0 -303
- package/dist/shared/ccjk.COweQ1RR.mjs +0 -5
- package/dist/shared/ccjk.CePkJq2S.mjs +0 -223
- package/dist/shared/ccjk.CfKKcvWy.mjs +0 -126
- package/dist/shared/ccjk.Cjgrln_h.mjs +0 -297
- package/dist/shared/ccjk.Cjj8SVrn.mjs +0 -54
- package/dist/shared/ccjk.CxpGa6MC.mjs +0 -2724
- package/dist/shared/ccjk.D5MFQT7w.mjs +0 -400
- package/dist/shared/ccjk.D6ycHbak.mjs +0 -270
- package/dist/shared/ccjk.D8ZLYSZZ.mjs +0 -299
- package/dist/shared/ccjk.DG_o24cZ.mjs +0 -88
- package/dist/shared/ccjk.DLLw-h4Y.mjs +0 -460
- package/dist/shared/ccjk.DOwtZMk8.mjs +0 -4019
- package/dist/shared/ccjk.DS7UESmF.mjs +0 -2451
- package/dist/shared/ccjk.DTdjs-qK.mjs +0 -1447
- package/dist/shared/ccjk.DXRAZcix.mjs +0 -66
- package/dist/shared/ccjk.DsYaCCx4.mjs +0 -317
- package/dist/shared/ccjk.J8YiPsOw.mjs +0 -259
- package/dist/shared/ccjk.KfSWcGlE.mjs +0 -38
- package/dist/shared/ccjk.RyizuzOI.mjs +0 -21
- package/dist/shared/ccjk.SPoXMvZD.mjs +0 -1242
- package/dist/shared/ccjk.T_cX87dY.mjs +0 -15
- package/dist/shared/ccjk.UIvifqNE.mjs +0 -1486
- package/dist/shared/ccjk._dESH4Rk.mjs +0 -111
- package/dist/shared/ccjk.bQ7Dh1g4.mjs +0 -249
- package/dist/shared/ccjk.c-ETfBZ_.mjs +0 -617
- package/dist/shared/ccjk.gDEDGD_t.mjs +0 -38
- package/dist/shared/ccjk.hoqrwWdN.mjs +0 -333
- package/dist/shared/ccjk.waa2ikKJ.mjs +0 -351
package/dist/chunks/fish.mjs
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
function generateFishCompletion(commands) {
|
|
2
|
-
const lines = [
|
|
3
|
-
"# CCJK CLI Fish Completion",
|
|
4
|
-
"# Generated automatically - do not edit manually",
|
|
5
|
-
"# Install: place in ~/.config/fish/completions/ccjk.fish",
|
|
6
|
-
"",
|
|
7
|
-
"# Disable file completion by default",
|
|
8
|
-
"complete -c ccjk -f",
|
|
9
|
-
"",
|
|
10
|
-
"# Helper functions",
|
|
11
|
-
"",
|
|
12
|
-
"# Check if we need command completion",
|
|
13
|
-
"function __fish_ccjk_needs_command",
|
|
14
|
-
" set -l cmd (commandline -opc)",
|
|
15
|
-
" if test (count $cmd) -eq 1",
|
|
16
|
-
" return 0",
|
|
17
|
-
" end",
|
|
18
|
-
" return 1",
|
|
19
|
-
"end",
|
|
20
|
-
"",
|
|
21
|
-
"# Check if current command matches",
|
|
22
|
-
"function __fish_ccjk_using_command",
|
|
23
|
-
" set -l cmd (commandline -opc)",
|
|
24
|
-
" if test (count $cmd) -gt 1",
|
|
25
|
-
" if test $argv[1] = $cmd[2]",
|
|
26
|
-
" return 0",
|
|
27
|
-
" end",
|
|
28
|
-
" end",
|
|
29
|
-
" return 1",
|
|
30
|
-
"end",
|
|
31
|
-
"",
|
|
32
|
-
"# Check if current subcommand matches",
|
|
33
|
-
"function __fish_ccjk_using_subcommand",
|
|
34
|
-
" set -l cmd (commandline -opc)",
|
|
35
|
-
" if test (count $cmd) -gt 2",
|
|
36
|
-
" if test $argv[1] = $cmd[2] -a $argv[2] = $cmd[3]",
|
|
37
|
-
" return 0",
|
|
38
|
-
" end",
|
|
39
|
-
" end",
|
|
40
|
-
" return 1",
|
|
41
|
-
"end",
|
|
42
|
-
"",
|
|
43
|
-
"# Dynamic completion functions",
|
|
44
|
-
"",
|
|
45
|
-
"# Get installed MCP services",
|
|
46
|
-
"function __fish_ccjk_mcp_services",
|
|
47
|
-
` ccjk mcp list --json 2>/dev/null | string match -r '"name":\\s*"([^"]+)' | string replace -r '"name":\\s*"' ''`,
|
|
48
|
-
"end",
|
|
49
|
-
"",
|
|
50
|
-
"# Get available skills",
|
|
51
|
-
"function __fish_ccjk_skills",
|
|
52
|
-
" ccjk skills list --format list 2>/dev/null | string match -v '^$'",
|
|
53
|
-
"end",
|
|
54
|
-
"",
|
|
55
|
-
"# Get available agents",
|
|
56
|
-
"function __fish_ccjk_agents",
|
|
57
|
-
` ccjk agent list --json 2>/dev/null | string match -r '"id":\\s*"([^"]+)' | string replace -r '"id":\\s*"' ''`,
|
|
58
|
-
"end",
|
|
59
|
-
"",
|
|
60
|
-
"# Get available sessions",
|
|
61
|
-
"function __fish_ccjk_sessions",
|
|
62
|
-
` ccjk session list --json 2>/dev/null | string match -r '"name":\\s*"([^"]+)' | string replace -r '"name":\\s*"' ''`,
|
|
63
|
-
"end",
|
|
64
|
-
"",
|
|
65
|
-
"# Global options",
|
|
66
|
-
'complete -c ccjk -s h -l help -d "Show help"',
|
|
67
|
-
'complete -c ccjk -s v -l version -d "Show version"',
|
|
68
|
-
'complete -c ccjk -s l -l lang -d "Display language" -xa "zh-CN en"',
|
|
69
|
-
"",
|
|
70
|
-
"# Commands"
|
|
71
|
-
];
|
|
72
|
-
for (const cmd of commands) {
|
|
73
|
-
lines.push("");
|
|
74
|
-
lines.push(`# ${cmd.name} command`);
|
|
75
|
-
lines.push(`complete -c ccjk -n __fish_ccjk_needs_command -a ${cmd.name} -d "${escapeFishString(cmd.description)}"`);
|
|
76
|
-
if (cmd.aliases) {
|
|
77
|
-
for (const alias of cmd.aliases) {
|
|
78
|
-
lines.push(`complete -c ccjk -n __fish_ccjk_needs_command -a ${alias} -d "${escapeFishString(cmd.description)} (alias)"`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if (cmd.options) {
|
|
82
|
-
for (const opt of cmd.options) {
|
|
83
|
-
const optLines = generateFishOption(cmd.name, opt, cmd.aliases);
|
|
84
|
-
lines.push(...optLines);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
if (cmd.subcommands) {
|
|
88
|
-
lines.push("");
|
|
89
|
-
lines.push(`# ${cmd.name} subcommands`);
|
|
90
|
-
for (const sub of cmd.subcommands) {
|
|
91
|
-
const condition = `__fish_ccjk_using_command ${cmd.name}`;
|
|
92
|
-
lines.push(`complete -c ccjk -n "${condition}" -a ${sub.name} -d "${escapeFishString(sub.description)}"`);
|
|
93
|
-
if (cmd.aliases) {
|
|
94
|
-
for (const alias of cmd.aliases) {
|
|
95
|
-
const aliasCondition = `__fish_ccjk_using_command ${alias}`;
|
|
96
|
-
lines.push(`complete -c ccjk -n "${aliasCondition}" -a ${sub.name} -d "${escapeFishString(sub.description)}"`);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
if (sub.options) {
|
|
100
|
-
for (const opt of sub.options) {
|
|
101
|
-
const subOptLines = generateFishSubcommandOption(cmd.name, sub.name, opt, cmd.aliases);
|
|
102
|
-
lines.push(...subOptLines);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return lines.join("\n");
|
|
109
|
-
}
|
|
110
|
-
function generateFishOption(cmdName, opt, aliases) {
|
|
111
|
-
const lines = [];
|
|
112
|
-
const flags = parseOptionFlags(opt.flags);
|
|
113
|
-
const desc = escapeFishString(opt.description);
|
|
114
|
-
const condition = `__fish_ccjk_using_command ${cmdName}`;
|
|
115
|
-
let optSpec = `-n "${condition}"`;
|
|
116
|
-
const shortFlag = flags.find((f) => f.startsWith("-") && !f.startsWith("--"));
|
|
117
|
-
if (shortFlag) {
|
|
118
|
-
optSpec += ` -s ${shortFlag.replace("-", "")}`;
|
|
119
|
-
}
|
|
120
|
-
const longFlag = flags.find((f) => f.startsWith("--"));
|
|
121
|
-
if (longFlag) {
|
|
122
|
-
optSpec += ` -l ${longFlag.replace("--", "")}`;
|
|
123
|
-
}
|
|
124
|
-
optSpec += ` -d "${desc}"`;
|
|
125
|
-
if (opt.values) {
|
|
126
|
-
if (typeof opt.values === "function") {
|
|
127
|
-
optSpec += " -r";
|
|
128
|
-
} else {
|
|
129
|
-
optSpec += ` -xa "${opt.values.join(" ")}"`;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
lines.push(`complete -c ccjk ${optSpec}`);
|
|
133
|
-
if (aliases) {
|
|
134
|
-
for (const alias of aliases) {
|
|
135
|
-
const aliasCondition = `__fish_ccjk_using_command ${alias}`;
|
|
136
|
-
const aliasOptSpec = optSpec.replace(condition, aliasCondition);
|
|
137
|
-
lines.push(`complete -c ccjk ${aliasOptSpec}`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return lines;
|
|
141
|
-
}
|
|
142
|
-
function generateFishSubcommandOption(cmdName, subName, opt, aliases) {
|
|
143
|
-
const lines = [];
|
|
144
|
-
const flags = parseOptionFlags(opt.flags);
|
|
145
|
-
const desc = escapeFishString(opt.description);
|
|
146
|
-
const condition = `__fish_ccjk_using_subcommand ${cmdName} ${subName}`;
|
|
147
|
-
let optSpec = `-n "${condition}"`;
|
|
148
|
-
const shortFlag = flags.find((f) => f.startsWith("-") && !f.startsWith("--"));
|
|
149
|
-
if (shortFlag) {
|
|
150
|
-
optSpec += ` -s ${shortFlag.replace("-", "")}`;
|
|
151
|
-
}
|
|
152
|
-
const longFlag = flags.find((f) => f.startsWith("--"));
|
|
153
|
-
if (longFlag) {
|
|
154
|
-
optSpec += ` -l ${longFlag.replace("--", "")}`;
|
|
155
|
-
}
|
|
156
|
-
optSpec += ` -d "${desc}"`;
|
|
157
|
-
if (opt.values) {
|
|
158
|
-
if (typeof opt.values === "function") {
|
|
159
|
-
optSpec += " -r";
|
|
160
|
-
} else {
|
|
161
|
-
optSpec += ` -xa "${opt.values.join(" ")}"`;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
lines.push(`complete -c ccjk ${optSpec}`);
|
|
165
|
-
if (aliases) {
|
|
166
|
-
for (const alias of aliases) {
|
|
167
|
-
const aliasCondition = `__fish_ccjk_using_subcommand ${alias} ${subName}`;
|
|
168
|
-
const aliasOptSpec = optSpec.replace(condition, aliasCondition);
|
|
169
|
-
lines.push(`complete -c ccjk ${aliasOptSpec}`);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return lines;
|
|
173
|
-
}
|
|
174
|
-
function parseOptionFlags(flags) {
|
|
175
|
-
return flags.split(",").map((f) => f.trim().split(/\s+/)[0]);
|
|
176
|
-
}
|
|
177
|
-
function escapeFishString(str) {
|
|
178
|
-
return str.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\$/g, "\\$");
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
export { generateFishCompletion };
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { randomBytes } from 'node:crypto';
|
|
2
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, unlinkSync, copyFileSync, readdirSync, statSync } from 'node:fs';
|
|
3
|
-
import { mkdir, writeFile as writeFile$1, rename, unlink } from 'node:fs/promises';
|
|
4
|
-
import { d as dirname, j as join } from '../shared/ccjk.bQ7Dh1g4.mjs';
|
|
5
|
-
|
|
6
|
-
class FileSystemError extends Error {
|
|
7
|
-
constructor(message, path, cause) {
|
|
8
|
-
super(message);
|
|
9
|
-
this.path = path;
|
|
10
|
-
this.cause = cause;
|
|
11
|
-
this.name = "FileSystemError";
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
function exists(path) {
|
|
15
|
-
return existsSync(path);
|
|
16
|
-
}
|
|
17
|
-
function ensureDir(path) {
|
|
18
|
-
if (!existsSync(path)) {
|
|
19
|
-
mkdirSync(path, { recursive: true });
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function ensureFileDir(filePath) {
|
|
23
|
-
const dir = dirname(filePath);
|
|
24
|
-
ensureDir(dir);
|
|
25
|
-
}
|
|
26
|
-
function readFile(path, encoding = "utf-8") {
|
|
27
|
-
try {
|
|
28
|
-
return readFileSync(path, encoding);
|
|
29
|
-
} catch (error) {
|
|
30
|
-
throw new FileSystemError(
|
|
31
|
-
`Failed to read file: ${path}`,
|
|
32
|
-
path,
|
|
33
|
-
error
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function writeFile(path, content, encoding = "utf-8") {
|
|
38
|
-
try {
|
|
39
|
-
ensureFileDir(path);
|
|
40
|
-
writeFileSync(path, content, encoding);
|
|
41
|
-
} catch (error) {
|
|
42
|
-
throw new FileSystemError(
|
|
43
|
-
`Failed to write file: ${path}`,
|
|
44
|
-
path,
|
|
45
|
-
error
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function writeFileAtomic(path, content, options = "utf-8") {
|
|
50
|
-
const dir = dirname(path);
|
|
51
|
-
ensureDir(dir);
|
|
52
|
-
const opts = typeof options === "string" ? { encoding: options } : options;
|
|
53
|
-
const encoding = opts.encoding ?? "utf-8";
|
|
54
|
-
const tempFileName = `.tmp_${randomBytes(8).toString("hex")}_${Date.now()}`;
|
|
55
|
-
const tempPath = join(dir, tempFileName);
|
|
56
|
-
try {
|
|
57
|
-
writeFileSync(tempPath, content, { encoding, mode: opts.mode });
|
|
58
|
-
renameSync(tempPath, path);
|
|
59
|
-
} catch (error) {
|
|
60
|
-
try {
|
|
61
|
-
if (existsSync(tempPath)) {
|
|
62
|
-
unlinkSync(tempPath);
|
|
63
|
-
}
|
|
64
|
-
} catch {
|
|
65
|
-
}
|
|
66
|
-
throw new FileSystemError(
|
|
67
|
-
`Failed to write file atomically: ${path}`,
|
|
68
|
-
path,
|
|
69
|
-
error
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
async function writeFileAtomicAsync(path, content, options = "utf-8") {
|
|
74
|
-
const dir = dirname(path);
|
|
75
|
-
await mkdir(dir, { recursive: true });
|
|
76
|
-
const opts = typeof options === "string" ? { encoding: options } : options;
|
|
77
|
-
const encoding = opts.encoding ?? "utf-8";
|
|
78
|
-
const tempFileName = `.tmp_${randomBytes(8).toString("hex")}_${Date.now()}`;
|
|
79
|
-
const tempPath = join(dir, tempFileName);
|
|
80
|
-
try {
|
|
81
|
-
await writeFile$1(tempPath, content, { encoding, mode: opts.mode });
|
|
82
|
-
await rename(tempPath, path);
|
|
83
|
-
} catch (error) {
|
|
84
|
-
try {
|
|
85
|
-
if (existsSync(tempPath)) {
|
|
86
|
-
await unlink(tempPath);
|
|
87
|
-
}
|
|
88
|
-
} catch {
|
|
89
|
-
}
|
|
90
|
-
throw new FileSystemError(
|
|
91
|
-
`Failed to write file atomically: ${path}`,
|
|
92
|
-
path,
|
|
93
|
-
error
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
function readJsonFile(path) {
|
|
98
|
-
try {
|
|
99
|
-
const content = readFile(path, "utf-8");
|
|
100
|
-
return JSON.parse(content);
|
|
101
|
-
} catch (error) {
|
|
102
|
-
throw new FileSystemError(
|
|
103
|
-
`Failed to read JSON file: ${path}`,
|
|
104
|
-
path,
|
|
105
|
-
error
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
function writeJsonFile(path, data, pretty = true) {
|
|
110
|
-
try {
|
|
111
|
-
const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
|
|
112
|
-
writeFile(path, content, "utf-8");
|
|
113
|
-
} catch (error) {
|
|
114
|
-
throw new FileSystemError(
|
|
115
|
-
`Failed to write JSON file: ${path}`,
|
|
116
|
-
path,
|
|
117
|
-
error
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
function copyFile(src, dest) {
|
|
122
|
-
try {
|
|
123
|
-
ensureFileDir(dest);
|
|
124
|
-
copyFileSync(src, dest);
|
|
125
|
-
} catch (error) {
|
|
126
|
-
throw new FileSystemError(
|
|
127
|
-
`Failed to copy file from ${src} to ${dest}`,
|
|
128
|
-
src,
|
|
129
|
-
error
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
function readDir(path) {
|
|
134
|
-
try {
|
|
135
|
-
return readdirSync(path);
|
|
136
|
-
} catch (error) {
|
|
137
|
-
throw new FileSystemError(
|
|
138
|
-
`Failed to read directory: ${path}`,
|
|
139
|
-
path,
|
|
140
|
-
error
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
function getStatsSafe(path) {
|
|
145
|
-
try {
|
|
146
|
-
return statSync(path);
|
|
147
|
-
} catch {
|
|
148
|
-
return null;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
function removeFile(path) {
|
|
152
|
-
try {
|
|
153
|
-
if (exists(path)) {
|
|
154
|
-
unlinkSync(path);
|
|
155
|
-
}
|
|
156
|
-
} catch (error) {
|
|
157
|
-
throw new FileSystemError(
|
|
158
|
-
`Failed to remove file: ${path}`,
|
|
159
|
-
path,
|
|
160
|
-
error
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
function copyDir(src, dest, options = {}) {
|
|
165
|
-
const { filter, overwrite = true } = options;
|
|
166
|
-
if (!exists(src)) {
|
|
167
|
-
throw new FileSystemError(`Source directory does not exist: ${src}`, src);
|
|
168
|
-
}
|
|
169
|
-
ensureDir(dest);
|
|
170
|
-
const entries = readDir(src);
|
|
171
|
-
for (const entry of entries) {
|
|
172
|
-
const srcPath = `${src}/${entry}`;
|
|
173
|
-
const destPath = `${dest}/${entry}`;
|
|
174
|
-
const stats = getStatsSafe(srcPath);
|
|
175
|
-
if (!stats) {
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
if (filter && !filter(srcPath, stats)) {
|
|
179
|
-
continue;
|
|
180
|
-
}
|
|
181
|
-
if (stats.isDirectory()) {
|
|
182
|
-
copyDir(srcPath, destPath, options);
|
|
183
|
-
} else {
|
|
184
|
-
if (!overwrite && exists(destPath)) {
|
|
185
|
-
continue;
|
|
186
|
-
}
|
|
187
|
-
copyFile(srcPath, destPath);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export { FileSystemError, copyDir, copyFile, ensureDir, ensureFileDir, exists, getStatsSafe, readDir, readFile, readJsonFile, removeFile, writeFile, writeFileAtomic, writeFileAtomicAsync, writeJsonFile };
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'node:fs';
|
|
2
|
-
import { DatabaseHealthMonitor } from './health-check.mjs';
|
|
3
|
-
import { j as join, d as dirname } from '../shared/ccjk.bQ7Dh1g4.mjs';
|
|
4
|
-
import 'better-sqlite3';
|
|
5
|
-
|
|
6
|
-
const DEFAULT_CONFIG = {
|
|
7
|
-
silent: false,
|
|
8
|
-
walThresholdMB: 10,
|
|
9
|
-
diskUtilizationThreshold: 70,
|
|
10
|
-
backupAgeThresholdDays: 7,
|
|
11
|
-
enableHistory: true
|
|
12
|
-
};
|
|
13
|
-
class HealthAlertsManager {
|
|
14
|
-
monitor;
|
|
15
|
-
config;
|
|
16
|
-
historyPath;
|
|
17
|
-
dbPath;
|
|
18
|
-
constructor(dbPath, config) {
|
|
19
|
-
this.dbPath = dbPath;
|
|
20
|
-
this.monitor = new DatabaseHealthMonitor(dbPath);
|
|
21
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
22
|
-
this.historyPath = join(dirname(dbPath), "alert-history.json");
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Run health checks and generate alerts
|
|
26
|
-
*/
|
|
27
|
-
async checkHealth() {
|
|
28
|
-
const alerts = [];
|
|
29
|
-
try {
|
|
30
|
-
const health = await this.monitor.runHealthCheck();
|
|
31
|
-
if (!health.checks.integrity.passed) {
|
|
32
|
-
alerts.push({
|
|
33
|
-
severity: "critical" /* CRITICAL */,
|
|
34
|
-
category: "corruption",
|
|
35
|
-
message: "Database corruption detected",
|
|
36
|
-
action: "Run: ccjk context recover",
|
|
37
|
-
timestamp: Date.now()
|
|
38
|
-
});
|
|
39
|
-
for (const error of health.checks.integrity.errors) {
|
|
40
|
-
alerts.push({
|
|
41
|
-
severity: "critical" /* CRITICAL */,
|
|
42
|
-
category: "corruption",
|
|
43
|
-
message: error,
|
|
44
|
-
timestamp: Date.now()
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const walSizeMB = health.checks.wal.walSize / (1024 * 1024);
|
|
49
|
-
if (walSizeMB > this.config.walThresholdMB) {
|
|
50
|
-
alerts.push({
|
|
51
|
-
severity: "warning" /* WARNING */,
|
|
52
|
-
category: "wal",
|
|
53
|
-
message: `WAL file is ${walSizeMB.toFixed(1)}MB (threshold: ${this.config.walThresholdMB}MB)`,
|
|
54
|
-
action: "Run: ccjk context checkpoint",
|
|
55
|
-
timestamp: Date.now()
|
|
56
|
-
});
|
|
57
|
-
} else if (walSizeMB > this.config.walThresholdMB / 2) {
|
|
58
|
-
alerts.push({
|
|
59
|
-
severity: "info" /* INFO */,
|
|
60
|
-
category: "wal",
|
|
61
|
-
message: `WAL file is ${walSizeMB.toFixed(1)}MB`,
|
|
62
|
-
action: "Consider checkpointing soon",
|
|
63
|
-
timestamp: Date.now()
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
if (health.checks.size.utilizationPercent < this.config.diskUtilizationThreshold) {
|
|
67
|
-
alerts.push({
|
|
68
|
-
severity: "warning" /* WARNING */,
|
|
69
|
-
category: "disk",
|
|
70
|
-
message: `Disk utilization is ${health.checks.size.utilizationPercent.toFixed(1)}% (threshold: ${this.config.diskUtilizationThreshold}%)`,
|
|
71
|
-
action: "Run: ccjk context vacuum",
|
|
72
|
-
timestamp: Date.now()
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
const backupAlert = await this.checkBackupStatus();
|
|
76
|
-
if (backupAlert) {
|
|
77
|
-
alerts.push(backupAlert);
|
|
78
|
-
}
|
|
79
|
-
if (health.checks.performance.queryTime > 100) {
|
|
80
|
-
alerts.push({
|
|
81
|
-
severity: "warning" /* WARNING */,
|
|
82
|
-
category: "performance",
|
|
83
|
-
message: `Query performance is slow (${health.checks.performance.queryTime}ms)`,
|
|
84
|
-
action: "Check database indexes",
|
|
85
|
-
timestamp: Date.now()
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
if (this.config.enableHistory && alerts.length > 0) {
|
|
89
|
-
await this.logToHistory(alerts, health.status);
|
|
90
|
-
}
|
|
91
|
-
return alerts;
|
|
92
|
-
} catch (error) {
|
|
93
|
-
return [{
|
|
94
|
-
severity: "critical" /* CRITICAL */,
|
|
95
|
-
category: "corruption",
|
|
96
|
-
message: `Health check failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
97
|
-
timestamp: Date.now()
|
|
98
|
-
}];
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Check backup status
|
|
103
|
-
*/
|
|
104
|
-
async checkBackupStatus() {
|
|
105
|
-
try {
|
|
106
|
-
const backups = this.monitor.listBackups();
|
|
107
|
-
if (backups.length === 0) {
|
|
108
|
-
return {
|
|
109
|
-
severity: "warning" /* WARNING */,
|
|
110
|
-
category: "backup",
|
|
111
|
-
message: "No backups found",
|
|
112
|
-
action: "Run: ccjk context backup",
|
|
113
|
-
timestamp: Date.now()
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
const latestBackup = backups[0];
|
|
117
|
-
const ageMs = Date.now() - latestBackup.metadata.timestamp;
|
|
118
|
-
const ageDays = ageMs / (1e3 * 60 * 60 * 24);
|
|
119
|
-
if (ageDays > this.config.backupAgeThresholdDays) {
|
|
120
|
-
return {
|
|
121
|
-
severity: "warning" /* WARNING */,
|
|
122
|
-
category: "backup",
|
|
123
|
-
message: `Latest backup is ${Math.floor(ageDays)} days old (threshold: ${this.config.backupAgeThresholdDays} days)`,
|
|
124
|
-
action: "Run: ccjk context backup",
|
|
125
|
-
timestamp: Date.now()
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
if (ageDays > this.config.backupAgeThresholdDays / 2) {
|
|
129
|
-
return {
|
|
130
|
-
severity: "info" /* INFO */,
|
|
131
|
-
category: "backup",
|
|
132
|
-
message: `Latest backup is ${Math.floor(ageDays)} days old`,
|
|
133
|
-
action: "Consider creating a new backup",
|
|
134
|
-
timestamp: Date.now()
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
return null;
|
|
138
|
-
} catch {
|
|
139
|
-
return null;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Display alerts with emoji indicators
|
|
144
|
-
*/
|
|
145
|
-
displayAlerts(alerts) {
|
|
146
|
-
if (alerts.length === 0) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
console.log("\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501");
|
|
150
|
-
console.log("\u{1F4CA} Database Health Alerts");
|
|
151
|
-
console.log("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n");
|
|
152
|
-
const critical = alerts.filter((a) => a.severity === "critical" /* CRITICAL */);
|
|
153
|
-
const warnings = alerts.filter((a) => a.severity === "warning" /* WARNING */);
|
|
154
|
-
const info = alerts.filter((a) => a.severity === "info" /* INFO */);
|
|
155
|
-
if (critical.length > 0) {
|
|
156
|
-
for (const alert of critical) {
|
|
157
|
-
console.log(`\u{1F534} CRITICAL: ${alert.message}`);
|
|
158
|
-
if (alert.action) {
|
|
159
|
-
console.log(` \u2192 ${alert.action}`);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
console.log();
|
|
163
|
-
}
|
|
164
|
-
if (warnings.length > 0) {
|
|
165
|
-
for (const alert of warnings) {
|
|
166
|
-
console.log(`\u{1F7E1} WARNING: ${alert.message}`);
|
|
167
|
-
if (alert.action) {
|
|
168
|
-
console.log(` \u2192 ${alert.action}`);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
console.log();
|
|
172
|
-
}
|
|
173
|
-
if (info.length > 0) {
|
|
174
|
-
for (const alert of info) {
|
|
175
|
-
console.log(`\u{1F4A1} INFO: ${alert.message}`);
|
|
176
|
-
if (alert.action) {
|
|
177
|
-
console.log(` \u2192 ${alert.action}`);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
console.log();
|
|
181
|
-
}
|
|
182
|
-
console.log("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n");
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Log alerts to history
|
|
186
|
-
*/
|
|
187
|
-
async logToHistory(alerts, healthStatus) {
|
|
188
|
-
try {
|
|
189
|
-
const fs = await import('node:fs/promises');
|
|
190
|
-
let history = [];
|
|
191
|
-
if (existsSync(this.historyPath)) {
|
|
192
|
-
const content = await fs.readFile(this.historyPath, "utf-8");
|
|
193
|
-
history = JSON.parse(content);
|
|
194
|
-
}
|
|
195
|
-
history.unshift({
|
|
196
|
-
timestamp: Date.now(),
|
|
197
|
-
alerts,
|
|
198
|
-
healthStatus,
|
|
199
|
-
resolved: false
|
|
200
|
-
});
|
|
201
|
-
history = history.slice(0, 100);
|
|
202
|
-
await fs.writeFile(this.historyPath, JSON.stringify(history, null, 2));
|
|
203
|
-
} catch {
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Get alert history
|
|
208
|
-
*/
|
|
209
|
-
async getHistory(limit = 10) {
|
|
210
|
-
try {
|
|
211
|
-
if (!existsSync(this.historyPath)) {
|
|
212
|
-
return [];
|
|
213
|
-
}
|
|
214
|
-
const fs = await import('node:fs/promises');
|
|
215
|
-
const content = await fs.readFile(this.historyPath, "utf-8");
|
|
216
|
-
const history = JSON.parse(content);
|
|
217
|
-
return history.slice(0, limit);
|
|
218
|
-
} catch {
|
|
219
|
-
return [];
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Mark alerts as resolved
|
|
224
|
-
*/
|
|
225
|
-
async markResolved(timestamp) {
|
|
226
|
-
try {
|
|
227
|
-
if (!existsSync(this.historyPath)) {
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
const fs = await import('node:fs/promises');
|
|
231
|
-
const content = await fs.readFile(this.historyPath, "utf-8");
|
|
232
|
-
const history = JSON.parse(content);
|
|
233
|
-
const entry = history.find((e) => e.timestamp === timestamp);
|
|
234
|
-
if (entry) {
|
|
235
|
-
entry.resolved = true;
|
|
236
|
-
await fs.writeFile(this.historyPath, JSON.stringify(history, null, 2));
|
|
237
|
-
}
|
|
238
|
-
} catch {
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Clear alert history
|
|
243
|
-
*/
|
|
244
|
-
async clearHistory() {
|
|
245
|
-
try {
|
|
246
|
-
if (existsSync(this.historyPath)) {
|
|
247
|
-
const fs = await import('node:fs/promises');
|
|
248
|
-
await fs.unlink(this.historyPath);
|
|
249
|
-
}
|
|
250
|
-
} catch {
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Get summary statistics
|
|
255
|
-
*/
|
|
256
|
-
async getSummary() {
|
|
257
|
-
const history = await this.getHistory(100);
|
|
258
|
-
if (history.length === 0) {
|
|
259
|
-
return {
|
|
260
|
-
totalAlerts: 0,
|
|
261
|
-
criticalCount: 0,
|
|
262
|
-
warningCount: 0,
|
|
263
|
-
infoCount: 0,
|
|
264
|
-
unresolvedCount: 0
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
const unresolved = history.filter((e) => !e.resolved);
|
|
268
|
-
const allAlerts = unresolved.flatMap((e) => e.alerts);
|
|
269
|
-
return {
|
|
270
|
-
totalAlerts: allAlerts.length,
|
|
271
|
-
criticalCount: allAlerts.filter((a) => a.severity === "critical" /* CRITICAL */).length,
|
|
272
|
-
warningCount: allAlerts.filter((a) => a.severity === "warning" /* WARNING */).length,
|
|
273
|
-
infoCount: allAlerts.filter((a) => a.severity === "info" /* INFO */).length,
|
|
274
|
-
unresolvedCount: unresolved.length,
|
|
275
|
-
lastCheckTime: history[0]?.timestamp
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Close monitor
|
|
280
|
-
*/
|
|
281
|
-
close() {
|
|
282
|
-
this.monitor.close();
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
async function runStartupHealthCheck(dbPath, config) {
|
|
286
|
-
if (!existsSync(dbPath)) {
|
|
287
|
-
return [];
|
|
288
|
-
}
|
|
289
|
-
if (config?.silent) {
|
|
290
|
-
return [];
|
|
291
|
-
}
|
|
292
|
-
const manager = new HealthAlertsManager(dbPath, config);
|
|
293
|
-
try {
|
|
294
|
-
const alerts = await manager.checkHealth();
|
|
295
|
-
if (alerts.length > 0) {
|
|
296
|
-
manager.displayAlerts(alerts);
|
|
297
|
-
}
|
|
298
|
-
return alerts;
|
|
299
|
-
} finally {
|
|
300
|
-
manager.close();
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
export { HealthAlertsManager, runStartupHealthCheck };
|