diff --git a/src/config.ts b/src/config.ts index 085d33c..8ec8afd 100644 --- a/src/config.ts +++ b/src/config.ts @@ -7,6 +7,8 @@ export interface Config { workingDirectory: string; model?: string; systemPrompt?: string; + /** 是否已向用户推送过首次欢迎/引导消息(全局只发一次) */ + welcomed?: boolean; } const CONFIG_DIR = join(homedir(), ".wechat-claude-code"); @@ -24,6 +26,7 @@ export function loadConfig(): Config { workingDirectory: parsed.workingDirectory || DEFAULT_CONFIG.workingDirectory, model: parsed.model, systemPrompt: parsed.systemPrompt, + welcomed: parsed.welcomed, }; mkdirSync(config.workingDirectory, { recursive: true }); return config; @@ -36,11 +39,12 @@ export function loadConfig(): Config { export function saveConfig(config: Config): void { mkdirSync(CONFIG_DIR, { recursive: true }); - const data: Record = { + const data: Record = { workingDirectory: config.workingDirectory, }; if (config.model) data.model = config.model; if (config.systemPrompt) data.systemPrompt = config.systemPrompt; + if (config.welcomed) data.welcomed = true; writeFileSync(CONFIG_PATH, JSON.stringify(data, null, 2) + "\n", "utf-8"); if (process.platform !== "win32") { chmodSync(CONFIG_PATH, 0o600); diff --git a/src/main.ts b/src/main.ts index e0bb69b..3515c47 100644 --- a/src/main.ts +++ b/src/main.ts @@ -25,6 +25,16 @@ import { MessageType, type WeixinMessage } from './wechat/types.js'; const MAX_MESSAGE_LENGTH = 4000; +const WELCOME_TEXT = `👋 你好!我是接在你电脑上的 Claude Code。直接在这里发消息,就能让我帮你处理任务——读写文件、跑命令、写代码、分析图片和文档都行。 + +常用命令: +/help 查看全部命令 +/status 查看当前会话状态 +/clear 清空上下文、开始新对话 +/stop 停止正在执行的任务 + +支持文字、语音、图片、文件,发一条试试看吧。`; + // Extensions eligible for auto-push when detected in Claude's response const AUTO_PUSH_EXTENSIONS = new Set([ '.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg', '.ico', @@ -362,6 +372,13 @@ async function handleMessage( const imageItem = extractFirstImageUrl(msg.item_list); const fileItem = extractFirstFileItem(msg.item_list); + // 首次交互:推送一次欢迎/引导,避免新用户面对空白聊天框、不知道能干啥 + if (!config.welcomed) { + config.welcomed = true; + saveConfig(config); + await sender.sendText(fromUserId, contextToken, WELCOME_TEXT); + } + // Drop non-command messages while processing (priority commands already handled upstream) if (session.state === 'processing' && !userText.startsWith('/')) { return;