@respira/wordpress-mcp-server 7.3.0 → 7.4.1

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.
Files changed (92) hide show
  1. package/dist/__tests__/site-list-self-heal.test.d.ts +18 -0
  2. package/dist/__tests__/site-list-self-heal.test.d.ts.map +1 -0
  3. package/dist/__tests__/site-list-self-heal.test.js +169 -0
  4. package/dist/__tests__/site-list-self-heal.test.js.map +1 -0
  5. package/dist/acf-tools.d.ts +0 -10
  6. package/dist/acf-tools.d.ts.map +1 -1
  7. package/dist/acf-tools.js +0 -15
  8. package/dist/acf-tools.js.map +1 -1
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +31 -36
  11. package/dist/config.js.map +1 -1
  12. package/dist/server.d.ts +34 -46
  13. package/dist/server.d.ts.map +1 -1
  14. package/dist/server.js +560 -463
  15. package/dist/server.js.map +1 -1
  16. package/dist/wordpress-client.d.ts +33 -29
  17. package/dist/wordpress-client.d.ts.map +1 -1
  18. package/dist/wordpress-client.js +124 -148
  19. package/dist/wordpress-client.js.map +1 -1
  20. package/package.json +2 -2
  21. package/skills/activity-report-composer/README.md +38 -0
  22. package/skills/activity-report-composer/SKILL.md +167 -0
  23. package/skills/activity-report-composer/metadata.json +42 -0
  24. package/skills/brand-voice-synthesizer/README.md +43 -0
  25. package/skills/brand-voice-synthesizer/SKILL.md +259 -0
  26. package/skills/brand-voice-synthesizer/metadata.json +46 -0
  27. package/skills/build-oxygen6-page/SKILL.md +59 -0
  28. package/skills/conversion-audit/README.md +37 -0
  29. package/skills/conversion-audit/SKILL.md +185 -0
  30. package/skills/conversion-audit/metadata.json +46 -0
  31. package/skills/custom-post-type-architect/README.md +34 -0
  32. package/skills/custom-post-type-architect/SKILL.md +158 -0
  33. package/skills/custom-post-type-architect/metadata.json +39 -0
  34. package/skills/design-system-synthesizer/README.md +46 -0
  35. package/skills/design-system-synthesizer/SKILL.md +395 -0
  36. package/skills/design-system-synthesizer/metadata.json +57 -0
  37. package/skills/figma-to-elementor/SKILL.md +204 -0
  38. package/skills/html-to-bricks/README.md +43 -0
  39. package/skills/html-to-bricks/SKILL.md +135 -0
  40. package/skills/html-to-bricks/metadata.json +41 -0
  41. package/skills/internal-link-builder/SKILL.md +258 -0
  42. package/skills/internal-link-builder/metadata.json +46 -0
  43. package/skills/migrate-beaver-builder-to-bricks/SKILL.md +251 -0
  44. package/skills/migrate-beaver-builder-to-gutenberg/SKILL.md +248 -0
  45. package/skills/migrate-brizy-to-gutenberg/SKILL.md +248 -0
  46. package/skills/migrate-divi-to-breakdance/SKILL.md +312 -0
  47. package/skills/migrate-divi-to-bricks/SKILL.md +321 -0
  48. package/skills/migrate-divi-to-gutenberg/SKILL.md +328 -0
  49. package/skills/migrate-elementor-to-breakdance/SKILL.md +287 -0
  50. package/skills/migrate-elementor-to-bricks/SKILL.md +289 -0
  51. package/skills/migrate-elementor-to-gutenberg/SKILL.md +327 -0
  52. package/skills/migrate-elementor-to-oxygen/SKILL.md +300 -0
  53. package/skills/migrate-oxygen-to-breakdance/SKILL.md +235 -0
  54. package/skills/migrate-oxygen-to-bricks/SKILL.md +237 -0
  55. package/skills/migrate-thrive-architect-to-gutenberg/SKILL.md +257 -0
  56. package/skills/migrate-visual-composer-to-gutenberg/SKILL.md +261 -0
  57. package/skills/migrate-wpbakery-to-bricks/SKILL.md +336 -0
  58. package/skills/migrate-wpbakery-to-gutenberg/SKILL.md +345 -0
  59. package/skills/mobile-experience-report/SKILL.md +719 -0
  60. package/skills/mobile-experience-report/telemetry.ts +137 -0
  61. package/skills/page-template-library/README.md +41 -0
  62. package/skills/page-template-library/SKILL.md +175 -0
  63. package/skills/page-template-library/metadata.json +44 -0
  64. package/skills/prime-the-agent/README.md +49 -0
  65. package/skills/prime-the-agent/SKILL.md +225 -0
  66. package/skills/prime-the-agent/metadata.json +46 -0
  67. package/skills/respira-setup-assistant/SKILL.md +386 -0
  68. package/skills/respira-setup-assistant/metadata.json +36 -0
  69. package/skills/seo-aeo-amplifier/README.md +61 -0
  70. package/skills/seo-aeo-amplifier/SKILL.md +277 -0
  71. package/skills/seo-aeo-amplifier/metadata.json +62 -0
  72. package/skills/stale-content-detector/README.md +41 -0
  73. package/skills/stale-content-detector/SKILL.md +156 -0
  74. package/skills/stale-content-detector/metadata.json +43 -0
  75. package/skills/technical-debt-audit/SKILL.md +691 -0
  76. package/skills/technical-debt-audit/telemetry.ts +142 -0
  77. package/skills/woocommerce-health-check/SKILL.md +719 -0
  78. package/skills/woocommerce-health-check/telemetry.ts +137 -0
  79. package/skills/wordpress-ai-image-optimizer/README.md +49 -0
  80. package/skills/wordpress-ai-image-optimizer/SKILL.md +232 -0
  81. package/skills/wordpress-ai-image-optimizer/metadata.json +63 -0
  82. package/skills/wordpress-site-dna/README.md +81 -0
  83. package/skills/wordpress-site-dna/SKILL.md +669 -0
  84. package/skills/wordpress-site-dna/telemetry.ts +137 -0
  85. package/dist/__tests__/acf-tool-routing.test.d.ts +0 -2
  86. package/dist/__tests__/acf-tool-routing.test.d.ts.map +0 -1
  87. package/dist/__tests__/acf-tool-routing.test.js +0 -37
  88. package/dist/__tests__/acf-tool-routing.test.js.map +0 -1
  89. package/dist/__tests__/cowork-bootstrap.test.d.ts +0 -2
  90. package/dist/__tests__/cowork-bootstrap.test.d.ts.map +0 -1
  91. package/dist/__tests__/cowork-bootstrap.test.js +0 -61
  92. package/dist/__tests__/cowork-bootstrap.test.js.map +0 -1
