From c928565079fe4290d3132ef6e1048061c469ae2b Mon Sep 17 00:00:00 2001 From: Wooden-Gear Date: Thu, 9 Apr 2026 03:27:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E8=AE=B0=E5=88=9B=E5=BB=BA=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0fileName=E5=AD=97=E6=AE=B5,=20=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=B0=E5=8E=9F=E6=97=B6=E9=97=B4=E6=88=B3?= =?UTF-8?q?=E4=B9=8B=E5=90=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plugin/DailyNote/dailynote.js | 12 ++++++++++-- Plugin/DailyNote/plugin-manifest.json | 8 +++++++- Plugin/DailyNoteWrite/daily-note-write.js | 17 +++++++++++++---- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/Plugin/DailyNote/dailynote.js b/Plugin/DailyNote/dailynote.js index e05580d8..529c0251 100644 --- a/Plugin/DailyNote/dailynote.js +++ b/Plugin/DailyNote/dailynote.js @@ -262,8 +262,9 @@ async function handleCreateCommand(args) { const dateString = args.dateString || args.Date; const contentText = args.contentText || args.Content; const tag = args.Tag || args.tag; + const fileName = args.fileName || args.FileName; - debugLog(`Processing 'create' for Maid: ${maid}, Date: ${dateString}`); + debugLog(`Processing 'create' for Maid: ${maid}, Date: ${dateString}, fileName: ${fileName}`); if (!maid || !dateString || !contentText) { return { status: "error", error: 'Invalid input for create: Missing maid/maidName, dateString/Date, or contentText/Content.' }; } @@ -315,7 +316,14 @@ async function handleCreateCommand(args) { }; } - const baseFileNameWithoutExt = `${datePart}-${timeStringForFile}`; + // 可选字段:将 fileName 作为后缀拼接到时间戳文件名后 + let sanitizedOptionalFileName = ''; + if (typeof fileName === 'string' && fileName.trim()) { + sanitizedOptionalFileName = sanitizePathComponent(fileName.trim()); + } + + const fileNameSuffix = sanitizedOptionalFileName ? `-${sanitizedOptionalFileName}` : ''; + const baseFileNameWithoutExt = `${datePart}-${timeStringForFile}${fileNameSuffix}`; const fileExtension = `.${CONFIGURED_EXTENSION}`; let finalFileName = `${baseFileNameWithoutExt}${fileExtension}`; diff --git a/Plugin/DailyNote/plugin-manifest.json b/Plugin/DailyNote/plugin-manifest.json index 657aef12..7c75343d 100644 --- a/Plugin/DailyNote/plugin-manifest.json +++ b/Plugin/DailyNote/plugin-manifest.json @@ -18,7 +18,7 @@ "invocationCommands": [ { "commandIdentifier": "create", - "description": "“创建日记”: 用于创建一篇新的日记。AI必须提供maid, Date, 和 Content。标签(Tag)可以通过两种方式提供:1) 作为Content的最后一行 (例如 'Tag: ...')。2) 使用独立的'Tag'字段。如果同时提供,独立的'Tag'字段将覆盖Content中的标签行。文件夹路径会根据maid中的[tag]自动归类。\n调用格式 (两种方式):\n1. 标签在Content末尾:\n<<<[TOOL_REQUEST]>>>\ntool_name:「始」DailyNote「末」,\ncommand:「始」create「末」,\nmaid:「始」[VCP开发]Roo「末」,\nDate:「始」2025-11-23「末」,\nContent:「始」今天我重构了DailyNote插件...\\nTag: VCP开发, 插件重构, Node.js「末」\n<<<[END_TOOL_REQUEST]>>>\n2. 使用独立Tag字段:\n<<<[TOOL_REQUEST]>>>\ntool_name:「始」DailyNote「末」,\ncommand:「始」create「末」,\nmaid:「始」[VCP开发]Roo「末」,\nDate:「始」2025-11-23「末」,\nContent:「始」今天我重构了DailyNote插件...「末」,\nTag:「始」VCP开发, 插件重构, Node.js「末」\n<<<[END_TOOL_REQUEST]>>>", + "description": "“创建日记”: 用于创建一篇新的日记。AI必须提供maid, Date, 和 Content。可选提供fileName字段,作为文件名后缀追加到时间戳命名之后(例如:2026-04-08-05_11_20-测试日记创建功能)。标签(Tag)可以通过两种方式提供:1) 作为Content的最后一行 (例如 'Tag: ...')。2) 使用独立的'Tag'字段。如果同时提供,独立的'Tag'字段将覆盖Content中的标签行。文件夹路径会根据maid中的[tag]自动归类。\n调用格式 (两种方式):\n1. 标签在Content末尾:\n<<<[TOOL_REQUEST]>>>\ntool_name:「始」DailyNote「末」,\ncommand:「始」create「末」,\nmaid:「始」[VCP开发]Roo「末」,\nDate:「始」2025-11-23「末」,\nfileName:「始」重构记录「末」,\nContent:「始」今天我重构了DailyNote插件...\\nTag: VCP开发, 插件重构, Node.js「末」\n<<<[END_TOOL_REQUEST]>>>\n2. 使用独立Tag字段:\n<<<[TOOL_REQUEST]>>>\ntool_name:「始」DailyNote「末」,\ncommand:「始」create「末」,\nmaid:「始」[VCP开发]Roo「末」,\nDate:「始」2025-11-23「末」,\nfileName:「始」重构记录「末」,\nContent:「始」今天我重构了DailyNote插件...「末」,\nTag:「始」VCP开发, 插件重构, Node.js「末」\n<<<[END_TOOL_REQUEST]>>>", "parameters": [ { "name": "maid", @@ -32,6 +32,12 @@ "required": true, "type": "string" }, + { + "name": "fileName", + "description": "可选文件名后缀,会追加到默认时间戳文件名后(例如:2026-04-08-05_11_20-测试日记创建功能)。", + "required": false, + "type": "string" + }, { "name": "Content", "description": "日记的完整内容。如果'Tag'参数未提供,则此内容的最后一行必须是以'Tag:'开头的标签行。", diff --git a/Plugin/DailyNoteWrite/daily-note-write.js b/Plugin/DailyNoteWrite/daily-note-write.js index 3077d7ad..81c48f3c 100644 --- a/Plugin/DailyNoteWrite/daily-note-write.js +++ b/Plugin/DailyNoteWrite/daily-note-write.js @@ -320,8 +320,8 @@ async function processTagsInContent(contentText) { // --- Core Diary Writing Logic --- -async function writeDiary(maidName, dateString, contentText) { - debugLog(`Processing diary write for Maid: ${maidName}, Date: ${dateString}`); +async function writeDiary(maidName, dateString, contentText, fileName) { + debugLog(`Processing diary write for Maid: ${maidName}, Date: ${dateString}, fileName: ${fileName}`); if (!maidName || !dateString || !contentText) { throw new Error('Invalid input: Missing Maid, Date, or Content.'); } @@ -361,7 +361,15 @@ async function writeDiary(maidName, dateString, contentText) { const timeStringForFile = `${hours}_${minutes}_${seconds}`; const dirPath = path.join(dailyNoteRootPath, sanitizedFolderName); - const baseFileNameWithoutExt = `${datePart}-${timeStringForFile}`; + + // 可选字段:将 fileName 作为后缀拼接到时间戳文件名后 + let sanitizedOptionalFileName = ''; + if (typeof fileName === 'string' && fileName.trim()) { + sanitizedOptionalFileName = sanitizePathComponent(fileName.trim()); + } + + const fileNameSuffix = sanitizedOptionalFileName ? `-${sanitizedOptionalFileName}` : ''; + const baseFileNameWithoutExt = `${datePart}-${timeStringForFile}${fileNameSuffix}`; const fileExtension = `.${CONFIGURED_EXTENSION}`; const finalFileName = `${baseFileNameWithoutExt}${fileExtension}`; const filePath = path.join(dirPath, finalFileName); @@ -396,8 +404,9 @@ async function main() { } const diaryData = JSON.parse(inputData); const { maidName, dateString, contentText } = diaryData; + const fileName = diaryData.fileName || diaryData.FileName; - const savedFilePath = await writeDiary(maidName, dateString, contentText); + const savedFilePath = await writeDiary(maidName, dateString, contentText, fileName); sendOutput({ status: "success", message: `Diary saved to ${savedFilePath}` }); } catch (error) {