Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions Plugin/DailyNote/dailynote.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.' };
}
Expand Down Expand Up @@ -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}`;
Expand Down
8 changes: 7 additions & 1 deletion Plugin/DailyNote/plugin-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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:'开头的标签行。",
Expand Down
17 changes: 13 additions & 4 deletions Plugin/DailyNoteWrite/daily-note-write.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.');
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down
Loading