本文へ移動
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,635(GitHub 19,635 + cccskills 0)
連携ツールYouTubeGemini

実行スコア 未検証

インストール方法を見る

こんなときに便利

  • 記事からLifeOSへの改善案を探したいとき
  • YouTube動画をCortexに保存したいとき
  • 貼り付けた文章をナレッジに追加したいとき
  • 情報源の重複を確認したいとき

日本語での紹介

できること

記事、ブログ、ニュース、YouTube動画、Xの投稿、PDF、画像、音声、貼り付けた文章など、ひとつの情報源を読み取り、内容の分析やLifeOSに取り入れる候補をまとめます。候補は提案として報告され、LifeOSへ自動で適用されるものではありません。Cortexに保存する場合は、情報源の種類を判定し、本文を取得して分類したうえで、出典URLや関連リンク、監査記録を含むノートとして登録します。同じ情報源を再度取り込んだときは重複として扱います。

こんなときに便利

読んだ記事から参考になる考え方を探したいときや、動画や文章をあとで参照できる形でCortexに残したいときに使えます。分析と保存をまとめて頼むことも、URLやテキストの保存だけを頼むこともできます。

使い方の例

  • 「この記事を分析して、LifeOSに取り入れられそうな点をまとめて」
  • 「このYouTube動画をCortexに保存して」
  • 「以下の文章をナレッジに追加して」

注意点

初回利用時はHarvestサービスの構築、接続先とトークンの設定、形式に応じたツールの導入が必要です。YouTube動画は公開URLを使ったGeminiの視聴処理を利用し、動画によっては取り込みに失敗します。

この紹介文は、公開されている SKILL.md をもとに AI(OpenAI Codex)が作成しました。正確な仕様は下の原文を確認してください。

資料チェック

SKILL.md の記述から、注意が要る操作と導入の前提を AI が確認しました。点数は実際に動かした結果(実行検証)だけで付けています。

安全面送信・削除・コマンド実行などの扱いが明示されているか
B一部不足Workflowsを経由してノートを書き、本文取得後に送信するが、外部サービスへの送信がある。
導入のしやすさ必要なツールや API キーが少ないか、書かれているか
B一部不足サービス構築、アドレスとトークン、形式別ツールの導入が必要と記載されている。

点数には入れていません。 2026年10月28日 時点で AI(OpenAI Codex)が判定しました。目安なので、入れる前に原文も確認してください。

評価が違うと思ったら、見直しを依頼する

どの項目が、なぜ違うと思うかを書いてください。ログインは不要です。内容を 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(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

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

無料概要あり

複数ベンダーの年次サイバーセキュリティ報告書を探して取得し、脅威やランサムウェア、侵害統計の傾向を出典付きで比較・分析します。

  • 脅威レポートをカテゴリ別に探したいとき
  • 特定ベンダーの報告書を取得したいとき
  • ランサムウェア動向を複数社で比較したいとき
danielmiessler/LifeOS2万2026年10月28日 更新

ApertureOscillation

無料概要あり

個別の機能や部品の設計と、システム全体の目的を同じ問いで比較し、両者の食い違い、適切な実装範囲、全体との整合性を3段階で整理するスキルです。

  • サービスやライブラリの分割判断
  • 機能要求と製品方針を比較したいとき
  • 新しい部品と既存システムの整合性確認
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の論文をテーマ・分野・論文IDで探し、著者や要旨、リンクをまとめます。新着論文の確認や、用意されている場合はAlphaXivのAI生成概要の取得にも対応します。

  • AI・機械学習の新着論文の確認
  • 特定テーマの論文を探したいとき
  • 論文IDやarXivのURLで照会
danielmiessler/LifeOS2万2026年10月28日 更新

danielmiessler のスキルをすべて見る

このスキルの問題を報告する