{
  "schemaVersion": "1.0",
  "item": {
    "slug": "focusnoteapp",
    "name": "focusnoteapp",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/trongnguyen29/focusnoteapp",
    "canonicalUrl": "https://clawhub.ai/trongnguyen29/focusnoteapp",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/focusnoteapp",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=focusnoteapp",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "slug": "focusnoteapp",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-01T02:24:59.608Z",
      "expiresAt": "2026-05-08T02:24:59.608Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=focusnoteapp",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=focusnoteapp",
        "contentDisposition": "attachment; filename=\"focusnoteapp-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "focusnoteapp"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/focusnoteapp"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/focusnoteapp",
    "agentPageUrl": "https://openagent3.xyz/skills/focusnoteapp/agent",
    "manifestUrl": "https://openagent3.xyz/skills/focusnoteapp/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/focusnoteapp/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "FocusNote: Add to Daily Note",
        "body": "This skill adds user-provided text to today's daily note in FocusNote as a new bullet point."
      },
      {
        "title": "How It Works",
        "body": "Reads the FocusNote documents path from ~/.lucia/documents-path.txt\nGenerates today's date in YYYY-MM-DD format\nLocates or creates today's daily note\nAdds the user's text as a new bullet point\nUpdates the document's JSON structure files"
      },
      {
        "title": "Prerequisites",
        "body": "FocusNote app must be running (it creates ~/.lucia/documents-path.txt on startup)\nNode.js installed for running the helper script"
      },
      {
        "title": "Implementation",
        "body": "When the user asks to add text to their daily note, follow these steps:"
      },
      {
        "title": "Step 1: Read Documents Path",
        "body": "const fs = require(\"fs\");\nconst path = require(\"path\");\nconst os = require(\"os\");\n\n// Read the documents path from FocusNote's config file\nconst focusnoteConfigPath = path.join(\n  os.homedir(),\n  \".lucia\",\n  \"documents-path.txt\",\n);\nconst documentsPath = fs.readFileSync(focusnoteConfigPath, \"utf-8\").trim();"
      },
      {
        "title": "Step 2: Generate Today's Date",
        "body": "const today = new Date();\nconst year = today.getFullYear();\nconst month = String(today.getMonth() + 1).padStart(2, \"0\");\nconst day = String(today.getDate()).padStart(2, \"0\");\nconst todayDocName = `${year}-${month}-${day}`;"
      },
      {
        "title": "Step 3: Locate Daily Note Folder",
        "body": "const dailyNotePath = path.join(documentsPath, \"notes\", todayDocName);\nconst structurePath = path.join(dailyNotePath, \"_structure.json\");\nconst metadataPath = path.join(dailyNotePath, \"_metadata.json\");\nconst nodesDir = path.join(dailyNotePath, \".nodes\");"
      },
      {
        "title": "Step 4: Create Daily Note If It Doesn't Exist",
        "body": "if (!fs.existsSync(dailyNotePath)) {\n  // Create directory structure\n  fs.mkdirSync(dailyNotePath, { recursive: true });\n  fs.mkdirSync(nodesDir, { recursive: true });\n\n  // Create metadata\n  const metadata = {\n    name: todayDocName,\n    createdAt: Date.now(),\n    updatedAt: Date.now(),\n  };\n  fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));\n\n  // Create empty structure\n  const structure = {\n    rootNodeIds: [],\n    deletedNodeIds: [],\n    nodes: {},\n  };\n  fs.writeFileSync(structurePath, JSON.stringify(structure, null, 2));\n}"
      },
      {
        "title": "Step 5: Create New Bullet Node",
        "body": "const { v4: uuidv4 } = require(\"uuid\"); // npm install uuid\n\n// Generate unique node ID\nconst nodeId = uuidv4();\nconst timestamp = Date.now();\n\n// Create Lexical bullet structure\nconst lexicalContent = {\n  root: {\n    children: [\n      {\n        children: [\n          {\n            children: [\n              {\n                detail: 0,\n                format: 0,\n                mode: \"normal\",\n                style: \"\",\n                text: userText, // The text from the user\n                type: \"text\",\n                version: 1,\n              },\n            ],\n            direction: \"ltr\",\n            format: \"\",\n            indent: 0,\n            type: \"listitem\",\n            version: 1,\n            value: 1,\n          },\n        ],\n        direction: \"ltr\",\n        format: \"\",\n        indent: 0,\n        type: \"list\",\n        version: 1,\n        listType: \"bullet\",\n        start: 1,\n        tag: \"ul\",\n      },\n    ],\n    direction: \"ltr\",\n    format: \"\",\n    indent: 0,\n    type: \"root\",\n    version: 1,\n  },\n};\n\n// Create node object\nconst newNode = {\n  id: nodeId,\n  content: JSON.stringify(lexicalContent),\n  isFolded: false,\n  isTodo: false,\n  isDone: false,\n  isInProgress: false,\n  isBlurred: false,\n  backgroundColor: null,\n  createdAt: timestamp,\n  updatedAt: timestamp,\n};"
      },
      {
        "title": "Step 6: Save Node to Sharded Directory",
        "body": "// Shard by first 2 characters of node ID\nconst shard = nodeId.substring(0, 2);\nconst shardDir = path.join(nodesDir, shard);\n\nif (!fs.existsSync(shardDir)) {\n  fs.mkdirSync(shardDir, { recursive: true });\n}\n\nconst nodeFilePath = path.join(shardDir, `node-${nodeId}.json`);\nfs.writeFileSync(nodeFilePath, JSON.stringify(newNode, null, 2));"
      },
      {
        "title": "Step 7: Update Structure File",
        "body": "// Read current structure\nconst structure = JSON.parse(fs.readFileSync(structurePath, \"utf-8\"));\n\n// Add node to structure\nstructure.rootNodeIds.push(nodeId);\nstructure.nodes[nodeId] = {\n  parentId: null,\n  orderIndex: structure.rootNodeIds.length - 1,\n  childIds: [],\n};\n\n// Update timestamp\nstructure.updatedAt = timestamp;\n\n// Save updated structure\nfs.writeFileSync(structurePath, JSON.stringify(structure, null, 2));"
      },
      {
        "title": "Complete Script Example",
        "body": "Here's a complete Node.js script you can use:\n\n#!/usr/bin/env node\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst os = require(\"os\");\nconst { v4: uuidv4 } = require(\"uuid\");\n\nfunction addToDailyNote(userText) {\n  try {\n    // Step 1: Read documents path\n    const focusnoteConfigPath = path.join(\n      os.homedir(),\n      \".lucia\",\n      \"documents-path.txt\",\n    );\n    if (!fs.existsSync(focusnoteConfigPath)) {\n      throw new Error(\n        \"FocusNote config file not found. Make sure FocusNote is running.\",\n      );\n    }\n    const documentsPath = fs.readFileSync(focusnoteConfigPath, \"utf-8\").trim();\n\n    // Step 2: Generate today's date\n    const today = new Date();\n    const year = today.getFullYear();\n    const month = String(today.getMonth() + 1).padStart(2, \"0\");\n    const day = String(today.getDate()).padStart(2, \"0\");\n    const todayDocName = `${year}-${month}-${day}`;\n\n    // Step 3: Set up paths\n    const dailyNotePath = path.join(documentsPath, \"notes\", todayDocName);\n    const structurePath = path.join(dailyNotePath, \"_structure.json\");\n    const metadataPath = path.join(dailyNotePath, \"_metadata.json\");\n    const nodesDir = path.join(dailyNotePath, \".nodes\");\n\n    // Step 4: Create daily note if needed\n    if (!fs.existsSync(dailyNotePath)) {\n      fs.mkdirSync(dailyNotePath, { recursive: true });\n      fs.mkdirSync(nodesDir, { recursive: true });\n\n      const metadata = {\n        name: todayDocName,\n        createdAt: Date.now(),\n        updatedAt: Date.now(),\n      };\n      fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));\n\n      const structure = {\n        rootNodeIds: [],\n        deletedNodeIds: [],\n        nodes: {},\n      };\n      fs.writeFileSync(structurePath, JSON.stringify(structure, null, 2));\n    }\n\n    // Step 5: Create new bullet node\n    const nodeId = uuidv4();\n    const timestamp = Date.now();\n\n    const lexicalContent = {\n      root: {\n        children: [\n          {\n            children: [\n              {\n                children: [\n                  {\n                    detail: 0,\n                    format: 0,\n                    mode: \"normal\",\n                    style: \"\",\n                    text: userText,\n                    type: \"text\",\n                    version: 1,\n                  },\n                ],\n                direction: \"ltr\",\n                format: \"\",\n                indent: 0,\n                type: \"listitem\",\n                version: 1,\n                value: 1,\n              },\n            ],\n            direction: \"ltr\",\n            format: \"\",\n            indent: 0,\n            type: \"list\",\n            version: 1,\n            listType: \"bullet\",\n            start: 1,\n            tag: \"ul\",\n          },\n        ],\n        direction: \"ltr\",\n        format: \"\",\n        indent: 0,\n        type: \"root\",\n        version: 1,\n      },\n    };\n\n    const newNode = {\n      id: nodeId,\n      content: JSON.stringify(lexicalContent),\n      isFolded: false,\n      isTodo: false,\n      isDone: false,\n      isInProgress: false,\n      isBlurred: false,\n      backgroundColor: null,\n      createdAt: timestamp,\n      updatedAt: timestamp,\n    };\n\n    // Step 6: Save node file\n    const shard = nodeId.substring(0, 2);\n    const shardDir = path.join(nodesDir, shard);\n\n    if (!fs.existsSync(shardDir)) {\n      fs.mkdirSync(shardDir, { recursive: true });\n    }\n\n    const nodeFilePath = path.join(shardDir, `node-${nodeId}.json`);\n    fs.writeFileSync(nodeFilePath, JSON.stringify(newNode, null, 2));\n\n    // Step 7: Update structure\n    const structure = JSON.parse(fs.readFileSync(structurePath, \"utf-8\"));\n    structure.rootNodeIds.push(nodeId);\n    structure.nodes[nodeId] = {\n      parentId: null,\n      orderIndex: structure.rootNodeIds.length - 1,\n      childIds: [],\n    };\n    structure.updatedAt = timestamp;\n    fs.writeFileSync(structurePath, JSON.stringify(structure, null, 2));\n\n    console.log(`✅ Added bullet to ${todayDocName}: \"${userText}\"`);\n    return { success: true, documentName: todayDocName, nodeId };\n  } catch (error) {\n    console.error(\"❌ Error adding to daily note:\", error.message);\n    return { success: false, error: error.message };\n  }\n}\n\n// Example usage\nif (require.main === module) {\n  const userText = process.argv.slice(2).join(\" \") || \"New bullet point\";\n  addToDailyNote(userText);\n}\n\nmodule.exports = { addToDailyNote };"
      },
      {
        "title": "Usage Examples",
        "body": "User: \"Add to my daily note: Finished the OpenClaw skill implementation\"\n\nAssistant: I'll add that to your daily note.\n\n# Run the script\nnode add-to-daily-note.js \"Finished the OpenClaw skill implementation\"\n\nOutput: ✅ Added bullet to 2026-02-11: \"Finished the OpenClaw skill implementation\"\n\nUser: \"Add a reminder to call mom tomorrow\"\n\nAssistant: I'll add that to today's note.\n\nnode add-to-daily-note.js \"Reminder to call mom tomorrow\""
      },
      {
        "title": "Installation",
        "body": "Save the script as add-to-daily-note.js in your OpenClaw skills directory\nInstall dependencies: npm install uuid\nMake it executable: chmod +x add-to-daily-note.js"
      },
      {
        "title": "Notes",
        "body": "The skill creates a new bullet point each time it's called\nBullets are added to the end of the daily note\nIf the daily note doesn't exist, it will be created automatically\nThe FocusNote app must be running for the documents path file to exist\nChanges are immediately visible when you open/refresh the daily note in FocusNote"
      },
      {
        "title": "Troubleshooting",
        "body": "Error: \"FocusNote config file not found\"\n\nMake sure FocusNote is running\nCheck that ~/.lucia/documents-path.txt exists\n\nBullets not appearing in FocusNote\n\nTry closing and reopening the daily note\nCheck that the node files were created in .nodes/ directory\nVerify _structure.json was updated correctly"
      }
    ],
    "body": "FocusNote: Add to Daily Note\n\nThis skill adds user-provided text to today's daily note in FocusNote as a new bullet point.\n\nHow It Works\nReads the FocusNote documents path from ~/.lucia/documents-path.txt\nGenerates today's date in YYYY-MM-DD format\nLocates or creates today's daily note\nAdds the user's text as a new bullet point\nUpdates the document's JSON structure files\nPrerequisites\nFocusNote app must be running (it creates ~/.lucia/documents-path.txt on startup)\nNode.js installed for running the helper script\nImplementation\n\nWhen the user asks to add text to their daily note, follow these steps:\n\nStep 1: Read Documents Path\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst os = require(\"os\");\n\n// Read the documents path from FocusNote's config file\nconst focusnoteConfigPath = path.join(\n  os.homedir(),\n  \".lucia\",\n  \"documents-path.txt\",\n);\nconst documentsPath = fs.readFileSync(focusnoteConfigPath, \"utf-8\").trim();\n\nStep 2: Generate Today's Date\nconst today = new Date();\nconst year = today.getFullYear();\nconst month = String(today.getMonth() + 1).padStart(2, \"0\");\nconst day = String(today.getDate()).padStart(2, \"0\");\nconst todayDocName = `${year}-${month}-${day}`;\n\nStep 3: Locate Daily Note Folder\nconst dailyNotePath = path.join(documentsPath, \"notes\", todayDocName);\nconst structurePath = path.join(dailyNotePath, \"_structure.json\");\nconst metadataPath = path.join(dailyNotePath, \"_metadata.json\");\nconst nodesDir = path.join(dailyNotePath, \".nodes\");\n\nStep 4: Create Daily Note If It Doesn't Exist\nif (!fs.existsSync(dailyNotePath)) {\n  // Create directory structure\n  fs.mkdirSync(dailyNotePath, { recursive: true });\n  fs.mkdirSync(nodesDir, { recursive: true });\n\n  // Create metadata\n  const metadata = {\n    name: todayDocName,\n    createdAt: Date.now(),\n    updatedAt: Date.now(),\n  };\n  fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));\n\n  // Create empty structure\n  const structure = {\n    rootNodeIds: [],\n    deletedNodeIds: [],\n    nodes: {},\n  };\n  fs.writeFileSync(structurePath, JSON.stringify(structure, null, 2));\n}\n\nStep 5: Create New Bullet Node\nconst { v4: uuidv4 } = require(\"uuid\"); // npm install uuid\n\n// Generate unique node ID\nconst nodeId = uuidv4();\nconst timestamp = Date.now();\n\n// Create Lexical bullet structure\nconst lexicalContent = {\n  root: {\n    children: [\n      {\n        children: [\n          {\n            children: [\n              {\n                detail: 0,\n                format: 0,\n                mode: \"normal\",\n                style: \"\",\n                text: userText, // The text from the user\n                type: \"text\",\n                version: 1,\n              },\n            ],\n            direction: \"ltr\",\n            format: \"\",\n            indent: 0,\n            type: \"listitem\",\n            version: 1,\n            value: 1,\n          },\n        ],\n        direction: \"ltr\",\n        format: \"\",\n        indent: 0,\n        type: \"list\",\n        version: 1,\n        listType: \"bullet\",\n        start: 1,\n        tag: \"ul\",\n      },\n    ],\n    direction: \"ltr\",\n    format: \"\",\n    indent: 0,\n    type: \"root\",\n    version: 1,\n  },\n};\n\n// Create node object\nconst newNode = {\n  id: nodeId,\n  content: JSON.stringify(lexicalContent),\n  isFolded: false,\n  isTodo: false,\n  isDone: false,\n  isInProgress: false,\n  isBlurred: false,\n  backgroundColor: null,\n  createdAt: timestamp,\n  updatedAt: timestamp,\n};\n\nStep 6: Save Node to Sharded Directory\n// Shard by first 2 characters of node ID\nconst shard = nodeId.substring(0, 2);\nconst shardDir = path.join(nodesDir, shard);\n\nif (!fs.existsSync(shardDir)) {\n  fs.mkdirSync(shardDir, { recursive: true });\n}\n\nconst nodeFilePath = path.join(shardDir, `node-${nodeId}.json`);\nfs.writeFileSync(nodeFilePath, JSON.stringify(newNode, null, 2));\n\nStep 7: Update Structure File\n// Read current structure\nconst structure = JSON.parse(fs.readFileSync(structurePath, \"utf-8\"));\n\n// Add node to structure\nstructure.rootNodeIds.push(nodeId);\nstructure.nodes[nodeId] = {\n  parentId: null,\n  orderIndex: structure.rootNodeIds.length - 1,\n  childIds: [],\n};\n\n// Update timestamp\nstructure.updatedAt = timestamp;\n\n// Save updated structure\nfs.writeFileSync(structurePath, JSON.stringify(structure, null, 2));\n\nComplete Script Example\n\nHere's a complete Node.js script you can use:\n\n#!/usr/bin/env node\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst os = require(\"os\");\nconst { v4: uuidv4 } = require(\"uuid\");\n\nfunction addToDailyNote(userText) {\n  try {\n    // Step 1: Read documents path\n    const focusnoteConfigPath = path.join(\n      os.homedir(),\n      \".lucia\",\n      \"documents-path.txt\",\n    );\n    if (!fs.existsSync(focusnoteConfigPath)) {\n      throw new Error(\n        \"FocusNote config file not found. Make sure FocusNote is running.\",\n      );\n    }\n    const documentsPath = fs.readFileSync(focusnoteConfigPath, \"utf-8\").trim();\n\n    // Step 2: Generate today's date\n    const today = new Date();\n    const year = today.getFullYear();\n    const month = String(today.getMonth() + 1).padStart(2, \"0\");\n    const day = String(today.getDate()).padStart(2, \"0\");\n    const todayDocName = `${year}-${month}-${day}`;\n\n    // Step 3: Set up paths\n    const dailyNotePath = path.join(documentsPath, \"notes\", todayDocName);\n    const structurePath = path.join(dailyNotePath, \"_structure.json\");\n    const metadataPath = path.join(dailyNotePath, \"_metadata.json\");\n    const nodesDir = path.join(dailyNotePath, \".nodes\");\n\n    // Step 4: Create daily note if needed\n    if (!fs.existsSync(dailyNotePath)) {\n      fs.mkdirSync(dailyNotePath, { recursive: true });\n      fs.mkdirSync(nodesDir, { recursive: true });\n\n      const metadata = {\n        name: todayDocName,\n        createdAt: Date.now(),\n        updatedAt: Date.now(),\n      };\n      fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));\n\n      const structure = {\n        rootNodeIds: [],\n        deletedNodeIds: [],\n        nodes: {},\n      };\n      fs.writeFileSync(structurePath, JSON.stringify(structure, null, 2));\n    }\n\n    // Step 5: Create new bullet node\n    const nodeId = uuidv4();\n    const timestamp = Date.now();\n\n    const lexicalContent = {\n      root: {\n        children: [\n          {\n            children: [\n              {\n                children: [\n                  {\n                    detail: 0,\n                    format: 0,\n                    mode: \"normal\",\n                    style: \"\",\n                    text: userText,\n                    type: \"text\",\n                    version: 1,\n                  },\n                ],\n                direction: \"ltr\",\n                format: \"\",\n                indent: 0,\n                type: \"listitem\",\n                version: 1,\n                value: 1,\n              },\n            ],\n            direction: \"ltr\",\n            format: \"\",\n            indent: 0,\n            type: \"list\",\n            version: 1,\n            listType: \"bullet\",\n            start: 1,\n            tag: \"ul\",\n          },\n        ],\n        direction: \"ltr\",\n        format: \"\",\n        indent: 0,\n        type: \"root\",\n        version: 1,\n      },\n    };\n\n    const newNode = {\n      id: nodeId,\n      content: JSON.stringify(lexicalContent),\n      isFolded: false,\n      isTodo: false,\n      isDone: false,\n      isInProgress: false,\n      isBlurred: false,\n      backgroundColor: null,\n      createdAt: timestamp,\n      updatedAt: timestamp,\n    };\n\n    // Step 6: Save node file\n    const shard = nodeId.substring(0, 2);\n    const shardDir = path.join(nodesDir, shard);\n\n    if (!fs.existsSync(shardDir)) {\n      fs.mkdirSync(shardDir, { recursive: true });\n    }\n\n    const nodeFilePath = path.join(shardDir, `node-${nodeId}.json`);\n    fs.writeFileSync(nodeFilePath, JSON.stringify(newNode, null, 2));\n\n    // Step 7: Update structure\n    const structure = JSON.parse(fs.readFileSync(structurePath, \"utf-8\"));\n    structure.rootNodeIds.push(nodeId);\n    structure.nodes[nodeId] = {\n      parentId: null,\n      orderIndex: structure.rootNodeIds.length - 1,\n      childIds: [],\n    };\n    structure.updatedAt = timestamp;\n    fs.writeFileSync(structurePath, JSON.stringify(structure, null, 2));\n\n    console.log(`✅ Added bullet to ${todayDocName}: \"${userText}\"`);\n    return { success: true, documentName: todayDocName, nodeId };\n  } catch (error) {\n    console.error(\"❌ Error adding to daily note:\", error.message);\n    return { success: false, error: error.message };\n  }\n}\n\n// Example usage\nif (require.main === module) {\n  const userText = process.argv.slice(2).join(\" \") || \"New bullet point\";\n  addToDailyNote(userText);\n}\n\nmodule.exports = { addToDailyNote };\n\nUsage Examples\n\nUser: \"Add to my daily note: Finished the OpenClaw skill implementation\"\n\nAssistant: I'll add that to your daily note.\n\n# Run the script\nnode add-to-daily-note.js \"Finished the OpenClaw skill implementation\"\n\n\nOutput: ✅ Added bullet to 2026-02-11: \"Finished the OpenClaw skill implementation\"\n\nUser: \"Add a reminder to call mom tomorrow\"\n\nAssistant: I'll add that to today's note.\n\nnode add-to-daily-note.js \"Reminder to call mom tomorrow\"\n\nInstallation\nSave the script as add-to-daily-note.js in your OpenClaw skills directory\nInstall dependencies: npm install uuid\nMake it executable: chmod +x add-to-daily-note.js\nNotes\nThe skill creates a new bullet point each time it's called\nBullets are added to the end of the daily note\nIf the daily note doesn't exist, it will be created automatically\nThe FocusNote app must be running for the documents path file to exist\nChanges are immediately visible when you open/refresh the daily note in FocusNote\nTroubleshooting\n\nError: \"FocusNote config file not found\"\n\nMake sure FocusNote is running\nCheck that ~/.lucia/documents-path.txt exists\n\nBullets not appearing in FocusNote\n\nTry closing and reopening the daily note\nCheck that the node files were created in .nodes/ directory\nVerify _structure.json was updated correctly"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/trongnguyen29/focusnoteapp",
    "publisherUrl": "https://clawhub.ai/trongnguyen29/focusnoteapp",
    "owner": "trongnguyen29",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/focusnoteapp",
    "downloadUrl": "https://openagent3.xyz/downloads/focusnoteapp",
    "agentUrl": "https://openagent3.xyz/skills/focusnoteapp/agent",
    "manifestUrl": "https://openagent3.xyz/skills/focusnoteapp/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/focusnoteapp/agent.md"
  }
}