@nbtca/prompt 1.0.1 → 1.0.3
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/.claude/settings.local.json +25 -0
- package/CHANGELOG.md +77 -164
- package/DEVELOPMENT.md +258 -0
- package/Prompt.wiki/Home.md +27 -0
- package/README.md +145 -186
- package/TERMINAL_UX.md +184 -0
- package/dist/config/data.d.ts +1 -1
- package/dist/config/data.js +1 -1
- package/dist/core/menu.d.ts.map +1 -1
- package/dist/core/menu.js +30 -27
- package/dist/core/menu.js.map +1 -1
- package/dist/core/vim-keys.d.ts +6 -4
- package/dist/core/vim-keys.d.ts.map +1 -1
- package/dist/core/vim-keys.js +20 -13
- package/dist/core/vim-keys.js.map +1 -1
- package/dist/features/docs.d.ts +1 -9
- package/dist/features/docs.d.ts.map +1 -1
- package/dist/features/docs.js +266 -46
- package/dist/features/docs.js.map +1 -1
- package/package.json +3 -2
- package/src/config/data.ts +1 -1
- package/src/core/menu.ts +31 -27
- package/src/core/vim-keys.ts +21 -13
- package/src/features/docs.ts +296 -47
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/features/docs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/features/docs.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nbtca/prompt",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"start": "node dist/index.js",
|
|
12
|
-
"dev": "tsx
|
|
12
|
+
"dev": "tsx src/index.ts",
|
|
13
|
+
"dev:watch": "tsx watch src/index.ts",
|
|
13
14
|
"build": "tsc",
|
|
14
15
|
"postbuild": "mkdir -p dist/logo && cp src/logo/logo.txt dist/logo/ && cp src/logo/ascii-logo.txt dist/logo/",
|
|
15
16
|
"clean": "rm -rf dist",
|
package/src/config/data.ts
CHANGED
package/src/core/menu.ts
CHANGED
|
@@ -17,40 +17,40 @@ import { APP_INFO, URLS } from '../config/data.js';
|
|
|
17
17
|
*/
|
|
18
18
|
const MAIN_MENU = [
|
|
19
19
|
{
|
|
20
|
-
name: '
|
|
20
|
+
name: '[*] Recent Events ' + chalk.gray('查看最近30天的社团活动'),
|
|
21
21
|
value: 'events',
|
|
22
|
-
short: '
|
|
22
|
+
short: 'Recent Events'
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
|
-
name: '
|
|
25
|
+
name: '[*] Repair Service ' + chalk.gray('电脑维修、软件安装'),
|
|
26
26
|
value: 'repair',
|
|
27
|
-
short: '
|
|
27
|
+
short: 'Repair Service'
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
|
-
name: '
|
|
30
|
+
name: '[*] Knowledge Base ' + chalk.gray('技术文档、教程资源'),
|
|
31
31
|
value: 'docs',
|
|
32
|
-
short: '
|
|
32
|
+
short: 'Knowledge Base'
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
name: '
|
|
35
|
+
name: '[*] Official Website ' + chalk.gray('访问NBTCA主页'),
|
|
36
36
|
value: 'website',
|
|
37
|
-
short: '
|
|
37
|
+
short: 'Official Website'
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
|
-
name: 'GitHub' + chalk.gray('
|
|
40
|
+
name: '[*] GitHub ' + chalk.gray('开源项目与代码'),
|
|
41
41
|
value: 'github',
|
|
42
42
|
short: 'GitHub'
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
|
-
name: '
|
|
45
|
+
name: '[?] About ' + chalk.gray('项目信息与帮助'),
|
|
46
46
|
value: 'about',
|
|
47
|
-
short: '
|
|
47
|
+
short: 'About'
|
|
48
48
|
},
|
|
49
49
|
new inquirer.Separator(' '),
|
|
50
50
|
{
|
|
51
|
-
name: chalk.dim('
|
|
51
|
+
name: chalk.dim('[x] Exit'),
|
|
52
52
|
value: 'exit',
|
|
53
|
-
short: '
|
|
53
|
+
short: 'Exit'
|
|
54
54
|
}
|
|
55
55
|
];
|
|
56
56
|
|
|
@@ -60,6 +60,10 @@ const MAIN_MENU = [
|
|
|
60
60
|
export async function showMainMenu(): Promise<void> {
|
|
61
61
|
while (true) {
|
|
62
62
|
try {
|
|
63
|
+
// Show keybinding hints
|
|
64
|
+
console.log(chalk.dim(' Navigation: j/k or ↑/↓ | Jump: g/G | Quit: q or Ctrl+C'));
|
|
65
|
+
console.log();
|
|
66
|
+
|
|
63
67
|
const { action } = await inquirer.prompt<{ action: string }>([
|
|
64
68
|
{
|
|
65
69
|
type: 'list',
|
|
@@ -135,23 +139,23 @@ async function handleAction(action: string): Promise<void> {
|
|
|
135
139
|
*/
|
|
136
140
|
function showAbout(): void {
|
|
137
141
|
console.log();
|
|
138
|
-
console.log(chalk.bold('
|
|
142
|
+
console.log(chalk.bold('>> About NBTCA'));
|
|
139
143
|
console.log();
|
|
140
|
-
console.log(chalk.dim('
|
|
141
|
-
console.log(chalk.dim('
|
|
142
|
-
console.log(chalk.dim('
|
|
144
|
+
console.log(chalk.dim('Project ') + APP_INFO.name);
|
|
145
|
+
console.log(chalk.dim('Version ') + `v${APP_INFO.version}`);
|
|
146
|
+
console.log(chalk.dim('Description ') + APP_INFO.fullDescription);
|
|
143
147
|
console.log();
|
|
144
|
-
console.log(chalk.dim('GitHub') +
|
|
145
|
-
console.log(chalk.dim('
|
|
146
|
-
console.log(chalk.dim('
|
|
148
|
+
console.log(chalk.dim('GitHub ') + chalk.cyan(APP_INFO.repository));
|
|
149
|
+
console.log(chalk.dim('Website ') + chalk.cyan(URLS.homepage));
|
|
150
|
+
console.log(chalk.dim('Email ') + chalk.cyan(URLS.email));
|
|
147
151
|
console.log();
|
|
148
|
-
console.log(chalk.dim('
|
|
149
|
-
console.log('
|
|
150
|
-
console.log('
|
|
151
|
-
console.log('
|
|
152
|
-
console.log('
|
|
152
|
+
console.log(chalk.dim('Features:'));
|
|
153
|
+
console.log(' - View recent association events');
|
|
154
|
+
console.log(' - Online repair service');
|
|
155
|
+
console.log(' - Technical knowledge base access');
|
|
156
|
+
console.log(' - Quick access to website and GitHub');
|
|
153
157
|
console.log();
|
|
154
|
-
console.log(chalk.dim('
|
|
155
|
-
console.log(chalk.dim('
|
|
158
|
+
console.log(chalk.dim('License ') + 'MIT License');
|
|
159
|
+
console.log(chalk.dim('Author ') + 'm1ngsama');
|
|
156
160
|
console.log();
|
|
157
161
|
}
|
package/src/core/vim-keys.ts
CHANGED
|
@@ -1,49 +1,56 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Vim
|
|
3
|
-
*
|
|
2
|
+
* Vim keybindings support
|
|
3
|
+
* Intercepts and translates keyboard input for j/k/g/G/q/ESC keys
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Enable Vim key mappings for stdin
|
|
8
|
+
* Maps: j/k (down/up), g/G (home/end), q (quit), ESC (back)
|
|
8
9
|
*/
|
|
9
10
|
export function enableVimKeys() {
|
|
10
11
|
const stdin = process.stdin;
|
|
11
12
|
|
|
12
|
-
//
|
|
13
|
+
// Only enable for TTY sessions
|
|
13
14
|
if (!stdin.isTTY) {
|
|
14
15
|
return;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
|
-
//
|
|
18
|
+
// Save original input handler
|
|
18
19
|
const originalEmit = stdin.emit.bind(stdin);
|
|
19
20
|
|
|
20
|
-
//
|
|
21
|
+
// Override emit method to intercept keyboard events
|
|
21
22
|
(stdin.emit as any) = function (event: string, ...args: any[]) {
|
|
22
23
|
if (event === 'keypress') {
|
|
23
24
|
const [, key] = args;
|
|
24
25
|
|
|
25
26
|
if (key && key.name) {
|
|
26
|
-
// j =
|
|
27
|
+
// j = down (mapped to down arrow)
|
|
27
28
|
if (key.name === 'j' && !key.ctrl && !key.meta) {
|
|
28
29
|
return originalEmit('keypress', null, { name: 'down' });
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
// k =
|
|
32
|
+
// k = up (mapped to up arrow)
|
|
32
33
|
if (key.name === 'k' && !key.ctrl && !key.meta) {
|
|
33
34
|
return originalEmit('keypress', null, { name: 'up' });
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
// g =
|
|
37
|
+
// g = jump to top (mapped to home)
|
|
37
38
|
if (key.name === 'g' && !key.shift && !key.ctrl && !key.meta) {
|
|
38
39
|
return originalEmit('keypress', null, { name: 'home' });
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
// G (Shift+g) =
|
|
42
|
+
// G (Shift+g) = jump to bottom (mapped to end)
|
|
42
43
|
if (key.name === 'g' && key.shift) {
|
|
43
44
|
return originalEmit('keypress', null, { name: 'end' });
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
//
|
|
47
|
+
// ESC = back/cancel (pass through for menu handling)
|
|
48
|
+
// Note: Applications should implement back navigation for ESC
|
|
49
|
+
if (key.name === 'escape') {
|
|
50
|
+
return originalEmit('keypress', null, { name: 'escape', sequence: '\x1b' });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// q = quit (mapped to Ctrl+C for application exit)
|
|
47
54
|
if (key.name === 'q' && !key.ctrl && !key.meta) {
|
|
48
55
|
return originalEmit('keypress', null, { name: 'c', ctrl: true });
|
|
49
56
|
}
|
|
@@ -55,8 +62,9 @@ export function enableVimKeys() {
|
|
|
55
62
|
}
|
|
56
63
|
|
|
57
64
|
/**
|
|
58
|
-
*
|
|
65
|
+
* Disable Vim key mappings
|
|
66
|
+
* Currently not implemented as we use Vim keys throughout the application
|
|
59
67
|
*/
|
|
60
68
|
export function disableVimKeys() {
|
|
61
|
-
//
|
|
69
|
+
// Not needed for current implementation
|
|
62
70
|
}
|
package/src/features/docs.ts
CHANGED
|
@@ -5,61 +5,291 @@
|
|
|
5
5
|
|
|
6
6
|
import axios from 'axios';
|
|
7
7
|
import { marked } from 'marked';
|
|
8
|
-
import
|
|
8
|
+
import TerminalRenderer from 'marked-terminal';
|
|
9
9
|
import chalk from 'chalk';
|
|
10
10
|
import open from 'open';
|
|
11
11
|
import inquirer from 'inquirer';
|
|
12
12
|
import { error, info, success, warning } from '../core/ui.js';
|
|
13
13
|
|
|
14
14
|
// 配置marked使用终端渲染器
|
|
15
|
-
marked.
|
|
15
|
+
marked.setOptions({
|
|
16
|
+
// @ts-ignore - markedTerminal类型定义问题
|
|
17
|
+
renderer: new TerminalRenderer()
|
|
18
|
+
});
|
|
16
19
|
|
|
17
20
|
/**
|
|
18
|
-
*
|
|
21
|
+
* GitHub仓库配置
|
|
19
22
|
*/
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
const GITHUB_REPO = {
|
|
24
|
+
owner: 'nbtca',
|
|
25
|
+
repo: 'documents',
|
|
26
|
+
branch: 'main'
|
|
27
|
+
};
|
|
24
28
|
|
|
25
29
|
/**
|
|
26
|
-
*
|
|
30
|
+
* 文档结构类型
|
|
27
31
|
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
'技术文档',
|
|
34
|
-
'教程资源'
|
|
35
|
-
];
|
|
32
|
+
interface DocItem {
|
|
33
|
+
name: string;
|
|
34
|
+
path: string;
|
|
35
|
+
type: 'file' | 'dir';
|
|
36
|
+
sha?: string;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
/**
|
|
39
|
-
*
|
|
40
|
+
* 预定义的文档分类
|
|
40
41
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
const DOC_CATEGORIES = [
|
|
43
|
+
{ name: '[Tutorial] 教程', path: 'tutorial' },
|
|
44
|
+
{ name: '[Repair] 维修日', path: '维修日' },
|
|
45
|
+
{ name: '[Events] 相关活动举办', path: '相关活动举办' },
|
|
46
|
+
{ name: '[Process] 流程文档', path: 'process' },
|
|
47
|
+
{ name: '[Repair] 维修相关', path: 'repair' },
|
|
48
|
+
{ name: '[Archive] 归档文档', path: 'archived' },
|
|
49
|
+
{ name: '[README] 项目说明', path: 'README.md' }
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 从GitHub获取目录内容
|
|
54
|
+
*/
|
|
55
|
+
async function fetchGitHubDirectory(path: string = ''): Promise<DocItem[]> {
|
|
56
|
+
const url = `https://api.github.com/repos/${GITHUB_REPO.owner}/${GITHUB_REPO.repo}/contents/${path}?ref=${GITHUB_REPO.branch}`;
|
|
44
57
|
|
|
45
|
-
|
|
58
|
+
try {
|
|
59
|
+
const response = await axios.get(url, {
|
|
46
60
|
timeout: 10000,
|
|
47
61
|
headers: {
|
|
48
|
-
'
|
|
62
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
63
|
+
'User-Agent': 'NBTCA-CLI'
|
|
49
64
|
}
|
|
50
65
|
});
|
|
51
66
|
|
|
52
|
-
|
|
67
|
+
return response.data
|
|
68
|
+
.filter((item: any) => {
|
|
69
|
+
// 过滤掉 node_modules, .git 等目录
|
|
70
|
+
if (item.name.startsWith('.')) return false;
|
|
71
|
+
if (item.name === 'node_modules') return false;
|
|
72
|
+
if (item.name === 'package.json') return false;
|
|
73
|
+
if (item.name === 'pnpm-lock.yaml') return false;
|
|
74
|
+
|
|
75
|
+
// 只显示目录和 markdown 文件
|
|
76
|
+
if (item.type === 'file' && !item.name.endsWith('.md')) return false;
|
|
77
|
+
|
|
78
|
+
return true;
|
|
79
|
+
})
|
|
80
|
+
.map((item: any) => ({
|
|
81
|
+
name: item.name,
|
|
82
|
+
path: item.path,
|
|
83
|
+
type: item.type === 'dir' ? 'dir' : 'file',
|
|
84
|
+
sha: item.sha
|
|
85
|
+
}))
|
|
86
|
+
.sort((a: DocItem, b: DocItem) => {
|
|
87
|
+
// 目录排在前面
|
|
88
|
+
if (a.type === 'dir' && b.type === 'file') return -1;
|
|
89
|
+
if (a.type === 'file' && b.type === 'dir') return 1;
|
|
90
|
+
return a.name.localeCompare(b.name);
|
|
91
|
+
});
|
|
92
|
+
} catch (err: any) {
|
|
93
|
+
throw new Error(`无法获取目录内容: ${err.message}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 从GitHub获取文件原始内容
|
|
99
|
+
*/
|
|
100
|
+
async function fetchGitHubRawContent(path: string): Promise<string> {
|
|
101
|
+
const url = `https://raw.githubusercontent.com/${GITHUB_REPO.owner}/${GITHUB_REPO.repo}/${GITHUB_REPO.branch}/${path}`;
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
const response = await axios.get(url, {
|
|
105
|
+
timeout: 15000,
|
|
106
|
+
headers: {
|
|
107
|
+
'User-Agent': 'NBTCA-CLI'
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
return response.data;
|
|
112
|
+
} catch (err: any) {
|
|
113
|
+
throw new Error(`无法获取文件内容: ${err.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* 清理和格式化Markdown内容
|
|
119
|
+
* 移除VitePress frontmatter和特殊语法,优化终端显示
|
|
120
|
+
*/
|
|
121
|
+
function cleanMarkdownContent(content: string): string {
|
|
122
|
+
let cleaned = content;
|
|
123
|
+
|
|
124
|
+
// 1. 移除 YAML frontmatter (---开头结尾的部分)
|
|
125
|
+
cleaned = cleaned.replace(/^---\n[\s\S]*?\n---\n/m, '');
|
|
126
|
+
|
|
127
|
+
// 2. 移除 VitePress 的特殊容器语法 (:::info, :::tip, :::warning 等)
|
|
128
|
+
// 保留内容,只移除容器标记
|
|
129
|
+
cleaned = cleaned.replace(/^:::(info|tip|warning|danger|details).*$/gm, '');
|
|
130
|
+
cleaned = cleaned.replace(/^:::$/gm, '');
|
|
131
|
+
|
|
132
|
+
// 3. 处理 VitePress 的 [[toc]] 语法
|
|
133
|
+
cleaned = cleaned.replace(/\[\[toc\]\]/gi, '**目录**\n\n_(请在浏览器中查看完整目录)_\n');
|
|
134
|
+
|
|
135
|
+
// 4. 清理多余的空行(超过2个连续空行压缩为2个)
|
|
136
|
+
cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
|
|
137
|
+
|
|
138
|
+
// 5. 移除 HTML 注释
|
|
139
|
+
cleaned = cleaned.replace(/<!--[\s\S]*?-->/g, '');
|
|
140
|
+
|
|
141
|
+
// 6. 清理开头和结尾的空白
|
|
142
|
+
cleaned = cleaned.trim();
|
|
143
|
+
|
|
144
|
+
return cleaned;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* 提取文档标题(从第一个 # 标题)
|
|
149
|
+
*/
|
|
150
|
+
function extractDocTitle(content: string): string | null {
|
|
151
|
+
const match = content.match(/^#\s+(.+)$/m);
|
|
152
|
+
return match?.[1]?.trim() ?? null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 浏览目录并选择文档
|
|
157
|
+
*/
|
|
158
|
+
async function browseDirectory(dirPath: string = ''): Promise<void> {
|
|
159
|
+
try {
|
|
160
|
+
info(dirPath ? `正在加载目录: ${dirPath}` : '正在加载文档列表...');
|
|
161
|
+
|
|
162
|
+
const items = await fetchGitHubDirectory(dirPath);
|
|
163
|
+
|
|
164
|
+
console.log('\r' + ' '.repeat(60) + '\r'); // 清除加载提示
|
|
165
|
+
|
|
166
|
+
if (items.length === 0) {
|
|
167
|
+
warning('该目录为空');
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// 构建选择列表
|
|
172
|
+
const choices = [
|
|
173
|
+
...(dirPath ? [
|
|
174
|
+
{ name: chalk.gray('[..] Up to parent directory'), value: { type: 'back' } },
|
|
175
|
+
new inquirer.Separator()
|
|
176
|
+
] : []),
|
|
177
|
+
...items.map(item => ({
|
|
178
|
+
name: item.type === 'dir'
|
|
179
|
+
? chalk.cyan(`[DIR] ${item.name}/`)
|
|
180
|
+
: chalk.white(`[MD] ${item.name}`),
|
|
181
|
+
value: item
|
|
182
|
+
})),
|
|
183
|
+
new inquirer.Separator(),
|
|
184
|
+
{ name: chalk.gray('[ ^] Return to main menu'), value: { type: 'exit' } }
|
|
185
|
+
];
|
|
186
|
+
|
|
187
|
+
const { selected } = await inquirer.prompt([
|
|
188
|
+
{
|
|
189
|
+
type: 'list',
|
|
190
|
+
name: 'selected',
|
|
191
|
+
message: dirPath ? `当前目录: ${dirPath}` : '选择文档或目录:',
|
|
192
|
+
choices,
|
|
193
|
+
pageSize: 15,
|
|
194
|
+
loop: false
|
|
195
|
+
}
|
|
196
|
+
]);
|
|
197
|
+
|
|
198
|
+
// 处理用户选择
|
|
199
|
+
if (selected.type === 'exit') {
|
|
200
|
+
return;
|
|
201
|
+
} else if (selected.type === 'back') {
|
|
202
|
+
// 返回上级目录
|
|
203
|
+
const parentPath = dirPath.split('/').slice(0, -1).join('/');
|
|
204
|
+
await browseDirectory(parentPath);
|
|
205
|
+
} else if (selected.type === 'dir') {
|
|
206
|
+
// 进入子目录
|
|
207
|
+
await browseDirectory(selected.path);
|
|
208
|
+
} else if (selected.type === 'file') {
|
|
209
|
+
// 查看文件
|
|
210
|
+
await viewMarkdownFile(selected.path);
|
|
211
|
+
// 查看完后继续浏览当前目录
|
|
212
|
+
await browseDirectory(dirPath);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
} catch (err: any) {
|
|
216
|
+
error('无法加载目录');
|
|
217
|
+
console.log(chalk.gray(` 错误: ${err.message}`));
|
|
218
|
+
|
|
219
|
+
const { retry } = await inquirer.prompt([
|
|
220
|
+
{
|
|
221
|
+
type: 'confirm',
|
|
222
|
+
name: 'retry',
|
|
223
|
+
message: '是否重试?',
|
|
224
|
+
default: true
|
|
225
|
+
}
|
|
226
|
+
]);
|
|
53
227
|
|
|
54
|
-
|
|
55
|
-
|
|
228
|
+
if (retry) {
|
|
229
|
+
await browseDirectory(dirPath);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* 查看Markdown文件
|
|
236
|
+
*/
|
|
237
|
+
async function viewMarkdownFile(path: string): Promise<void> {
|
|
238
|
+
try {
|
|
239
|
+
info(`正在加载: ${path}`);
|
|
240
|
+
|
|
241
|
+
// 从GitHub获取原始Markdown内容
|
|
242
|
+
const rawContent = await fetchGitHubRawContent(path);
|
|
243
|
+
|
|
244
|
+
// 清理VitePress特殊语法
|
|
245
|
+
const cleanedContent = cleanMarkdownContent(rawContent);
|
|
246
|
+
|
|
247
|
+
// 提取标题
|
|
248
|
+
const title = extractDocTitle(cleanedContent) || path.split('/').pop() || path;
|
|
249
|
+
|
|
250
|
+
console.clear();
|
|
251
|
+
console.log();
|
|
252
|
+
console.log(chalk.cyan.bold(`>> ${title}`));
|
|
253
|
+
console.log(chalk.gray(` ${path}`));
|
|
254
|
+
console.log();
|
|
255
|
+
console.log(chalk.gray('='.repeat(80)));
|
|
256
|
+
console.log();
|
|
257
|
+
|
|
258
|
+
// 渲染Markdown到终端
|
|
259
|
+
const rendered = marked(cleanedContent);
|
|
56
260
|
console.log(rendered);
|
|
57
261
|
console.log();
|
|
262
|
+
console.log(chalk.gray('='.repeat(80)));
|
|
263
|
+
console.log();
|
|
264
|
+
console.log(chalk.dim(' Note: Some features are only available in browser'));
|
|
265
|
+
console.log();
|
|
58
266
|
|
|
59
267
|
success('文档加载完成');
|
|
60
|
-
|
|
268
|
+
console.log();
|
|
269
|
+
|
|
270
|
+
// 提供后续操作选项
|
|
271
|
+
const { action } = await inquirer.prompt([
|
|
272
|
+
{
|
|
273
|
+
type: 'list',
|
|
274
|
+
name: 'action',
|
|
275
|
+
message: '选择操作:',
|
|
276
|
+
choices: [
|
|
277
|
+
{ name: '[ <] Back to docs list', value: 'back' },
|
|
278
|
+
{ name: '[ *] Open in browser', value: 'browser' }
|
|
279
|
+
]
|
|
280
|
+
}
|
|
281
|
+
]);
|
|
282
|
+
|
|
283
|
+
if (action === 'browser') {
|
|
284
|
+
await openDocsInBrowser(path);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
} catch (err: any) {
|
|
288
|
+
console.log('\r' + ' '.repeat(60) + '\r');
|
|
61
289
|
error('无法加载文档');
|
|
290
|
+
console.log(chalk.gray(` 错误: ${err.message}`));
|
|
62
291
|
warning('建议在浏览器中查看');
|
|
292
|
+
console.log();
|
|
63
293
|
|
|
64
294
|
const { openBrowser } = await inquirer.prompt([
|
|
65
295
|
{
|
|
@@ -71,7 +301,7 @@ export async function viewDoc(path: string): Promise<void> {
|
|
|
71
301
|
]);
|
|
72
302
|
|
|
73
303
|
if (openBrowser) {
|
|
74
|
-
await openDocsInBrowser();
|
|
304
|
+
await openDocsInBrowser(path);
|
|
75
305
|
}
|
|
76
306
|
}
|
|
77
307
|
}
|
|
@@ -79,10 +309,13 @@ export async function viewDoc(path: string): Promise<void> {
|
|
|
79
309
|
/**
|
|
80
310
|
* 在浏览器中打开知识库
|
|
81
311
|
*/
|
|
82
|
-
export async function openDocsInBrowser(): Promise<void> {
|
|
312
|
+
export async function openDocsInBrowser(path?: string): Promise<void> {
|
|
83
313
|
try {
|
|
84
314
|
info('正在打开浏览器...');
|
|
85
|
-
|
|
315
|
+
const url = path
|
|
316
|
+
? `https://docs.nbtca.space/${path.replace(/\.md$/, '')}`
|
|
317
|
+
: 'https://docs.nbtca.space';
|
|
318
|
+
await open(url);
|
|
86
319
|
success('已在浏览器中打开知识库');
|
|
87
320
|
} catch (err) {
|
|
88
321
|
error('无法打开浏览器');
|
|
@@ -95,26 +328,42 @@ export async function openDocsInBrowser(): Promise<void> {
|
|
|
95
328
|
* 显示知识库菜单
|
|
96
329
|
*/
|
|
97
330
|
export async function showDocsMenu(): Promise<void> {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
331
|
+
console.log();
|
|
332
|
+
console.log(chalk.cyan.bold(' >> Knowledge Base'));
|
|
333
|
+
console.log(chalk.dim(' Browse documentation from terminal or open in browser'));
|
|
334
|
+
console.log();
|
|
102
335
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
336
|
+
const choices = [
|
|
337
|
+
...DOC_CATEGORIES.map(cat => ({
|
|
338
|
+
name: cat.name,
|
|
339
|
+
value: cat.path
|
|
340
|
+
})),
|
|
341
|
+
new inquirer.Separator(),
|
|
342
|
+
{ name: chalk.gray('[ *] Open in browser'), value: 'browser' },
|
|
343
|
+
{ name: chalk.gray('[ ^] Back to main menu'), value: 'back' }
|
|
344
|
+
];
|
|
112
345
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
346
|
+
const { action } = await inquirer.prompt([
|
|
347
|
+
{
|
|
348
|
+
type: 'list',
|
|
349
|
+
name: 'action',
|
|
350
|
+
message: '选择文档分类:',
|
|
351
|
+
choices,
|
|
352
|
+
pageSize: 15,
|
|
353
|
+
loop: false
|
|
118
354
|
}
|
|
355
|
+
]);
|
|
356
|
+
|
|
357
|
+
if (action === 'back') {
|
|
358
|
+
return;
|
|
359
|
+
} else if (action === 'browser') {
|
|
360
|
+
await openDocsInBrowser();
|
|
361
|
+
} else if (action === 'README.md') {
|
|
362
|
+
// 直接查看 README
|
|
363
|
+
await viewMarkdownFile('README.md');
|
|
364
|
+
} else {
|
|
365
|
+
// 浏览指定目录
|
|
366
|
+
await browseDirectory(action);
|
|
119
367
|
}
|
|
120
368
|
}
|
|
369
|
+
|