Просмотр исходного кода

refactor: Extract pulse to standalone repo

Move pulse command to github.com/0xDarkMatter/pulse

Pulse generates persistent state files and news digests that don't
belong in a shared plugin repo. As standalone it can track its own
state and evolve independently.

Removed: pulse/, news/ directories
Updated: commands/pulse.md → deprecation notice

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
0xDarkMatter 5 месяцев назад
Родитель
Сommit
469e3dd68d

+ 1 - 1
README.md

@@ -102,7 +102,7 @@ Then symlink or copy to your Claude directories:
 | [spawn](commands/spawn.md) | Generate expert agents with PhD-level patterns and code examples. |
 | [conclave](commands/conclave.md) | **[DEPRECATED]** Use [Conclave CLI](https://github.com/0xDarkMatter/conclave) instead. |
 | [atomise](commands/atomise.md) | Atom of Thoughts reasoning - decompose problems into atomic units with confidence tracking and backtracking. |
-| [pulse](commands/pulse.md) | Generate Claude Code ecosystem news digest from blogs, repos, and community sources. |
+| [pulse](commands/pulse.md) | **[MOVED]** See [0xDarkMatter/pulse](https://github.com/0xDarkMatter/pulse). |
 | [setperms](commands/setperms.md) | Set tool permissions and CLI preferences. |
 | [archive](commands/archive.md) | Archive completed plans and session state. |
 

+ 16 - 381
commands/pulse.md

@@ -1,398 +1,33 @@
 ---
-description: "Generate Claude Code ecosystem news digest. Fetches blogs, repos, and community sources via Firecrawl. Output to news/{date}_pulse.md."
+description: "**[MOVED]** Claude Code ecosystem news digest. Now at github.com/0xDarkMatter/pulse"
 ---
 
-# Pulse - Claude Code News Feed
+# Pulse
 
-Fetch and summarize the latest developments in the Claude Code ecosystem.
+> **This command has been moved to a standalone repository.**
 
-## What This Command Does
+## New Location
 
-1. **Fetches** content from blogs, official repos, and community sources
-2. **Deduplicates** against previously seen URLs (stored in `news/state.json`)
-3. **Summarizes** each item with an engaging precis + relevance assessment
-4. **Writes** digest to `news/{YYYY-MM-DD}_pulse.md`
-5. **Updates** state to prevent duplicate entries in future runs
+**Repository:** [github.com/0xDarkMatter/pulse](https://github.com/0xDarkMatter/pulse)
 
-## Arguments
-
-- `--force` - Regenerate digest even if today's already exists
-- `--days N` - Look back N days instead of 1 (default: 1)
-- `--dry-run` - Show sources that would be fetched without actually fetching
-
-## Sources
-
-### Official (Priority: Critical)
-
-```json
-[
-  {"name": "Anthropic Engineering", "url": "https://www.anthropic.com/engineering", "type": "blog"},
-  {"name": "Claude Blog", "url": "https://claude.com/blog", "type": "blog"},
-  {"name": "Claude Code Docs", "url": "https://code.claude.com", "type": "docs"},
-  {"name": "anthropics/claude-code", "url": "https://github.com/anthropics/claude-code", "type": "repo"},
-  {"name": "anthropics/skills", "url": "https://github.com/anthropics/skills", "type": "repo"},
-  {"name": "anthropics/claude-code-action", "url": "https://github.com/anthropics/claude-code-action", "type": "repo"},
-  {"name": "anthropics/claude-agent-sdk-demos", "url": "https://github.com/anthropics/claude-agent-sdk-demos", "type": "repo"}
-]
-```
-
-### Community Blogs (Priority: High)
-
-```json
-[
-  {"name": "Simon Willison", "url": "https://simonwillison.net", "type": "blog"},
-  {"name": "Every", "url": "https://every.to", "type": "blog"},
-  {"name": "SSHH Blog", "url": "https://blog.sshh.io", "type": "blog"},
-  {"name": "Lee Han Chung", "url": "https://leehanchung.github.io", "type": "blog"},
-  {"name": "Nick Nisi", "url": "https://nicknisi.com", "type": "blog"},
-  {"name": "HumanLayer", "url": "https://www.humanlayer.dev/blog", "type": "blog"},
-  {"name": "Chris Dzombak", "url": "https://www.dzombak.com/blog", "type": "blog"},
-  {"name": "GitButler", "url": "https://blog.gitbutler.com", "type": "blog"},
-  {"name": "Docker Blog", "url": "https://www.docker.com/blog", "type": "blog"},
-  {"name": "Nx Blog", "url": "https://nx.dev/blog", "type": "blog"},
-  {"name": "Yee Fei Ooi", "url": "https://medium.com/@ooi_yee_fei", "type": "blog"}
-]
-```
-
-### Community Indexes (Priority: Medium)
-
-```json
-[
-  {"name": "Awesome Claude Skills", "url": "https://github.com/travisvn/awesome-claude-skills", "type": "repo"},
-  {"name": "Awesome Claude Code", "url": "https://github.com/hesreallyhim/awesome-claude-code", "type": "repo"},
-  {"name": "Awesome Claude", "url": "https://github.com/alvinunreal/awesome-claude", "type": "repo"},
-  {"name": "SkillsMP", "url": "https://skillsmp.com", "type": "marketplace"},
-  {"name": "Awesome Claude AI", "url": "https://awesomeclaude.ai", "type": "directory"}
-]
-```
-
-### Tools (Priority: Medium)
-
-```json
-[
-  {"name": "Worktree", "url": "https://github.com/agenttools/worktree", "type": "repo"}
-]
-```
-
-### GitHub Search Queries (Priority: High)
-
-Use `gh search repos` and `gh search code` for discovery:
-
-```bash
-# Repos with recent Claude Code activity (last 7 days)
-gh search repos "claude code" --pushed=">$(date -d '7 days ago' +%Y-%m-%d)" --sort=updated --limit=10
-
-# Hooks and skills hotspots
-gh search repos "claude code hooks" --pushed=">$(date -d '7 days ago' +%Y-%m-%d)" --sort=updated
-gh search repos "claude code skills" --pushed=">$(date -d '7 days ago' +%Y-%m-%d)" --sort=updated
-gh search repos "CLAUDE.md agent" --pushed=">$(date -d '7 days ago' +%Y-%m-%d)" --sort=updated
-
-# Topic-based discovery (often better signal)
-gh search repos --topic=claude-code --sort=updated --limit=10
-gh search repos --topic=model-context-protocol --sort=updated --limit=10
-
-# Code search for specific patterns
-gh search code "PreToolUse" --language=json --limit=5
-gh search code "PostToolUse" --language=json --limit=5
-```
-
-### Reddit Search (Priority: Medium)
-
-Use Firecrawl or web search for Reddit threads:
-
-```
-site:reddit.com/r/ClaudeAI "Claude Code" (hooks OR skills OR worktree OR tmux)
-```
-
-### Official Docs Search (Priority: High)
-
-Check for documentation updates:
-
-```
-site:code.claude.com hooks
-site:code.claude.com skills
-site:code.claude.com github-actions
-site:code.claude.com mcp
-```
-
-## Execution Steps
-
-### Step 1: Check State
-
-Read `pulse/state.json` to get:
-- `last_run` timestamp
-- `seen_urls` array for deduplication
-- `seen_commits` object for repo tracking
-
-If today's digest exists AND `--force` not specified:
-```
-Pulse digest already exists for today: news/{date}_pulse.md
-Use --force to regenerate.
-```
-
-### Fetch Script
-
-Run the parallel fetcher:
-```bash
-python pulse/fetch.py --sources all --max-workers 15 --output pulse/fetch_cache.json
-```
-
-### Step 2: Fetch Sources
-
-**For Blogs** - Use Firecrawl to fetch and extract recent articles:
-
-```bash
-# Fetch blog content via firecrawl
-firecrawl https://simonwillison.net --format markdown
-```
-
-Look for articles with dates in the last N days (default 1).
-
-**For GitHub Repos** - Use `gh` CLI:
-
-```bash
-# Get latest release
-gh api repos/anthropics/claude-code/releases/latest --jq '.tag_name, .published_at, .body'
-
-# Get recent commits
-gh api repos/anthropics/claude-code/commits --jq '.[:5] | .[] | {sha: .sha[:7], message: .commit.message, date: .commit.author.date}'
-
-# Get recent discussions (if enabled)
-gh api repos/anthropics/claude-code/discussions --jq '.[:3]'
-```
-
-**For Marketplaces/Directories** - Use Firecrawl:
+## Installation
 
 ```bash
-firecrawl https://skillsmp.com --format markdown
-firecrawl https://awesomeclaude.ai --format markdown
-```
-
-### Step 3: Filter & Deduplicate
-
-For each item found:
-1. Check if URL is in `seen_urls` - skip if yes
-2. Check if date is within lookback window - skip if older
-3. For repos, check if commit SHA matches `seen_commits[repo]` - skip if same
-
-### Step 4: Generate Summaries
-
-For each new item, generate:
-
-**Precis** (2-3 sentences):
-> Engaging summary that captures the key points and why someone would want to read this.
-
-**Relevance** (1 sentence):
-> How this specifically relates to or could improve our claude-mods project.
-
-Use this prompt pattern for each item:
-```
-Article: [title]
-URL: [url]
-Content: [extracted content]
-
-Generate:
-1. A 2-3 sentence engaging summary (precis)
-2. A 1-sentence assessment of relevance to "claude-mods" (a collection of Claude Code extensions including agents, skills, and commands)
+# Clone the repo
+git clone https://github.com/0xDarkMatter/pulse.git
 
-Format:
-PRECIS: [summary]
-RELEVANCE: [assessment]
+# Copy the command to your Claude Code commands
+cp pulse/COMMAND.md ~/.claude/commands/pulse.md
 ```
 
-### Step 5: Write Digest
-
-**IMPORTANT**: Read `pulse/BRAND_VOICE.md` before writing. Follow the voice guidelines.
+## Why It Moved
 
-Create `news/{YYYY-MM-DD}_pulse.md` with format:
+Pulse generates persistent state files and news digests that don't belong in a shared plugin repo. As a standalone tool, it can:
 
-```markdown
-# Pulse · {date in words}
-
-{Opening paragraph: Set the scene. What's the throughline this week? What should readers care about? Write conversationally, as if explaining to a smart friend.}
+- Track its own state without cluttering claude-mods
+- Have dedicated issue tracking for source curation
+- Evolve independently from the plugin release cycle
 
 ---
 
-## The Signal
-
-{1-3 most important/newsworthy items. These get:}
-- 2-paragraph summaries (150-200 words)
-- Extended "Pulse insights:" (2-3 sentences)
-- Source name linked to parent site
-
-### [{title}]({url})
-
-**[{source_name}]({source_parent_url})** · {date}
-
-{Paragraph 1: Hook + context. Start with something interesting—a question, surprising fact, or reframing.}
-
-{Paragraph 2: Substance + implications. What's actually in it and why it matters beyond the obvious.}
-
-**Pulse insights:** {Opinionated take on relevance to Claude Code practitioners. Be direct, take a stance.}
-
----
-
-## Official Updates
-
-{Other items from Anthropic sources}
-
-### [{title}]({url})
-
-**[{source_name}]({source_parent_url})** · {date}
-
-{1 paragraph summary (60-100 words). Hook + substance + implication in flowing narrative.}
-
-**Pulse insights:** {1-2 sentences. Practical, specific.}
-
----
-
-## GitHub Discoveries
-
-{New repos from topic/keyword searches}
-
-### [{repo_name}]({url})
-
-**{author}** · {one-line description}
-
-{1 paragraph on what it does and why it's interesting.}
-
-**Pulse insights:** {1-2 sentences.}
-
----
-
-## Community Radar
-
-{Notable community sources, blogs, discussions}
-
-### [{source_name}]({url}) — {pithy tagline}
-
-{2-3 sentences on what makes this source valuable.}
-
----
-
-## Quick Hits
-
-- **[{title}]({url})**: {one-line description}
-- ...
-
----
-
-## The Hit List
-
-1. **{Action}** — {Why}
-2. ...
-
----
-
-*{Randomised footer from BRAND_VOICE.md} · {date in words} · {suffix}*
-```
-
-### Step 6: Update State
-
-Update `pulse/state.json`:
-
-```json
-{
-  "version": "1.0",
-  "last_run": "{ISO timestamp}",
-  "seen_urls": [
-    "...existing...",
-    "...new urls from this run..."
-  ],
-  "seen_commits": {
-    "anthropics/claude-code": "{latest_sha}",
-    "anthropics/skills": "{latest_sha}",
-    ...
-  }
-}
-```
-
-Keep only last 30 days of URLs to prevent unbounded growth.
-
-### Step 7: Display Summary
-
-```
-Pulse: 2025-12-12
-
-Fetched 23 sources
-Found 8 new items (15 deduplicated)
-
-Critical:
-  - anthropics/claude-code v1.2.0 released
-
-Digest written to: news/2025-12-12_pulse.md
-```
-
-## Fetching Strategy
-
-**Priority Order**:
-1. Try `WebFetch` first (fastest, built-in)
-2. If 403/blocked/JS-heavy, use Firecrawl
-3. For GitHub repos, always use `gh` CLI
-
-**Parallel Fetching**:
-- Fetch multiple sources simultaneously
-- Use retry with exponential backoff (2s, 4s, 8s, 16s)
-- Report progress: `[====------] 12/23 sources`
-
-**Error Handling**:
-- If source fails after 4 retries, log and continue
-- Include failed sources in digest footer
-- Don't fail entire run for single source failure
-
-## Output Example
-
-See `news/2025-12-12_pulse.md` for a complete example in the current format.
-
-Key elements:
-- Opening 2 paragraphs set the scene conversationally (see BRAND_VOICE.md)
-- "The Signal" section gets 2 paragraphs + extended insights
-- All source names link to parent sites
-- "Pulse insights:" replaces "Why it matters"
-- "The Hit List" for actionable items (not homework—marching orders)
-- Randomised footer from BRAND_VOICE.md variations
-
-## Edge Cases
-
-### No New Items
-```
-Pulse: 2025-12-12
-
-Fetched 23 sources
-No new items found (all 12 items already seen)
-
-Last digest: news/2025-12-11_pulse.md
-```
-
-### Source Failures
-```
-Pulse: 2025-12-12
-
-Fetched 23 sources (2 failed)
-Found 6 new items
-
-Failed sources:
-  - skillsmp.com (timeout after 4 retries)
-  - every.to (403 Forbidden)
-
-Digest written to: news/2025-12-12_pulse.md
-```
-
-### First Run (No State)
-Initialize state.json with empty arrays/objects before proceeding.
-
-## Integration
-
-The `/pulse` command is standalone but integrates with:
-- **claude-architect agent** - Reviews digests for actionable insights (configured in agent's startup)
-- **news/state.json** - Persistent deduplication state
-- **Firecrawl** - Primary fetching mechanism for blocked/JS sites
-- **gh CLI** - GitHub API access for repo updates
-
-## Notes
-
-- Run manually when you want ecosystem updates: `Pulse`
-- Use `--force` to regenerate today's digest with fresh data
-- Use `--days 7` for weekly catchup after vacation
-- Digests are git-trackable for historical reference
-- **Always read `pulse/BRAND_VOICE.md`** before writing summaries
+*See the [Pulse repository](https://github.com/0xDarkMatter/pulse) for full documentation.*

+ 0 - 0
news/.gitkeep


+ 0 - 152
news/2025-12-12_pulse.md

@@ -1,152 +0,0 @@
-# Pulse · December 12, 2025
-
-What happens when your coding agent forgets everything you did yesterday? You start over. You re-explain context. You watch it make the same mistakes. It's the dirty secret of agentic coding—brilliant in the moment, amnesiac by morning. But here's the thing: the smartest people building these tools have been quietly solving this exact problem, and this week they finally started showing their work.
-
-Anthropic dropped a piece on long-running agent harnesses that reads like the missing manual we've all been waiting for. The community responded with a flurry of parallel workflow tools, worktree managers, and at least three "awesome" lists that are actually awesome. Meanwhile, the practitioners who've been living in Claude Code for months are starting to share patterns that feel less like tips and more like battle-tested doctrine. The ecosystem is growing up fast—and if you're not paying attention, you're already behind.
-
----
-
-## The Signal
-
-### [Effective harnesses for long-running agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents)
-
-**[Anthropic Engineering](https://www.anthropic.com/engineering)** · November 26, 2025
-
-Here's the thing about agents: they're brilliant within a conversation, but ask them to remember what happened yesterday and you're back to square one. The Anthropic team has been wrestling with this exact problem—how do you build harnesses that let agents work across sessions without losing their minds?
-
-Their answer draws on an unexpected source: how human engineers manage context when they step away from a problem. The patterns here (checkpointing, resumable state, explicit handoff protocols) feel like the missing manual for anyone building tools that need to survive a context window reset. It's the kind of deep thinking that usually stays inside research labs, now published for the rest of us to steal.
-
-**Pulse insights:** This speaks directly to our `/plan --save` and `/plan --load` commands. The checkpoint pattern they describe is almost exactly what we're doing with `session-cache.json`, but they've thought through edge cases we haven't—particularly around what to do when the world changes between sessions. Worth a close read.
-
----
-
-### [Compound Engineering: How Every Codes With Agents](https://every.to/chain-of-thought/compound-engineering-how-every-codes-with-agents)
-
-**[Every](https://every.to)** · December 11, 2025
-
-"What happens to software engineering when 100 percent of your code is written by agents?" Dan Shipper and Kieran Klaassen aren't asking hypothetically—they're running five production products at Every where nobody types code manually anymore. The piece introduces "compound engineering," where each feature makes the next one easier because the system learns from every bug, test, and breakthrough.
-
-The real gem is their four-step loop: Plan → Work → Review → Compound. That last step—feeding lessons back into the system—is where most teams fall short. They've open-sourced a [Claude Code plugin](https://github.com/EveryInc/compound-engineering-plugin) with the exact workflow, which is unusually generous.
-
-**Pulse insights:** Their "plan first, code second" philosophy aligns perfectly with Claude Code's Plan Mode. The compound step is what we're missing—we should think about how `/pulse` itself could feed insights back into our agents automatically.
-
----
-
-## Official Updates
-
-### [Advanced tool use on the Claude Developer Platform](https://www.anthropic.com/engineering/advanced-tool-use)
-
-**[Anthropic Engineering](https://www.anthropic.com/engineering)** · November 24, 2025
-
-Three new beta features that let Claude discover and execute tools dynamically. If you've ever wished Claude could figure out which tools exist without you listing them all upfront, this is the paper to read. The implications for skill discovery are significant—imagine Claude browsing your `.claude/skills/` directory and choosing the right one without explicit triggers.
-
-**Pulse insights:** Could change how we structure skill descriptions. If Claude can discover tools dynamically, our trigger keywords might matter less than clear capability descriptions.
-
----
-
-### [Code execution with MCP: Building more efficient agents](https://www.anthropic.com/engineering/code-execution-with-mcp)
-
-**[Anthropic Engineering](https://www.anthropic.com/engineering)** · November 4, 2025
-
-Every tool call eats context tokens—the definition goes in, the result comes back, and suddenly you've burned through half your window on boilerplate. This piece explores how MCP code execution can compress those round-trips, essentially letting the agent "think in code" rather than "think in API calls." The efficiency gains are substantial for agents doing repetitive operations.
-
-**Pulse insights:** Our `fetch-expert` agent would benefit from this pattern. Instead of multiple WebFetch calls, a single code execution could handle the whole parallel fetch loop.
-
----
-
-### [anthropics/claude-code: Remove footer from code-review plugin](https://github.com/anthropics/claude-code/commit/e8cca9a7af677289c97fc0efb117abdf21d3b948)
-
-**[anthropics/claude-code](https://github.com/anthropics/claude-code)** · December 11, 2025
-
-A small commit, but a telling one: the official code-review plugin no longer appends "Generated with Claude Code" footers. The implication? Anthropic is moving toward outputs that blend seamlessly rather than announcing their AI origins.
-
-**Pulse insights:** We've been adding similar footers to our commands. Worth considering whether this is still the right call, or if we should follow Anthropic's lead toward invisible assistance.
-
----
-
-## GitHub Discoveries
-
-The `claude-code` topic on GitHub has been busy. Here are the repos that caught our eye:
-
-### [worktrunk](https://github.com/max-sixty/worktrunk)
-
-**max-sixty** · Git worktree management for parallel agents
-
-You know how painful it is when multiple Claude sessions try to touch the same files? Worktrunk solves this with proper Git worktree isolation—each agent gets its own working directory, commits happen cleanly, and merges don't turn into nightmares. The CLI is minimal and focused.
-
-**Pulse insights:** This is the missing piece for anyone running concurrent agents. We should experiment with integrating worktree patterns into our multi-agent workflows.
-
----
-
-### [riffrag](https://github.com/naxoc/riffrag)
-
-**naxoc** · Local RAG + skills creator
-
-A clever combination: build a local RAG index of your codebase, then use it to generate Claude Code skills automatically. The idea is that your code patterns become teachable skills without manual documentation. Still early, but the approach is sound.
-
-**Pulse insights:** The auto-skills-from-code concept could supercharge `/agent-genesis`. Instead of manually describing expertise, let the code speak for itself.
-
----
-
-### [spec-oxide](https://github.com/marconae/spec-oxide)
-
-**marconae** · Spec-driven development with MCP
-
-Written in Rust (naturally), this tool enforces spec-first development where you write requirements, the agent implements, and specs become the source of truth. The MCP integration means Claude Code can read and validate against specs natively.
-
-**Pulse insights:** Spec-driven development + MCP is an interesting pattern for complex features. Could inform how we structure `/plan` outputs.
-
----
-
-### [Claude-Multi-Agent-Research-System-Skill](https://github.com/zubayer0077/Claude-Multi-Agent-Research-System-Skill)
-
-**zubayer0077** · Orchestrated research agents
-
-A skill for running multiple agents in parallel on research tasks, with built-in audit trails. The orchestration layer handles task distribution and result synthesis—essentially a conductor pattern for agent swarms.
-
-**Pulse insights:** The parallel execution model here is more sophisticated than our current approach. Worth studying for potential `fetch-expert` improvements.
-
----
-
-## Community Radar
-
-### [SkillsMP](https://skillsmp.com) — The skills keep coming
-
-The Claude Skills Marketplace now indexes hundreds of community skills, sortable by stars and categories. Quality varies wildly, but it's becoming the de facto discovery layer for anyone not wanting to reinvent wheels.
-
----
-
-### [Simon Willison](https://simonwillison.net) — Consistently essential
-
-Simon's been on a tear with MCP coverage. If you're not subscribed, you're missing the clearest explanations of what these tools actually do (and don't do). His "things I learned" format is worth stealing.
-
----
-
-### [Shrivu's Substack](https://blog.sshh.io) — Practitioner dispatches
-
-Real workflows from someone actually shipping with Claude Code daily. Less theory, more "here's what broke and how I fixed it." The kind of content that's hard to find elsewhere.
-
----
-
-## Quick Hits
-
-- **[Awesome Claude AI](https://awesomeclaude.ai)**: Fresh MCP server listings and SDK integrations—the directory's getting genuinely useful
-- **[vibeproxy](https://github.com/automazeio/vibeproxy)**: macOS menu bar app for using Claude subscriptions without API keys. Yes, it works.
-- **[claude-code-mux](https://github.com/YonickAzuma/claude-code-mux)**: Multi-model routing in single sessions—OpenAI and Claude playing nice together
-- **[mcp-memory](https://github.com/mem0ai/mcp-memory)**: Persistent memory layer for MCP—agents that actually remember things between sessions
-- **[claude-code-metrics](https://github.com/anthropics/claude-code-metrics)**: Official usage analytics for tracking token spend and session patterns
-- **[cursorrules.io](https://cursorrules.io)**: Growing collection of `.cursorrules` files—steal patterns for your `.claude/rules/`
-
----
-
-## The Hit List
-
-1. **Read the harnesses article** — Anthropic's checkpoint patterns are worth stealing for `/plan --save`
-2. **Clone compound engineering** — Every's plugin is free, battle-tested, and solves problems you haven't hit yet
-3. **Set up worktrunk** — Your parallel agent workflow is a mess without proper worktree isolation
-4. **Kill your footers** — Anthropic removed "Generated with Claude Code" from their plugins. Take the hint.
-5. **Audit your skills** — Half of them probably duplicate built-in functionality now
-
----
-
-*Sifted by Pulse · 12th December 2025 · 16 tabs so you don't have to*

+ 0 - 154
news/2025-12-13_pulse.md

@@ -1,154 +0,0 @@
-# Pulse · December 13, 2025
-
-The plugin ecosystem just exploded. Overnight, GitHub lit up with a dozen new Claude Code plugin repos—marketplaces, skill collections, workflow automations. Some are personal toolkits made public, others are production-ready frameworks with Linear integration and ADR generation. It's like watching a Cambrian explosion of developer tooling, except everyone's building for the same organism.
-
-What's driving this? Two things: Anthropic's plugin spec finally clicked, and people are realizing that the best way to make Claude Code work for you is to teach it your workflow. Not abstract "best practices," but your actual process—your commit style, your testing philosophy, your code review checklist. The repos popping up this week aren't just code; they're crystallized developer opinions. And that's exactly what Claude needs to be useful.
-
----
-
-## The Signal
-
-### [Very Important Agents](https://nicknisi.com/posts/very-important-agents)
-
-**[Nick Nisi](https://nicknisi.com)** · December 2025
-
-Nick's been on the Changelog & Friends podcast talking about Claude Code, and this post is the companion piece—a tour of the plugins that actually make it into his daily workflow. It's not a tutorial; it's a field report from someone who's been living in Claude Code for months and has strong opinions about what works.
-
-The real value here isn't the specific plugins (though those are useful), it's the meta-lesson: the best Claude Code setups are highly personal. Nick's workflow revolves around TypeScript, Vim keybindings, and a particular way of thinking about commits. His plugins encode those preferences. If you're still using vanilla Claude Code, this is a nudge to start building your own.
-
-**Pulse insights:** Nick's approach validates what we've been doing with claude-mods. The plugin-per-workflow pattern scales. Worth checking if any of his specific plugins solve problems we've been reinventing.
-
----
-
-### [How I Use Every Claude Code Feature](https://blog.sshh.io/p/how-i-use-every-claude-code-feature)
-
-**[SSHH Blog](https://blog.sshh.io)** · December 2025
-
-Shrivu Shankar wrote the brain dump we all needed—a systematic tour of Claude Code's feature surface, with concrete examples of when each thing actually matters. This isn't documentation; it's documentation filtered through heavy usage. The sections on hooks and skills are particularly good because they show the non-obvious interactions.
-
-What stands out: Shrivu doesn't just list features, he explains when *not* to use them. The bit about avoiding over-engineering skills is gold. Sometimes a simple CLAUDE.md instruction beats a formal skill definition. That kind of judgment only comes from shipping real work with these tools.
-
-**Pulse insights:** Required reading for anyone building plugins. The "when not to use it" framing should inform our own skill documentation. We should audit our skills for over-engineering.
-
----
-
-### [AI Can't Read Your Docs](https://blog.sshh.io/p/ai-cant-read-your-docs)
-
-**[SSHH Blog](https://blog.sshh.io)** · December 2025
-
-A counterintuitive claim: AI coding agents often struggle with well-documented codebases because the docs are optimized for humans, not LLMs. Shrivu argues for "LLM-native documentation"—structured metadata, explicit capability descriptions, examples that double as test cases. It's a provocation, but it's backed by real friction he's encountered.
-
-The deeper point: as AI agents become primary consumers of our code, we might need to write differently. Not dumbed-down, but differently structured. The implications for AGENTS.md files and skill descriptions are significant.
-
-**Pulse insights:** This should change how we write skill descriptions. Less prose, more structured capability declarations. Worth experimenting with the LLM-native doc format he proposes.
-
----
-
-## GitHub Discoveries
-
-The `claude-code` topic exploded this week. Here's what stood out:
-
-### [lazyclaude](https://github.com/NikiforovAll/lazyclaude)
-
-**NikiforovAll** · A lazygit-style TUI for visualizing Claude Code customizations
-
-Finally, someone built the obvious thing: a terminal UI for browsing your Claude Code setup. See your skills, agents, hooks, and commands in one navigable interface. It's early, but the concept is solid—configuration visibility matters when you're managing dozens of customizations.
-
-**Pulse insights:** This solves a real problem. Our `.claude/` directory is getting unwieldy. Worth watching—or contributing to.
-
----
-
-### [claude-deep-research](https://github.com/karanIPS/claude-deep-research)
-
-**karanIPS** · Deep Research workflow for Claude Code · ⭐ 20
-
-A pre-built configuration for running Claude Code in research mode—extended context, web search integration, structured output. It's essentially a "preset" for a specific use case, which is a pattern we haven't explored much.
-
-**Pulse insights:** The "preset for use case" pattern is interesting. We could package claude-mods configurations as installable presets rather than just loose files.
-
----
-
-### [claude-code-skills](https://github.com/levnikolaevich/claude-code-skills)
-
-**levnikolaevich** · 29 production-ready skills for Agile workflows · ⭐ 11
-
-The most ambitious skill collection we've seen—Epic/Story/Task management, Risk-Based Testing, ADR generation, all with Linear integration. It's opinionated (Agile-heavy), but the implementation quality is high. Real documentation, real tests.
-
-**Pulse insights:** This is what mature Claude Code extensions look like. The Linear integration is particularly clever—skills that talk to external systems, not just Claude. Steal liberally.
-
----
-
-### [gh-aw (GitHub Agentic Workflows)](https://github.com/githubnext/gh-aw)
-
-**githubnext** · GitHub's official agentic workflows experiment · ⭐ 265
-
-GitHub Next dropped this quietly: a framework for building AI-powered workflows that run on GitHub infrastructure. It's not Claude Code specific, but the patterns overlap heavily. Think of it as GitHub's answer to "what happens when agents need CI/CD."
-
-**Pulse insights:** This is GitHub signaling where they're headed. The workflow-as-code patterns here might become standard. Worth understanding even if we don't adopt directly.
-
----
-
-### [claude-code-openai](https://github.com/sar4daniela/claude-code-openai)
-
-**sar4daniela** · Run Claude Code on OpenAI models · ⭐ 10
-
-Exactly what it sounds like: a shim that lets you use Claude Code's interface with OpenAI's models. Useful for comparison testing or when you hit Claude rate limits. The existence of this suggests Claude Code's UX is good enough to port.
-
-**Pulse insights:** The "Claude Code as interface, any model as backend" pattern is growing. Good for ecosystem diversity. We should ensure our plugins are model-agnostic where possible.
-
----
-
-## Community Radar
-
-### [Claude Agent Skills: A First Principles Deep Dive](https://leehanchung.github.io/blogs/2025/10/26/claude-skills-deep-dive/)
-
-**[Lee Han Chung](https://leehanchung.github.io)** · Technical breakdown of how skills actually work
-
-Lee reverse-engineers the skill system from first principles—context injection, two-message patterns, LLM-based routing. If you've wondered why skills behave the way they do, this explains the mechanics. Dense but rewarding.
-
-**Pulse insights:** The "two-message pattern" explanation should be required reading before writing complex skills. We've been cargo-culting patterns without understanding why.
-
----
-
-### [GitButler 0.16 - "Sweet Sixteen"](https://blog.gitbutler.com/gitbutler-0-16)
-
-**[GitButler](https://blog.gitbutler.com)** · New release with Agents Tab and AI tool integrations
-
-GitButler now has a dedicated Agents Tab for AI tool configuration. The integration story is getting smoother—less context-switching between Git client and terminal. The "rules" feature for commit policies is clever.
-
-**Pulse insights:** GitButler is becoming the Git UI for the AI era. If you're not using it, you're making life harder than necessary.
-
----
-
-### [Think First, AI Second](https://every.to/p/think-first-ai-second)
-
-**[Every](https://every.to)** · Three principles for maintaining cognitive edge
-
-Every's take on not becoming dependent on AI for thinking. The principles are simple but important: formulate your own hypothesis before asking, review AI output critically, maintain skills you could do manually. Good hygiene for power users.
-
-**Pulse insights:** Worth internalizing. The "formulate before asking" principle applies directly to how we write prompts and skill descriptions.
-
----
-
-## Quick Hits
-
-- **[lazygit-style TUI](https://github.com/NikiforovAll/lazyclaude)**: Browse your Claude Code config visually—finally
-- **[GPT-5.2 coverage](https://simonwillison.net/2025/Dec/11/gpt-52/)**: Simon's breakdown of OpenAI's latest—useful for comparison context
-- **[Useful patterns for HTML tools](https://simonwillison.net/2025/Dec/10/html-tools/)**: Simon on building browser-based AI tools
-- **[claude-code-otel](https://github.com/thinktecture-labs/claude-code-otel)**: OpenTelemetry integration for Claude Code metrics—observability matters
-- **[wasp-lang/claude-plugins](https://github.com/wasp-lang/claude-plugins)**: Wasp framework's official Claude Code integration
-- **[spec-oxide](https://github.com/marconae/spec-oxide)**: Spec-driven development with MCP—Rust implementation
-
----
-
-## The Hit List
-
-1. **Install lazyclaude** — You need visibility into your `.claude/` directory chaos
-2. **Read Shrivu's feature guide** — Stop using Claude Code at 30% capacity
-3. **Audit your skills for over-engineering** — Sometimes CLAUDE.md instructions beat formal skills
-4. **Check claude-code-skills for Linear patterns** — If you use Linear, steal this integration
-5. **Consider presets** — Package your config as an installable setup, not loose files
-
----
-
-*Brewed by Pulse · 13th December 2025 · 19 articles, 15 repos, zero hallucinations*

+ 0 - 142
news/2025-12-20_pulse.md

@@ -1,142 +0,0 @@
-# Pulse · December 20th, 2025
-
-This week's throughline? The walls are coming down. Anthropic handed MCP to the Linux Foundation, OpenAI joined the founding board of an "Agentic AI Foundation," and skills became an open standard. After a year of proprietary land-grabs in AI tooling, the major players are suddenly playing nice—or at least pretending to. Meanwhile, Docker's betting big on local AI with voice agents and MCP toolkits, and OpenAI quietly shipped GPT-5.2-Codex optimized for "long-horizon work." The message is clear: 2025 is the year agents go from demos to deployments.
-
-If you're building extensions for Claude Code, pay attention. The Agent Skills spec is now an open standard—meaning our skills might need to play nice with Cursor, OpenCode, and who knows what else. And the MCP Foundation gives us a stable target to build against. This isn't just governance news; it's the ground shifting under our feet.
-
----
-
-## The Signal
-
-### [Donating the Model Context Protocol and Establishing the Agentic AI Foundation](https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation)
-
-**[Anthropic News](https://www.anthropic.com/news)** · December 9, 2025
-
-Here's the thing: MCP was always meant to be open, but "open with Anthropic's blessing" is different from "open under the Linux Foundation." This week, Anthropic transferred MCP to the newly established Agentic AI Foundation—a directed fund with Anthropic, Block, and OpenAI as co-founders, plus backing from Google, Microsoft, AWS, Cloudflare, and Bloomberg. That's basically everyone who matters agreeing that agent interoperability shouldn't be owned by one company.
-
-The numbers tell the story: over 10,000 active public MCP servers, integrations in ChatGPT, Cursor, Gemini, Microsoft Copilot, and VS Code. MCP won. Now it's getting the governance structure to match. Block's "goose" and OpenAI's "AGENTS.md" are also joining the foundation, suggesting a broader consolidation of agentic standards under one roof.
-
-**Pulse insights:** This is legitimately good news for claude-mods. We've been building on MCP, and now we have assurance it won't fragment or get locked down. The foundation structure also means we can contribute upstream if we build something useful. Worth tracking the governance repo when it goes live.
-
----
-
-### [Agent Skills: An Open Standard](https://simonwillison.net/2025/Dec/19/agent-skills/)
-
-**[Simon Willison](https://simonwillison.net)** · December 19, 2025
-
-Anthropic converted their internal skills mechanism into an open specification living in its own GitHub repository. The spec is refreshingly brief—readable in minutes—and defines how agents discover and invoke capabilities. OpenCode, Cursor, Letta, and GitHub have already adopted it. Notably absent: OpenAI, who appears to be quietly building their own implementation.
-
-The move mirrors what happened with MCP: start proprietary, prove the pattern, then hand it to the community. Skills were announced in October and hit critical mass by December. That's fast even by AI standards.
-
-**Pulse insights:** Our `.claude/skills/` structure already follows this pattern, but we should audit against the official spec. If Cursor and OpenCode are adopting it, there's an interoperability play here—skills that work across Claude Code *and* competitors. That's a differentiator worth exploring.
-
----
-
-## Official Updates
-
-### [Sharing Our Compliance Framework for California's SB 53](https://www.anthropic.com/news/compliance-framework-SB53)
-
-**[Anthropic News](https://www.anthropic.com/news)** · December 19, 2025
-
-Anthropic released their compliance approach for California's Transparency in Frontier AI Act. This is governance work, but it matters—SB 53 sets requirements for how frontier AI systems document capabilities and safety measures. Anthropic publishing their framework publicly signals confidence and sets a template others might follow.
-
-**Pulse insights:** Not directly relevant to claude-mods unless you're building enterprise tooling that needs compliance documentation. Bookmark for later.
-
----
-
-### [Working with the US Department of Energy to Unlock Scientific Discovery](https://www.anthropic.com/news/genesis-mission-partnership)
-
-**[Anthropic News](https://www.anthropic.com/news)** · December 18, 2025
-
-Partnership with DOE on "Genesis Mission"—using Claude for scientific research acceleration. Details sparse, but signals Anthropic's push into specialized enterprise verticals beyond coding and writing.
-
-**Pulse insights:** Keep an eye on whether DOE-specific tools or capabilities emerge. Government work sometimes spawns interesting OSS.
-
----
-
-### [Protecting the Well-Being of Our Users](https://www.anthropic.com/news/protecting-well-being-of-users)
-
-**[Anthropic News](https://www.anthropic.com/news)** · December 18, 2025
-
-Anthropic's initiative addressing user safety in AI products—focused on mental health implications and responsible deployment. Part of their broader Constitutional AI work.
-
-**Pulse insights:** Unlikely to affect Claude Code directly, but may influence how Claude responds in extended sessions.
-
----
-
-## GitHub Discoveries
-
-### [anthropics/skills](https://github.com/anthropics/skills)
-
-**Anthropic** · Official skills specification
-
-The canonical home for the Agent Skills open standard. Includes the spec, examples, and adoption guidelines. Already seeing community contributions.
-
-**Pulse insights:** Clone it, read it, check our skills against it. This is now the source of truth.
-
----
-
-### [obra/superpowers](https://github.com/obra/superpowers)
-
-**obra** · Core skills library with 20+ battle-tested patterns
-
-Community library offering TDD, debugging, and collaboration skills for Claude Code. Worth reviewing for patterns we might adopt or improve upon.
-
-**Pulse insights:** Competition and inspiration in one package. The TDD skill looks particularly well-designed.
-
----
-
-## Community Radar
-
-### [Every.to](https://every.to) — OpenAI's Codex Playbook
-
-[OpenAI Gave Us a Glimpse Into Their AI Coding Playbook](https://every.to/source-code/openai-gave-us-a-glimpse-into-their-ai-coding-playbook) dropped this week with lessons from the team that built Codex. Key insight: "treat Codex like a new coworker you're onboarding, not a tool." They built Sora's Android app in 28 days with four engineers. The bottleneck shifted from coding to architecture and review—sound familiar?
-
-**Pulse insights:** The "onboarding not tooling" framing is worth internalizing. Our agents could benefit from this mental model.
-
----
-
-### [Simon Willison](https://simonwillison.net) — LLM Year in Review
-
-Prolific week from Simon. Beyond the skills coverage: [Andrej Karpathy's 2025 LLM Year in Review](https://simonwillison.net/2025/Dec/19/andrej-karpathy/) (RLVR as the new training paradigm), [GPT-5.2-Codex](https://simonwillison.net/2025/Dec/19/introducing-gpt-52-codex/) (OpenAI's agent-optimized model for "long-horizon work"), and [Your Job Is to Deliver Code You've Proven Works](https://simonwillison.net/2025/Dec/18/code-proven-to-work/) (on junior devs depositing untested AI code).
-
-**Pulse insights:** The "code proven to work" essay should be required reading. Pairs well with our `/testgen` and `/review` commands.
-
----
-
-### [Docker Blog](https://www.docker.com/blog) — MCP Goes Mainstream
-
-Docker's all-in on MCP this week. [Voice AI Apps with Docker](https://www.docker.com/blog/develop-deploy-voice-ai-apps/) showcases EchoKit—an open-source voice agent orchestrator using Model Runner and MCP Toolkit. [Adding MCP Servers to ChatGPT](https://www.docker.com/blog/add-mcp-server-to-chatgpt/) shows the Docker MCP Toolkit connecting external tools to ChatGPT. The stack is maturing fast.
-
-**Pulse insights:** EchoKit's architecture (VAD → ASR → LLM → TTS pipeline) is interesting for voice-first agents. Docker Model Runner + MCP could be a deployment target for our tools.
-
----
-
-### [GitButler](https://blog.gitbutler.com) — Multi-Account Git
-
-[Using GitButler with Multiple GitHub Accounts](https://blog.gitbutler.com/gitbutler-with-multiple-accounts/) addresses a real pain point for contractors and OSS contributors juggling identities.
-
-**Pulse insights:** Tangentially useful if you're testing claude-mods across personal and work contexts.
-
----
-
-## Quick Hits
-
-- **[Sam Rose Explains LLMs Visually](https://simonwillison.net/2025/Dec/19/sam-rose-llms/)**: Interactive visual essay on tokenization, embeddings, and transformers—great for onboarding juniors
-- **[Swift-JustHTML Parser](https://simonwillison.net/2025/Dec/18/swift-justhtml/)**: AI-powered code porting produces a dependency-free HTML5 parser in Swift
-- **[Docker Model Runner on Universal Blue](https://www.docker.com/blog/docker-model-runner-universal-blue/)**: GPU-ready AI dev environment ships with Aurora and Bluefin distros
-- **[Docker Hardened Images](https://www.docker.com/blog/docker-hardened-images-security-independently-validated-by-srlabs/)**: Secure-by-default containers now free for all teams
-- **[Accenture + Anthropic Partnership](https://www.anthropic.com/news/anthropic-accenture-partnership)**: Multi-year deal to move enterprises from AI pilots to production
-
----
-
-## The Hit List
-
-1. **Audit skills against the open spec** — Check `.claude/skills/` structure against `anthropics/skills` repo
-2. **Explore cross-platform skill interop** — If Cursor adopts skills, can our skills work there too?
-3. **Read the Codex playbook** — "Onboarding not tooling" is a mental model shift worth making
-4. **Watch Docker MCP Toolkit** — Deployment target for local-first agent architectures
-
----
-
-*Woven by Pulse · December 20th, 2025 · 18 sources across the ecosystem*

+ 0 - 139
news/2025-12-23_pulse.md

@@ -1,139 +0,0 @@
-# Pulse - 23rd December 2025
-
-The week before Christmas, and Claude Code got a stocking stuffer: inline code review comments that actually suggest fixes. Meanwhile, Anthropic made the MCP donation to a new foundation official, Simon Willison discovered Claude can navigate Cloudflare dashboards better than most humans, and the GitHub ecosystem continued its explosive growth - the system prompts collection hit 100k stars, which tells you something about how many developers are trying to understand what's actually happening inside these tools.
-
-The throughline this week? The infrastructure for AI-assisted development is maturing fast. We're past the "cool demo" phase and into "this is how work gets done" territory.
-
----
-
-## The Signal
-
-### [Claude Code v2.0.74 - Inline Code Review Comments](https://github.com/anthropics/claude-code/releases/tag/v2.0.74)
-
-**[anthropics/claude-code](https://github.com/anthropics/claude-code)** - Dec 19, 2025
-
-Here's a feature that sounds simple but changes the code review game: Claude Code now posts inline comments with committable suggestions directly on your PRs. Not just "this looks wrong" - actual diffs you can apply with one click. The team refined this over several commits: suggestions are now limited to 5 lines (because nobody wants a 50-line inline diff), the "Bug:" prefix got dropped (less noise), and there's a prompt encouraging you to use Claude Code for larger fixes rather than trying to cram everything into a suggestion.
-
-What makes this interesting is the philosophy shift. Instead of treating code review as a monolithic pass/fail judgment, it's now a conversation with actionable next steps. The summary comment is skipped when inline comments are posted - no more redundant "I found 3 issues" followed by... 3 issues.
-
-**Pulse insights:** This is worth stealing for our `/review` command. The pattern of "small suggestions inline, big fixes delegated to the agent" is exactly right. Consider updating our review output to match this model - inline for quick wins, explicit "run Claude Code" prompts for anything substantial.
-
-### [MCP Donated to Agentic AI Foundation](https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation)
-
-**[Anthropic News](https://www.anthropic.com/news)** - Dec 9, 2025
-
-Anthropic made the Model Context Protocol official open infrastructure by donating it to a newly established Agentic AI Foundation. This isn't just a PR move - it's a signal that MCP is meant to be the universal connector between AI tools and external systems, not an Anthropic-proprietary play. The foundation structure means other companies can contribute without worrying about feeding a competitor's moat.
-
-**Pulse insights:** If you've been hesitant to build MCP servers because "what if Anthropic changes direction?" - that concern just got significantly smaller. The protocol is now genuinely open. Time to revisit our mcp-patterns skill and maybe add some server templates.
-
----
-
-## Official Updates
-
-### [Agent Skills Specification Split](https://github.com/anthropics/skills/commit/f232228)
-
-**[anthropics/skills](https://github.com/anthropics/skills)** - Dec 16-20, 2025
-
-The skills repo got a documentation overhaul: the monolithic agent-skills-spec was split into separate authoring and client integration guides. There's now a dedicated specification website linked from the repo. The doc-coauthoring skill was also added as an example.
-
-**Pulse insights:** If you're writing skills, bookmark the new spec site. The split makes it clearer what skill authors vs. skill consumers need to know.
-
-### [SB53 Transparency Compliance Framework](https://www.anthropic.com/news/compliance-framework-SB53)
-
-**[Anthropic News](https://www.anthropic.com/news)** - Dec 19, 2025
-
-Anthropic published their compliance framework for California's SB53 (Transparency in Frontier AI Act). The interesting bit: they're being proactive about transparency requirements before they're mandated.
-
-**Pulse insights:** Mostly relevant for enterprise deployments and anyone building on Claude who needs to answer compliance questions. The framework doc itself is worth reading if you're pitching Claude to regulated industries.
-
-### [DOE Genesis Mission Partnership](https://www.anthropic.com/news/genesis-mission-partnership)
-
-**[Anthropic News](https://www.anthropic.com/news)** - Dec 18, 2025
-
-Anthropic is working with the US Department of Energy on scientific discovery applications. The "Genesis mission" framing suggests this is about fundamental research acceleration, not just document summarization.
-
-**Pulse insights:** Interesting for the capability signal - if DOE is betting on Claude for serious research, that's validation. Less directly relevant to claude-mods unless you're building science-focused agents.
-
----
-
-## GitHub Discoveries
-
-### [system-prompts-and-models-of-ai-tools](https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools)
-
-**x1xhlol** - 101,461 stars - System prompts from 30+ AI coding tools
-
-The definitive collection of leaked/extracted system prompts from Claude Code, Cursor, Windsurf, Devin, and basically every AI coding tool that exists. Just crossed 100k stars, making it one of the most popular AI repos on GitHub.
-
-**Pulse insights:** Essential research material. If you're writing agents or skills, seeing how the major tools structure their prompts is invaluable. Warning: some prompts are outdated as tools update.
-
-### [claude-code-router](https://github.com/musistudio/claude-code-router)
-
-**musistudio** - 23,835 stars - Use Claude Code as coding infrastructure foundation
-
-A wrapper that lets you use Claude Code as a foundation while controlling the interaction layer. Useful if you want Claude Code's capabilities but need custom UX or integration points.
-
-**Pulse insights:** Interesting architectural pattern for building on top of Claude Code rather than beside it. Worth exploring if our plugin approach ever feels limiting.
-
-### [wshobson/agents](https://github.com/wshobson/agents)
-
-**wshobson** - 23,253 stars - Multi-agent orchestration for Claude Code
-
-Intelligent automation and multi-agent orchestration specifically designed for Claude Code workflows. The star count suggests this is hitting a real need.
-
-**Pulse insights:** Direct competition/complement to our agent approach. Worth a close look to see what patterns they're using that we're not.
-
-### [claude-mem](https://github.com/thedotmack/claude-mem)
-
-**thedotmack** - 8,789 stars - Session memory plugin
-
-Automatically captures everything Claude does during sessions, compresses it with AI, and injects relevant context back into future sessions. Uses the agent-sdk for compression.
-
-**Pulse insights:** This is basically solving our session continuity problem from a different angle. Instead of explicit save/load, it's automatic capture and smart injection. Worth studying their compression approach.
-
-### [ccusage](https://github.com/ryoppippi/ccusage)
-
-**ryoppippi** - 9,360 stars - Usage analytics CLI
-
-Analyzes Claude Code usage from local JSONL files. See where your tokens are going, what's working, what's not.
-
-**Pulse insights:** Useful for anyone trying to optimize their Claude Code workflow. Could inspire a `/usage` command for claude-mods.
-
----
-
-## Community Radar
-
-### [Simon Willison](https://simonwillison.net) - The practical AI columnist
-
-Two standout posts this week: "Claude in Chrome extension solves real problems" shows Claude navigating the Cloudflare dashboard to configure CORS headers - a genuinely useful demo of browser agents. "Your job is to deliver code you have proven to work" is a sharp take on professional standards for AI-assisted development.
-
-**Pulse insights:** Willison remains the best source for practical, non-hype AI coverage. The "code you have proven to work" piece should be required reading for anyone using Claude Code professionally.
-
-### [Gemini 3 Flash](https://simonwillison.net/2025/Dec/17/gemini-3-flash/)
-
-**[Google](https://deepmind.google)** - Dec 17, 2025
-
-Google dropped Gemini 3 Flash - faster and cheaper. The multimodal benchmarks are impressive, and the pricing undercuts competitors significantly.
-
-**Pulse insights:** Competition is good. Worth keeping an eye on for our `/conclave` command - Gemini's 2M context window makes it valuable for large codebase analysis.
-
----
-
-## Quick Hits
-
-- **[n8n-mcp](https://github.com/czlonkowski/n8n-mcp)**: MCP server for building n8n workflows from Claude - 10.9k stars
-- **[obra/superpowers](https://github.com/obra/superpowers)**: Core skills library for Claude Code - 10.9k stars
-- **[claude-code-templates](https://github.com/davila7/claude-code-templates)**: CLI tool for configuring and monitoring - 13k stars
-- **[awesome-claude-code](https://github.com/hesreallyhim/awesome-claude-code)**: Curated commands and workflows - 18.5k stars (still growing)
-
----
-
-## The Hit List
-
-1. **Try the new inline code review** - Test v2.0.74's suggestion feature on a real PR
-2. **Read the split skills spec** - The authoring guide is now separate and clearer
-3. **Study claude-mem's compression** - Their approach to session memory might improve our /plan system
-4. **Bookmark the system-prompts repo** - 100k stars means everyone else is reading it too
-
----
-
-*Channeled by Pulse - 23rd December 2025 - 18 sources across the ecosystem*

+ 0 - 28
news/state.json

@@ -1,28 +0,0 @@
-{
-  "version": "1.0",
-  "last_run": "2025-12-20T12:00:00Z",
-  "seen_urls": [
-    "https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation",
-    "https://www.anthropic.com/news/compliance-framework-SB53",
-    "https://www.anthropic.com/news/genesis-mission-partnership",
-    "https://www.anthropic.com/news/protecting-well-being-of-users",
-    "https://www.anthropic.com/news/anthropic-accenture-partnership",
-    "https://simonwillison.net/2025/Dec/19/agent-skills/",
-    "https://simonwillison.net/2025/Dec/19/andrej-karpathy/",
-    "https://simonwillison.net/2025/Dec/19/introducing-gpt-52-codex/",
-    "https://simonwillison.net/2025/Dec/19/sam-rose-llms/",
-    "https://simonwillison.net/2025/Dec/18/code-proven-to-work/",
-    "https://simonwillison.net/2025/Dec/18/swift-justhtml/",
-    "https://www.docker.com/blog/develop-deploy-voice-ai-apps/",
-    "https://www.docker.com/blog/add-mcp-server-to-chatgpt/",
-    "https://www.docker.com/blog/docker-model-runner-universal-blue/",
-    "https://www.docker.com/blog/docker-hardened-images-security-independently-validated-by-srlabs/",
-    "https://www.docker.com/blog/from-the-captains-chair-igor-aleksandrov/",
-    "https://every.to/source-code/openai-gave-us-a-glimpse-into-their-ai-coding-playbook",
-    "https://every.to/p/how-ai-can-cut-your-planning-cycle-from-two-weeks-to-two-days",
-    "https://blog.gitbutler.com/gitbutler-with-multiple-accounts/",
-    "https://github.com/anthropics/skills",
-    "https://github.com/obra/superpowers"
-  ],
-  "seen_commits": {}
-}

+ 0 - 0
pulse/.gitkeep


+ 0 - 173
pulse/BRAND_VOICE.md

@@ -1,173 +0,0 @@
-# Pulse Brand Voice
-
-> Intelligent, conversational, and just the right amount of cheeky. Like your smartest friend who actually reads the docs.
-
-## Core Principles
-
-### 1. Conversational Intelligence
-Write like you're explaining something fascinating to a smart friend over coffee. Assume intelligence, skip the basics, get to the interesting bits.
-
-**Do:** "What happens to software engineering when 100 percent of your code is written by agents?"
-**Don't:** "AI is changing software development in many important ways."
-
-### 2. Start with the Stakes
-Lead with why someone should care. The first sentence should create tension, curiosity, or a sense of "wait, what?"
-
-**Do:** "If you're funding or starting an AI company in 2025, Rich Sutton's 'bitter lesson' should terrify and guide you."
-**Don't:** "This article discusses AI investment strategies."
-
-### 3. Casual but Never Sloppy
-Use contractions, occasional em-dashes, and the odd rhetorical question. But keep sentences crisp and ideas sharp.
-
-**Good:** "So much of engineering until now assumed that coding is hard and engineers are scarce. Removing those bottlenecks makes traditional practices—like manually writing tests—feel slow and outdated."
-
-### 4. Show Personality Through Specificity
-Don't say "interesting" or "innovative." Say exactly what makes something matter. If you can't explain why it's cool, it probably isn't.
-
-**Do:** "A single developer can do the work of five developers a few years ago—and no, that's not hyperbole."
-**Don't:** "This is a significant productivity improvement."
-
-### 5. Wit, Not Cringe
-A touch of personality, never try-hard. Self-aware observations work better than jokes. If it sounds like a LinkedIn post, delete it.
-
-**Do:** "It feels weird to be typing code into your computer or staring at a blinking cursor in a code editor. Like handwriting a letter in 2025."
-**Don't:** "AI is so amazing, programmers are basically obsolete! LOL!"
-
-## Article Summaries
-
-### Length & Structure
-- **Lead articles**: 2 paragraphs (150-200 words). Set the scene, explain the substance, hint at implications.
-- **Standard articles**: 1 paragraph (60-100 words). Hook + substance + why-it-matters in a flowing narrative.
-- **Brief items**: 2-3 sentences. Punchy, informative, done.
-
-### Opening Lines
-Start with:
-- A provocative question
-- A surprising fact or contrast
-- A "here's the thing" framing
-- A direct statement that reframes the topic
-
-**Examples:**
-- "The team at Anthropic has been thinking about what happens when agents need to work across sessions—and their answer might change how we all build tools."
-- "There's a quiet revolution happening in Git workflows, and it has nothing to do with branches."
-- "You know that feeling when your agent forgets everything from yesterday? Someone finally did something about it."
-
-### Avoiding Clichés
-Never use:
-- "Game-changing" / "Revolutionary" / "Innovative" (if it were, you wouldn't need to say it)
-- "Excited to announce" / "We're thrilled" (nobody cares about your emotions)
-- "Deep dive" (use "close look" or just describe what's in it)
-- "Leverage" / "Utilize" (use "use" like a normal person)
-- "Best practices" without specifics (meaningless corporate speak)
-- "Transformative" / "Cutting-edge" / "Next-gen" (cringe)
-- "Unlock" / "Empower" / "Democratize" (buzzword bingo)
-
-## Pulse Insights
-
-Replace "Why it matters" with "Pulse insights:" — a brief, opinionated take on relevance to Claude Code practitioners. This is where you get to have opinions.
-
-### Tone for Insights
-- Direct and practical—no hedging
-- Opinionated—actually take a stance, don't be wishy-washy
-- Connect to specific capabilities or gaps
-- Okay to be speculative or suggest experiments
-- Can be snarky when warranted (e.g., "Another 'awesome' list, but this one's actually useful")
-
-**Examples:**
-- "Pulse insights: This slots directly into our session state problem. Worth stealing the checkpoint pattern for `/plan --save`."
-- "Pulse insights: The parallel worktree approach could let us run multiple agents without the git conflicts. Time for an experiment."
-- "Pulse insights: Mostly relevant if you're building MCP servers. If you're just using Claude Code, bookmark it for later."
-
-## Footer Style
-
-End with a lyrical, slightly poetic sign-off that feels human-curated. **Randomise from the variations below** each time you generate a digest.
-
-**Format:**
-```
-*{variation} · {date in words} · {suffix}*
-```
-
-**Footer Variations** (randomise each digest—variety is the spice):
-
-```
-Harmonised by Pulse
-Synthesised by Pulse
-Distilled by Pulse
-Curated by Pulse
-Assembled by Pulse
-Gathered by Pulse
-Woven by Pulse
-Composed by Pulse
-Tuned by Pulse
-Brewed by Pulse
-Filtered by Pulse
-Channeled by Pulse
-Conducted by Pulse
-Orchestrated by Pulse
-Sifted by Pulse
-```
-
-**Suffix Variations** (mix and match for flavour):
-
-```
-· {N} sources
-· {N} sources across the ecosystem
-· {N} signals from the noise
-· {N} corners of the internet
-· {N} sources, zero hallucinations
-· {N} tabs so you don't have to
-· scanning {N} sources while you slept
-· from {N} sources, with taste
-· {N} RSS feeds you never check
-· {N} blogs, one summary
-· saving you {N} browser tabs
-```
-
-**Examples:**
-- *Brewed by Pulse · 12th December 2025 · 16 sources*
-- *Filtered by Pulse · December 12, 2025 · 23 signals from the noise*
-- *Woven by Pulse · 12 December 2025 · scanning 18 sources while you slept*
-- *Curated by Pulse · December 12th, 2025 · 16 tabs so you don't have to*
-
-## Source Attribution
-
-Always link the source name to its parent site:
-- "[Anthropic Engineering](https://anthropic.com/engineering)" not just "Anthropic Engineering"
-- "[Simon Willison](https://simonwillison.net)" not just "Simon Willison"
-- "[r/ClaudeAI](https://reddit.com/r/ClaudeAI)" not just "Reddit"
-
-## The Signal (Lead Articles)
-
-1-3 articles get promoted to "The Signal" status. Don't overthink it—if something made you go "oh, that's interesting," it's probably a lead.
-
-**Criteria** (any of these):
-- **Breaking**: Just announced, hot off the press
-- **Official**: Anthropic dropped something new
-- **Actually useful**: Changes how people work, not just interesting in theory
-- **First-of-its-kind**: Someone built something nobody else has
-
-**Lead treatment:**
-- Top of the digest, can't miss it
-- 2-paragraph summary (the full story, not a teaser)
-- Extended "Pulse insights" (2-3 sentences—opinions encouraged)
-- Visual separation so it feels important
-
-## Example Transformation
-
-### Before (Boring)
-> **Effective harnesses for long-running agents**
-> Source: Anthropic Engineering | Type: Post
-> Covers how agents face challenges working across context windows. Looks at human engineering patterns.
-> **Why it matters**: May help with our session state management.
-
-*Reads like a database entry. Nobody wants to click.*
-
-### After (Pulse Voice)
-> ### [Effective harnesses for long-running agents](https://anthropic.com/engineering/effective-harnesses-for-long-running-agents)
-> **[Anthropic Engineering](https://anthropic.com/engineering)** · November 26, 2025
->
-> Here's the thing about agents: they're brilliant within a conversation, but ask them to remember what happened yesterday and you're back to square one. The Anthropic team has been wrestling with this exact problem—how do you build harnesses that let agents work across sessions without losing their minds? Their answer draws on an unexpected source: how human engineers manage context when they step away from a problem. The patterns here (checkpointing, resumable state, explicit handoff protocols) feel like the missing manual for anyone building tools that need to survive a context window reset.
->
-> **Pulse insights:** This speaks directly to our `/plan --save` and `/plan --load` commands. The checkpoint pattern they describe is almost exactly what we're doing with `session-cache.json`, but they've thought through edge cases we haven't. Worth a close read to see if we should adopt their handoff protocol.
-
-*Now it sounds like someone actually read it and has opinions.*

+ 0 - 159
pulse/NEWS_TEMPLATE.md

@@ -1,159 +0,0 @@
-# Pulse · {{DATE_WORDS}}
-
-{{INTRO}}
-
----
-
-## The Signal
-
-{{#LEAD_STORIES}}
-### [{{TITLE}}]({{URL}})
-
-**[{{SOURCE_NAME}}]({{SOURCE_URL}})** · {{DATE}}
-
-{{SUMMARY_P1}}
-
-{{SUMMARY_P2}}
-
-**Pulse insights:** {{INSIGHTS}}
-
----
-{{/LEAD_STORIES}}
-
-## Official Updates
-
-{{#OFFICIAL}}
-### [{{TITLE}}]({{URL}})
-
-**[{{SOURCE_NAME}}]({{SOURCE_URL}})** · {{DATE}}
-
-{{SUMMARY}}
-
-**Pulse insights:** {{INSIGHTS}}
-
----
-{{/OFFICIAL}}
-
-## GitHub Discoveries
-
-{{GITHUB_INTRO}}
-
-{{#GITHUB_REPOS}}
-### [{{REPO_NAME}}]({{URL}})
-
-**{{AUTHOR}}** · {{ONE_LINER}}
-
-{{DESCRIPTION}}
-
-**Pulse insights:** {{INSIGHTS}}
-
----
-{{/GITHUB_REPOS}}
-
-## Community Radar
-
-{{#COMMUNITY}}
-### [{{ARTICLE_TITLE}}]({{ARTICLE_URL}})
-
-**[{{SOURCE_NAME}}]({{SOURCE_URL}})** · {{DATE}}
-
-{{SUMMARY}}
-
-**Pulse insights:** {{INSIGHTS}}
-
----
-{{/COMMUNITY}}
-
-## Quick Hits
-
-{{#QUICK_HITS}}
-- **[{{TITLE}}]({{URL}})**: {{ONE_LINER}}
-{{/QUICK_HITS}}
-
----
-
-## The Hit List
-
-{{#ACTION_ITEMS}}
-{{INDEX}}. **{{ACTION}}** — {{REASON}}
-{{/ACTION_ITEMS}}
-
----
-
-*{{FOOTER}}*
-
----
-
-## Template Variables Reference
-
-### Global
-- `{{DATE_WORDS}}` - e.g., "December 12, 2025"
-- `{{DATE_ISO}}` - e.g., "2025-12-12"
-- `{{SOURCE_COUNT}}` - Total sources fetched
-- `{{INTRO}}` - Opening 2-paragraph hook (see BRAND_VOICE.md)
-- `{{FOOTER}}` - Randomised sign-off (see BRAND_VOICE.md footer variations)
-
-### The Signal (1-3 items)
-- `{{TITLE}}` - Article/post title
-- `{{URL}}` - Direct link to content
-- `{{SOURCE_NAME}}` - e.g., "Anthropic Engineering"
-- `{{SOURCE_URL}}` - Parent site URL
-- `{{DATE}}` - Publication date
-- `{{SUMMARY_P1}}` - First paragraph (hook + context)
-- `{{SUMMARY_P2}}` - Second paragraph (substance + implications)
-- `{{INSIGHTS}}` - 2-3 sentence Pulse insights
-
-### Official Updates
-Same as Lead Stories but with single `{{SUMMARY}}` paragraph.
-
-### GitHub Discoveries
-- `{{GITHUB_INTRO}}` - Brief intro to the section
-- `{{REPO_NAME}}` - Repository name
-- `{{AUTHOR}}` - GitHub username
-- `{{ONE_LINER}}` - Brief description
-- `{{DESCRIPTION}}` - 1 paragraph explanation
-- `{{INSIGHTS}}` - 1-2 sentence insights
-
-### Community Radar
-- `{{ARTICLE_TITLE}}` - Specific article title (not just blog name)
-- `{{ARTICLE_URL}}` - Direct article link
-- `{{SOURCE_NAME}}` - Blog/publication name
-- `{{SOURCE_URL}}` - Blog homepage
-- `{{DATE}}` - Article date
-- `{{SUMMARY}}` - 1 paragraph summary
-- `{{INSIGHTS}}` - 1-2 sentence insights
-
-### Quick Hits (4-6 items)
-- `{{TITLE}}` - Item title
-- `{{URL}}` - Link
-- `{{ONE_LINER}}` - Pithy description (max 15 words)
-
-### The Hit List (3-5 items)
-- `{{INDEX}}` - Number (1, 2, 3...)
-- `{{ACTION}}` - What to do
-- `{{REASON}}` - Why it matters (brief)
-
----
-
-## Section Guidelines
-
-### Intro ({{INTRO}})
-Two paragraphs. First hooks with a question or surprising observation. Second expands with "here's what we found" energy. Should feel like the opening of a really good newsletter—makes you want to keep reading. Be cheeky, be specific, avoid clichés.
-
-### The Signal
-Reserve for genuinely important items:
-- Breaking news from Anthropic
-- Major ecosystem shifts
-- Tools/patterns that change how people work
-
-### Community Radar
-**Must include specific recent articles**, not just blog links. Each entry should be a piece of content published in the last 7 days, with its own summary and insights.
-
-### Quick Hits
-Rapid-fire items that don't need full treatment but are worth knowing. Good for:
-- Minor updates
-- Interesting repos without much to say
-- Things to bookmark for later
-
-### The Hit List
-Formerly "Actionable Items." Should feel like marching orders, not homework. Frame as opportunities, not obligations.

Разница между файлами не показана из-за своего большого размера
+ 0 - 11
pulse/articles_cache.json


+ 0 - 401
pulse/fetch.py

@@ -1,401 +0,0 @@
-#!/usr/bin/env python3
-"""
-Pulse Fetch - Parallel URL fetching for Claude Code news digest.
-
-Uses asyncio + ThreadPoolExecutor to fetch multiple URLs via Firecrawl simultaneously.
-Outputs JSON with fetched content for LLM summarization.
-
-Usage:
-    python fetch.py                          # Fetch all sources
-    python fetch.py --sources blogs          # Fetch only blogs
-    python fetch.py --max-workers 20         # Increase parallelism
-    python fetch.py --output pulse.json
-    python fetch.py --discover-articles      # Extract recent articles from blog homepages
-"""
-
-import os
-import sys
-import json
-import re
-from datetime import datetime, timezone
-from concurrent.futures import ThreadPoolExecutor, as_completed
-from pathlib import Path
-from urllib.parse import urlparse, urljoin
-import argparse
-
-# Try to import firecrawl
-try:
-    from firecrawl import FirecrawlApp
-    FIRECRAWL_AVAILABLE = True
-except ImportError:
-    FIRECRAWL_AVAILABLE = False
-    print("Warning: firecrawl not installed. Install with: pip install firecrawl-py")
-
-# Sources configuration
-SOURCES = {
-    "official": [
-        {"name": "Anthropic Engineering", "url": "https://www.anthropic.com/engineering", "type": "blog"},
-        {"name": "Claude Blog", "url": "https://claude.ai/blog", "type": "blog"},
-        {"name": "Claude Code Docs", "url": "https://code.claude.com", "type": "docs"},
-    ],
-    "blogs": [
-        {"name": "Simon Willison", "url": "https://simonwillison.net", "type": "blog"},
-        {"name": "Every", "url": "https://every.to", "type": "blog"},
-        {"name": "SSHH Blog", "url": "https://blog.sshh.io", "type": "blog"},
-        {"name": "Lee Han Chung", "url": "https://leehanchung.github.io", "type": "blog"},
-        {"name": "Nick Nisi", "url": "https://nicknisi.com", "type": "blog"},
-        {"name": "HumanLayer", "url": "https://www.humanlayer.dev/blog", "type": "blog"},
-        {"name": "Chris Dzombak", "url": "https://www.dzombak.com/blog", "type": "blog"},
-        {"name": "GitButler", "url": "https://blog.gitbutler.com", "type": "blog"},
-        {"name": "Docker Blog", "url": "https://www.docker.com/blog", "type": "blog"},
-        {"name": "Nx Blog", "url": "https://nx.dev/blog", "type": "blog"},
-        {"name": "Yee Fei Ooi", "url": "https://medium.com/@ooi_yee_fei", "type": "blog"},
-    ],
-    "community": [
-        {"name": "SkillsMP", "url": "https://skillsmp.com", "type": "marketplace"},
-        {"name": "Awesome Claude AI", "url": "https://awesomeclaude.ai", "type": "directory"},
-    ],
-}
-
-# Relevance keywords for filtering
-RELEVANCE_KEYWORDS = [
-    "claude", "claude code", "anthropic", "mcp", "model context protocol",
-    "agent", "skill", "subagent", "cli", "terminal", "prompt engineering",
-    "cursor", "windsurf", "copilot", "aider", "coding assistant", "hooks"
-]
-
-# Patterns to identify article links in markdown content
-ARTICLE_LINK_PATTERNS = [
-    # Standard markdown links with date-like paths
-    r'\[([^\]]+)\]\((https?://[^\)]+/\d{4}/[^\)]+)\)',
-    # Links with /blog/, /posts/, /p/ paths
-    r'\[([^\]]+)\]\((https?://[^\)]+/(?:blog|posts?|p|articles?)/[^\)]+)\)',
-    # Links with slugified titles (word-word-word pattern)
-    r'\[([^\]]+)\]\((https?://[^\)]+/[\w]+-[\w]+-[\w]+[^\)]*)\)',
-]
-
-# Exclude patterns (navigation, categories, tags, etc.)
-EXCLUDE_PATTERNS = [
-    r'/tag/', r'/category/', r'/author/', r'/page/', r'/archive/',
-    r'/about', r'/contact', r'/subscribe', r'/newsletter', r'/feed',
-    r'/search', r'/login', r'/signup', r'/privacy', r'/terms',
-    r'\.xml$', r'\.rss$', r'\.atom$', r'#', r'\?',
-]
-
-
-def fetch_url_firecrawl(app: 'FirecrawlApp', source: dict) -> dict:
-    """Fetch a single URL using Firecrawl API."""
-    url = source["url"]
-    name = source["name"]
-
-    try:
-        result = app.scrape(url, formats=['markdown'])
-
-        # Handle both dict and object responses
-        if hasattr(result, 'markdown'):
-            markdown = result.markdown or ''
-            metadata = result.metadata.__dict__ if hasattr(result.metadata, '__dict__') else {}
-        else:
-            markdown = result.get('markdown', '')
-            metadata = result.get('metadata', {})
-
-        return {
-            "name": name,
-            "url": url,
-            "type": source.get("type", "unknown"),
-            "status": "success",
-            "content": markdown[:50000],  # Limit content size
-            "title": metadata.get('title', name),
-            "description": metadata.get('description', ''),
-            "fetched_at": datetime.utcnow().isoformat() + "Z",
-        }
-    except Exception as e:
-        return {
-            "name": name,
-            "url": url,
-            "type": source.get("type", "unknown"),
-            "status": "error",
-            "error": str(e),
-            "fetched_at": datetime.utcnow().isoformat() + "Z",
-        }
-
-
-def get_firecrawl_api_key():
-    """Get Firecrawl API key from env or config file."""
-    import re
-
-    # Try environment variable first
-    key = os.getenv('FIRECRAWL_API_KEY')
-    if key:
-        return key
-
-    # Try ~/.claude/delegate.yaml
-    config_path = os.path.expanduser("~/.claude/delegate.yaml")
-    if os.path.exists(config_path):
-        try:
-            with open(config_path, encoding="utf-8") as f:
-                content = f.read()
-            # Parse the api_keys block and find firecrawl
-            in_api_keys = False
-            for line in content.split('\n'):
-                stripped = line.strip()
-                if stripped.startswith('api_keys:'):
-                    in_api_keys = True
-                    continue
-                if in_api_keys and stripped and not line.startswith(' ') and not line.startswith('\t'):
-                    if not stripped.startswith('#'):
-                        in_api_keys = False
-                if in_api_keys and 'firecrawl:' in stripped.lower():
-                    match = re.search(r'firecrawl:\s*["\']?([^"\'\n#]+)', stripped, re.IGNORECASE)
-                    if match:
-                        return match.group(1).strip()
-        except Exception:
-            pass
-
-    return None
-
-
-def fetch_all_parallel(sources: list, max_workers: int = 10) -> list:
-    """Fetch all URLs in parallel using ThreadPoolExecutor."""
-    if not FIRECRAWL_AVAILABLE:
-        print("Error: firecrawl not available")
-        return []
-
-    api_key = get_firecrawl_api_key()
-    if not api_key:
-        print("Error: FIRECRAWL_API_KEY not set. Set env var or add to ~/.claude/delegate.yaml")
-        return []
-
-    app = FirecrawlApp(api_key=api_key)
-    results = []
-    total = len(sources)
-    completed = 0
-
-    print(f"Fetching {total} URLs with {max_workers} workers...")
-
-    with ThreadPoolExecutor(max_workers=max_workers) as executor:
-        # Submit all tasks
-        future_to_source = {
-            executor.submit(fetch_url_firecrawl, app, source): source
-            for source in sources
-        }
-
-        # Process results as they complete
-        for future in as_completed(future_to_source):
-            source = future_to_source[future]
-            completed += 1
-
-            try:
-                result = future.result()
-                results.append(result)
-                status = "OK" if result["status"] == "success" else "FAIL"
-                print(f"[{completed}/{total}] {status}: {source['name']}")
-            except Exception as e:
-                print(f"[{completed}/{total}] ERROR: {source['name']} - {e}")
-                results.append({
-                    "name": source["name"],
-                    "url": source["url"],
-                    "status": "error",
-                    "error": str(e),
-                })
-
-    return results
-
-
-def extract_article_links(content: str, base_url: str, max_articles: int = 5) -> list:
-    """Extract article links from markdown content."""
-    articles = []
-    seen_urls = set()
-    base_domain = urlparse(base_url).netloc
-
-    for pattern in ARTICLE_LINK_PATTERNS:
-        matches = re.findall(pattern, content)
-        for title, url in matches:
-            # Skip if already seen
-            if url in seen_urls:
-                continue
-
-            # Skip excluded patterns
-            if any(re.search(exc, url, re.IGNORECASE) for exc in EXCLUDE_PATTERNS):
-                continue
-
-            # Ensure same domain or relative URL
-            parsed = urlparse(url)
-            if parsed.netloc and parsed.netloc != base_domain:
-                continue
-
-            # Clean up title
-            title = title.strip()
-            if len(title) < 5 or len(title) > 200:
-                continue
-
-            # Skip generic link text
-            if title.lower() in ['read more', 'continue reading', 'link', 'here', 'click here']:
-                continue
-
-            seen_urls.add(url)
-            articles.append({
-                "title": title,
-                "url": url,
-            })
-
-    return articles[:max_articles]
-
-
-def discover_articles(sources: list, max_workers: int = 10, max_articles_per_source: int = 5) -> list:
-    """Fetch blog homepages and extract recent article links."""
-    if not FIRECRAWL_AVAILABLE:
-        print("Error: firecrawl not available")
-        return []
-
-    api_key = get_firecrawl_api_key()
-    if not api_key:
-        print("Error: FIRECRAWL_API_KEY not set. Set env var or add to ~/.claude/delegate.yaml")
-        return []
-
-    # First, fetch all blog homepages
-    print(f"Phase 1: Fetching {len(sources)} blog homepages...")
-    homepage_results = fetch_all_parallel(sources, max_workers=max_workers)
-
-    # Extract article links from each
-    all_articles = []
-    print(f"\nPhase 2: Extracting article links...")
-
-    for result in homepage_results:
-        if result["status"] != "success":
-            continue
-
-        content = result.get("content", "")
-        base_url = result["url"]
-        source_name = result["name"]
-
-        articles = extract_article_links(content, base_url, max_articles=max_articles_per_source)
-        print(f"  {source_name}: found {len(articles)} articles")
-
-        for article in articles:
-            all_articles.append({
-                "name": article["title"],
-                "url": article["url"],
-                "type": "article",
-                "source_name": source_name,
-                "source_url": base_url,
-            })
-
-    if not all_articles:
-        print("No articles found to fetch")
-        return homepage_results
-
-    # Phase 3: Fetch individual articles
-    print(f"\nPhase 3: Fetching {len(all_articles)} individual articles...")
-    article_results = fetch_all_parallel(all_articles, max_workers=max_workers)
-
-    # Add source info to results
-    for i, result in enumerate(article_results):
-        if i < len(all_articles):
-            result["source_name"] = all_articles[i].get("source_name", "")
-            result["source_url"] = all_articles[i].get("source_url", "")
-
-    return article_results
-
-
-def filter_relevant_content(results: list) -> list:
-    """Filter results to only those with Claude Code relevant content."""
-    relevant = []
-
-    for result in results:
-        if result["status"] != "success":
-            continue
-
-        content = ((result.get("content") or "") + " " +
-                   (result.get("title") or "") + " " +
-                   (result.get("description") or "")).lower()
-
-        # Check for relevance keywords
-        for keyword in RELEVANCE_KEYWORDS:
-            if keyword.lower() in content:
-                result["relevant_keyword"] = keyword
-                relevant.append(result)
-                break
-
-    return relevant
-
-
-def main():
-    parser = argparse.ArgumentParser(description="Pulse Fetch - Parallel URL fetching")
-    parser.add_argument("--sources", choices=["all", "official", "blogs", "community"],
-                        default="all", help="Source category to fetch")
-    parser.add_argument("--max-workers", type=int, default=10,
-                        help="Maximum parallel workers (default: 10)")
-    parser.add_argument("--output", "-o", type=str, default=None,
-                        help="Output JSON file (default: stdout)")
-    parser.add_argument("--filter-relevant", action="store_true",
-                        help="Only include results with relevant keywords")
-    parser.add_argument("--discover-articles", action="store_true",
-                        help="Extract and fetch individual articles from blog homepages")
-    parser.add_argument("--max-articles-per-source", type=int, default=5,
-                        help="Max articles to fetch per source (default: 5)")
-    args = parser.parse_args()
-
-    # Collect sources based on selection
-    if args.sources == "all":
-        sources = []
-        for category in SOURCES.values():
-            sources.extend(category)
-    else:
-        sources = SOURCES.get(args.sources, [])
-
-    if not sources:
-        print(f"No sources found for category: {args.sources}")
-        return 1
-
-    # Fetch URLs - either discover articles or just fetch homepages
-    if args.discover_articles:
-        # Filter to only blog-type sources for article discovery
-        blog_sources = [s for s in sources if s.get("type") == "blog"]
-        if not blog_sources:
-            print("No blog sources found for article discovery")
-            return 1
-        results = discover_articles(
-            blog_sources,
-            max_workers=args.max_workers,
-            max_articles_per_source=args.max_articles_per_source
-        )
-    else:
-        results = fetch_all_parallel(sources, max_workers=args.max_workers)
-
-    # Filter if requested
-    if args.filter_relevant:
-        results = filter_relevant_content(results)
-        print(f"\nFiltered to {len(results)} relevant results")
-
-    # Prepare output
-    output = {
-        "fetched_at": datetime.utcnow().isoformat() + "Z",
-        "total_sources": len(sources),
-        "successful": len([r for r in results if r.get("status") == "success"]),
-        "failed": len([r for r in results if r.get("status") != "success"]),
-        "results": results,
-    }
-
-    # Output
-    json_output = json.dumps(output, indent=2)
-
-    if args.output:
-        Path(args.output).write_text(json_output, encoding="utf-8")
-        print(f"\nResults saved to: {args.output}")
-    else:
-        print("\n" + "=" * 60)
-        print("RESULTS")
-        print("=" * 60)
-        print(json_output)
-
-    # Summary
-    print(f"\n{'=' * 60}")
-    print(f"SUMMARY: {output['successful']}/{output['total_sources']} successful")
-    print(f"{'=' * 60}")
-
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())

Разница между файлами не показана из-за своего большого размера
+ 0 - 21
pulse/fetch_cache.json


+ 0 - 45
pulse/state.json

@@ -1,45 +0,0 @@
-{
-  "version": "1.0",
-  "last_run": "2025-12-23T12:00:00Z",
-  "seen_urls": [
-    "https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents",
-    "https://www.anthropic.com/engineering/advanced-tool-use",
-    "https://www.anthropic.com/engineering/code-execution-with-mcp",
-    "https://www.anthropic.com/engineering/claude-code-sandboxing",
-    "https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills",
-    "https://github.com/anthropics/claude-code/releases/tag/v2.0.74",
-    "https://www.anthropic.com/news/donating-the-model-context-protocol-and-establishing-of-the-agentic-ai-foundation",
-    "https://www.anthropic.com/news/compliance-framework-SB53",
-    "https://www.anthropic.com/news/genesis-mission-partnership",
-    "https://www.anthropic.com/news/protecting-well-being-of-users",
-    "https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools",
-    "https://github.com/musistudio/claude-code-router",
-    "https://github.com/wshobson/agents",
-    "https://github.com/thedotmack/claude-mem",
-    "https://github.com/ryoppippi/ccusage",
-    "https://github.com/czlonkowski/n8n-mcp",
-    "https://github.com/obra/superpowers",
-    "https://simonwillison.net/2025/Dec/22/claude-chrome-cloudflare/",
-    "https://simonwillison.net/2025/Dec/18/code-proven-to-work/",
-    "https://simonwillison.net/2025/Dec/17/gemini-3-flash/",
-    "https://skillsmp.com",
-    "https://awesomeclaude.ai",
-    "https://simonwillison.net"
-  ],
-  "seen_commits": {
-    "anthropics/claude-code": "d213a74",
-    "anthropics/skills": "69c0b1a"
-  },
-  "digest_history": [
-    {
-      "date": "2025-12-12",
-      "file": "2025-12-12_pulse.md",
-      "items_count": 24
-    },
-    {
-      "date": "2025-12-23",
-      "file": "2025-12-23_pulse.md",
-      "items_count": 18
-    }
-  ]
-}

Некоторые файлы не были показаны из-за большого количества измененных файлов