myaidev-method 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +0 -1
- package/.env.example +5 -4
- package/CHANGELOG.md +2 -2
- package/CONTENT_CREATION_GUIDE.md +489 -3211
- package/DEVELOPER_USE_CASES.md +1 -1
- package/MODULAR_INSTALLATION.md +2 -2
- package/README.md +39 -33
- package/TECHNICAL_ARCHITECTURE.md +1 -1
- package/USER_GUIDE.md +242 -190
- package/agents/content-editor-agent.md +90 -0
- package/agents/content-planner-agent.md +97 -0
- package/agents/content-research-agent.md +62 -0
- package/agents/content-seo-agent.md +101 -0
- package/agents/content-writer-agent.md +69 -0
- package/agents/infographic-analyzer-agent.md +63 -0
- package/agents/infographic-designer-agent.md +72 -0
- package/bin/cli.js +776 -422
- package/{content-rules.example.md → content-rules-example.md} +2 -2
- package/dist/mcp/health-check.js +82 -68
- package/dist/mcp/mcp-config.json +8 -0
- package/dist/mcp/openstack-server.js +1746 -1262
- package/dist/server/.tsbuildinfo +1 -1
- package/extension.json +21 -4
- package/package.json +181 -184
- package/skills/company-config/SKILL.md +133 -0
- package/skills/configure/SKILL.md +1 -1
- package/skills/myai-configurator/SKILL.md +77 -0
- package/skills/myai-configurator/content-creation-configurator/SKILL.md +516 -0
- package/skills/myai-configurator/content-maintenance-configurator/SKILL.md +397 -0
- package/skills/myai-content-enrichment/SKILL.md +114 -0
- package/skills/myai-content-ideation/SKILL.md +288 -0
- package/skills/myai-content-ideation/evals/evals.json +182 -0
- package/skills/myai-content-production-coordinator/SKILL.md +946 -0
- package/skills/{content-rules-setup → myai-content-rules-setup}/SKILL.md +1 -1
- package/skills/{content-verifier → myai-content-verifier}/SKILL.md +1 -1
- package/skills/myai-content-writer/SKILL.md +333 -0
- package/skills/{infographic → myai-infographic}/SKILL.md +1 -1
- package/skills/myai-proprietary-content-verifier/SKILL.md +175 -0
- package/skills/myai-proprietary-content-verifier/evals/evals.json +36 -0
- package/skills/myai-skill-builder/SKILL.md +699 -0
- package/skills/myai-skill-builder/agents/analyzer-agent.md +137 -0
- package/skills/myai-skill-builder/agents/comparator-agent.md +77 -0
- package/skills/myai-skill-builder/agents/grader-agent.md +103 -0
- package/skills/myai-skill-builder/assets/eval_review.html +131 -0
- package/skills/myai-skill-builder/references/schemas.md +211 -0
- package/skills/myai-skill-builder/scripts/aggregate_benchmark.py +190 -0
- package/skills/myai-skill-builder/scripts/generate_review.py +381 -0
- package/skills/myai-skill-builder/scripts/package_skill.py +91 -0
- package/skills/myai-skill-builder/scripts/run_eval.py +105 -0
- package/skills/myai-skill-builder/scripts/run_loop.py +211 -0
- package/skills/myai-skill-builder/scripts/utils.py +123 -0
- package/skills/myai-visual-generator/SKILL.md +125 -0
- package/skills/myai-visual-generator/evals/evals.json +155 -0
- package/skills/myai-visual-generator/references/infographic-pipeline.md +73 -0
- package/skills/myai-visual-generator/references/research-visuals.md +57 -0
- package/skills/myai-visual-generator/references/services.md +89 -0
- package/skills/myai-visual-generator/scripts/visual-generation-utils.js +1272 -0
- package/skills/myaidev-figma/SKILL.md +212 -0
- package/skills/myaidev-figma/capture.js +133 -0
- package/skills/myaidev-figma/crawl.js +130 -0
- package/skills/myaidev-figma-configure/SKILL.md +130 -0
- package/skills/openstack-manager/SKILL.md +1 -1
- package/skills/payloadcms-publisher/SKILL.md +141 -77
- package/skills/payloadcms-publisher/references/field-mapping.md +142 -0
- package/skills/payloadcms-publisher/references/lexical-format.md +97 -0
- package/skills/security-auditor/SKILL.md +1 -1
- package/src/cli/commands/addon.js +105 -7
- package/src/config/workflows.js +172 -228
- package/src/lib/ascii-banner.js +197 -182
- package/src/lib/{content-coordinator.js → content-production-coordinator.js} +649 -459
- package/src/lib/installation-detector.js +93 -59
- package/src/lib/payloadcms-utils.js +285 -510
- package/src/lib/workflow-installer.js +55 -0
- package/src/mcp/health-check.js +82 -68
- package/src/mcp/openstack-server.js +1746 -1262
- package/src/scripts/configure-visual-apis.js +224 -173
- package/src/scripts/configure-wordpress-mcp.js +96 -66
- package/src/scripts/init/install.js +109 -85
- package/src/scripts/init-project.js +138 -67
- package/src/scripts/utils/write-content.js +67 -52
- package/src/scripts/wordpress/publish-to-wordpress.js +128 -128
- package/src/templates/claude/CLAUDE.md +19 -12
- package/hooks/hooks.json +0 -26
- package/skills/content-coordinator/SKILL.md +0 -130
- package/skills/content-enrichment/SKILL.md +0 -80
- package/skills/content-writer/SKILL.md +0 -285
- package/skills/skill-builder/SKILL.md +0 -417
- package/skills/visual-generator/SKILL.md +0 -140
- /package/skills/{content-writer → myai-content-writer}/agents/editor-agent.md +0 -0
- /package/skills/{content-writer → myai-content-writer}/agents/planner-agent.md +0 -0
- /package/skills/{content-writer → myai-content-writer}/agents/research-agent.md +0 -0
- /package/skills/{content-writer → myai-content-writer}/agents/seo-agent.md +0 -0
- /package/skills/{content-writer → myai-content-writer}/agents/visual-planner-agent.md +0 -0
- /package/skills/{content-writer → myai-content-writer}/agents/writer-agent.md +0 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: myai-content-ideation
|
|
3
|
+
description: Researches a topic area, discovers strategic Themes, and creates ideation briefs and article plans. Internal agent — dispatched by content-writer and production-coordinator.
|
|
4
|
+
user-invocable: false
|
|
5
|
+
allowed-tools: [Read, Write, WebSearch, WebFetch, Glob, Bash]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Content Ideation + Planning
|
|
9
|
+
|
|
10
|
+
Given a topic (or a broad area), audience, and content type, discover **Themes**, research supporting material, and produce four outputs:
|
|
11
|
+
|
|
12
|
+
1. `content-themes.json` - persistent file of discovered Themes (appended across runs)
|
|
13
|
+
2. `.content-session/ideation.md` - per-session ideation brief for the next pipeline phase
|
|
14
|
+
3. `.content-session/plan.md` - actionable article structure and keyword placement plan for the writer
|
|
15
|
+
4. `content-queue/{jobDir}/` - content stubs (one per Theme) ready for the production coordinator
|
|
16
|
+
|
|
17
|
+
## What Is a Theme?
|
|
18
|
+
|
|
19
|
+
A **Theme** is a strategic content grouping: a title, a description, and reference URLs that demonstrate the kind of content belonging to it. Themes ensure content variety, strategic coverage, and topical authority.
|
|
20
|
+
|
|
21
|
+
A Theme contains exactly four fields:
|
|
22
|
+
|
|
23
|
+
| Field | Type | Description |
|
|
24
|
+
|-------|------|-------------|
|
|
25
|
+
| `title` | string | Short, descriptive name for the editorial grouping |
|
|
26
|
+
| `description` | string | 1-3 sentences explaining the angle, why it matters, and who it is for |
|
|
27
|
+
| `strategy` | string | The ideation approach used to develop content under this Theme (see **Strategies** below) |
|
|
28
|
+
| `referenceUrls` | string[] | 2-5 URLs of existing published content (yours or competitors') that exemplify this Theme |
|
|
29
|
+
|
|
30
|
+
### Strategies
|
|
31
|
+
|
|
32
|
+
A strategy is the ideation lens through which a Theme's content is approached. When discovering Themes, propose a strategy for each one. During interactive sessions, discuss strategy options with the user to find the best fit for the topic and audience.
|
|
33
|
+
|
|
34
|
+
| Strategy | When to use |
|
|
35
|
+
|----------|-------------|
|
|
36
|
+
| **Gap Analysis** | There is a clear gap in existing coverage — missing subtopics, unanswered questions, or underserved audiences that your content can fill |
|
|
37
|
+
| **Current Trends** | The topic intersects with recent developments, emerging technology, industry shifts, or timely events worth capitalizing on |
|
|
38
|
+
| **Related Subject** | The core topic connects to an adjacent domain; bridging the two creates unique cross-disciplinary value |
|
|
39
|
+
| **Hub and Spoke** | The Theme is broad enough to warrant a pillar piece with multiple supporting articles linking back to it for topical authority |
|
|
40
|
+
| **Unique Angle** | You have proprietary data, original research, contrarian takes, or first-hand experience that no competitor can replicate |
|
|
41
|
+
| **Venn Diagram** | Two or more distinct audiences or subject areas overlap; the content targets the intersection to capture a niche |
|
|
42
|
+
|
|
43
|
+
These are starting points — new strategies can emerge during ideation. If a Theme doesn't fit neatly into one, propose and name a new strategy with a short rationale.
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"title": "Big Data on Bare Metal",
|
|
50
|
+
"description": "Articles exploring how big data workloads like OLAP, stream processing, and high-volume data collection benefit from dedicated bare metal infrastructure versus shared cloud environments.",
|
|
51
|
+
"strategy": "Gap Analysis",
|
|
52
|
+
"referenceUrls": [
|
|
53
|
+
"https://example.com/olap-databases-bare-metal-dedicated-servers",
|
|
54
|
+
"https://example.com/single-tenant-private-cloud-high-volume-data-collection",
|
|
55
|
+
"https://example.com/real-time-data-processing-apache-storm-flink"
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Themes are **not** article outlines. They are a strategic grouping that multiple articles can be written under.
|
|
61
|
+
|
|
62
|
+
## Process
|
|
63
|
+
|
|
64
|
+
1. **Parse the Brief**: Extract topic, audience, and content type from the task prompt
|
|
65
|
+
2. **Search**: Use `WebSearch` to find 5-10 authoritative, recent sources on the topic area (prioritize last 12 months)
|
|
66
|
+
3. **Discover Themes**: Identify 2-4 distinct Themes by grouping findings into strategic angles; collect reference URLs for each Theme
|
|
67
|
+
4. **Write Themes**: Save Themes. If the task prompt specifies a path (e.g. `.content-session/{slug}/themes.json`), write there — no merge, coordinator will merge after batch. Otherwise write to `content-themes.json` at project root; if it exists, read and merge (add new Themes, skip duplicates by title, update URLs for existing Themes)
|
|
68
|
+
5. **Write Content Stubs**: For each Theme, generate a content stub markdown file and write it to `content-queue/{jobDir}/` (see Output 4 below)
|
|
69
|
+
6. **Research Selected Theme**: Do deeper research on the most promising Theme (or user-specified one)
|
|
70
|
+
7. **Write ideation brief**: Save per-session research to `.content-session/ideation.md`
|
|
71
|
+
8. **Create article plan**: Use ideation findings to create a detailed structure in `.content-session/plan.md`
|
|
72
|
+
|
|
73
|
+
## Output 1: Themes (content-themes.json or task-specified path)
|
|
74
|
+
|
|
75
|
+
Default path: `content-themes.json` at project root. In batch mode, the coordinator may specify `.content-session/{slug}/themes.json` to avoid race conditions.
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"lastUpdated": "{YYYY-MM-DD}",
|
|
80
|
+
"themes": [
|
|
81
|
+
{
|
|
82
|
+
"title": "{Theme title}",
|
|
83
|
+
"description": "{1-3 sentence description of the angle and audience}",
|
|
84
|
+
"strategy": "{Gap Analysis | Current Trends | Related Subject | Hub and Spoke | Unique Angle | Venn Diagram | custom}",
|
|
85
|
+
"referenceUrls": [
|
|
86
|
+
"{url1}",
|
|
87
|
+
"{url2}",
|
|
88
|
+
"{url3}"
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Merge Rules (only when writing to content-themes.json)
|
|
96
|
+
|
|
97
|
+
When writing to `content-themes.json` and it already exists:
|
|
98
|
+
- Read the existing file first
|
|
99
|
+
- Add new Themes (no existing Theme has the same or very similar title)
|
|
100
|
+
- For existing Themes, append newly found reference URLs (no duplicates)
|
|
101
|
+
- Update `lastUpdated` to today's date
|
|
102
|
+
- Preserve all existing Themes; never remove them
|
|
103
|
+
|
|
104
|
+
## Output 2: `.content-session/ideation.md`
|
|
105
|
+
|
|
106
|
+
Per-session ideation brief consumed by planner/writer phases:
|
|
107
|
+
|
|
108
|
+
```markdown
|
|
109
|
+
# Ideation: {topic}
|
|
110
|
+
|
|
111
|
+
## Selected Theme
|
|
112
|
+
**{Theme title}** - {Theme description}
|
|
113
|
+
**Strategy**: {strategy} — [1 sentence explaining why this strategy fits]
|
|
114
|
+
|
|
115
|
+
## Key Facts & Statistics
|
|
116
|
+
- [Fact 1] - Source: [attribution + URL]
|
|
117
|
+
- [Fact 2] - Source: [attribution + URL]
|
|
118
|
+
|
|
119
|
+
## Expert Perspectives
|
|
120
|
+
- [Expert/Org]: "[Quote or paraphrased insight]" - [Context]
|
|
121
|
+
|
|
122
|
+
## Content Gaps
|
|
123
|
+
- [Gap 1] - Why it matters
|
|
124
|
+
- [Gap 2] - Why it matters
|
|
125
|
+
|
|
126
|
+
## Current Landscape
|
|
127
|
+
[2-3 paragraph summary of what is currently known/published in this Theme area]
|
|
128
|
+
|
|
129
|
+
## Trends & Recent Developments
|
|
130
|
+
- [Trend 1] - [Date/Timeframe]
|
|
131
|
+
- [Trend 2] - [Date/Timeframe]
|
|
132
|
+
|
|
133
|
+
## Recommended Article
|
|
134
|
+
**{Title idea}** - [1-2 paragraph recommendation for the best article to write within this Theme, given audience, existing coverage, and available unique value. Explain the angle and why it is high-value.]
|
|
135
|
+
|
|
136
|
+
## Sources
|
|
137
|
+
1. [Title] - [URL] - [Relevance note]
|
|
138
|
+
2. ...
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Output 4: Content Stubs (`content-queue/{jobDir}/`)
|
|
142
|
+
|
|
143
|
+
After discovering Themes, generate a content stub for each Theme. Stubs are markdown files with frontmatter that the content-production-coordinator consumes in batch mode.
|
|
144
|
+
|
|
145
|
+
### Job Directory
|
|
146
|
+
|
|
147
|
+
Create a job directory inside `content-queue/` named with a date and sequential counter:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
content-queue/jobYYYYMMDD_NN/
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Where `NN` is a zero-padded sequential number starting at `01`. If `content-queue/` already contains a directory for today's date (e.g. `job20260223_01`), increment the counter (e.g. `job20260223_02`).
|
|
154
|
+
|
|
155
|
+
Example: `content-queue/job20260223_01/`
|
|
156
|
+
|
|
157
|
+
If the task prompt specifies a job directory path, use that instead.
|
|
158
|
+
|
|
159
|
+
### Stub Files
|
|
160
|
+
|
|
161
|
+
Each stub is named with a URL-friendly slug derived from the Theme title:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
content-queue/job20260223_01/kubernetes_application_performance.md
|
|
165
|
+
content-queue/job20260223_01/big_data_on_bare_metal.md
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Slug rules: lowercase, replace spaces and hyphens with underscores, strip non-alphanumeric characters (except underscores), collapse multiple underscores.
|
|
169
|
+
|
|
170
|
+
### Stub Format
|
|
171
|
+
|
|
172
|
+
Each stub contains frontmatter describing the content piece. The `strategy` field comes from the Theme (not "theme"). All other fields use values from the task prompt or sensible defaults:
|
|
173
|
+
|
|
174
|
+
```markdown
|
|
175
|
+
---
|
|
176
|
+
title: "{Theme title — used as the article topic}"
|
|
177
|
+
mode: new
|
|
178
|
+
content_type: blog-post
|
|
179
|
+
status: pending
|
|
180
|
+
priority: normal
|
|
181
|
+
tone: professional
|
|
182
|
+
word_count: 1500
|
|
183
|
+
audience: "{audience from task prompt}"
|
|
184
|
+
strategy: "{Theme strategy — e.g. Gap Analysis, Current Trends}"
|
|
185
|
+
keywords:
|
|
186
|
+
- "{primary keyword derived from Theme}"
|
|
187
|
+
- "{secondary keyword}"
|
|
188
|
+
references:
|
|
189
|
+
- "{referenceUrl1 from Theme}"
|
|
190
|
+
- "{referenceUrl2 from Theme}"
|
|
191
|
+
goals:
|
|
192
|
+
- "{1-sentence goal derived from Theme description}"
|
|
193
|
+
visuals: true
|
|
194
|
+
publish: wordpress
|
|
195
|
+
publish_status: draft
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Theme Context
|
|
199
|
+
|
|
200
|
+
{Theme description — 1-3 sentences explaining the angle, why it matters, and who it is for}
|
|
201
|
+
|
|
202
|
+
## Reference Material
|
|
203
|
+
|
|
204
|
+
{Bullet list of reference URLs with brief annotation of what each covers}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Field mapping from Theme to stub:
|
|
208
|
+
|
|
209
|
+
| Theme Field | Stub Field | Notes |
|
|
210
|
+
|-------------|------------|-------|
|
|
211
|
+
| `title` | `title` | Used as the article topic |
|
|
212
|
+
| `strategy` | `strategy` | Ideation strategy, NOT placed in a "theme" field |
|
|
213
|
+
| `referenceUrls` | `references` | Carried over as-is |
|
|
214
|
+
| `description` | Body: Theme Context | Placed in the markdown body, not frontmatter |
|
|
215
|
+
|
|
216
|
+
Override defaults with values from the task prompt when available (e.g. `audience`, `tone`, `word_count`, `content_type`, `publish`, `publish_status`).
|
|
217
|
+
|
|
218
|
+
## Constraints
|
|
219
|
+
|
|
220
|
+
- Do not write the full article draft
|
|
221
|
+
- Keep Output 2 under 1000 words
|
|
222
|
+
- Every fact must include source attribution
|
|
223
|
+
- Include at least one contrarian or alternative viewpoint
|
|
224
|
+
- Identify at least 2 genuine content gaps
|
|
225
|
+
- Produce at least 2 Themes in `content-themes.json`, ideally 3-4
|
|
226
|
+
- Ensure Themes are meaningfully different from each other
|
|
227
|
+
- Reference URLs must be real, publicly accessible URLs found during research
|
|
228
|
+
- Every Theme must have a corresponding stub in the job directory
|
|
229
|
+
|
|
230
|
+
## Output 3: `.content-session/plan.md`
|
|
231
|
+
|
|
232
|
+
After ideation, create the article plan using this template:
|
|
233
|
+
|
|
234
|
+
```markdown
|
|
235
|
+
# Article Plan
|
|
236
|
+
|
|
237
|
+
## Title Options
|
|
238
|
+
1. **[Recommended Title]** <- Primary choice
|
|
239
|
+
2. [Alternative 1]
|
|
240
|
+
3. [Alternative 2]
|
|
241
|
+
|
|
242
|
+
## Article Brief
|
|
243
|
+
- **Type**: {content_type}
|
|
244
|
+
- **Target Words**: {word_count}
|
|
245
|
+
- **Tone**: {tone}
|
|
246
|
+
- **Theme**: {Theme title}
|
|
247
|
+
- **Strategy**: {strategy}
|
|
248
|
+
- **Primary Keyword**: {keyword}
|
|
249
|
+
- **Secondary Keywords**: {keyword2, keyword3}
|
|
250
|
+
|
|
251
|
+
## Structure
|
|
252
|
+
|
|
253
|
+
### Introduction (~{X} words)
|
|
254
|
+
- **Hook Strategy**: [Specific hook approach]
|
|
255
|
+
- **Hook Content**: [The actual hook sentence/concept]
|
|
256
|
+
- **Bridge**: [How to connect hook to article topic]
|
|
257
|
+
- **Promise**: [What the reader will learn/gain]
|
|
258
|
+
- **Keywords**: Use primary keyword in first paragraph
|
|
259
|
+
|
|
260
|
+
### {Section 1 Title} (~{X} words)
|
|
261
|
+
- **Key Points**:
|
|
262
|
+
- [Point 1 with research reference]
|
|
263
|
+
- [Point 2 with supporting data]
|
|
264
|
+
- [Point 3]
|
|
265
|
+
- **Keywords**: Use secondary keyword in heading or first paragraph
|
|
266
|
+
- **Evidence**: [Specific stat/quote from research to include]
|
|
267
|
+
|
|
268
|
+
[Continue for all sections...]
|
|
269
|
+
|
|
270
|
+
### Conclusion (~{X} words)
|
|
271
|
+
- **Summary Approach**: [Recap key insights, do not repeat verbatim]
|
|
272
|
+
- **CTA**: [Specific call to action]
|
|
273
|
+
- **Next Steps**: [What the reader should do next]
|
|
274
|
+
|
|
275
|
+
## Keyword Placement Map
|
|
276
|
+
|
|
277
|
+
| Keyword | Location | Context |
|
|
278
|
+
|---------|----------|---------|
|
|
279
|
+
| {primary} | Title, Intro para 1, H2-1, Conclusion | Natural integration |
|
|
280
|
+
| {secondary1} | H2-2, Body section 3 | Supporting context |
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Planning Constraints
|
|
284
|
+
|
|
285
|
+
- Word count allocations must sum to the target (+/-5%)
|
|
286
|
+
- Every section must have at least 2 key points
|
|
287
|
+
- Keywords cannot be forced; place only where natural
|
|
288
|
+
- Plan must clearly derive from the selected Theme and ideation findings
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "myai-content-ideation",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 0,
|
|
6
|
+
"name": "enterprise-saas",
|
|
7
|
+
"prompt": "Research the topic of AI-powered customer support automation for B2B SaaS companies. Audience: CTOs and VP Engineering at mid-market SaaS companies (100-500 employees). Content type: blog-post. Word count: 2000.",
|
|
8
|
+
"expected_output": "Themes JSON with 2-4 themes, ideation.md with research, plan.md with article structure, content stubs in content-queue/",
|
|
9
|
+
"files": [],
|
|
10
|
+
"assertions": [
|
|
11
|
+
{
|
|
12
|
+
"id": "themes-file-exists",
|
|
13
|
+
"text": "content-themes.json exists and is valid JSON",
|
|
14
|
+
"type": "file_check"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "themes-count",
|
|
18
|
+
"text": "content-themes.json contains 2-4 themes",
|
|
19
|
+
"type": "content_check"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "themes-have-required-fields",
|
|
23
|
+
"text": "Each theme has title, description, strategy, and referenceUrls fields",
|
|
24
|
+
"type": "content_check"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "themes-valid-strategies",
|
|
28
|
+
"text": "Each theme strategy is one of: Gap Analysis, Current Trends, Related Subject, Hub and Spoke, Unique Angle, Venn Diagram, or a custom strategy with rationale",
|
|
29
|
+
"type": "content_check"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "ideation-file-exists",
|
|
33
|
+
"text": ".content-session/ideation.md exists and follows the template structure",
|
|
34
|
+
"type": "file_check"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "ideation-has-sources",
|
|
38
|
+
"text": "ideation.md contains at least 3 sourced facts with URLs",
|
|
39
|
+
"type": "content_check"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "ideation-has-content-gaps",
|
|
43
|
+
"text": "ideation.md identifies at least 2 content gaps",
|
|
44
|
+
"type": "content_check"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "plan-file-exists",
|
|
48
|
+
"text": ".content-session/plan.md exists and follows the plan template",
|
|
49
|
+
"type": "file_check"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "plan-word-counts",
|
|
53
|
+
"text": "plan.md section word counts sum to approximately 2000 words (+/-5%)",
|
|
54
|
+
"type": "content_check"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "stubs-created",
|
|
58
|
+
"text": "Content stubs exist in content-queue/ with one stub per theme",
|
|
59
|
+
"type": "file_check"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "stubs-have-frontmatter",
|
|
63
|
+
"text": "Each content stub has valid YAML frontmatter with required fields (title, mode, content_type, status, strategy, audience, keywords, references)",
|
|
64
|
+
"type": "content_check"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": 1,
|
|
70
|
+
"name": "edge-computing",
|
|
71
|
+
"prompt": "Research edge computing and WebAssembly for IoT applications. Audience: backend developers and DevOps engineers building IoT platforms. Content type: technical tutorial. Tone: conversational. Word count: 2500.",
|
|
72
|
+
"expected_output": "Themes JSON, ideation.md, plan.md with tutorial structure, content stubs reflecting technical tutorial type and conversational tone",
|
|
73
|
+
"files": [],
|
|
74
|
+
"assertions": [
|
|
75
|
+
{
|
|
76
|
+
"id": "themes-file-exists",
|
|
77
|
+
"text": "content-themes.json exists and is valid JSON",
|
|
78
|
+
"type": "file_check"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "themes-count",
|
|
82
|
+
"text": "content-themes.json contains 2-4 themes",
|
|
83
|
+
"type": "content_check"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "themes-distinct",
|
|
87
|
+
"text": "Themes are meaningfully different from each other (not just variations of the same angle)",
|
|
88
|
+
"type": "content_check"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "ideation-file-exists",
|
|
92
|
+
"text": ".content-session/ideation.md exists with research findings",
|
|
93
|
+
"type": "file_check"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "ideation-contrarian-viewpoint",
|
|
97
|
+
"text": "ideation.md includes at least one contrarian or alternative viewpoint",
|
|
98
|
+
"type": "content_check"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "plan-content-type",
|
|
102
|
+
"text": "plan.md reflects technical tutorial content type (not generic blog post)",
|
|
103
|
+
"type": "content_check"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "plan-tone",
|
|
107
|
+
"text": "plan.md specifies conversational tone",
|
|
108
|
+
"type": "content_check"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "plan-word-count-target",
|
|
112
|
+
"text": "plan.md targets 2500 words total across sections",
|
|
113
|
+
"type": "content_check"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"id": "stubs-created",
|
|
117
|
+
"text": "Content stubs exist in content-queue/ with correct content_type and tone",
|
|
118
|
+
"type": "file_check"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "reference-urls-real",
|
|
122
|
+
"text": "Theme referenceUrls are plausible real URLs (not example.com placeholders)",
|
|
123
|
+
"type": "content_check"
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"id": 2,
|
|
129
|
+
"name": "green-cloud",
|
|
130
|
+
"prompt": "Research sustainable cloud infrastructure and green computing practices. Audience: infrastructure architects and sustainability officers at enterprise companies. Content type: blog-post. Write themes to .content-session/green-cloud/themes.json. Job directory: content-queue/job20260311_01/",
|
|
131
|
+
"expected_output": "Themes written to custom path, ideation.md, plan.md, stubs in specified job directory",
|
|
132
|
+
"files": [],
|
|
133
|
+
"assertions": [
|
|
134
|
+
{
|
|
135
|
+
"id": "themes-custom-path",
|
|
136
|
+
"text": "Themes written to .content-session/green-cloud/themes.json (NOT content-themes.json)",
|
|
137
|
+
"type": "file_check"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"id": "themes-valid-json",
|
|
141
|
+
"text": "themes.json is valid JSON with lastUpdated and themes array",
|
|
142
|
+
"type": "content_check"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "themes-count",
|
|
146
|
+
"text": "themes.json contains 2-4 themes",
|
|
147
|
+
"type": "content_check"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "ideation-file-exists",
|
|
151
|
+
"text": ".content-session/ideation.md exists",
|
|
152
|
+
"type": "file_check"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "plan-file-exists",
|
|
156
|
+
"text": ".content-session/plan.md exists",
|
|
157
|
+
"type": "file_check"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"id": "stubs-in-specified-dir",
|
|
161
|
+
"text": "Content stubs are in content-queue/job20260311_01/ (the specified job directory)",
|
|
162
|
+
"type": "file_check"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"id": "stubs-match-themes",
|
|
166
|
+
"text": "Number of stubs matches number of themes (one stub per theme)",
|
|
167
|
+
"type": "content_check"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"id": "no-root-themes-file",
|
|
171
|
+
"text": "No content-themes.json created at project root (should use custom path only)",
|
|
172
|
+
"type": "file_check"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"id": "stubs-audience-correct",
|
|
176
|
+
"text": "Stub frontmatter audience field references infrastructure architects and sustainability officers",
|
|
177
|
+
"type": "content_check"
|
|
178
|
+
}
|
|
179
|
+
]
|
|
180
|
+
}
|
|
181
|
+
]
|
|
182
|
+
}
|