Token导航 LogoToken导航

Agent Skill · 开发

newsletter-campaign-workflow(时事通讯活动工作流程)

newsletter-campaign-workflow 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

newsletter-campaign-workflow 是开发类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描有提醒项,按安装量在开发类的 21,746 个 Skill 里排第 14,373。

总安装 710周安装 29GitHub Stars 1下载 227核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:newsletter-campaign-workflow(时事通讯活动工作流程)
来源仓库:https://github.com/venture-formations/aiprodaily
仓库路径:skills/newsletter-campaign-workflow
安装命令:
npx skills add https://github.com/venture-formations/aiprodaily --skill newsletter-campaign-workflow
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/venture-formations/aiprodaily --skill newsletter-campaign-workflow

这个 Skill 是做什么的

开发类 Skill 面向写代码、改代码和排查问题,一般会读写仓库文件,部分还会执行构建或测试命令。

newsletter-campaign-workflow 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。

适用于 GitHub 仓库管理、代码协作、Issue 跟踪等开发相关任务场景。通过 npx skills add 命令从指定 GitHub 仓库安装,需确认权限范围和联网需求。安装前建议核实维护状态、是否会触发命令执行或文件读写操作。可结合原始 README 文档进一步核验具体功能和使用方法。

来源仓库内路径:skills/newsletter-campaign-workflow

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/venture-formations/aiprodaily --skill newslett…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

newsletter-campaign-workflow 怎么安装?

在终端执行 npx skills add https://github.com/venture-formations/aiprodaily --skill newsletter-campaig…。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

newsletter-campaign-workflow 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

newsletter-campaign-workflow 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

newsletter-campaign-workflow 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

newsletter-campaign-workflow 用的人多吗?

公开数据是累计安装 710 次,近一周安装 29 次,下载 227 次,GitHub 1 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

newsletter-campaign-workflow 安全吗?

第三方扫描有提醒项,说明存在需要人工确认的行为。安装前请打开源码看清它读了什么、联网到哪里。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理开发类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

开发类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
skill-vetter

技能审查员 · OpenClaw

8,779,018986操作浏览器MIT-0通过
ontology

本体论 · OpenClaw

6,636,960576只读MIT-0通过
entra-app-registration

内部应用程序注册 · Codex、Claude

6,631,872764接触敏感数据未明确通过
entra-app-registration

内部应用程序注册 · Codex、Claude

3,757,680201接触敏感数据未明确通过
nano-banana-pro

纳米香蕉专业版 · OpenClaw

3,526,898364接触敏感数据MIT-0有提醒
newsletter-campaign-workflow

时事通讯活动工作流程 · 本页

7101需要联网未明确有提醒

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Newsletter Campaign Workflow Skill

Purpose

Comprehensive guide for working with the AIProDaily newsletter platform's campaign workflow system, including RSS processing, article generation, multi-tenant data management, and automated publication.

When to Use

Automatically activates when working with:

  • Campaign creation and management
  • RSS feed processing and article generation
  • Workflow steps and automation
  • Newsletter publication and sending
  • MailerLite integration
  • Multi-tenant campaign operations
  • Advertorial and ad management
  • Campaign status transitions

System Architecture

Multi-Tenant Structure

Newsletter (slug: "accounting")
  → publication_id (UUID)
    → Campaigns (daily)
      → RSS Posts (scored, assigned)
        → Articles (generated from posts)
          → Email (sent via MailerLite)

CRITICAL: ALL database queries MUST filter by publication_id

Issue Status Lifecycle

draft → processing → ready → approved → sent
         ↓ (if error)
       failed

Status Meanings:

  • draft: Issue created, ready for workflow
  • processing: Workflow actively running
  • ready: Content generated, ready for review
  • approved: Manual approval for sending
  • sent: Published to subscribers
  • failed: Workflow error occurred

Note: "Issue" replaced "campaign" in the codebase. The issues table was formerly newsletter_campaigns.


Core Workflow: 10-Step RSS Processing

Location: src/lib/workflows/process-rss-workflow.ts Architecture: Vercel Workflows Timeout: 800 seconds per step Trigger: /api/cron/trigger-workflow (every 5 minutes)

Workflow Steps

  1. Setup (800s)

- Create tomorrow's campaign - Select AI apps/prompts - Assign top 24 posts (12 primary + 12 secondary) - Run deduplication

  1. Generate Primary Titles (800s)

- Generate 6 primary headlines

3-4. Generate Primary Bodies (800s each)

  • Batch 1: Generate 3 primary articles
  • Batch 2: Generate 3 more primary articles
  1. Fact-Check Primary (800s)

- Fact-check all 6 primary articles - Store fact_check_score (0-10)

  1. Generate Secondary Titles (800s)

- Generate 6 secondary headlines

