@geminilight/mindos 0.5.48 → 0.5.50

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.
@@ -0,0 +1,12 @@
1
+ import { redirect } from 'next/navigation';
2
+ import { readSettings } from '@/lib/settings';
3
+ import HelpContent from '@/components/help/HelpContent';
4
+
5
+ export const dynamic = 'force-dynamic';
6
+
7
+ export default function HelpPage() {
8
+ const settings = readSettings();
9
+ if (settings.setupPending) redirect('/setup');
10
+
11
+ return <HelpContent />;
12
+ }
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useRef, useCallback, useState, useEffect } from 'react';
4
4
  import Link from 'next/link';
5
- import { FolderTree, Search, Settings, RefreshCw, Blocks, Bot, Compass, ChevronLeft, ChevronRight } from 'lucide-react';
5
+ import { FolderTree, Search, Settings, RefreshCw, Blocks, Bot, Compass, HelpCircle, ChevronLeft, ChevronRight } from 'lucide-react';
6
6
  import { useLocale } from '@/lib/LocaleContext';
7
7
  import { DOT_COLORS, getStatusLevel } from './SyncStatusBar';
8
8
  import type { SyncStatus } from './settings/SyncTab';
@@ -20,6 +20,7 @@ interface ActivityBarProps {
20
20
  expanded: boolean;
21
21
  onExpandedChange: (expanded: boolean) => void;
22
22
  onSettingsClick: () => void;
23
+ onHelpClick: () => void;
23
24
  onSyncClick: (rect: DOMRect) => void;
24
25
  }
25
26
 
@@ -79,6 +80,7 @@ export default function ActivityBar({
79
80
  expanded,
80
81
  onExpandedChange,
81
82
  onSettingsClick,
83
+ onHelpClick,
82
84
  onSyncClick,
83
85
  }: ActivityBarProps) {
84
86
  const lastClickRef = useRef(0);
@@ -167,6 +169,12 @@ export default function ActivityBar({
167
169
  {/* ── Bottom: Action buttons (not panel toggles) ── */}
168
170
  <div className={`${expanded ? 'mx-3' : 'mx-auto w-6'} border-t border-border`} />
169
171
  <div className={`flex flex-col ${expanded ? 'px-1.5' : 'items-center'} gap-1 py-2`}>
172
+ <RailButton
173
+ icon={<HelpCircle size={18} />}
174
+ label={t.sidebar.help}
175
+ expanded={expanded}
176
+ onClick={() => debounced(onHelpClick)}
177
+ />
170
178
  <RailButton
171
179
  icon={<Settings size={18} />}
172
180
  label={t.sidebar.settingsTitle}
@@ -118,7 +118,8 @@ export default function GuideCard({ onNavigate, spaces = [], recentFiles = [] }:
118
118
  }, [guideState, g, patchGuide]);
119
119
 
120
120
  const handleSyncClick = useCallback(() => {
121
- window.dispatchEvent(new KeyboardEvent('keydown', { key: ',', metaKey: true, bubbles: true }));
121
+ // Open settings directly to the Sync tab (SidebarLayout listens for this event)
122
+ window.dispatchEvent(new CustomEvent('mindos:open-settings', { detail: { tab: 'sync' } }));
122
123
  }, []);
123
124
 
124
125
  // Auto-dismiss final state after 8 seconds
@@ -152,6 +152,10 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
152
152
  setSettingsTab(undefined);
153
153
  }, []);
154
154
 
155
+ const handleHelpClick = useCallback(() => {
156
+ router.push('/help');
157
+ }, [router]);
158
+
155
159
  const closeSettings = useCallback(() => {
156
160
  setSettingsOpen(false);
157
161
  setSettingsTab(undefined);
@@ -188,6 +192,7 @@ export default function SidebarLayout({ fileTree, children }: SidebarLayoutProps
188
192
  expanded={lp.railExpanded}
189
193
  onExpandedChange={handleExpandedChange}
190
194
  onSettingsClick={handleSettingsClick}
195
+ onHelpClick={handleHelpClick}
191
196
  onSyncClick={handleSyncClick}
192
197
  />
193
198
 
@@ -0,0 +1,229 @@
1
+ 'use client';
2
+
3
+ import { useState, useMemo, useCallback } from 'react';
4
+ import { BookOpen, Rocket, Brain, Keyboard, HelpCircle, Bot, ChevronDown, Copy, Check } from 'lucide-react';
5
+ import { useLocale } from '@/lib/LocaleContext';
6
+
7
+ /* ── Collapsible Section ── */
8
+ function Section({ icon, title, defaultOpen = false, children }: {
9
+ icon: React.ReactNode;
10
+ title: string;
11
+ defaultOpen?: boolean;
12
+ children: React.ReactNode;
13
+ }) {
14
+ const [open, setOpen] = useState(defaultOpen);
15
+
16
+ return (
17
+ <div className="bg-card border border-border rounded-lg overflow-hidden">
18
+ <button
19
+ onClick={() => setOpen(v => !v)}
20
+ className="w-full flex items-center gap-3 px-5 py-4 text-left hover:bg-muted/50 transition-colors focus-visible:ring-2 focus-visible:ring-ring"
21
+ aria-expanded={open}
22
+ >
23
+ <span className="text-[var(--amber)]">{icon}</span>
24
+ <span className="text-base font-medium font-display text-foreground flex-1">{title}</span>
25
+ <ChevronDown size={16} className={`text-muted-foreground transition-transform duration-200 ${open ? 'rotate-180' : ''}`} />
26
+ </button>
27
+ {open && (
28
+ <div className="px-5 pb-5 pt-0">
29
+ <div className="border-t border-border pt-4">
30
+ {children}
31
+ </div>
32
+ </div>
33
+ )}
34
+ </div>
35
+ );
36
+ }
37
+
38
+ /* ── Step Card ── */
39
+ function StepCard({ step, title, desc }: { step: number; title: string; desc: string }) {
40
+ return (
41
+ <div className="flex gap-4 items-start">
42
+ <div className="shrink-0 w-8 h-8 rounded-full flex items-center justify-center text-sm font-bold font-mono" style={{ background: 'var(--amber-dim)', color: 'var(--amber)' }}>
43
+ {step}
44
+ </div>
45
+ <div className="min-w-0">
46
+ <p className="text-sm font-medium text-foreground">{title}</p>
47
+ <p className="text-sm text-muted-foreground mt-0.5">{desc}</p>
48
+ </div>
49
+ </div>
50
+ );
51
+ }
52
+
53
+ /* ── Copyable Prompt Block ── */
54
+ function PromptBlock({ text, copyLabel }: { text: string; copyLabel: string }) {
55
+ const [copied, setCopied] = useState(false);
56
+
57
+ const handleCopy = useCallback(() => {
58
+ const clean = text.replace(/^[""]|[""]$/g, '');
59
+ navigator.clipboard.writeText(clean).then(() => {
60
+ setCopied(true);
61
+ setTimeout(() => setCopied(false), 1500);
62
+ });
63
+ }, [text]);
64
+
65
+ return (
66
+ <div className="group/prompt mt-2 flex items-start gap-2 bg-background border border-border rounded-md px-3 py-2">
67
+ <p className="flex-1 text-xs font-mono leading-relaxed" style={{ color: 'var(--amber)' }}>{text}</p>
68
+ <button
69
+ onClick={handleCopy}
70
+ className="shrink-0 p-1 rounded hover:bg-muted text-muted-foreground hover:text-foreground transition-colors opacity-0 group-hover/prompt:opacity-100 focus-visible:opacity-100"
71
+ aria-label={copyLabel}
72
+ title={copyLabel}
73
+ >
74
+ {copied ? <Check size={13} className="text-success" /> : <Copy size={13} />}
75
+ </button>
76
+ </div>
77
+ );
78
+ }
79
+
80
+ /* ── FAQ Item ── */
81
+ function FaqItem({ q, a }: { q: string; a: string }) {
82
+ const [open, setOpen] = useState(false);
83
+
84
+ return (
85
+ <div className="border-b border-border last:border-b-0">
86
+ <button
87
+ onClick={() => setOpen(v => !v)}
88
+ className="w-full flex items-center justify-between py-3 text-left focus-visible:ring-2 focus-visible:ring-ring"
89
+ aria-expanded={open}
90
+ >
91
+ <span className="text-sm font-medium text-foreground pr-4">{q}</span>
92
+ <ChevronDown size={14} className={`shrink-0 text-muted-foreground transition-transform duration-200 ${open ? 'rotate-180' : ''}`} />
93
+ </button>
94
+ {open && (
95
+ <p className="text-sm text-muted-foreground pb-3 leading-relaxed">{a}</p>
96
+ )}
97
+ </div>
98
+ );
99
+ }
100
+
101
+ /* ── Shortcut Row ── */
102
+ function ShortcutRow({ keys, label }: { keys: string; label: string }) {
103
+ return (
104
+ <div className="flex items-center justify-between py-1.5">
105
+ <span className="text-sm text-foreground">{label}</span>
106
+ <div className="flex items-center gap-1">
107
+ {keys.split(' ').map((key, i) => (
108
+ <kbd
109
+ key={i}
110
+ className="px-1.5 py-0.5 text-xs rounded border border-border bg-muted text-muted-foreground font-mono min-w-[24px] text-center"
111
+ >
112
+ {key}
113
+ </kbd>
114
+ ))}
115
+ </div>
116
+ </div>
117
+ );
118
+ }
119
+
120
+ /* ── Main Component ── */
121
+ export default function HelpContent() {
122
+ const { t } = useLocale();
123
+ const h = t.help;
124
+
125
+ const isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.userAgent);
126
+ const mod = isMac ? '⌘' : 'Ctrl';
127
+
128
+ const shortcuts = useMemo(() => [
129
+ { keys: `${mod} K`, label: h.shortcuts.search },
130
+ { keys: `${mod} /`, label: h.shortcuts.askAI },
131
+ { keys: `${mod} ,`, label: h.shortcuts.settings },
132
+ { keys: `${mod} ?`, label: h.shortcuts.shortcutPanel },
133
+ { keys: 'E', label: h.shortcuts.editFile },
134
+ { keys: `${mod} S`, label: h.shortcuts.save },
135
+ { keys: 'Esc', label: h.shortcuts.closePanel },
136
+ { keys: '@', label: h.shortcuts.attachFile },
137
+ ], [mod, h.shortcuts]);
138
+
139
+ return (
140
+ <div className="content-width px-4 md:px-6 py-8 md:py-12">
141
+ {/* ── Header ── */}
142
+ <div className="mb-8">
143
+ <div className="flex items-center gap-2 mb-1">
144
+ <div className="w-1 h-6 rounded-full" style={{ background: 'var(--amber)' }} />
145
+ <h1 className="text-2xl font-bold font-display text-foreground">{h.title}</h1>
146
+ </div>
147
+ <p className="text-muted-foreground text-sm ml-3 mt-1">{h.subtitle}</p>
148
+ </div>
149
+
150
+ {/* ── Sections ── */}
151
+ <div className="space-y-3">
152
+ {/* 1. What is MindOS */}
153
+ <Section icon={<BookOpen size={18} />} title={h.whatIs.title} defaultOpen>
154
+ <p className="text-sm text-muted-foreground leading-relaxed">{h.whatIs.body}</p>
155
+ </Section>
156
+
157
+ {/* 2. Core Concepts */}
158
+ <Section icon={<Brain size={18} />} title={h.concepts.title} defaultOpen>
159
+ <div className="space-y-4">
160
+ <div>
161
+ <p className="text-sm font-medium text-foreground">{h.concepts.spaceTitle}</p>
162
+ <p className="text-sm text-muted-foreground mt-0.5">{h.concepts.spaceDesc}</p>
163
+ </div>
164
+ <div>
165
+ <p className="text-sm font-medium text-foreground">{h.concepts.instructionTitle}</p>
166
+ <p className="text-sm text-muted-foreground mt-0.5">{h.concepts.instructionDesc}</p>
167
+ </div>
168
+ <div>
169
+ <p className="text-sm font-medium text-foreground">{h.concepts.skillTitle}</p>
170
+ <p className="text-sm text-muted-foreground mt-0.5">{h.concepts.skillDesc}</p>
171
+ </div>
172
+ </div>
173
+ </Section>
174
+
175
+ {/* 3. Quick Start */}
176
+ <Section icon={<Rocket size={18} />} title={h.quickStart.title} defaultOpen>
177
+ <div className="space-y-4">
178
+ <StepCard step={1} title={h.quickStart.step1Title} desc={h.quickStart.step1Desc} />
179
+ <StepCard step={2} title={h.quickStart.step2Title} desc={h.quickStart.step2Desc} />
180
+ <StepCard step={3} title={h.quickStart.step3Title} desc={h.quickStart.step3Desc} />
181
+ </div>
182
+ </Section>
183
+
184
+ {/* 4. Using MindOS with AI Agents */}
185
+ <Section icon={<Bot size={18} />} title={h.agentUsage.title} defaultOpen>
186
+ <p className="text-sm text-muted-foreground leading-relaxed mb-4">{h.agentUsage.intro}</p>
187
+
188
+ <div className="space-y-3">
189
+ {h.agentUsage.scenarios.map((sc, i) => {
190
+ const prompts = sc.prompt.split('\n');
191
+ return (
192
+ <div key={i} className="bg-muted/50 rounded-md px-4 py-3">
193
+ <div className="flex items-center gap-2">
194
+ <span className="text-base leading-none" role="img" suppressHydrationWarning>{sc.emoji}</span>
195
+ <p className="text-sm font-medium text-foreground">{sc.title}</p>
196
+ </div>
197
+ <p className="text-sm text-muted-foreground mt-1">{sc.desc}</p>
198
+ {prompts.map((p, j) => (
199
+ <PromptBlock key={j} text={p} copyLabel={h.agentUsage.copy} />
200
+ ))}
201
+ </div>
202
+ );
203
+ })}
204
+ </div>
205
+
206
+ <p className="text-xs text-muted-foreground mt-4">{h.agentUsage.hint}</p>
207
+ </Section>
208
+
209
+ {/* 5. Keyboard Shortcuts */}
210
+ <Section icon={<Keyboard size={18} />} title={h.shortcutsTitle}>
211
+ <div className="space-y-0">
212
+ {shortcuts.map((s) => (
213
+ <ShortcutRow key={s.keys} keys={s.keys} label={s.label} />
214
+ ))}
215
+ </div>
216
+ </Section>
217
+
218
+ {/* 6. FAQ */}
219
+ <Section icon={<HelpCircle size={18} />} title={h.faq.title}>
220
+ <div>
221
+ {h.faq.items.map((item, i) => (
222
+ <FaqItem key={i} q={item.q} a={item.a} />
223
+ ))}
224
+ </div>
225
+ </Section>
226
+ </div>
227
+ </div>
228
+ );
229
+ }
@@ -60,6 +60,7 @@ export const en = {
60
60
  plugins: 'Plugins',
61
61
  agents: 'Agents',
62
62
  discover: 'Discover',
63
+ help: 'Help',
63
64
  syncLabel: 'Sync',
64
65
  collapseTitle: 'Collapse sidebar',
65
66
  expandTitle: 'Expand sidebar',
@@ -659,7 +660,7 @@ export const en = {
659
660
  promptEmpty: 'Help me design a knowledge base folder structure that fits my needs',
660
661
  },
661
662
  sync: {
662
- title: 'Set up sync',
663
+ title: 'Sync Notes',
663
664
  optional: 'Optional',
664
665
  cta: 'Configure',
665
666
  },
@@ -770,4 +771,66 @@ export const en = {
770
771
  },
771
772
  ],
772
773
  },
774
+ help: {
775
+ title: 'Help & Guide',
776
+ subtitle: 'Everything you need to get started with MindOS',
777
+ whatIs: {
778
+ title: 'What is MindOS?',
779
+ body: 'MindOS is where you think, and where your AI agents act. You and AI share the same brain — when you correct AI, that correction is captured automatically; next time AI understands you better, and your own thinking gets sharper along the way. You and AI grow together. In an age of AI anxiety, MindOS focuses on human growth — think clearly, make better decisions, ship faster, and build up knowledge that\'s truly yours.',
780
+ },
781
+ quickStart: {
782
+ title: 'Quick Start',
783
+ step1Title: 'Browse your knowledge base',
784
+ step1Desc: 'Click the Spaces icon in the left sidebar to explore your files. Each top-level folder is a "Space" — a themed area like Profile, Notes, or Projects.',
785
+ step2Title: 'Chat with AI',
786
+ step2Desc: 'Press ⌘/ (or Ctrl/) to open the AI panel. Ask anything about your knowledge base, or use @ to attach a specific file for context.',
787
+ step3Title: 'Connect your AI agents',
788
+ step3Desc: 'Go to Settings → MCP to connect external agents like Claude Code, Cursor, or Windsurf. Once connected, they can read and write your knowledge base directly.',
789
+ },
790
+ concepts: {
791
+ title: 'Core Concepts',
792
+ spaceTitle: 'Space',
793
+ spaceDesc: 'Spaces are knowledge partitions organized the way you think. You decide the structure, and AI agents follow it to read, write, and manage automatically.',
794
+ instructionTitle: 'Instruction',
795
+ instructionDesc: 'A rules file that all AI agents obey. You write the boundaries once, and every agent connected to your knowledge base follows them.',
796
+ skillTitle: 'Skill',
797
+ skillDesc: 'Teaches agents how to operate your knowledge base — reading, writing, organizing. Agents don\'t guess; they follow the skills you\'ve installed.',
798
+ },
799
+ shortcutsTitle: 'Keyboard Shortcuts',
800
+ agentUsage: {
801
+ title: 'Using MindOS with AI Agents',
802
+ intro: 'Once you connect an agent (Claude Code, Cursor, Windsurf, etc.) via MCP, just talk to it naturally. The agent can read and write your knowledge base directly — no special commands needed. Here are the most common scenarios:',
803
+ scenarios: [
804
+ { emoji: '🪪', title: 'Inject Your Identity', desc: 'Tell all AI agents who you are — preferences, tech stack, communication style — in one shot.', prompt: '"Here is my resume, read it and organize my identity, skills, and preferences into MindOS Profile."' },
805
+ { emoji: '🔄', title: 'Cross-Agent Handoff', desc: 'Brainstorm ideas in GPT, then execute in Claude Code — zero context loss.', prompt: '"Save this conversation to MindOS."\n"Read the plan in MindOS and help me start coding."' },
806
+ { emoji: '📋', title: 'Experience → SOP', desc: 'Turn hard-won debugging sessions into reusable workflows that prevent future mistakes.', prompt: '"Help me distill this conversation into a reusable workflow in MindOS."' },
807
+ { emoji: '🚀', title: 'Project Cold Start', desc: 'Spin up a new project in minutes — your profile and SOPs guide the scaffolding automatically.', prompt: '"Help me start a new project following the Startup SOP in MindOS."' },
808
+ { emoji: '🔍', title: 'Research & Archive', desc: 'Let agents research competitors or topics for you, then file structured results in your knowledge base.', prompt: '"Help me research X, Y, Z products and save results to the MindOS product library."' },
809
+ ],
810
+ copy: 'Copy prompt',
811
+ hint: 'Tip: The agent auto-discovers your knowledge base structure. Just mention "MindOS" in your prompt and it will know where to look. Click "Explore" in the left sidebar for more scenarios.',
812
+ },
813
+ shortcuts: {
814
+ search: 'Search files',
815
+ askAI: 'Toggle AI panel',
816
+ settings: 'Open Settings',
817
+ shortcutPanel: 'Keyboard shortcuts panel',
818
+ editFile: 'Edit current file',
819
+ save: 'Save file',
820
+ closePanel: 'Close panel / Exit modal',
821
+ attachFile: 'Attach file in AI chat',
822
+ },
823
+ faq: {
824
+ title: 'FAQ',
825
+ items: [
826
+ { q: 'How do I change the language?', a: 'Go to Settings → Appearance → Language. You can switch between English and Chinese.' },
827
+ { q: 'How do I connect an AI agent?', a: 'Go to Settings → MCP & Skills. MindOS auto-detects installed agents (Claude Code, Cursor, etc.) and lets you connect them with one click.' },
828
+ { q: 'Where is my data stored?', a: 'All your data stays on your local machine as plain Markdown files. MindOS never uploads your data to any cloud service. You own everything.' },
829
+ { q: 'How do I sync across devices?', a: 'Go to Settings → Sync. MindOS uses Git for cross-device sync. Enter your Git remote URL and access token to start syncing.' },
830
+ { q: 'Can I use my own AI provider?', a: 'Yes! Go to Settings → AI. You can use OpenAI, Anthropic, Google, or any OpenAI-compatible API with a custom base URL.' },
831
+ { q: 'What file formats are supported?', a: 'MindOS works best with Markdown (.md) files, but also supports JSON, CSV, and plain text. Plugins extend rendering for special formats like Kanban boards or timelines.' },
832
+ { q: 'How do I create a new note?', a: 'Click the + icon next to any folder in the file tree, or ask AI to create one for you. Notes are just Markdown files — you can also create them from your file system.' },
833
+ ],
834
+ },
835
+ },
773
836
  } as const;
@@ -85,6 +85,7 @@ export const zh = {
85
85
  plugins: '插件',
86
86
  agents: '智能体',
87
87
  discover: '探索',
88
+ help: '帮助',
88
89
  syncLabel: '同步',
89
90
  collapseTitle: '收起侧栏',
90
91
  expandTitle: '展开侧栏',
@@ -684,7 +685,7 @@ export const zh = {
684
685
  promptEmpty: '帮我设计一个适合我的知识库目录结构',
685
686
  },
686
687
  sync: {
687
- title: '配置同步',
688
+ title: '同步笔记',
688
689
  optional: '可选',
689
690
  cta: '设置',
690
691
  },
@@ -795,4 +796,66 @@ export const zh = {
795
796
  },
796
797
  ],
797
798
  },
799
+ help: {
800
+ title: '帮助与指南',
801
+ subtitle: '开始使用 MindOS 所需的一切',
802
+ whatIs: {
803
+ title: '什么是 MindOS?',
804
+ body: 'MindOS 是你思考的地方,也是 AI Agent 行动的起点。你和 AI 共享同一个大脑——你纠正了 AI,这个纠正自动沉淀;AI 下次更懂你,你自己的思路也跟着变清晰。人和 AI 一起成长。在 AI 焦虑蔓延的时代,MindOS 更关注人的成长——想清楚问题、做好判断、快速实践、攒下属于自己的认知。',
805
+ },
806
+ quickStart: {
807
+ title: '快速开始',
808
+ step1Title: '浏览你的知识库',
809
+ step1Desc: '点击左侧边栏的"空间"图标来浏览你的文件。每个顶级文件夹是一个"空间"——比如 Profile、Notes 或 Projects。',
810
+ step2Title: '和 AI 对话',
811
+ step2Desc: '按 ⌘/(或 Ctrl/)打开 AI 面板。询问任何关于知识库的问题,或使用 @ 附加特定文件作为上下文。',
812
+ step3Title: '连接你的 AI Agent',
813
+ step3Desc: '前往 设置 → MCP 连接外部 Agent,如 Claude Code、Cursor 或 Windsurf。连接后,它们可以直接读写你的知识库。',
814
+ },
815
+ concepts: {
816
+ title: '核心概念',
817
+ spaceTitle: '空间(Space)',
818
+ spaceDesc: '空间是按你的思维方式组织的知识分区。你怎么想,就怎么分,AI Agent 遵循同样的结构来自动读写和管理。',
819
+ instructionTitle: '指令(Instruction)',
820
+ instructionDesc: '一份所有 AI Agent 都遵守的规则文件。你写一次边界,每个连接到知识库的 Agent 都会照做。',
821
+ skillTitle: '技能(Skill)',
822
+ skillDesc: '教 Agent 如何操作你的知识库——读取、写入、整理。Agent 不是瞎猜,而是按你安装的 Skill 来执行。',
823
+ },
824
+ shortcutsTitle: '快捷键',
825
+ agentUsage: {
826
+ title: '在 AI Agent 中使用 MindOS',
827
+ intro: '通过 MCP 连接 Agent(Claude Code、Cursor、Windsurf 等)后,直接用自然语言对话即可。Agent 能自动读写你的知识库,不需要特殊指令。以下是最常见的使用场景:',
828
+ scenarios: [
829
+ { emoji: '🪪', title: '注入身份', desc: '让所有 AI Agent 一次认识你——偏好、技术栈、沟通风格。', prompt: '"这是我的简历,读一下,帮我把身份、技能和偏好整理到 MindOS Profile 里。"' },
830
+ { emoji: '🔄', title: '跨 Agent 切换', desc: '在 GPT 里聊想法,到 Claude Code 去执行——上下文零丢失。', prompt: '"帮我把刚才的对话整理到 MindOS。"\n"读一下 MindOS 里的方案,帮我开始写代码。"' },
831
+ { emoji: '📋', title: '经验→SOP', desc: '把踩坑经验沉淀为可复用的工作流,下次 3 分钟搞定。', prompt: '"帮我把这次对话的经验沉淀到 MindOS,形成可复用的工作流。"' },
832
+ { emoji: '🚀', title: '项目冷启动', desc: '几分钟搭建新项目——Profile 和 SOP 自动引导脚手架。', prompt: '"帮我按 MindOS 里的 Startup SOP 启动一个新项目。"' },
833
+ { emoji: '🔍', title: '调研入库', desc: '让 Agent 替你调研竞品或话题,结果结构化存入知识库。', prompt: '"帮我调研 X、Y、Z 这几个产品,结果写入 MindOS 产品库。"' },
834
+ ],
835
+ copy: '复制 Prompt',
836
+ hint: '提示:Agent 会自动发现你的知识库结构。在 prompt 中提到"MindOS",它就知道去哪里找。点击左侧"探索"查看更多场景。',
837
+ },
838
+ shortcuts: {
839
+ search: '搜索文件',
840
+ askAI: '切换 AI 面板',
841
+ settings: '打开设置',
842
+ shortcutPanel: '快捷键面板',
843
+ editFile: '编辑当前文件',
844
+ save: '保存文件',
845
+ closePanel: '关闭面板 / 退出弹窗',
846
+ attachFile: '在 AI 对话中附加文件',
847
+ },
848
+ faq: {
849
+ title: '常见问题',
850
+ items: [
851
+ { q: '如何切换语言?', a: '前往 设置 → 外观 → 语言。支持中文和英文切换。' },
852
+ { q: '如何连接 AI Agent?', a: '前往 设置 → MCP & Skills。MindOS 会自动检测已安装的 Agent(Claude Code、Cursor 等),一键即可连接。' },
853
+ { q: '我的数据存储在哪里?', a: '所有数据以纯 Markdown 文件的形式存储在你的本地机器上。MindOS 不会将你的数据上传到任何云服务。数据完全由你掌控。' },
854
+ { q: '如何跨设备同步?', a: '前往 设置 → 同步。MindOS 使用 Git 进行跨设备同步。输入 Git 远程仓库 URL 和访问令牌即可开始同步。' },
855
+ { q: '可以使用自己的 AI 服务商吗?', a: '可以!前往 设置 → AI。支持 OpenAI、Anthropic、Google,或任何 OpenAI 兼容的 API(自定义 Base URL)。' },
856
+ { q: '支持哪些文件格式?', a: 'MindOS 最适合 Markdown(.md)文件,但也支持 JSON、CSV 和纯文本。插件可以扩展特殊格式的渲染,如看板或时间线。' },
857
+ { q: '如何创建新笔记?', a: '点击文件树中任意文件夹旁的 + 图标,或让 AI 帮你创建。笔记就是 Markdown 文件,你也可以直接在文件系统中创建。' },
858
+ ],
859
+ },
860
+ },
798
861
  } as const satisfies Widen<typeof en>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geminilight/mindos",
3
- "version": "0.5.48",
3
+ "version": "0.5.50",
4
4
  "description": "MindOS — Human-Agent Collaborative Mind System. Local-first knowledge base that syncs your mind to all AI Agents via MCP.",
5
5
  "keywords": [
6
6
  "mindos",