{
  "schemaVersion": "1.0",
  "item": {
    "slug": "zettel-link",
    "name": "Zettel Link",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/hxy9243/zettel-link",
    "canonicalUrl": "https://clawhub.ai/hxy9243/zettel-link",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/zettel-link",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=zettel-link",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "TODO.md",
      "_meta.json",
      "config/config.json",
      "scripts/config.py"
    ],
    "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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/zettel-link"
    },
    "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/zettel-link",
    "agentPageUrl": "https://openagent3.xyz/skills/zettel-link/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zettel-link/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zettel-link/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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Zettel Link Skill",
        "body": "This skill provides a suite of idempotent Python scripts to embed, search, and link notes in an Obsidian vault using semantic similarity. All scripts live in scripts/ and support multiple embedding providers.\n\nThe skill should be triggered when the user wants to search notes, retrieve notes, or discover connections between notes.\n\nIf the search directory is indexed with embeddings, the skill should prompt the user if they want to create new embeddings."
      },
      {
        "title": "Dependencies",
        "body": "uv 0.10.0+\nPython 3.10+\nOne of the following embedding providers:\n\nOllama with mxbai-embed-large (local, default)\nOpenAI API with text-embedding-3-small\nGoogle Gemini API with text-embedding-004"
      },
      {
        "title": "Overview of Commands",
        "body": "uv run scripts/config.py: Configure the embedding model and other settings.\nuv run scripts/embed.py: Embed notes and cache to .embeddings/embeddings.json\nuv run scripts/search.py: Semantic search over embedded notes\nuv run scripts/link.py: Discover semantic connections, output to .embeddings/links.json"
      },
      {
        "title": "Step 0 — Setup and Config",
        "body": "If the config/config.json file does not exist, create it:\n\nuv run scripts/config.py\n\nThis creates config/config.json with defaults:\n\n{\n    \"model\": \"mxbai-embed-large\",\n    \"provider\": {\n        \"name\": \"ollama\",\n        \"url\": \"http://localhost:11434\"\n    },\n    \"max_input_length\": 8192,\n    \"cache_dir\": \".embeddings\",\n    \"default_threshold\": 0.65,\n    \"top_k\": 5,\n    \"skip_dirs\": [\".obsidian\", \".trash\", \".embeddings\", \"Spaces\", \"templates\"],\n    \"skip_files\": [\"CLAUDE.md\", \"Vault.md\", \"Dashboard.md\", \"templates.md\"]\n}\n\nTo use a remote provider:\n\n# OpenAI\nuv run scripts/config.py --provider openai\n\n# Gemini\nuv run scripts/config.py --provider gemini\n\n# Custom model\nuv run scripts/config.py --provider openai --model text-embedding-3-large\n\nTo adjust tuning parameters:\n\nuv run scripts/config.py --top-k 10 --threshold 0.7 --max-input-length 4096"
      },
      {
        "title": "Step 1 — Create Embeddings",
        "body": "uv run scripts/embed.py --input <directory>\n\nThis creates <directory>/.embeddings/embeddings.json with the embedding cache.\n\nIncremental updates: Only re-embeds files that have been modified since the last run (based on file modification time).\nText truncation: Automatically truncates text to max_input_length before embedding.\nStale pruning: Removes entries for files that no longer exist.\nForce re-embed: Use --force to re-embed everything."
      },
      {
        "title": "Step 2 — Semantic Search",
        "body": "uv run scripts/search.py --input <directory> --query \"<query>\"\n\nThis embeds the query using the configured provider and compares it with all cached embeddings, returning the top_k most similar notes.\n\nResults are saved to <directory>/.embeddings/search_results.json."
      },
      {
        "title": "Step 3 — Semantic Connection Discovery",
        "body": "uv run scripts/link.py --input <directory>\n\nThis computes cosine similarity for all note pairs and outputs connections above the default_threshold to <directory>/.embeddings/links.json.\n\nThe output includes:\n\nA flat list of all link pairs with scores\nA per-note grouping for easy lookup\n\nTuning: Adjust --threshold to widen or narrow the connection discovery."
      },
      {
        "title": "Cache",
        "body": "Format: JSON with metadata envelope (metadata + data)\nLocation: <directory>/.embeddings/embeddings.json\nMetadata: Tracks generation timestamp, model, provider, embedding size\nInvalidation: Based on file modification time (mtime)\nForce rebuild: Delete the cache file or use --force flag"
      },
      {
        "title": "Agent Instructions",
        "body": "When using this skill:\n\nAlways run config.py first if config/config.json does not exist.\nRun embed.py before search.py or link.py — the cache must exist.\nFor remote providers (openai, gemini), ensure the API key environment variable is set (or provide a local .env file in the skill directory).\nAll scripts are idempotent and safe to re-run."
      }
    ],
    "body": "Zettel Link Skill\n\nThis skill provides a suite of idempotent Python scripts to embed, search, and link notes in an Obsidian vault using semantic similarity. All scripts live in scripts/ and support multiple embedding providers.\n\nThe skill should be triggered when the user wants to search notes, retrieve notes, or discover connections between notes.\n\nIf the search directory is indexed with embeddings, the skill should prompt the user if they want to create new embeddings.\n\nDependencies\nuv 0.10.0+\nPython 3.10+\nOne of the following embedding providers:\nOllama with mxbai-embed-large (local, default)\nOpenAI API with text-embedding-3-small\nGoogle Gemini API with text-embedding-004\nOverview of Commands\nuv run scripts/config.py: Configure the embedding model and other settings.\nuv run scripts/embed.py: Embed notes and cache to .embeddings/embeddings.json\nuv run scripts/search.py: Semantic search over embedded notes\nuv run scripts/link.py: Discover semantic connections, output to .embeddings/links.json\nWorkflow\nStep 0 — Setup and Config\n\nIf the config/config.json file does not exist, create it:\n\nuv run scripts/config.py\n\n\nThis creates config/config.json with defaults:\n\n{\n    \"model\": \"mxbai-embed-large\",\n    \"provider\": {\n        \"name\": \"ollama\",\n        \"url\": \"http://localhost:11434\"\n    },\n    \"max_input_length\": 8192,\n    \"cache_dir\": \".embeddings\",\n    \"default_threshold\": 0.65,\n    \"top_k\": 5,\n    \"skip_dirs\": [\".obsidian\", \".trash\", \".embeddings\", \"Spaces\", \"templates\"],\n    \"skip_files\": [\"CLAUDE.md\", \"Vault.md\", \"Dashboard.md\", \"templates.md\"]\n}\n\n\nTo use a remote provider:\n\n# OpenAI\nuv run scripts/config.py --provider openai\n\n# Gemini\nuv run scripts/config.py --provider gemini\n\n# Custom model\nuv run scripts/config.py --provider openai --model text-embedding-3-large\n\n\nTo adjust tuning parameters:\n\nuv run scripts/config.py --top-k 10 --threshold 0.7 --max-input-length 4096\n\nStep 1 — Create Embeddings\nuv run scripts/embed.py --input <directory>\n\n\nThis creates <directory>/.embeddings/embeddings.json with the embedding cache.\n\nIncremental updates: Only re-embeds files that have been modified since the last run (based on file modification time).\nText truncation: Automatically truncates text to max_input_length before embedding.\nStale pruning: Removes entries for files that no longer exist.\nForce re-embed: Use --force to re-embed everything.\nStep 2 — Semantic Search\nuv run scripts/search.py --input <directory> --query \"<query>\"\n\n\nThis embeds the query using the configured provider and compares it with all cached embeddings, returning the top_k most similar notes.\n\nResults are saved to <directory>/.embeddings/search_results.json.\n\nStep 3 — Semantic Connection Discovery\nuv run scripts/link.py --input <directory>\n\n\nThis computes cosine similarity for all note pairs and outputs connections above the default_threshold to <directory>/.embeddings/links.json.\n\nThe output includes:\n\nA flat list of all link pairs with scores\nA per-note grouping for easy lookup\n\nTuning: Adjust --threshold to widen or narrow the connection discovery.\n\nCache\nFormat: JSON with metadata envelope (metadata + data)\nLocation: <directory>/.embeddings/embeddings.json\nMetadata: Tracks generation timestamp, model, provider, embedding size\nInvalidation: Based on file modification time (mtime)\nForce rebuild: Delete the cache file or use --force flag\nAgent Instructions\n\nWhen using this skill:\n\nAlways run config.py first if config/config.json does not exist.\nRun embed.py before search.py or link.py — the cache must exist.\nFor remote providers (openai, gemini), ensure the API key environment variable is set (or provide a local .env file in the skill directory).\nAll scripts are idempotent and safe to re-run."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/hxy9243/zettel-link",
    "publisherUrl": "https://clawhub.ai/hxy9243/zettel-link",
    "owner": "hxy9243",
    "version": "1.1.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/zettel-link",
    "downloadUrl": "https://openagent3.xyz/downloads/zettel-link",
    "agentUrl": "https://openagent3.xyz/skills/zettel-link/agent",
    "manifestUrl": "https://openagent3.xyz/skills/zettel-link/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/zettel-link/agent.md"
  }
}