7-8. Generate Secondary Bodies (800s each)

  • Batch 1: Generate 3 secondary articles
  • Batch 2: Generate 3 more secondary articles
  1. Fact-Check Secondary (800s)

- Fact-check all 6 secondary articles

  1. Finalize (800s)

- Auto-select top 3 per section - Generate welcome section - Generate subject line - Set status to draft - Unassign unused posts

Workflow Best Practices

✅ Error Handling Pattern:

let retryCount = 0
const maxRetries = 2

while (retryCount <= maxRetries) {
  try {
    await processStep()
    return  // Success
  } catch (error) {
    retryCount++
    if (retryCount > maxRetries) {
      console.error('[Step X/10] Failed after retries')
      throw error
    }
    console.log(`[Step X/10] Retrying (${retryCount}/${maxRetries})...`)
    await new Promise(resolve => setTimeout(resolve, 2000))
  }
}

✅ Logging Pattern:

// One-line summaries with prefixes
console.log('[Workflow] Step 1/10: Setup complete, 24 posts assigned')
console.log('[AI] Batch 1/4: Scored 3 posts, avg: 7.2')
console.error('[DB] Query failed:', error.message)

Log Prefixes:

  • [Workflow] - Vercel Workflow orchestration
  • [RSS] - RSS processing
  • [AI] - OpenAI/Claude API calls
  • [DB] - Database operations
  • [CRON] - Cron job execution

Critical Rules

1. Multi-Tenant Isolation

ALWAYS filter by publication_id:

// ✅ CORRECT
const { data } = await supabaseAdmin
  .from('articles')
  .select('*')
  .eq('campaign_id', campaignId)
  .eq('publication_id', newsletterId)  // REQUIRED

// ❌ WRONG - Data leakage!
const { data } = await supabaseAdmin
  .from('articles')
  .select('*')
  .eq('campaign_id', campaignId)

2. Date/Time Handling

NEVER use UTC conversions for date comparisons:

// ✅ CORRECT: Local date comparison
const dateStr = date.split('T')[0]  // "2025-01-07"
const today = new Date().toISOString().split('T')[0]
if (dateStr === today) { /* ... */ }

// ❌ FORBIDDEN: UTC conversion shifts dates
date.toISOString()  // Wrong timezone!
date.toUTCString()  // Breaks comparisons!

Why: UTC conversion shifts dates by timezone. Users expect Central Time.

3. Performance & Limits

Hard Limits (Vercel):

  • Workflow step timeout: 800 seconds (13 minutes per step)
  • API route timeout: 600 seconds (10 minutes max)
  • Log size: 10MB maximum
  • Memory: 1024MB default

AI Integration

Standard Pattern: callAIWithPrompt()

Location: src/lib/openai.ts

import { callAIWithPrompt } from '@/lib/openai'

const result = await callAIWithPrompt(
  'ai_prompt_primary_article_title',  // Key in app_settings
  newsletterId,
  {
    title: post.title,
    description: post.description,
    content: post.full_article_text
  }
)
// result = { headline: "Your Generated Title" }

How it works:

  1. Loads complete JSON prompt from app_settings table
  2. Replaces placeholders (e.g., {{title}}, {{content}})
  3. Calls AI API (OpenAI or Claude)
  4. Returns parsed JSON response

Prompt Storage Format

INSERT INTO app_settings (key, value, publication_id, ai_provider)
VALUES (
  'ai_prompt_primary_article_title',
  '{
    "model": "gpt-4o",
    "temperature": 0.7,
    "max_output_tokens": 500,
    "response_format": { "type": "json_schema", "json_schema": {...} },
    "messages": [
      {"role": "system", "content": "You are a headline writer..."},
      {"role": "user", "content": "Title: {{title}}\n\nWrite a headline."}
    ]
  }',
  'newsletter-uuid',
  'openai'
);

All parameters stored in database, not hardcoded.


Database Schema (Key Tables)

Note: "Issues" replaced "campaigns" in the database. The table issues was formerly newsletter_campaigns.

publications (formerly newsletters)
  ├── issues (status: draft → processing → ready → sent)
  │   ├── issue_articles (primary section, 6 generated, 3 active)
  │   ├── secondary_articles (secondary section, 6 generated, 3 active)
  │   └── rss_posts (assigned posts)
  │       └── post_ratings (multi-criteria scores)
  │
  ├── rss_feeds (active/inactive, section assignment)
  ├── publication_settings (key-value config, scoped by publication_id)
  ├── advertisements (advertorials for rotation)
  ├── issue_advertisements (tracks ad usage per issue)
  └── archived_articles, archived_rss_posts (historical data)

API Route Template

// app/api/[feature]/route.ts
import { NextRequest, NextResponse } from 'next/server'
import { supabaseAdmin } from '@/lib/supabase'

