跳到正文
cccskills
免费在 GitHub 公开中文介绍

Harvest

分析一篇文章、一段视频或其他单一来源,提炼可供 LifeOS 参考的改进建议;也可将内容分类后保存到 Cortex,并附上来源信息和关联链接。

原文查看原文说明

Mines one piece of content for LifeOS and/or ingests it into Cortex. USE WHEN harvest, harvest this, /harvest, /ha, mine this for the system, anything useful in this for us, what can LifeOS take from this, should we adopt anything from this, ingest to knowledge, save to knowledge, drop into knowledge, route to knowledge, add to the knowledge archive, archive this signal, capture this to knowledge, classify and route to knowledge. NOT FOR Cortex note ops, Upgrade / lu scans, Cortex recall, X PullBookmarks sweeps.

danielmiessler/LifeOS星标 19,636(GitHub 19,636 + cccskills 0)
集成工具YouTubeGemini

实测评分 未实测

查看安装方法

适用场景

  • 从文章中寻找 LifeOS 可借鉴之处
  • 将 YouTube 视频保存到 Cortex
  • 把粘贴的文字加入知识库
  • 检查来源是否已保存

中文介绍

功能

Harvest 可以读取单一来源,例如文章、博客、新闻、YouTube 视频、X 帖子、PDF、图片、音频或粘贴的文字,并分析内容,整理 LifeOS 可以借鉴的建议。这些建议只会作为报告提供,不会自动应用到 LifeOS。若要保存到 Cortex,工具会识别来源类型、获取正文、进行分类,再生成包含来源网址、关联链接和审计记录的笔记。重复收录同一来源时会标记为重复。

适用场景

阅读文章后想寻找可借鉴的想法,或想把视频和文字保存到 Cortex 以便日后查阅时,可以使用此技能。您可以同时请求分析和保存,也可以只要求保存网址或粘贴的文字。

使用示例

  • “分析这篇文章,并总结 LifeOS 可以借鉴的内容。”
  • “把这个 YouTube 视频保存到 Cortex。”
  • “将下面这段文字加入知识库。”

注意事项

首次使用需要构建 Harvest 服务,配置服务地址和令牌,并安装相应格式的工具。收录 YouTube 视频时会使用 Gemini 观看公开网址;部分视频可能无法成功收录。

本介绍由 AI(OpenAI Codex)根据公开的 SKILL.md 撰写。准确的规格请查看下方原文。

文档检查

AI 根据 SKILL.md 的内容检查了需要注意的操作和使用前提。评分只依据实际运行的结果(实测对比)。

安全性发送数据、删除文件、执行命令等是否有说明
B部分不足通过 Workflows 写入笔记,并将来源数据发送到云端服务。
安装难易度所需工具和 API 密钥是否少且有说明
B部分不足需要服务、地址、令牌和格式工具,步骤见 Setup.md。

不计入评分。 由 AI(OpenAI Codex)于 2026年10月28日 评估。仅供参考,安装前请同时查看原文。

如果您认为评估有误,请申请复核

请写明哪一项有误以及原因。无需登录。我们会对照 SKILL.md 重新评估,并在此处更新结果。

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

包含的文件(7)

  • SKILL.md11.8 KB
  • Intents/HarvestText.md1.9 KB
  • Intents/HarvestUrl.md1.6 KB
  • Intents/HarvestYoutube.md1.9 KB
  • Intents/Mine.md7.0 KB
  • Setup.md6.7 KB
  • Tools/harvest.ts42.8 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Harvest

Contents: Ideal State · Intent Routing · Tool contract · Data & Config · Gotchas · Examples

Two halves of one motion. Mine: read one piece of content and analyze it properly — what it is, where it is strong and weak — and, as one section of that report, what LifeOS should adopt from it (adoption report-only), with any further sections (such as the DA's own commentary) set by the install's preferences. Ingest: land the source in Cortex as a proper note — one CLI detects the source type, fetches the body or transcript, sends it through the Workflows classifier for TELOS-graded routing, then writes a schema-correct note with typed cross-links and a sidecar audit trail.

Saving signal by hand skips the cross-links, guesses the wrong folder and forgets the source URL, so capture is one command that routes through the same classifier and writer every time.

Ideal State

  • Every harvested source lands in Cortex as one schema-correct note with its source URL, typed cross-links and an audit trail, written only by the canonical pipeline.
  • A mined source's output carries analysis of the source ahead of its LifeOS adoption candidates, plus the sections the install's PREFERENCES.md asks for, and those candidates are recommended, never applied.
  • Failures, duplicates and thin fetches are reported as what they are; nothing is filed as a stub or garbage body that only looks like a capture.

Intent Routing

IntentTriggerFile
Mine (general analysis + LifeOS-upgrade pass, then ingest)harvest <input>, /ha, "mine this for the system", "anything useful in this for us"Intents/Mine.md
HarvestUrl (ingest an article, blog, LessWrong, Substack, news)"ingest <URL>", "save this <URL> to knowledge"Intents/HarvestUrl.md
HarvestYoutube (ingest any youtu.be / youtube.com link)"ingest <youtube URL>", "save this video to knowledge"Intents/HarvestYoutube.md
HarvestText (ingest raw paste, no URL)"ingest the following:", "save this text to knowledge"Intents/HarvestText.md

The bare word "harvest" routes to Mine (mine → then ingest). "Ingest"/"save to knowledge" routes straight to the matching ingestion intent. If the input is ambiguous (URL is a YouTube link), Tools/harvest.ts auto-detects host and routes itself.

References

FileRead when
Setup.mdfirst-time setup: build the harvest service, set the address and token, install the format tools

Tool contract

  • One CLI does the work: bun ~/.claude/skills/Harvest/Tools/harvest.ts <input> [--type auto|article|youtube|x|text|pdf|image|audio] [--url <url>] [--dry-run] [--body-out <file>] (the type list is harvest.ts --help's; --url names the canonical source for a text signal; --body-out writes the fetched title and full body to a file before any POST, so a caller analyzes the same text the note is built from)
  • The harvest classifier worker (cloud; built per Setup.md § 3. Build the service; URL in Config.md / HARVEST_API_BASE env) — accepts a normalized signal at /ingest-and-classify, persists it idempotently in its D1 database, and returns {id, classification, confidence, reasoning, routed_actions}.
  • LIFEOS/TOOLS/HarvestExecutor.ts (local) — polls Workflows' /items, dispatches routed_actions through typed handlers (create_knowledge_idea_entry, create_knowledge_source_entry, create_learning_queue_entry), and writes the actual KNOWLEDGE note with harvest_item_id linkage.
  • The skill never writes to MEMORY/KNOWLEDGE/ directly. It always routes through Workflows then the executor.
  • Idempotency: Workflows enforces UNIQUE(source, external_id) — re-harvesting the same URL returns output.status: "duplicate". The executor sidecar at MEMORY/STATE/harvest-executor-state.json makes the local write idempotent too. On a duplicate, look up the existing item with the source and external_id the summary block printed: curl -H "Authorization: Bearer $TOKEN" "$HARVEST_API/items?source=<source>&external_id=<id>". YouTube captures use source=web (the video id is the external id); articles, X posts, files and pasted text use source=manual.
  • Output: MEMORY/KNOWLEDGE/{Ideas,People,Companies,Research}/<slug>.md with source_url:, source_harvest_id:, ≥2 typed related: entries, and 1-3 body [[wikilinks]].

The summary block harvest.ts prints to stdout contains:

  • source — manual:lesswrong-<id> or similar canonical external_id
  • workflows.id — D1 row id (used to look up the harvest item later)
  • classification — knowledge / learning / blog_seed / etc.
  • confidence — Workflows' confidence score
  • routed_actions — the action verbs Workflows decided
  • executor.paths_written — actual file paths created in MEMORY/KNOWLEDGE/
  • executor.status — executed / backfilled / deferred

Data & Config

The USER extension lives at <configRoot>/LIFEOS/USER/CUSTOMIZATIONS/SKILLS/Harvest/ (configRoot is $CLAUDE_CONFIG_DIR when set, else ~/.claude; harvest.ts resolves its sibling tools from the same root):

  • Config.md — harvest_api_base:, the harvest worker URL. The HARVEST_API_BASE env var wins when set; with neither, harvest.ts stops and names the file and key.
  • PREFERENCES.md (optional) — report preferences the Mine intent applies on top of its default shape, including any section it adds.
  • History.md (optional) — the install's provenance behind generic credits in the intents, read on demand.

The bearer token is the auth_token: field of ~/.config/workflows/config.yaml, the same source HarvestExecutor uses (see Gotchas).

First-time setup (the harvest service, its address and token, and the format tools) is in Setup.md.

Gotchas

  • Name it Cortex. User-facing destination names, report labels, and completion messages use Cortex (for example, "Saved to Cortex"). MEMORY/KNOWLEDGE/ is a storage path, not the product name; "Knowledge Archive" and "knowledge system" are not names for Cortex. Preserve literal paths, API identifiers, source quotations, and accepted trigger phrases.
  • Don't skip the body fetch. Workflows' classifier needs real text, not just the URL. The tool fetches the page body locally before POSTing — if you bypass the tool and POST a URL with empty body, classification quality collapses.
  • YouTube comes from a Gemini watch pass on the public URL, never the captions or the page. harvest.ts sends the URL to LIFEOS/TOOLS/GeminiWatch.ts and the note body names the model that watched it. The title comes from YouTube's published oEmbed endpoint, and falls back to YouTube <id> when that answers nothing. Gemini refuses some livestream URLs ("caller does not have permission"); the capture then fails with that reason. Don't try to parse the YouTube page HTML directly — it's mostly nav and JS. An install may add its own transcript lane beside the tool; when one is present it runs first, the watch pass is its fallback, and the note body says which source was used.
  • Never re-implement the writer. The single canonical writer is HarvestExecutor.ts. If a write requirement isn't supported (new action verb, new entity type), extend the executor's handler set — don't fork the write logic into this skill.
  • Auth lives in YAML, not the env. The token is in ~/.config/workflows/config.yaml under auth_token: — not in ~/.claude/.env. Read the YAML; don't process.env.WORKFLOWS_TOKEN.
  • Content-type beats the URL path — arxiv.org/pdf/<id> has no .pdf on it. Routed by path alone, that link goes to the article path, which fetches the PDF bytes, HTML-strips them, and produces mojibake that passes the length check and would be filed as a real capture. The fetch now sniffs Content-Type and the %PDF- magic bytes and re-routes, with assertReadableText() as the backstop that fails any body over 2% control/replacement characters. Never loosen that guard to make a stubborn source "work" — a capture that stores garbage is worse than one that fails.
  • A real file with no handler must fail loudly, never fall through to text. Falling through files the path string itself as the note body — a stub wearing the shape of a successful capture. detectType throws on an unrecognized extension for exactly this reason (Synapse ISC-22). A relative path resolves against the working directory; before 2026-10-13 only absolute paths counted as files, so harvest.ts notes.md filed the string "notes.md" as raw text.
  • Type floors differ on purpose. An article needs 200 bytes, a YouTube transcript 500, a voice memo 80, an image 40. A one-sentence voice memo is a legitimate capture; applying the video threshold to it silently rejects real captures.
  • Vision description is skipped inside a nested Claude Code session. CLAUDECODE blocks the subprocess (OPERATIONAL_PREFERENCES), so describeImage returns null and OCR alone carries the capture rather than the whole harvest failing. Run image harvests from a plain shell when the description matters.
  • Source detection is host-based. youtu.be and youtube.com → YouTube; everything else with http(s):// → article. Raw text (no scheme) → text. An X/Twitter status URL → x: read through skills/X/Tools/read.ts, and a post carrying a video has the video downloaded and watched (GeminiWatch.ts watchFile); a failed watch fails the capture (Synapse ISC-32). Bluesky still goes as an article.
  • The note is written from the captured body. /items does not return the body, so harvest.ts hands it to the executor with --body-file. Before 2026-10-08 every note was written from the title and the classifier's one-line reasoning alone (Synapse ISC-33). Running HarvestExecutor.ts --item by hand without --body-file still gets the thin metadata-only note.
  • A JavaScript app shell fails the body floor; it is never filed as its loading text. A page that strips to under 200 bytes ends in "Body too short". When the page is one you can open, read it in a real browser through the Interceptor skill and harvest the text with --type text --url <page>. harvest.ts fetches only the page it was given and never calls endpoints the page did not ask for.
  • --dry-run doesn't touch Workflows. It runs source detection + body fetch and prints what would be POSTed. Useful when validating a new source type without burning a D1 row.

Examples

User: "harvest https://youtu.be/<video-id>"
→ Mine intent
→ A harvest report (analysis, any preference-added sections, LifeOS upgrades table, verdict) ending in a **Cortex:** line with the note path

User: "save this https://example.com/some-article to knowledge"
→ HarvestUrl intent
→ One readable block from the printed summary, including the Cortex note path, or the duplicate's existing path

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

AnnualReports

免费有简介

按类别或厂商查找并获取网络安全报告,比较威胁、勒索软件、数据泄露、云安全和AI趋势。分析会注明每项数据的厂商、年份及报告,并分别呈现来源间的分歧。

  • 按类别查找威胁报告
  • 获取指定厂商的报告
  • 比较多家厂商的勒索软件趋势
danielmiessler/LifeOS2万2026年10月28日 更新

ApertureOscillation

免费有简介

通过三轮分析,对比单个功能或组件的设计需求与整个系统的目标,梳理两者的冲突、合适的实现范围,以及方案是否符合整体方向。

  • 判断服务或库是否应拆分
  • 比较功能需求与产品方向
  • 检查新组件是否符合现有系统
danielmiessler/LifeOS2万2026年10月28日 更新

Aphorisms

免费有简介

按文章主题寻找格言或引文,按相关程度排序,并附上作者和推荐理由。可添加带出处的引文、按主题研究思想家的言论、整理使用记录,帮助避免重复引用。

  • 为新闻简报寻找引文
  • 保存有出处且不重复的引文
  • 按主题研究思想家的言论
danielmiessler/LifeOS2万2026年10月28日 更新

Art

免费有简介

按用途选择制作流程,生成博客插图、技术图解、比较图、漫画和图标等视觉内容,并输出供预览的图像。

  • 制作博客标题图
  • 解释系统结构
  • 展示比较或时间线
danielmiessler/LifeOS2万2026年10月28日 更新

ArtDirection

免费有简介

依据简报和制作标准评估图片、影片、幻灯片及网站页面截图,由视觉评审给出评分和缺陷优先级,支持有限轮次的修改;通过评审后才能交付,并可记录人工评分供后续校准。

  • 按优先级整理图片修改项
  • 依标准评估影片或幻灯片
  • 发布前检查视觉效果
danielmiessler/LifeOS2万2026年10月28日 更新

ArXiv

免费有简介

按主题、研究领域或论文编号查找 arXiv 论文,并整理标题、作者、摘要和链接;查看新投稿,也可在有内容时获取 AlphaXiv 的人工智能生成概述。

  • 查看人工智能和机器学习新论文
  • 查找特定主题的论文
  • 按论文编号或 arXiv 网址查询
danielmiessler/LifeOS2万2026年10月28日 更新

查看 danielmiessler 的全部技能

报告此技能的问题