@@ -0,0 +1,277 @@
1
+ # SEO & AEO Amplifier
2
+
3
+ **Version:** 1.3.0
4
+ **Updated:** 2026-06-30
5
+ **Freshly updated:** v1.3.0 takes a snapshot with respira_get_snapshot before any edit so every change is one-click reversible, switches from full extract/inject to surgical respira_find_element + respira_update_element edits for meta titles, descriptions and H1s, applies schema and meta across many pages in a single safe pass with respira_batch_update, and wires respira_generate_activity_report into the "SEO work done -> client report" handoff. Also leans on the real SEO analysis tools (respira_analyze_seo, respira_analyze_aeo, respira_analyze_rankmath, respira_check_seo_issues, respira_check_structured_data) instead of hand-rolled scoring.
6
+
7
+ Comprehensive on-page SEO and Answer Engine Optimization (AEO) audit and auto-fix system for WordPress sites. Scans all content, detects issues, generates intelligent schema markup, and creates optimized duplicates for review.
8
+
9
+ ## What This Skill Does
10
+
11
+ **Finds:**
12
+ - Missing or weak title tags and meta descriptions
13
+ - Poor heading structure (multiple H1s, skipped heading levels, non-descriptive headings)
14
+ - Missing image alt text across all media
15
+ - Thin content (pages under 300 words)
16
+ - Broken internal links
17
+ - Orphaned pages (no internal links pointing to them)
18
+ - Non-descriptive URL slugs
19
+ - Content that could answer questions but lacks FAQ schema
20
+ - Missing structured data (Article, HowTo, Product, Event, Video, Review)
21
+ - Content not optimized for featured snippets
22
+ - Missing table of contents on long-form content
23
+ - No clear Q&A structure for "People Also Ask" boxes
24
+
25
+ **Provides:**
26
+ - Comprehensive SEO health score (0-100)
27
+ - Page-by-page opportunity analysis
28
+ - Automated duplicate creation with all fixes applied
29
+ - Intelligent schema markup generation based on content type
30
+ - Before/after comparison for every fix
31
+ - Plugin-specific guidance (Yoast SEO, Rank Math, or plugin-agnostic)
32
+
33
+ **Generates Schema Markup:**
34
+ - Article schema (blog posts, news)
35
+ - FAQ schema (Q&A content detected)
36
+ - HowTo schema (tutorial/guide content)
37
+ - Product schema (WooCommerce products - requires WooCommerce add-on)
38
+ - Event schema (event content detected)
39
+ - Video schema (embedded videos detected)
40
+ - Review schema (review content detected)
41
+ - Breadcrumb schema (site navigation)
42
+ - Organization/Website schema (site-wide)
43
+
44
+ ## Requirements
45
+
46
+ - Respira for WordPress plugin installed and connected
47
+ - MCP connection active (desktop or WebMCP)
48
+ - WooCommerce add-on (optional - for product schema)
49
+ - Read access to scan site, write access to create duplicates
50
+
51
+ ## Trigger Phrase
52
+
53
+ - "amplify my seo and aeo"
54
+
55
+ ## Alternative Triggers
56
+
57
+ - "optimize my site for search engines"
58
+ - "run seo aeo audit"
59
+ - "improve my search visibility"
60
+ - "scan for seo opportunities"
61
+
62
+ ## Execution Workflow
63
+
64
+ ### Phase 1: Comprehensive Audit
65
+
66
+ 1. Verify Respira + MCP connection via `respira_get_site_context`. If unavailable, stop and show setup guidance.
67
+ 2. Detect SEO plugin setup using `respira_list_plugins`:
68
+ - Yoast SEO
69
+ - Rank Math
70
+ - No SEO plugin
71
+ 3. Scan all published pages and posts:
72
+ - `respira_list_pages`
73
+ - `respira_list_posts`
74
+ 4. For each content item, load content and metadata:
75
+ - `respira_read_page` or `respira_read_post`
76
+ - `respira_get_builder_info` when needed
77
+ 5. Analyze on-page SEO. Prefer the real analysis tools over hand-rolled checks:
78
+ - `respira_analyze_seo` for the on-page SEO pass (title, meta, headings, content depth, links)
79
+ - `respira_check_seo_issues` for the prioritized issue list per page
80
+ - `respira_analyze_rankmath` when Rank Math is detected (reads its score and recommendations)
81
+ - `respira_check_structured_data` to see which schema types already exist vs are missing
82
+ - Supplement with `respira_list_media` + in-content image checks for alt text coverage
83
+ - Cross-checks the tools cover: title quality, meta description quality, heading hierarchy (single H1, no level skips), content depth, internal links / orphaned pages, URL slug descriptiveness
84
+ 6. Analyze AEO opportunities with `respira_analyze_aeo` (answer-engine readiness), plus `respira_check_structured_data`:
85
+ - FAQ potential (question patterns)
86
+ - HowTo potential (step-by-step patterns)
87
+ - Featured snippet opportunities
88
+ - Missing table of contents on long-form pages
89
+ - Missing structured data per content type
90
+ 7. Build opportunity scoring:
91
+ - Critical / High / Medium / Low
92
+ - Per-page opportunity score (0-100)
93
+ 8. Produce full report with:
94
+ - Overall health score
95
+ - Priority matrix
96
+ - Top opportunity pages
97
+ - Plugin-specific integration notes
98
+
99
+ ### Phase 2: Ask for Confirmation
100
+
101
+ After report, ask:
102
+
103
+ > I found [X] pages with SEO/AEO opportunities. Would you like me to create optimized duplicates for all of them? You will review before publishing.
104
+
105
+ If user declines, stop after delivering recommendations.
106
+
107
+ ### Phase 3: Auto-Fix on Duplicates (Only If Approved)
108
+
109
+ 1. **Snapshot first.** Before touching anything, take a snapshot with `respira_get_snapshot` so the whole pass is one-click reversible via `respira_restore_snapshot` if a fix looks wrong.
110
+ 2. For each selected page/post:
111
+ - Create the review copy with `respira_create_page_duplicate` (pages) or `respira_create_post_duplicate` (posts)
112
+ 3. Apply fixes on the duplicate only. Use surgical edits, not full extract/inject:
113
+ - **Locate the exact node first** with `respira_find_element` (find the meta title, meta description, and the H1 / heading elements), then change only that node with `respira_update_element`. This avoids re-writing the whole page and keeps the builder's structure intact.
114
+ - Optimize title tags (target < 60 chars)
115
+ - Generate/rewrite meta descriptions (target 150-160 chars)
116
+ - Fix heading structure (single H1, logical hierarchy)
117
+ - Add/repair image alt text
118
+ - Add table of contents for long-form pages
119
+ - Restructure Q&A blocks for FAQ readiness
120
+ - Generate and inject JSON-LD schema markup
121
+ - Improve URL slug when safe and requested
122
+ 4. **Apply the same fix across many pages in one safe pass** with `respira_batch_update` (for example, the same Organization/WebSite schema or a meta pattern across a set of duplicates) instead of looping one slow update at a time.
123
+ 5. Save remaining page-level changes with `respira_update_page` / `respira_update_post`.
124
+ 6. Verify with `respira_check_seo_issues` / `respira_check_structured_data` on a sample of the fixed duplicates to confirm the issues actually cleared.
125
+ 7. Produce before/after comparison snapshots for representative pages.
126
+ 8. Summarize totals:
127
+ - Duplicates created
128
+ - Titles/meta/schema/alt/headings fixed
129
+ - Snapshot id (so the user knows the rollback point)
130
+
131
+ ## Plugin Integration Behavior
132
+
133
+ ### Yoast SEO detected
134
+
135
+ - Read Yoast metadata
136
+ - Populate Yoast-compatible meta fields on duplicates
137
+ - Add JSON-LD schema only where Yoast does not already cover the content type
138
+ - Suggest focus keywords and readability improvements
139
+
140
+ ### Rank Math detected
141
+
142
+ - Read Rank Math metadata
143
+ - Populate Rank Math-compatible meta fields on duplicates
144
+ - Add JSON-LD schema where missing
145
+
146
+ ### No SEO plugin detected
147
+
148
+ - Insert meta tags and JSON-LD directly in duplicate content
149
+ - Recommend optional Yoast or Rank Math adoption
150
+
151
+ ## Schema Generation Rules
152
+
153
+ Generate schema based on detected content intent:
154
+
155
+ - **Article:** blog/news/editorial content
156
+ - **FAQPage:** clear Q&A content patterns
157
+ - **HowTo:** procedural/step-by-step content
158
+ - **Product:** WooCommerce products (if add-on/tools available)
159
+ - **Event:** event date/location content
160
+ - **VideoObject:** embedded YouTube/Vimeo/video blocks
161
+ - **Review:** clear review/rating content
162
+ - **BreadcrumbList:** URL hierarchy
163
+ - **Organization / WebSite:** site-level identity signals
164
+
165
+ All schema must be JSON-LD and valid structure-first (no fabricated claims).
166
+
167
+ ## Output Format
168
+
169
+ Always include:
170
+
171
+ 1. **Executive summary**
172
+ 2. **Overall score + severity counts**
173
+ 3. **Top opportunities with impact rationale**
174
+ 4. **Plugin integration notes**
175
+ 5. **Clear confirmation prompt for duplicate creation**
176
+
177
+ If auto-fix is run, also include:
178
+
179
+ 6. **Fix summary totals**
180
+ 7. **Before/after samples**
181
+ 8. **Review instructions in WordPress admin**
182
+
183
+ ## Safety Model
184
+
185
+ - Read-only audit first
186
+ - Snapshot via `respira_get_snapshot` before any write, restore with `respira_restore_snapshot`
187
+ - Explicit user confirmation before changes
188
+ - Duplicate-first changes only
189
+ - Never auto-publish
190
+ - Provide rollback guidance
191
+ - Preserve live content unless user explicitly approves publishing workflow
192
+
193
+ ## Client Report Handoff
194
+
195
+ When the audit and (optional) fixes are done, turn the SEO work into a deliverable the customer can hand to a client or keep for their own records:
196
+
197
+ - Call `respira_generate_activity_report` to pull the actual edits made in this session (titles, meta, schema, alt text, headings) into a structured "SEO work done" report.
198
+ - Pair it with the before/after samples and the snapshot id from Phase 3 so the report shows what changed and how to roll it back.
199
+ - Good fit for monthly retainers: run the audit, apply approved fixes on duplicates, then export the activity report as the month's SEO summary.
200
+
201
+ ## Honest Disclaimer
202
+
203
+ This skill identifies SEO/AEO opportunities and creates optimized duplicates for review.
204
+
205
+ It cannot:
206
+ - Guarantee rankings
207
+ - Fix off-page SEO or backlinks
208
+ - Fix server-level technical SEO by itself
209
+ - Publish without review
210
+
211
+ It can:
212
+ - Find broad on-page SEO and AEO gaps
213
+ - Generate structured schema recommendations and implementation
214
+ - Create transparent before/after duplicate drafts quickly
215
+
216
+ ## Tooling
217
+
218
+ **Core WordPress tools**
219
+ - `respira_get_site_context`
220
+ - `respira_list_pages`
221
+ - `respira_list_posts`
222
+ - `respira_read_page`
223
+ - `respira_read_post`
224
+ - `respira_get_builder_info`
225
+ - `respira_list_media`
226
+ - `respira_list_plugins`
227
+ - `respira_create_page_duplicate`
228
+ - `respira_create_post_duplicate`
229
+ - `respira_update_page`
230
+ - `respira_update_post`
231
+
232
+ **SEO / AEO analysis tools**
233
+ - `respira_analyze_seo`
234
+ - `respira_analyze_aeo`
235
+ - `respira_analyze_rankmath`
236
+ - `respira_check_seo_issues`
237
+ - `respira_check_structured_data`
238
+
239
+ **Precision edit + safety tools**
240
+ - `respira_find_element` (locate meta title / description / H1 nodes)
241
+ - `respira_update_element` (change only that node)
242
+ - `respira_batch_update` (apply schema/meta across many pages in one pass)
243
+ - `respira_get_snapshot` (snapshot before edits)
244
+ - `respira_restore_snapshot` (one-click rollback)
245
+
246
+ **Reporting**
247
+ - `respira_generate_activity_report` (SEO work done -> client report)
248
+
249
+ **WooCommerce tools (optional)**
250
+ - `woocommerce_list_products`
251
+ - `woocommerce_get_product`
252
+
253
+ ## Telemetry
254
+
255
+ After run completion, send fire-and-forget usage tracking to:
256
+
257
+ - `POST https://www.respira.press/api/skills/track-usage`
258
+
259
+ Include:
260
+ - `skill_slug = seo-aeo-amplifier`
261
+ - site/version context
262
+ - duration and success
263
+ - issues found and fixes applied counts
264
+ - tools used
265
+
266
+ Never block user flow on telemetry failure.
267
+
268
+ ## Related Skills
269
+
270
+ - WordPress Site DNA
271
+ - Technical Debt Audit
272
+ - Mobile Experience Report
273
+
274
+ ---
275
+
276
+ Built by Respira Team
277
+ https://respira.press/skills/seo-aeo-amplifier
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "SEO & AEO Amplifier",
3
+ "slug": "seo-aeo-amplifier",
4
+ "icon": "🚀",
5
+ "category": "performance",
6
+ "description": "Comprehensive on-page SEO and AEO audit with automated optimization. Scans all content, detects issues, generates intelligent schema markup, and creates optimized duplicates for review.",
7
+ "author": "Respira Team",
8
+ "author_url": "https://respira.press",
9
+ "trigger": "amplify my seo and aeo",
10
+ "requires_respira": true,
11
+ "requires_woocommerce_addon": false,
12
+ "requires_accessibility_addon": false,
13
+ "is_read_only": false,
14
+ "is_duplicate_first": true,
15
+ "version": "1.2.0",
16
+ "last_updated": "2026-05-24",
17
+ "tools_used": [
18
+ "respira_get_site_context",
19
+ "respira_list_pages",
20
+ "respira_list_posts",
21
+ "respira_get_page",
22
+ "respira_get_post",
23
+ "respira_detect_page_builder",
24
+ "respira_list_media",
25
+ "respira_list_plugins",
26
+ "respira_create_duplicate",
27
+ "respira_update_page",
28
+ "respira_update_post",
29
+ "woocommerce_list_products",
30
+ "woocommerce_get_product"
31
+ ],
32
+ "detects": [
33
+ "missing_title_tags",
34
+ "weak_meta_descriptions",
35
+ "poor_heading_structure",
36
+ "missing_alt_text",
37
+ "thin_content",
38
+ "broken_internal_links",
39
+ "orphaned_pages",
40
+ "non_descriptive_urls",
41
+ "missing_faq_schema",
42
+ "missing_article_schema",
43
+ "missing_howto_schema",
44
+ "missing_toc",
45
+ "no_qa_structure"
46
+ ],
47
+ "generates": [
48
+ "article_schema",
49
+ "faq_schema",
50
+ "howto_schema",
51
+ "product_schema",
52
+ "event_schema",
53
+ "video_schema",
54
+ "review_schema",
55
+ "breadcrumb_schema",
56
+ "organization_schema",
57
+ "optimized_titles",
58
+ "optimized_meta_descriptions",
59
+ "image_alt_text",
60
+ "table_of_contents"
61
+ ]
62
+ }
@@ -0,0 +1,41 @@
1
+ # Stale Content Detector
2
+
3
+ > Find the content drag on your site in 30 seconds.
4
+
5
+ Categorizes every page and post on your site by how long it's been since last update. Tells you what to refresh, what to redirect, and what to archive — based on age, traffic signal, and internal link count.
6
+
7
+ ## What you get
8
+
9
+ | Bucket | Age | Suggested action |
10
+ |---|---|---|
11
+ | Fresh | < 6 months | leave alone |
12
+ | Aging | 6–12 months | review headline + opener, refresh if outdated |
13
+ | Stale | 12–24 months | refresh content meaningfully |
14
+ | Archive-candidate | 24+ months (low traffic / orphan) | archive, redirect, or 410 |
15
+
16
+ Plus a "what I'd refresh first" top-5 list ranked by traffic + internal link equity, so you know where to start.
17
+
18
+ ## Why it matters
19
+
20
+ Stale content is an SEO drag and a credibility tax. If your "2023 trends" article still ranks but nobody's touched it since 2023, you're losing trust the day a reader notices the date. The skill finds these items fast so you can decide: refresh, redirect, or archive.
21
+
22
+ ## Triggers
23
+
24
+ - *"find old content"*
25
+ - *"what's stale"*
26
+ - *"what needs refreshing"*
27
+ - *"audit my content age"*
28
+ - *"what should I archive"*
29
+
30
+ ## Hard rule
31
+
32
+ Never deletes a page directly. Even archive-candidates get a recommendation, not a deletion. You decide.
33
+
34
+ ## Pairs with
35
+
36
+ [SEO & AEO Amplifier](https://respira.press/skills/seo-aeo-amplifier) — once you've identified what to refresh, the Amplifier handles the actual content updates.
37
+
38
+ ## Requires
39
+
40
+ - Respira for WordPress plugin
41
+ - MCP server connected
@@ -0,0 +1,156 @@
1
+ # Stale Content Detector
2
+
3
+ **Version:** 1.0.0
4
+ **Updated:** 2026-05-24
5
+ **Category:** audit
6
+ **Status:** stable
7
+ **Requires:** Respira for WordPress plugin 7.1+ + MCP server
8
+
9
+ ---
10
+
11
+ ## Description
12
+
13
+ Find pages and posts that haven't been updated in a long time, categorize them as fresh / aging / stale / archive-candidate, and suggest action per item: refresh, redirect, archive, or leave alone. Stale content is an SEO drag and a credibility tax — if your "2023 trends" article still ranks but nobody's touched it since 2023, you're losing trust the day a reader notices the date.
14
+
15
+ This skill is intentionally focused. It's not a content audit (use [SEO & AEO Amplifier](https://respira.press/skills/seo-aeo-amplifier) for that). It's the "what's old" question, answered fast.
16
+
17
+ ---
18
+
19
+ ## What it categorizes
20
+
21
+ | Bucket | Age since last update | Suggested action |
22
+ |---|---|---|
23
+ | Fresh | < 6 months | leave alone |
24
+ | Aging | 6–12 months | review the headline + opening paragraph; if still accurate, leave; if outdated, refresh the date |
25
+ | Stale | 12–24 months | refresh the content meaningfully (new data, new examples), update the modified date |
26
+ | Archive-candidate | 24+ months **and** low traffic / orphan | archive, redirect, or 410 — depends on if anything links to it |
27
+
28
+ Plus an "evergreen" override: pages tagged as evergreen (`/about/`, `/contact/`, `/pricing/`, `/privacy/`) skip the staleness check entirely.
29
+
30
+ ---
31
+
32
+ ## When to Use
33
+
34
+ - Quarterly content review
35
+ - Migrating a site and trying to decide what to bring vs leave behind
36
+ - After a content team change — find the inherited backlog of old work
37
+ - Before publishing the next batch of new content (so the old stuff doesn't drag the rankings of the new stuff)
38
+ - After a Google update that emphasizes "freshness" signals
39
+
40
+ ---
41
+
42
+ ## Trigger Phrases
43
+
44
+ - "find old content"
45
+ - "what's stale"
46
+ - "what needs refreshing"
47
+ - "audit my content age"
48
+ - "find content to update"
49
+ - "stale content scan"
50
+ - "what should i archive"
51
+
52
+ ---
53
+
54
+ ## Execution Workflow
55
+
56
+ ### Step 1 — Confirm site
57
+
58
+ Call `respira_get_active_site` + `respira_get_site_context`.
59
+
60
+ ### Step 2 — Pull pages and posts
61
+
62
+ Call:
63
+
64
+ - `respira_list_pages(per_page=100)` for pages
65
+ - `respira_list_posts(per_page=100, status=publish)` for posts
66
+ - `respira_list_custom_posts(post_type=<each non-default CPT>, per_page=100)` for any CPT detected via `respira_list_post_types`
67
+
68
+ Each result includes `modified` and `date`. Sort by `modified` ascending — oldest first.
69
+
70
+ ### Step 3 — Identify evergreen pages
71
+
72
+ Pull the list of pages and check each against the evergreen list (`/about`, `/contact`, `/pricing`, `/privacy`, `/terms`, `/legal`, `/imprint`, `/faq`, `/support`). If the URL or slug matches, flag as evergreen and skip the staleness check.
73
+
74
+ Also check if the post type has `has_archive=false` and a single URL pattern matching contact/legal/utility — those are usually evergreen.
75
+
76
+ ### Step 4 — Compute staleness
77
+
78
+ For each non-evergreen page or post, compute days-since-modified. Bucket:
79
+
80
+ - 0–180 days → **fresh**
81
+ - 181–365 days → **aging**
82
+ - 366–730 days → **stale**
83
+ - 731+ days → **archive-candidate** (further filtering in Step 5)
84
+
85
+ ### Step 5 — Add traffic + orphan signals (archive-candidate filter)
86
+
87
+ For items in the archive-candidate bucket, we need to know if anyone is reading them or linking to them. Two signals:
88
+
89
+ 1. **Internal link count.** Call `respira_find_element` with the page's URL as a search term. Count incoming internal links. If zero, the page is an orphan.
90
+ 2. **External traffic** (if available — depends on whether the site has Plausible / GA4 / similar wired to Respira). If not available, skip.
91
+
92
+ Recompute:
93
+
94
+ - Archive-candidate + orphan + no traffic → **archive (or 410)**
95
+ - Archive-candidate + has internal links + no traffic → **archive + redirect** (preserve link equity)
96
+ - Archive-candidate + has traffic → **refresh** (downgrade from archive-candidate to stale)
97
+
98
+ ### Step 6 — Output the report
99
+
100
+ ```markdown
101
+ ## Content age audit for {site_url}
102
+
103
+ Scanned {n_pages} pages + {n_posts} posts + {n_custom} custom posts ({n_total} total). Evergreen pages skipped: {n_evergreen}.
104
+
105
+ ### Summary
106
+
107
+ | Bucket | Count | % |
108
+ |---|---|---|
109
+ | Fresh (<6mo) | {n_fresh} | {pct_fresh}% |
110
+ | Aging (6–12mo) | {n_aging} | {pct_aging}% |
111
+ | Stale (12–24mo) | {n_stale} | {pct_stale}% |
112
+ | Archive-candidate (24+mo) | {n_archive} | {pct_archive}% |
113
+
114
+ ### Stale (12–24 months)
115
+
116
+ | Title | Last modified | Action |
117
+ |---|---|---|
118
+ | {title} | {modified} ({days_ago}d) | refresh |
119
+ | ... | | |
120
+
121
+ ### Archive-candidate (24+ months)
122
+
123
+ | Title | Last modified | Internal links | Suggested action |
124
+ |---|---|---|---|
125
+ | {title} | {modified} ({days_ago}d) | {link_count} | {action} |
126
+ | ... | | | |
127
+
128
+ ### What I'd refresh first (top 5 by traffic or link equity)
129
+
130
+ 1. **{title}** ({days_ago}d old) — {one-line reason: high incoming link count / high traffic / topical relevance to current focus}
131
+ 2. ...
132
+ ```
133
+
134
+ ### Step 7 — Offer to act on a chosen item
135
+
136
+ Ask: *"Want me to refresh one of these now? I can pull the existing content, suggest updates, create a duplicate with the refresh applied, and you review."*
137
+
138
+ If yes, route to the SEO & AEO Amplifier skill or directly compose `respira_create_page_duplicate` + targeted updates.
139
+
140
+ ---
141
+
142
+ ## Hard rules
143
+
144
+ - **Never delete a page directly.** Even archive-candidates get a recommendation, not a deletion. The user decides. Use `respira_delete_page` only if the user explicitly asks for deletion of a specific named page.
145
+ - **The evergreen list is opinionated but overridable.** Output the list at the top of the report so the user can see what got skipped and add/remove items.
146
+ - **Don't conflate stale with bad.** A 2-year-old page that still has 1,000 monthly views is not a problem. The "refresh" recommendation is based on age, not quality.
147
+ - **Modified date is canonical.** Don't read `date` (published) as a staleness signal. A 2018 post updated last month is fresh.
148
+ - **Custom post types matter.** Case studies, podcast episodes, properties — these often need different staleness windows. If the user runs a podcast and the latest episode is 6 months old, that's stale for podcast content even though "fresh" for blog posts. Offer to set per-CPT windows on a v1.1 of this skill.
149
+
150
+ ---
151
+
152
+ ## Telemetry
153
+
154
+ Records: site URL hash, n_pages / n_posts / n_custom counted, bucket distribution, success/failure, total duration. No page titles, no URLs, no decisions sent.
155
+
156
+ Endpoint: `POST https://www.respira.press/api/skills/track-usage`
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "Stale Content Detector",
3
+ "slug": "stale-content-detector",
4
+ "icon": "🕰️",
5
+ "category": "audit",
6
+ "description": "Find pages and posts that haven't been updated in a long time. Categorize as fresh / aging / stale / archive-candidate. Suggest refresh, redirect, or archive per item — based on age, traffic signal, and internal link count.",
7
+ "author": "Respira Team",
8
+ "author_url": "https://respira.press",
9
+ "trigger": "find old content",
10
+ "requires_respira": true,
11
+ "requires_woocommerce_addon": false,
12
+ "requires_accessibility_addon": false,
13
+ "is_read_only": true,
14
+ "is_duplicate_first": false,
15
+ "version": "1.0.0",
16
+ "last_updated": "2026-05-24",
17
+ "tools_used": [
18
+ "respira_get_active_site",
19
+ "respira_get_site_context",
20
+ "respira_list_pages",
21
+ "respira_list_posts",
22
+ "respira_list_post_types",
23
+ "respira_list_custom_posts",
24
+ "respira_find_element"
25
+ ],
26
+ "detects": [
27
+ "modified_date",
28
+ "evergreen_pages",
29
+ "fresh_content",
30
+ "aging_content",
31
+ "stale_content",
32
+ "archive_candidate_content",
33
+ "orphan_pages",
34
+ "internal_link_count"
35
+ ],
36
+ "generates": [
37
+ "staleness_bucket_distribution",
38
+ "stale_items_table",
39
+ "archive_candidates_table",
40
+ "refresh_priority_list",
41
+ "per_item_action_recommendation"
42
+ ]
43
+ }