export async function POST(request: NextRequest) {
  try {
    const body = await request.json()

    if (!body.campaignId) {
      return NextResponse.json(
        { error: 'Missing campaignId' },
        { status: 400 }
      )
    }

    const result = await processData(body)
    return NextResponse.json({ data: result })

  } catch (error: any) {
    console.error('[API] Error:', error.message)
    return NextResponse.json(
      { error: 'Internal server error' },
      { status: 500 }
    )
  }
}

export const maxDuration = 600  // 10 minutes for long operations

Common Tasks

Create New Campaign

const { data: campaign } = await supabaseAdmin
  .from('newsletter_campaigns')
  .insert({
    publication_id: newsletterId,
    date: tomorrowDate,  // YYYY-MM-DD format
    status: 'draft',
    subject_line: null
  })
  .select()
  .single()

Assign RSS Posts to Campaign

await supabaseAdmin
  .from('rss_posts')
  .update({
    campaign_id: campaignId,
    assigned_at: new Date().toISOString(),
    section: 'primary'  // or 'secondary'
  })
  .in('id', topPostIds)
  .eq('publication_id', newsletterId)  // REQUIRED

Generate Article Content

const result = await callAIWithPrompt(
  'ai_prompt_primary_article_body',
  newsletterId,
  {
    title: post.title,
    description: post.description,
    content: post.full_article_text
  }
)

await supabaseAdmin
  .from('articles')
  .insert({
    campaign_id: campaignId,
    publication_id: newsletterId,  // REQUIRED
    rss_post_id: post.id,
    headline: result.headline,
    article_text: result.body,
    fact_check_score: null,
    is_active: false
  })

Automation & Cron Jobs

Configuration: vercel.json

Active Crons

CronSchedulePurpose
/api/cron/trigger-workflowEvery 5 minTrigger RSS workflow if scheduled
/api/cron/ingest-rssEvery 15 minFetch & score new RSS posts
/api/cron/send-reviewEvery 5 minCreate MailerLite campaign and send review email
/api/cron/send-finalEvery 5 minSend final issues (status: approved)
/api/cron/send-secondaryEvery 5 minSend secondary newsletter
/api/cron/monitor-workflowsEvery 5 minCheck for failed/stuck workflows
/api/cron/process-mailerlite-updatesEvery 5 minProcess MailerLite webhooks
/api/cron/cleanup-pending-submissionsDaily 7 AMClear stale ad submissions
/api/cron/import-metricsDaily 6 AMSync MailerLite metrics
/api/cron/health-checkEvery 5 min (8AM-10PM)System health check

Not Implemented (registered in vercel.json but empty)

CronScheduleNotes
/api/cron/populate-eventsEvery 5 minEvents system not implemented
/api/cron/sync-eventsDaily midnightEvents system not implemented
/api/cron/generate-weatherDaily 8 PMRoute file missing
/api/cron/collect-wordleDaily 7 PMRoute file missing

Troubleshooting

Campaign Stuck in "processing"

-- Check workflow status
SELECT id, status, date, created_at, updated_at
FROM newsletter_campaigns
WHERE status = 'processing'
AND publication_id = 'your-newsletter-id'
ORDER BY created_at DESC;

-- Reset to draft (if needed)
UPDATE newsletter_campaigns
SET status = 'draft'
WHERE id = 'campaign-id'
AND publication_id = 'your-newsletter-id';

Posts Not Scoring

  1. Check RSS ingestion: /api/cron/ingest-rss logs
  2. Verify criteria config: SELECT * FROM app_settings WHERE key LIKE 'criteria_%' AND publication_id =?
  3. Check prompts exist: SELECT * FROM app_settings WHERE key LIKE 'ai_prompt_criteria_%' AND publication_id =?
  4. Verify feeds active: SELECT * FROM rss_feeds WHERE active = true AND publication_id =?

Workflow Failures

  1. Check Vercel logs: vercel logs --since 1h
  2. Check workflow monitor cron: /api/cron/monitor-workflows
  3. Look for timeout errors (step > 800s)
  4. Check retry count in logs

Reference Documentation

See claude.md in project root for:

  • Complete workflow details
  • Multi-criteria scoring system
  • RSS feed management
  • MailerLite integration
  • Advertorial rotation
  • Section management

Skill Status: ACTIVE ✅ Line Count: < 500 (following best practices) ✅ Project-Specific: Tailored for AIProDaily tech stack ✅

平台分布

Codex

36.62%
按下载量换算83

Claude

31.75%
按下载量换算72

Cursor

17.04%
按下载量换算39

Gemini CLI

9.98%
按下载量换算23

安全审计

Gen Agent Trust Hub

通过

Socket

可疑

Snyk

可疑

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills