Merge OrbitOS into project — one install, everything ready
- Added 15 OrbitOS skills (bundled in skills/orbitos/) - Added vault structure templates (views, templates, prompts) - Added install.sh (macOS + Linux) - Removed references/orbitos-skills.md (no longer needed) - Updated README: 30 skills total, unified install flow Total: 9 mm* + 6 dependencies + 15 orbitos = 30 skills
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
# News-to-Article Workflow Reference
|
||||
|
||||
Full workflow for taking news items / content ideas from a digest and writing in-depth articles.
|
||||
|
||||
## Article Directory Structure
|
||||
|
||||
```
|
||||
~/vault/60_Articles/
|
||||
├── YYYY-MM-DD-<slug>/
|
||||
│ ├── article.md # Full article with frontmatter (title, description, date, category, tags, status: draft)
|
||||
│ ├── brief.md # Optional: research notes, source summaries, angles considered
|
||||
│ └── images/ # Featured + inline images
|
||||
│ └── featured.png
|
||||
└── YYYY-MM-DD-<slug2>/
|
||||
...
|
||||
```
|
||||
|
||||
## Article Frontmatter Template
|
||||
|
||||
```yaml
|
||||
---
|
||||
title: "Hook-driven title (≤ 60 chars, Thai)"
|
||||
description: "SEO meta description (120-160 chars)"
|
||||
slug: "yyyy-mm-dd-kebab-case-slug"
|
||||
date: YYYY-MM-DD
|
||||
category: SEO | AI | Marketing | Research
|
||||
author: Macky
|
||||
tags: [Tag1, Tag2, Tag3, Tag4]
|
||||
status: draft
|
||||
---
|
||||
```
|
||||
|
||||
## Research Phase (do this first, before writing)
|
||||
|
||||
### Step 1: Identify source articles
|
||||
From the digest's news items, find the original source URLs. Never write from the digest summary alone — always read the originals.
|
||||
|
||||
### Step 2: Read each source article
|
||||
Use this curl technique for most sites:
|
||||
|
||||
```bash
|
||||
curl -sL --max-time 20 "<URL>" | python3 -c "
|
||||
import sys, re
|
||||
html = sys.stdin.read()
|
||||
# Strip scripts and styles
|
||||
html = re.sub(r'<script[^>]*>.*?</script>', '', html, flags=re.DOTALL)
|
||||
html = re.sub(r'<style[^>]*>.*?</style>', '', html, flags=re.DOTALL)
|
||||
# Try to get <article> content first
|
||||
match = re.search(r'<article[^>]*>(.*?)</article>', html, re.DOTALL)
|
||||
if match:
|
||||
text = re.sub(r'<[^>]+>', ' ', match.group(1))
|
||||
else:
|
||||
text = re.sub(r'<[^>]+>', ' ', html)
|
||||
text = re.sub(r'\s+', ' ', text).strip()
|
||||
print(text[:15000])
|
||||
"
|
||||
```
|
||||
|
||||
For Cloudflare-protected sites (e.g. VentureBeat):
|
||||
- Fall back to `browser_navigate` → `browser_snapshot(full=true)` → `browser_scroll` as needed
|
||||
|
||||
### Step 3: Extract key data per source
|
||||
For each source, extract:
|
||||
- **Numbers** — all specific metrics, percentages, dollar amounts
|
||||
- **Quotes** — direct statements from researchers/executives
|
||||
- **Mechanisms** — how something works (the causal chain)
|
||||
- **Contrasts** — before/after, old/new, claimed vs actual
|
||||
|
||||
### Step 4: Synthesize across sources
|
||||
Organize findings into a coherent narrative:
|
||||
1. What's the core insight/problem each article describes?
|
||||
2. How do the sources overlap, complement, or contradict each other?
|
||||
3. What's the single actionable takeaway that readers can use today?
|
||||
|
||||
## Writing Phase
|
||||
|
||||
### Thai Content Structure (per article)
|
||||
|
||||
```
|
||||
# [Hook-driven title]
|
||||
|
||||
> [Hook paragraph — 1-2 sentences, breaks reader expectation]
|
||||
|
||||
## 📚 สารบัญ
|
||||
- [Section 1]
|
||||
- [Section 2]
|
||||
- ...
|
||||
|
||||
## [Section 1 — Core insight]
|
||||
[Data table with comparison columns]
|
||||
[Explanation paragraph — 2-4 sentences]
|
||||
📌 [Topic] Takeaway: [Actionable insight in 1-2 sentences]
|
||||
|
||||
## [Section 2 — Mechanism]
|
||||
[Data table with before/after]
|
||||
[Explanation]
|
||||
📌 [Topic] Takeaway: [...]
|
||||
|
||||
...
|
||||
|
||||
## สรุป Actionable Takeaways
|
||||
| สิ่งที่ต้องทำ | เหตุผล |
|
||||
|:---|:---|
|
||||
| ✅ [Action] | [Why — bulletproof reasoning] |
|
||||
| ❌ [Avoid] | [Why — the trap to dodge] |
|
||||
|
||||
---
|
||||
|
||||
**ที่มา:**
|
||||
- [Author], "[Title]" — [Publication], [Date]
|
||||
```
|
||||
|
||||
### Thai Writing Conventions
|
||||
|
||||
| Element | Convention |
|
||||
|:---|:---|
|
||||
| **Title** | Hook-driven ≤ 60 chars. Curiosity gap or contrarian claim. Include target keyword naturally |
|
||||
| **Opening** | Break expectation — "ถ้าคุณคิดว่า X — คุณคิดผิด" / "ไม่ใช่แค่ X — มันคือ Y" |
|
||||
| **Section labels** | 📌 "GEO Takeaway" / "Content Strategy Takeaway" / "Business Takeaway" |
|
||||
| **Tables** | Comparison columns with emoji indicators (✅ ❌ 🟢 🟡 🔴 🏆) |
|
||||
| **Code/terms** | Use backticks for English technical terms (`result_source`, `turn_use_case`) |
|
||||
| **Numbers** | Bold the headline number — "เร่งความเร็วได้ **85%**" |
|
||||
| **Sources footer** | "**ที่มา:**" section listing all source articles as markdown links |
|
||||
|
||||
### Avoid
|
||||
- Generic openings: "ในโลกดิจิทัลวันนี้", "ด้วยความก้าวหน้าของเทคโนโลยี"
|
||||
- Artificial FAQ sections — don't add them unless the content genuinely raises questions
|
||||
- Keyword stuffing — use Thai synonyms naturally
|
||||
- Over-explaining — trust the reader to connect simple dots
|
||||
|
||||
## Pitfalls
|
||||
|
||||
1. **web_extract / web_search may not be configured** — always have curl+browser fallback ready. Script/security warnings from pipe-to-python are a real risk; get auto-approval or use inline parsing.
|
||||
2. **Majority of articles are in the 60_Articles/<slug>/article.md format** — check existing structure before saving. Never invent a new format.
|
||||
3. **Source article may be behind paywall or bot-block** — curl can't read everything. Browser tools handle Cloudflare/Vercel. YouTube and social platforms need different approaches.
|
||||
4. **Content date ≠ publish date** — use the source research date or the article's original publication date, not today's date, for the article slug and frontmatter.
|
||||
5. **Multiple articles from one digest session** — batch them in parallel via delegate_task if independent; write sequentially if they share data.
|
||||
6. **arXiv API returns Atom XML, not RSS** — parse `<entry>` elements specifically; the `head -300` approach in the newsletter skill truncates at a fixed line count, so use `python3 -c` for proper XML parsing.
|
||||
Reference in New Issue
Block a user