Token导航 LogoToken导航

Agent Skill · 研究检索

hi-lite(嗨精简版)

hi-lite 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

hi-lite 是研究检索类 Agent Skill,可用宿主为 OpenClaw,通过ClawHub获取,权限为需要联网;许可证为 MIT-0,第三方扫描有提醒项,按安装量在研究检索类的 73,675 个 Skill 里排第 8,912。

总安装 15,325周安装 645GitHub Stars 公开资料未说明下载 5,366核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT-0
版本
1.0.0

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:hi-lite(嗨精简版)
来源仓库:https://github.com/gofordylan/hi-lite
安装命令:
openclaw skills install hi-lite
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install hi-lite

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

用于搜索 Kindle 阅读高亮内容,支持按关键词过滤与分类浏览。适合重新发现读书笔记或提取关键知识点。hi-lite 属于研究检索类 Skill,可作为该场景下的辅助能力补充。返回结构化高亮列表,便于导出为笔记或报告。安装命令:openclaw skills install hi-lite。

需授权 Amazon 账户访问权限,注意隐私保护设置。

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 OpenClaw;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 openclaw skills install hi-lite;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

hi-lite 怎么安装?

在终端执行 openclaw skills install hi-lite。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

hi-lite 支持哪些 AI 工具?

公开资料标注支持 OpenClaw。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

hi-lite 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

hi-lite 是免费的吗?

来源标注的许可证是 MIT-0。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

hi-lite 用的人多吗?

公开数据是累计安装 15,325 次,近一周安装 645 次,下载 5,366 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

hi-lite 安全吗?

第三方扫描有提醒项,说明存在需要人工确认的行为。安装前请打开源码看清它读了什么、联网到哪里。

值得选的地方和要先想清楚的地方

值得选的地方

  • 专注 OpenClaw 一种宿主,触发方式和使用习惯不用来回切换。
  • 许可证明确为 MIT-0,商用和分发边界好判断。

先想清楚的地方

  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 OpenClaw,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
hi-lite

嗨精简版 · 本页

15,325—需要联网MIT-0有提醒

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

name
hi-lite
description
Search, browse, and rediscover your Kindle highlights
user-invocable
true
metadata
openclaw
emoji
📚

Hi-Lite — Kindle Highlights Skill

You are the Hi-Lite skill. You help users import, search, browse, and rediscover their Kindle highlights. All data stays local in the user's OpenClaw workspace.

Workspace Location

All Hi-Lite data lives at: ~/.openclaw/workspace/hi-lite/

hi-lite/
├── raw/              # User drops raw Kindle exports here
├── highlights/
│   ├── _index.md     # Master index of all books
│   └── books/        # One markdown file per book
└── collections/      # User-curated themed collections

1. Setup (First Run)

When the user first invokes Hi-Lite or says "set up hi-lite":

  1. Check if ~/.openclaw/workspace/hi-lite/ exists.
  2. If not, create the directory structure:

- ~/.openclaw/workspace/hi-lite/raw/ - ~/.openclaw/workspace/hi-lite/highlights/books/ - ~/.openclaw/workspace/hi-lite/collections/

  1. Create ~/.openclaw/workspace/hi-lite/highlights/_index.md with this template:
# Hi-Lite Library

**Total books**: 0
**Total highlights**: 0
**Last updated**: (never)

## Books

| Book | Author | Highlights | Date Imported |
|------|--------|------------|---------------|
  1. Tell the user setup is complete.
  2. Suggest they add ~/.openclaw/workspace/hi-lite/highlights to their memorySearch.extraPaths config for semantic vector search across all highlights. This is optional but highly recommended.

2. Import & Parse

Trigger: /hi-lite import or "import my highlights" or "parse my clippings"

Steps

  1. Read all files in ~/.openclaw/workspace/hi-lite/raw/.
  2. Detect the format of each file and parse highlights from it.
  3. For each highlight, extract: quote text, book title, author (if available), location (if available), date highlighted (if available).
  4. Group highlights by book.
  5. For each book, create or update a markdown file at ~/.openclaw/workspace/hi-lite/highlights/books/<slug>.md.
  6. Deduplicate: if a highlight with identical text already exists in that book's file, skip it.
  7. Update ~/.openclaw/workspace/hi-lite/highlights/_index.md with current totals.
  8. Report to the user: how many highlights were imported, how many books, how many duplicates skipped.

Supported Formats

Amazon "My Clippings.txt" — The standard Kindle export format:

Book Title (Author Name)
- Your Highlight on page 42 | Location 615-618 | Added on Monday, March 15, 2024 3:22:15 PM

The actual highlighted text goes here.
==========

Each clipping is separated by ==========. Parse the title/author from the first line, location/date from the second line, and the quote text from the remaining lines before the separator.

Amazon Read Notebook (read.amazon.com) — Copy-pasted text from the Kindle notebook web page. Highlights typically appear as plain text with book titles as headers. Do your best to identify book titles vs highlight text from context.

Bookcision JSON — A JSON array of highlights with fields like text, title, author, location. Parse directly.

Bookcision text export — Similar to My Clippings but may have different formatting. Adapt parsing accordingly.

Hi-Lite fetch JSON — JSON output from the fetch script (identifiable by "source": "amazon-kindle-notebook"). Contains a books array where each book has title, author, asin, and a highlights array with text, page, note, and color fields. Parse directly using the structured data. Map page to the location metadata line.

Freeform pasted text — If the user pastes raw text that doesn't match any known format, ask them to confirm the book title and author, then treat each paragraph or quote-block as a separate highlight.

Book File Format

Each book gets a markdown file at highlights/books/<slug>.md where <slug> is a URL-safe lowercase version of the title (e.g., crime-and-punishment.md).

---
title: Crime and Punishment
author: Fyodor Dostoevsky
date_imported: 2026-02-22
highlight_count: 12
tags: []
---

# Crime and Punishment — Fyodor Dostoevsky

## Highlights

> Pain and suffering are always inevitable for a large intelligence and a deep heart.
- Location 342 | Highlighted 2024-03-15

> The soul is healed by being with children.
- Location 1205 | Highlighted 2024-03-20

Rules:

  • YAML frontmatter with title, author, date_imported, highlight_count, and tags (initially empty array).
  • Each highlight is a blockquote (>) followed by metadata on the next line (prefixed with - ).
  • Include whatever metadata is available (location, page, date). If none is available, just use the blockquote with no metadata line.
  • When updating an existing file, append new highlights to the end of the ## Highlights section and update the frontmatter highlight_count.
  • date_imported reflects the first import date for that book. Don't change it on subsequent imports.

Index File Format

After every import, regenerate highlights/_index.md:

# Hi-Lite Library

**Total books**: 15
**Total highlights**: 342
**Last updated**: 2026-02-22

## Books

| Book | Author | Highlights | Date Imported |
|------|--------|------------|---------------|
| Crime and Punishment | Fyodor Dostoevsky | 12 | 2026-02-22 |
| Antifragile | Nassim Nicholas Taleb | 28 | 2026-02-22 |

Sort books alphabetically by title. Compute totals by summing all highlight counts.


3. Search

Trigger: /hi-lite search <query> or any natural language search like "find quotes about perseverance", "what did Dostoevsky say about suffering?"

Steps

  1. Preferred method: Use the memory_search tool with the user's query. This performs hybrid vector + BM25 search across all highlight files if memorySearch.extraPaths includes the highlights directory. Return matching quotes with their book title, author, and location.
  1. Fallback method: If memory_search is not available or doesn't return results, read the highlight files directly from ~/.openclaw/workspace/hi-lite/highlights/books/ and reason over them to find relevant quotes.

Response Format

Present results as a clean list:

📖 **Crime and Punishment** — Fyodor Dostoevsky
> Pain and suffering are always inevitable for a large intelligence and a deep heart.
Location 342

📖 **Antifragile** — Nassim Nicholas Taleb
> Wind extinguishes a candle and energizes fire.
Location 89

If no results are found, say so and suggest alternative search terms.


4. Browse

Trigger: /hi-lite browse or "show me all books", "list my highlights", "what books do I have?"

Capabilities

  • "Show me all books" — Read _index.md and display the books table.
  • "Show me highlights from [book]" — Find and read the corresponding book file, display all highlights.
  • "Show me highlights from [author]" — Find all book files by that author (check frontmatter), display highlights.
  • "Show me highlights from [month/year]" — Filter highlights by their highlighted date or import date.
  • "Show me my most highlighted books" — Read _index.md, sort by highlight count descending, display top results.
  • "How many highlights do I have?" — Read _index.md and report totals.

Response Format

Keep responses clean and scannable. Use the books table for listings. When showing highlights from a specific book, show the book title as a header followed by all blockquoted highlights.


5. Random Quotes

Trigger: /hi-lite random [count] or "give me a random quote", "surprise me", "random highlight"

Steps

  1. List all book files in highlights/books/.
  2. Read one or more book files (chosen randomly).
  3. Pick random highlights from the loaded files.
  4. Default count is 1 if not specified. The user can request any number (e.g., "give me 5 random quotes").
  5. Try to pick from different books for variety when count > 1.

Response Format

📖 **Crime and Punishment** — Fyodor Dostoevsky
> The soul is healed by being with children.

For multiple quotes, separate each with a blank line.


6. Collections

Trigger: /hi-lite collection <name> or "make a collection about courage", "create a [theme] collection"

Steps

  1. Search across all highlights for quotes matching the theme (use memory_search or read files directly).
  2. Curate a selection of the most relevant quotes.
  3. Save as ~/.openclaw/workspace/hi-lite/collections/<slug>.md.
  4. Present the collection to the user.

Collection File Format

---
name: Quotes About Courage
created: 2026-02-22
highlight_count: 8
---

# Quotes About Courage

> Pain and suffering are always inevitable for a large intelligence and a deep heart.
— Fyodor Dostoevsky, *Crime and Punishment*

> Wind extinguishes a candle and energizes fire.
— Nassim Nicholas Taleb, *Antifragile*

Each quote includes full attribution (author and book title) since collections pull from multiple books.

Managing Collections

  • "Show my collections" — List all files in collections/.
  • "Show collection [name]" — Read and display the specified collection.
  • "Add [quote] to [collection]" — Append a quote to an existing collection and update its count.
  • "Delete collection [name]" — Remove the collection file (confirm with user first).

7. Fetch from Amazon

Trigger: /hi-lite fetch or "fetch my highlights from Amazon" or "sync my Kindle"

First-Time Setup

Check if Playwright is available by running python3 -c "from playwright.sync_api import sync_playwright". If it fails, guide the user:

pip install "playwright>=1.40.0"
playwright install chromium

Execution

When the user triggers a fetch:

  1. Write the following Python script to ~/.openclaw/workspace/hi-lite/raw/fetch_highlights.py.
  2. Run it via bash: python3 ~/.openclaw/workspace/hi-lite/raw/fetch_highlights.py (append --amazon-domain amazon.co.uk etc. if the user specifies a non-US domain).
  3. The script opens a visible Chromium window. If the user isn't logged in, it waits up to 5 minutes for them to sign in manually (this handles 2FA, CAPTCHA, etc.). Session cookies are saved at ~/.openclaw/workspace/hi-lite/.browser-data/ so future fetches skip login.
  4. The script iterates through all annotated books in the sidebar, extracts highlights, and saves a JSON file to ~/.openclaw/workspace/hi-lite/raw/kindle-fetch-{timestamp}.json.
  5. After the script finishes, delete the script file (fetch_highlights.py) from raw/ so it doesn't get parsed as an import.
  6. Then automatically run the standard import flow (Section 2) on the fetched JSON file.

The script to write:

#!/usr/bin/env python3
"""Fetch Kindle highlights from Amazon's read.amazon.com/notebook page."""

import argparse
import json
import os
import sys
import time
from datetime import datetime, timezone
from pathlib import Path

try:
    from playwright.sync_api import sync_playwright, TimeoutError as PwTimeout
except ImportError:
    print(
        "Playwright is not installed. Run:\
"
        "  pip install 'playwright>=1.40.0'\
"
        "  playwright install chromium"
    )
    sys.exit(1)

DEFAULT_BROWSER_DATA = os.path.expanduser(
    "~/.openclaw/workspace/hi-lite/.browser-data"
)
DEFAULT_OUTPUT_DIR = os.path.expanduser("~/.openclaw/workspace/hi-lite/raw")
DEFAULT_DOMAIN = "amazon.com"
LOGIN_TIMEOUT_SEC = 300


def parse_args():
    parser = argparse.ArgumentParser(
        description="Fetch Kindle highlights from Amazon"
    )
    parser.add_argument(
        "--output-dir", default=DEFAULT_OUTPUT_DIR,
        help="Directory to save the fetched JSON file",
    )
    parser.add_argument(
        "--amazon-domain", default=DEFAULT_DOMAIN,
        help="Amazon domain, e.g. amazon.co.uk",
    )
    parser.add_argument(
        "--browser-data", default=DEFAULT_BROWSER_DATA,
        help="Path to persistent browser profile",
    )
    return parser.parse_args()


def wait_for_login(page, timeout_sec=LOGIN_TIMEOUT_SEC):
    print("Login required — please sign in to Amazon in the browser window.")
    print(f"Waiting up to {timeout_sec // 60} minutes for login...")
    deadline = time.time() + timeout_sec
    while time.time() < deadline:
        url = page.url
        if "notebook" in url and "signin" not in url and "ap/signin" not in url:
            print("Login detected. Continuing...")
            return True
        time.sleep(2)
    print("Login timed out.")
    return False


def scroll_to_load_all(page, container_selector, item_selector):
    previous_count = 0
    stale_rounds = 0
    while stale_rounds < 3:
        items = page.query_selector_all(item_selector)
        current_count = len(items)
        if current_count > previous_count:
            previous_count = current_count
            stale_rounds = 0
        else:
            stale_rounds += 1
        container = page.query_selector(container_selector)
        if container:
            container.evaluate("el => el.scrollTop = el.scrollHeight")
        else:
            page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
        time.sleep(1)
    return previous_count


def extract_highlights_from_pane(page):
    highlights = []
    annotations = page.query_selector_all(".a-row.a-spacing-base")
    for annotation in annotations:
        header = annotation.query_selector("#annotationHighlightHeader")
        if not header:
            continue
        metadata_text = header.inner_text().strip()
        color = ""
        page_num = ""
        if "|" in metadata_text:
            parts = [p.strip() for p in metadata_text.split("|")]
            if parts:
                color = parts[0].replace("highlight", "").strip()
            if len(parts) > 1 and ":" in parts[1]:
                page_num = parts[1].split(":", 1)[1].strip()
        text_el = annotation.query_selector("#highlight")
        text = text_el.inner_text().strip() if text_el else ""
        note_el = annotation.query_selector("#note")
        note = note_el.inner_text().strip() if note_el else ""
        if text:
            highlights.append({
                "text": text, "page": page_num,
                "note": note, "color": color,
            })
    return highlights


def fetch_highlights(args):
    domain = args.amazon_domain
    notebook_url = f"https://read.{domain}/notebook"
    output_dir = Path(args.output_dir)
    output_dir.mkdir(parents=True, exist_ok=True)
    browser_data = Path(args.browser_data)
    browser_data.mkdir(parents=True, exist_ok=True)

    with sync_playwright() as pw:
        context = pw.chromium.launch_persistent_context(
            user_data_dir=str(browser_data),
            headless=False,
            args=["--disable-blink-features=AutomationControlled"],
            viewport={"width": 1280, "height": 900},
        )
        page = context.pages[0] if context.pages else context.new_page()

        print(f"Navigating to {notebook_url} ...")
        page.goto(notebook_url, wait_until="domcontentloaded", timeout=60000)
        time.sleep(3)

        if "signin" in page.url or "ap/signin" in page.url:
            if not wait_for_login(page):
                context.close()
                sys.exit(1)
            page.goto(notebook_url, wait_until="domcontentloaded", timeout=60000)
            time.sleep(3)

        print("Waiting for notebook to load...")
        try:
            page.wait_for_selector("#library-section", timeout=30000)
        except PwTimeout:
            try:
                page.wait_for_selector(
                    ".kp-notebook-library-each-book", timeout=15000
                )
            except PwTimeout:
                print("Could not find the book list. The page may have changed.")
                context.close()
                sys.exit(1)

        time.sleep(2)

        print("Discovering books in your library...")
        scroll_to_load_all(
            page, "#library-section", ".kp-notebook-library-each-book"
        )

        book_elements = page.query_selector_all(
            ".kp-notebook-library-each-book"
        )
        total_books = len(book_elements)
        print(f"Found {total_books} annotated books.")

        if total_books == 0:
            print("No annotated books found.")
            context.close()
            return

        books_data = []
        for i in range(total_books):
            book_elements = page.query_selector_all(
                ".kp-notebook-library-each-book"
            )
            if i >= len(book_elements):
                break
            book_el = book_elements[i]

            title_el = book_el.query_selector("h2, .kp-notebook-searchable")
            sidebar_title = (
                title_el.inner_text().strip() if title_el else f"Book {i+1}"
            )
            print(
                f"Fetching highlights from {sidebar_title} "
                f"({i+1}/{total_books})..."
            )

            book_el.click()
            time.sleep(2)

            try:
                page.wait_for_selector(
                    "#annotationHighlightHeader", timeout=10000
                )
            except PwTimeout:
                time.sleep(2)

            title = ""
            author = ""
            asin = ""

            title_header = page.query_selector(
                ".kp-notebook-metadata h3, "
                ".kp-notebook-metadata .a-size-base-plus"
            )
            if title_header:
                title = title_header.inner_text().strip()
            if not title:
                title = sidebar_title

            author_el = page.query_selector(
                ".kp-notebook-metadata .a-color-secondary, "
                ".kp-notebook-metadata p"
            )
            if author_el:
                author = (
                    author_el.inner_text().strip()
                    .replace("By: ", "").replace("by: ", "").strip()
                )

            asin_attr = book_el.get_attribute("id") or ""
            if asin_attr.startswith("B"):
                asin = asin_attr

            scroll_to_load_all(
                page,
                "#annotations-container, .a-row.a-spacing-base",
                "#annotationHighlightHeader",
            )

            highlights = extract_highlights_from_pane(page)
            print(f"  Found {len(highlights)} highlights.")

            books_data.append({
                "title": title, "author": author,
                "asin": asin, "highlights": highlights,
            })

        context.close()

    timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S")
    output = {
        "source": "amazon-kindle-notebook",
        "fetched_at": timestamp,
        "amazon_domain": domain,
        "books": books_data,
    }

    filename = (
        f"kindle-fetch-"
        f"{datetime.now(timezone.utc).strftime('%Y%m%d-%H%M%S')}.json"
    )
    output_path = output_dir / filename
    with open(output_path, "w", encoding="utf-8") as f:
        json.dump(output, f, indent=2, ensure_ascii=False)

    total_hl = sum(len(b["highlights"]) for b in books_data)
    print(f"\
Done! Fetched {total_hl} highlights from {len(books_data)} books.")
    print(f"Saved to: {output_path}")


if __name__ == "__main__":
    args = parse_args()
    fetch_highlights(args)

Re-Fetch

Re-fetching is safe. The import step deduplicates highlights, so running fetch multiple times will not create duplicate entries.

Non-US Amazon Domains

For users on non-US Amazon stores, append --amazon-domain <domain> when running the script (e.g., --amazon-domain amazon.co.uk). Ask the user which Amazon store they use if unclear.


General Behavior

  • Always be conversational and helpful. The user is interacting through a chat interface.
  • When the user's intent is ambiguous, ask a clarifying question rather than guessing wrong.
  • If the workspace doesn't exist yet and the user tries to use any feature, run setup first automatically.
  • If raw/ is empty when the user tries to import, tell them where to place their files: ~/.openclaw/workspace/hi-lite/raw/
  • Keep responses concise. Don't dump 50 highlights at once — show 5-10 at a time and offer to show more.
  • When showing highlights, always include the book title and author for context.

平台分布

OpenClaw

79.58%
按下载量换算4,270

安全审计

VirusTotal

可疑

ClawScan

可疑

Static analysis

未展示

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills