ops-social-planner
GitHub提供多引擎社交媒体计划内容的只读仪表板,聚合身份与项目下的草稿及广告,按渠道和时间分组展示。支持本地服务UI并自动打开浏览器,用于内容日历查看与调度监控。
Trigger Scenarios
Install
npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-social-planner -g -y
SKILL.md
Frontmatter
{
"name": "ops-social-planner",
"effort": "medium",
"maxTurns": 25,
"description": "OPS on-demand: This skill should be used when the user asks to \"content calendar\", \"what is scheduled\"…",
"allowed-tools": [
"Bash",
"Read",
"Grep",
"Glob",
"mcp__typefully__typefully_list_drafts",
"mcp__typefully__typefully_get_draft",
"mcp__typefully__typefully_get_queue",
"mcp__upload-post__list_scheduled",
"mcp__upload-post__list_profiles"
],
"argument-hint": "[--project <id>] [--collect-only] [--port <n>] [--no-open]"
}
/ops-social-planner — engine-agnostic planned-content viewer
Load ops-rules before acting. Public repo (no personal data). Outbound: one draft → one approval → one send. If AskUserQuestion / Workflow are missing, follow Rule 10 in ops-rules (Hermes: numbered options / two-turn Telegram card; delegate_task).
Read-only dashboard of every scheduled post and ad, grouped identity/project → channel → time,
regardless of posting engine. Personal/founder identity and project brands stay strictly separated
(see /ops-socials identity rules). See SPEC.md for the full design.
What it does
bin/ops-social-planner collectreads$PREFS_PATH/preferences.json(marketing.social_identities.personal.*+marketing.projects.*.social), dispatches a per-engine fetcher keyed onsocial.engine.primary, normalizes to one schema, and writes$OPS_DATA_DIR/social-planner/state.json(owner data — never committed, Rule 0).- It then serves the static UI (
ui/) on localhost and opens the browser.
Engines
engine.primary |
Source | Status |
|---|---|---|
typefully |
GET /v2/social-sets/{id}/drafts (Bearer; key from ~/.config/typefully/config.json) |
✅ wired |
upload-post |
GET /api/uploadposts/schedule (Apikey; key from engine.upload_post.api_key_ref) |
✅ wired |
meta-graph / meta-ads |
Graph Ads API per project BM/token | 🔌 hook (UI shows "pending") |
google-ads |
GAQL per project customer id | 🔌 hook |
null / unprovisioned |
— | shown fail-closed (0 items) |
Adding an engine = adding one fetch<Engine>() in bin/ops-social-planner + a dispatch branch. No UI change.
Run it
"${CLAUDE_PLUGIN_ROOT}/bin/ops-social-planner" # collect → serve → open
"${CLAUDE_PLUGIN_ROOT}/bin/ops-social-planner" collect # regenerate state.json only
"${CLAUDE_PLUGIN_ROOT}/bin/ops-social-planner" serve --port 7937 # serve existing state
The UI renders ui/state.sample.json (synthetic, PII-free) when no live state exists, so it works
with zero credentials — useful for the PR preview.
Agent enrichment path (optional, when invoked as a skill)
The headless collector covers posts on wired engines. When richer output is wanted, the agent can:
- Pull ads via MCP (
mcp__meta__*, Google Ads) per project and mergekind:"ad"items intostate.json. - Replace the heuristic
rationalewith an LLM-written one (slot + sequence + channel intent). - Re-run
serveto refresh. Do not publish or edit from here — routing/mutation belongs to/ops-socials+/ops-marketing.
Guarantees
- Read-only. No secrets in the client. Server binds
127.0.0.1only. - Identity separation honored: personal vs project never merged; unprovisioned projects render fail-closed.
- No owner data committed — only
ui/+bin/+SPEC.md+ the synthetic fixture.
Version History
-
6f1e3e0
Current 2026-08-27 09:33
修复文件竞态条件,优化发现索引读取逻辑,确保缺失能力文件时安全退出,并修正市场标识命名问题。
- 64bad13 2026-08-12 09:02


