CANN/cannbot-skills CLI前端需求

📅 2026/7/5 18:23:27
CANN/cannbot-skills CLI前端需求
CANNBot-Insight CLI 前端需求文档【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills版本: v1.1日期: 2025-06-14作者: Guan XinghuaPoC 验证: Ink v7.0.6 React 19.2.7 ESM tsx状态: PoC 验证后更新1. 背景与目标1.1 现状CANNBot-Insight 目前只有一个 Web 前端Next.js 16 shadcn/ui提供 3 个页面、15 个 API 端点覆盖 Session 导入、观测、对比、AI 分析等功能。1.2 痛点痛点说明必须启动浏览器在 SSH 远程服务器、无桌面环境下无法使用不适合脚本化无法在 CI/CD、cron 任务中自动查询和分析信息密度低Web UI 的卡片和图表在快速排查问题时不如终端高效开发者偏好目标用户LLM Agent 开发者习惯终端工作流1.3 目标后端零改动新增一套纯 CLI 前端复用现有 15 个 API 端点。️ 提供两种模式TUI 交互模式Terminal UI纯命令行模式单次命令 后端 API 完全不变CLI 作为 API 客户端调用 可独立安装也可作为npm script使用2. 竞品参考工具模式值得借鉴k9sTUI表格详情面板、快捷键导航、资源树lazygitTUI分栏布局、左右面板切换、内联 diffhtop/btopTUI实时刷新、ASCII 柱状图、颜色编码mitmproxy双模Web CLI 共存、flow 列表详情钻取SimonWs llm纯命令llm logs列表、llm logs -r ID详情、管道友好gh CLI纯命令gh pr list→gh pr view N列表详情范式LiteLLM双模CLI proxy Web dashboard 并行核心 UX 范式list → select → detail列表浏览 → 选择 → 详情钻取3. 技术方案3.1 技术选型方案推荐说明Ink v7(React for CLI)✅ 首选React 19 ESM与现有 React 技术栈统一第三方组件自实现Blessed/Blessed-Contrib❌成熟但非 React 范式学习成本高Terminal-kit❌低级 API开发效率低纯 Commander.js⚡ 备选仅做纯命令模式不做 TUI推荐Ink v7 自实现组件PoC 验证第三方 Ink 组件不兼容 v7全部自实现DataTable— 自写表格string-width 视觉宽度对齐SelectInput— 自写选择菜单50 行TextInput— 自写输入框30 行Spinner— 自写加载动画10 行Ink 内置Box— 布局容器chalk.bold — 标题着色替代 ink-big-textESM 要求: Ink v7 yoga-layout 使用 top-level awaitpackage.json 必须设type: module运行工具用 tsx不是 ts-node核心依赖版本PoC 验证锁定包名版本用途ink^7.0.6React CLI 渲染引擎react^19.2.7UI 框架tsxlatestTypeScript ESM 运行工具替代 ts-nodecommanderlatest命令行参数解析纯命令模式chalklatest终端颜色输出string-widthlatest中文/CJK 字符视觉宽度计算cli-truncatelatest视觉宽度安全的字符串截断重要: 不要安装 ink-table、ink-select、ink-spinner、ink-text-input、ink-big-text 等第三方 Ink 组件库——它们均不兼容 Ink v7必须全部自实现。测试依赖包名用途ink-testing-libraryInk 组件测试完全兼容 v7提供lastFrameInk v7 render() 限制: Ink v7 原生render()返回对象不包含lastFrame/frames/output属性。测试时必须使用ink-testing-library的render()它提供lastFrame()方法获取最近一帧输出。3.2 架构设计┌──────────────────────────────────────────────┐ │ CANNBot-Insight │ ├──────────────────┬───────────────────────────┤ │ Web Frontend │ CLI Frontend │ │ (Next.js) │ (Ink / Commander) │ │ │ │ │ /page.tsx │ cli/index.tsx │ │ /session/... │ cli/commands/ │ │ /compare │ cli/components/ │ │ │ cli/hooks/ │ ├──────────────────┴───────────────────────────┤ │ HTTP API Client │ │ (shared API client lib) │ ├──────────────────────────────────────────────┤ │ Backend (不变) │ │ /api/observe/* /api/ingest/* │ │ /api/ai/* /api/config/* │ ├──────────────────────────────────────────────┤ │ Prisma SQLite │ └──────────────────────────────────────────────┘3.3 两种运行模式模式 ATUI 交互模式主模式$ cannbot-insight tui # 或简写 $ cannbot-insight启动全屏终端界面类似 k9s/lazygit 的体验。模式 B纯命令行模式脚本友好# 列表 $ cannbot-insight sessions $ cannbot-insight sessions --user guanxinghua --limit 20 # 详情 $ cannbot-insight session taskId $ cannbot-insight session taskId --tab turns $ cannbot-insight session taskId --tab workflow --format tree # 搜索 $ cannbot-insight search taskId --keyword bug # 导入 $ cannbot-insight import --source opencode-db --file ./sessions.db $ cannbot-insight import --source claude-jsonl --dir ./logs/ # 对比 $ cannbot-insight compare taskId1 taskId2 # 统计 $ cannbot-insight stats $ cannbot-insight stats --session taskId # 管道友好 $ cannbot-insight sessions --json | jq .[] | .totalTokens4. 功能映射4.1 Web → CLI 完整映射表Web 功能API 端点CLI TUICLI 命令首页 — Session 列表GET /api/observe/dataSession 列表表格sessions首页 — 全局统计卡片GET /api/observe/stats顶部状态栏stats首页 — 文件导入POST /api/ingest/import-file导入面板import首页 — 会话预览POST /api/ingest/import-file/sessions导入预览列表import --list首页 — 删除会话DELETE /api/ingest/delete-session删除确认对话框delete首页 — Session 对比选择—多选 Entercompare id1 id2Session — Overview TabGET /api/observe/stats?taskIdXGET /api/observe/executionsOverview 面板session id --tab overviewSession — Turns TabGET /api/observe/session/turnsTurn 时间线列表session id --tab turnsSession — Workflow TabGET /api/observe/session/workflowASCII 树形图session id --tab workflowSession — Trace TabGET /api/observe/session/turns/search搜索结果面板search id --keyword XSession — Subagents TabGET /api/observe/executionsSubagent 卡片列表session id --tab subagentsSession — Skills TabGET /api/observe/session(skills)Skill 事件列表session id --tab skillsSession — Interactions TabGET /api/observe/session/bridges交互桥接表格session id --tab bridgesSession — AI WorkflowPOST /api/ai/analyze-workflowAI 分析输出session id --ai-analyzeSession — Context TabGET /api/observe/session/turns(contextWindowPct)上下文增长表session id --tab contextSession — Turn 详情GET /api/observe/session/turns/[turnId]Turn 详情面板turn taskId turnIdCompare 页面多次 observe API并排对比表格compare id1 id2Context Window 配置GET /api/config/context-windows配置查看config context-windows4.2 TUI 布局设计┌─────────────────────────────────────────────────────────────┐ │ CANNBot-Insight v0.31 Sessions: 42 Cost: ¥12 │ ← 顶部状态栏 ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─── Sessions ──────────────────────────────────────────┐ │ │ │ # │ Date │ User │ Turns │ Tokens │ Cost │ │ ← 主表格 │ │ 1 │ 06-14 10:30│ guan... │ 25 │ 150K │ ¥3.20 │ │ │ │ 2 │ 06-14 09:15│ guan... │ 12 │ 80K │ ¥1.50 │ │ │ │ 3 │ 06-13 18:00│ guan... │ 45 │ 320K │ ¥8.10 │ │ │ │ * │ ... │ │ │ │ │ │ │ └───────────────────────────────────────────────────────┘ │ │ │ │ ┌─── Preview ──────────────────────────────────────────┐ │ ← 底部预览 │ │ Session: abc123... │ │ │ │ First Query: 帮我实现 xxx 功能 │ │ │ │ Model: claude-3.5-sonnet Duration: 45m │ │ │ │ Tools: 120 Skills: 8 Subagents: 3 │ │ │ └───────────────────────────────────────────────────────┘ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ ↑↓ Navigate │ Enter: Detail │ i: Import │ d: Delete │ q: Quit │ ← 快捷键 └─────────────────────────────────────────────────────────────┘4.3 TUI Session 详情页┌─────────────────────────────────────────────────────────────┐ │ Session: abc123 │ claude-3.5-sonnet │ 45min │ ¥3.20│ ├─────────────────────────────────────────────────────────────┤ │ [Overview] [Turns] [Workflow] [Trace] [Subs] [Skills] [Ctx] │ ← Tab 切换 ├─────────────────────────────────────────────────────────────┤ │ │ │ Overview: │ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ │ Tokens │ Cost │ Duration │ LLM Calls│ │ ← 指标卡片 │ │ 150K │ ¥3.20 │ 45m │ 25 │ │ │ └──────────┴──────────┴──────────┴──────────┘ │ │ │ │ Token Breakdown: │ │ Input: ████████████░░░░ 60K (40%) │ ← ASCII 柱状图 │ Output: ██████░░░░░░░░░░ 30K (20%) │ │ Reasoning:████████████████ 80K (53%) │ │ Cache: ███░░░░░░░░░░░░░ 15K (10%) │ │ │ │ Executions: │ │ ┌────────────────┬───────┬──────┬───────┐ │ │ │ Agent │Tokens │ Cost │ Tools │ │ │ │ root │ 100K │ ¥2.1 │ 80 │ │ │ │ subagent:debug │ 50K │ ¥1.1 │ 40 │ │ │ └────────────────┴───────┴──────┴───────┘ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ Tab: Switch │ Enter: Drill-down │ Esc: Back │ q: Quit │ └─────────────────────────────────────────────────────────────┘4.4 Workflow Tab — ASCII 树形图┌─ Workflow ──────────────────────────────────────────────────┐ │ │ │ Phase 1: 需求分析 │ │ ├── [Turn 1] user → assistant (12K tokens, 5.2s) │ │ │ └── read_file × 3 │ │ ├── [Turn 2] user → assistant (8K tokens, 3.1s) │ │ │ ├── search_files × 2 │ │ │ └── terminal × 1 │ │ │ │ │ Phase 2: 代码实现 │ │ ├── [Turn 3] user → assistant (25K tokens, 12.5s) │ │ │ ├── write_file × 2 │ │ │ ├── patch × 4 │ │ │ └── → subagent:test-runner │ │ │ ├── [Turn 3.1] (8K tokens, 4.2s) │ │ │ └── [Turn 3.2] (6K tokens, 3.0s) │ │ │ │ │ ✅ Checkpoint: 功能完成 │ │ │ │ │ Phase 3: 测试验证 │ │ ├── [Turn 4] user → assistant (15K tokens, 8.0s) │ │ │ ├── terminal (npm test) │ │ │ └── patch × 2 │ │ │ └─────────────────────────────────────────────────────────────┘4.5 Context Tab — 上下文增长追踪┌─ Context Window Usage ──────────────────────────────────────┐ │ │ │ Turn │ Tokens │ Context% │ Bar │ │ ─────┼────────┼──────────┼────────────────────────────────│ │ 1 │ 12K │ 6% │ ██ │ │ 2 │ 20K │ 10% │ ███ │ │ 3 │ 45K │ 22% │ ██████ │ │ 4 │ 80K │ 40% │ ████████████ │ │ 5 │ 120K │ 60% │ ██████████████████ │ │ 6 │ 160K │ 80% │ ████████████████████████ ⚠️ │ │ 7 │ 195K │ 97% │ ██████████████████████████ │ │ │ │ ⚠️ Turn 6: Context 80%, approaching limit │ │ Turn 7: Context 95%, critical! │ │ │ │ Model: claude-3.5-sonnet (200K window) │ └─────────────────────────────────────────────────────────────┘5. 命令设计5.1 命令树cannbot-insight (cbin) ├── tui # 启动 TUI 交互模式默认 ├── sessions # 列出所有 session │ ├── --user name # 按用户过滤 │ ├── --limit n # 限制数量 │ ├── --subagent # 包含 subagent │ └── --json # JSON 输出 ├── session taskId # 查看 session 详情 │ ├── --tab name # 指定 tab (overview|turns|workflow|subagents|skills|bridges|context) │ ├── --format fmt # 输出格式 (table|tree|json|ascii) │ └── --json # JSON 输出 ├── turn taskId turnId # 查看 turn 详情 │ └── --json # JSON 输出 ├── search taskId # 搜索 session 内 turn │ ├── --keyword kw # 搜索关键词 │ └── --json # JSON 输出 ├── compare id1 id2 # 对比两个 session │ └── --json # JSON 输出 ├── stats # 全局统计 │ ├── --session taskId # 指定 session 统计 │ └── --json # JSON 输出 ├── import # 导入 session │ ├── --source type # opencode-db | claude-jsonl │ ├── --file path # 文件路径 │ ├── --dir path # 目录路径递归扫描 │ └── --list # 仅列出可导入的 session ├── delete # 删除 session │ ├── --session taskId # 删除指定 session │ └── --all # 删除全部 ├── config # 配置管理 │ └── context-windows # 查看上下文窗口配置 └── --server url # 指定后端地址 (默认 http://localhost:21025)5.2 纯命令模式输出示例$ cannbot-insight sessions --limit 5 # Date User Turns Tokens Cost Model 1 06-14 10:30 guanxing.. 25 150.2K ¥3.20 claude-3.5-sonnet 2 06-14 09:15 guanxing.. 12 80.5K ¥1.50 glm-5 3 06-13 18:00 guanxing.. 45 320.0K ¥8.10 deepseek-v4 4 06-13 14:20 guanxing.. 8 45.3K ¥0.90 claude-3.5-sonnet 5 06-12 22:10 guanxing.. 33 210.7K ¥5.40 gpt-4o Total: 42 sessions | 2.1M tokens | ¥56.30 cost$ cannbot-insight stats Global Statistics ────────────────────────────── Sessions: 42 Total Tokens: 2,100,450 Total Cost: ¥56.30 Avg Latency: 8.2s Total Duration: 18h 32m$ cannbot-insight compare abc123 def456 ┌─────────────┬──────────────┬──────────────┐ │ Metric │ abc123 │ def456 │ ├─────────────┼──────────────┼──────────────┤ │ Tokens │ 150.2K │ 80.5K │ │ Cost │ ¥3.20 │ ¥1.50 │ │ Duration │ 45m │ 22m │ │ Turns │ 25 │ 12 │ │ Tool Calls │ 120 │ 45 │ │ Subagents │ 3 │ 1 │ │ Skills │ 8 │ 4 │ │ Model │ claude-3.5 │ glm-5 │ └─────────────┴──────────────┴──────────────┘ Winner: def456 (lower cost, fewer tokens, faster)6. 快捷键设计TUI 模式6.1 全局快捷键键功能q/CtrlC退出?/F1帮助/搜索/过滤r刷新数据Tab切换面板焦点j/↓向下k/↑向上6.2 Session 列表页键功能Enter进入 Session 详情Space选中用于对比c对比选中的两个 Sessioni导入面板d删除选中 SessionD删除全部s切换排序列f过滤按用户/模型6.3 Session 详情页键功能1-7切换 Tab[/]上一个/下一个 TabEnter钻取详情Turn/ExecutionEsc返回列表aAI 分析y复制当前 Session ID7. 目录结构src/ ├── app/ # Web 前端不变 │ ├── page.tsx │ ├── session/[taskId]/ │ ├── compare/ │ └── api/ ├── lib/ # 共享库不变 │ ├── shared/types.ts │ ├── db.ts │ ├── ingest/ │ └── ... └── cli/ # ✨ 新增 CLI 前端 ├── index.ts # CLI 入口commander 路由 ├── client.ts # API 客户端封装 HTTP 调用 ├── config.ts # CLI 配置server URL、颜色主题 │ ├── commands/ # 纯命令模式 │ ├── sessions.ts # sessions 命令 │ ├── session.ts # session id 命令 │ ├── turn.ts # turn 命令 │ ├── search.ts # search 命令 │ ├── compare.ts # compare 命令 │ ├── stats.ts # stats 命令 │ ├── import.ts # import 命令 │ ├── delete.ts # delete 命令 │ └── config.ts # config 命令 │ ├── tui/ # TUI 交互模式 │ ├── App.tsx # TUI 根组件Ink │ ├── screens/ │ │ ├── SessionList.tsx # Session 列表屏 │ │ ├── SessionDetail.tsx # Session 详情屏 │ │ ├── TurnDetail.tsx # Turn 详情屏 │ │ ├── CompareView.tsx # 对比屏 │ │ ├── ImportPanel.tsx # 导入面板 │ │ └── HelpScreen.tsx # 帮助屏 │ ├── tabs/ │ │ ├── OverviewTab.tsx # Overview Tab │ │ ├── TurnsTab.tsx # Turns Tab │ │ ├── WorkflowTab.tsx # Workflow Tab (ASCII tree) │ │ ├── SubagentsTab.tsx # Subagents Tab │ │ ├── SkillsTab.tsx # Skills Tab │ │ ├── BridgesTab.tsx # Interactions Tab │ │ └── ContextTab.tsx # Context Tab │ └── components/ │ ├── StatusBar.tsx # 顶部状态栏 │ ├── KeyBar.tsx # 底部快捷键提示 │ ├── DataTable.tsx # 通用数据表格 │ ├── MetricCards.tsx # 指标卡片行 │ ├── AsciiBar.tsx # ASCII 柱状图 │ ├── TreeView.tsx # ASCII 树形图 │ ├── TabBar.tsx # Tab 切换栏 │ ├── ConfirmDialog.tsx # 确认对话框 │ ├── Spinner.tsx # 自写加载动画替代 ink-spinner │ ├── TextInput.tsx # 自写输入框替代 ink-text-input │ ├── hooks/ # TUI 自定义 hooks │ ├── useApi.ts # API 请求 hook │ ├── useKeyboard.ts # 键盘事件 hook │ ├── useNavigation.ts # 屏幕导航 hook │ └── useTable.ts # 表格排序/翻页 hook │ └── utils/ # CLI 工具函数 ├── format.ts # 数字/时间/货币格式化 ├── colors.ts # 终端颜色主题 └── table.ts # 表格对齐/截断8. 分期计划Phase 1纯命令模式MVP目标可在脚本和终端中快速查询数据任务对应 API优先级CLI 入口 Commander 框架—P0API Client 封装全部 15 个P0sessions列表命令/api/observe/dataP0session id详情命令/api/observe/sessionstatsexecutionsP0stats全局统计/api/observe/statsP0turn id详情/api/observe/session/turns/[turnId]P1search搜索/api/observe/session/turns/searchP1compare对比多次 observe APIP1import导入/api/ingest/import-fileP1delete删除/api/ingest/delete-sessionP2--json输出模式—P1--server参数—P0预估工作量3-5 天Phase 2TUI 交互模式目标全屏终端 UIk9s/lazygit 风格体验任务优先级Ink 框架 App 壳 屏幕导航ESM tsxP0StatusBar KeyBar 组件P0Session 列表屏表格、排序、过滤P0Session 详情屏Tab 切换P0Overview Tab指标卡片 ASCII 柱状图P0Turns Tab时间线列表 详情钻取P0Workflow TabASCII 树形图P1Subagents Tab卡片列表P1Context Tab上下文增长表P1Import 面板P2Compare 屏P2Skills / Bridges TabP2AI Workflow 分析触发P2预估工作量7-10 天Phase 3增强特性特性说明实时刷新--watch模式自动轮询新 session管道集成stdin 管道输入 session ID主题配置支持暗色/亮色终端主题导出导出为 CSV/Markdown/HTMLShell 补全bash/zsh/fish 自动补全Aliascbin短命令别名多服务器配置文件中管理多个后端地址9. 技术要点9.1 API Client 设计// src/cli/client.ts export class InsightClient { constructor(private baseUrl: string http://localhost:21025) {} // Sessions async listSessions(opts: { page?: number; pageSize?: number; user?: string }) { ... } async getSession(taskId: string) { ... } async getStats(taskId?: string) { ... } async getExecutions(taskId: string) { ... } async getTurns(taskId: string, opts?: { isSubagent?: boolean; role?: string }) { ... } async getTurnDetail(turnId: string) { ... } async searchTurns(taskId: string, keyword: string) { ... } async getWorkflow(taskId: string) { ... } async getBridges(taskId: string) { ... } // Ingest async importSession(source: string, filePath: string) { ... } async listImportableSessions(source: string, filePath: string) { ... } async deleteSession(taskId?: string, deleteAll?: boolean) { ... } // AI async analyzeWorkflow(taskId: string, provider: AIProvider) { ... } // Config async getContextWindows(model?: string) { ... } }9.2 共享类型复用CLI 直接复用src/lib/shared/types.ts中的类型定义无需重新定义SessionListItemTokenUsageToolCallInfoRawInteractionCLI 专用 API response 类型字段结构与 shared 内部类型不同在src/cli/types.ts中定义加Api前缀与 shared 区分。重叠子结构如 TokenUsage从 shared 导入复用。9.3 版本号来源CLI 版本号从src/lib/version.ts导入不硬编码import { VERSION, VERSION_DISPLAY } from /lib/version; // Commander: program.version(VERSION) // StatusBar: Text {VERSION_DISPLAY}/Text9.4 TUI stdin 原始模式切换TUI 需要接管键盘输入必须将 stdin 切换到原始模式。生命周期管理// 进入 TUI 前 process.stdin.resume(); process.stdin.setRawMode(true); // Ink render 配置 render(App /, { exitOnCtrlC: false, // 禁用 Ink 默认 CtrlC 退出自己处理 patchConsole: false, // 不 patch console避免干扰 API 日志 }); // 退出 TUI 时恢复 instance.unmount(); process.stdin.setRawMode(false); process.stdin.pause();关键点:exitOnCtrlC: false让我们自己处理退出逻辑清理状态、恢复 stdinpatchConsole: false避免 Ink 劫持 console.log 导致 API 调试信息丢失。9.5 中文宽度处理中文字符在终端占 2 列宽InkText width{N}按字符数计算导致错位。解决方案import stringWidth from string-width; export function padEndVisual(str: string, width: number): string { const visualWidth stringWidth(str); const padding width - visualWidth; if (padding 0) return truncateVisual(str, width); return str .repeat(padding); } export function truncateVisual(str: string, maxVisualWidth: number): string { if (!str) return —; if (stringWidth(str) maxVisualWidth) return str; let result ; let currentWidth 0; for (const char of str) { const charWidth stringWidth(char); if (currentWidth charWidth maxVisualWidth - 1) { return result …; } result char; currentWidth charWidth; } return result; }9.6 格式化示例// src/cli/utils/format.ts export function formatTokens(n: number): string { if (n 1_000_000) return ${(n / 1_000_000).toFixed(1)}M; if (n 1_000) return ${(n / 1_000).toFixed(1)}K; return ${n}; } export function formatCost(cost: number): string { return ¥${cost.toFixed(2)}; } export function formatDuration(seconds: number): string { if (seconds 3600) return ${(seconds / 3600).toFixed(1)}h; if (seconds 60) return ${(seconds / 60).toFixed(0)}m; return ${seconds.toFixed(1)}s; } export function formatDate(iso: string): string { const d new Date(iso); return ${(d.getMonth()1).toString().padStart(2,0)}-${d.getDate().toString().padStart(2,0)} ${d.getHours().toString().padStart(2,0)}:${d.getMinutes().toString().padStart(2,0)}; }10. 安装与使用10.1 安装# 全局安装 npm install -g cannbot-insight # 或 npx 直接使用 npx cannbot-insight sessions10.2 配置# 首次使用配置后端地址 cannbot-insight config set server http://localhost:21025 # 或环境变量 export CANNBOT_SERVERhttp://192.168.1.100:2102510.3 package.json 脚本{ type: module, scripts: { cli: tsx src/cli/index.ts, tui: tsx src/cli/index.ts tui } }ESM tsx: package.jsontype: module是 Ink v7 的硬性要求yoga-layout 使用 top-level awaitCJS 模式报错。运行工具必须用 tsx不能用 ts-node。11. 风险与决策风险影响应对Ink 在 Windows Terminal 兼容性部分 ANSI 转义码不支持测试 Windows Terminal WSL降级渲染TUI 大表格性能1000 session 列表卡顿虚拟滚动 分页加载后端需要运行CLI 不能独立工作文档明确说明依赖关系提供cbin server启动命令命令与 npm script 冲突npx cannbot-insight可能冲突提供cbin短别名Ink v7 第三方组件不兼容ink-table/ink-spinner 等不兼容 v7全部自实现Spinner 10行、TextInput 30行、DataTable 已有设计12. 成功标准指标目标API 覆盖率15/15 端点全部覆盖命令模式可用性所有命令可在 3 秒内返回结果TUI 可用性Session 列表 → 详情 → 返回全程无需鼠标管道友好所有命令支持--json输出零后端改动后端代码无任何修改测试覆盖CLI 命令单元测试 80%【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考