@rune-kit/rune 2.10.0 → 2.12.0
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/LICENSE +21 -21
- package/README.md +65 -6
- package/commands/rune.md +168 -168
- package/compiler/__tests__/detect-invariants.test.js +136 -0
- package/compiler/__tests__/doctor-mesh.test.js +229 -0
- package/compiler/__tests__/hook-dispatch.test.js +91 -0
- package/compiler/__tests__/hooks-antigravity.test.js +118 -0
- package/compiler/__tests__/hooks-cursor.test.js +139 -0
- package/compiler/__tests__/hooks-install.test.js +305 -0
- package/compiler/__tests__/hooks-merge.test.js +204 -0
- package/compiler/__tests__/hooks-tiers.test.js +519 -0
- package/compiler/__tests__/hooks-windsurf.test.js +115 -0
- package/compiler/__tests__/inject-claude-md.test.js +152 -0
- package/compiler/__tests__/load-invariants.test.js +408 -0
- package/compiler/__tests__/onboard-invariants.test.js +240 -0
- package/compiler/adapters/hooks/antigravity.js +140 -0
- package/compiler/adapters/hooks/claude.js +166 -0
- package/compiler/adapters/hooks/cursor.js +191 -0
- package/compiler/adapters/hooks/index.js +82 -0
- package/compiler/adapters/hooks/tier-emitter.js +182 -0
- package/compiler/adapters/hooks/windsurf.js +202 -0
- package/compiler/bin/rune.js +196 -6
- package/compiler/commands/hook-dispatch.js +87 -0
- package/compiler/commands/hooks/install.js +120 -0
- package/compiler/commands/hooks/merge.js +211 -0
- package/compiler/commands/hooks/presets.js +116 -0
- package/compiler/commands/hooks/status.js +112 -0
- package/compiler/commands/hooks/tiers.js +221 -0
- package/compiler/commands/hooks/uninstall.js +94 -0
- package/compiler/doctor.js +236 -0
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -127
- package/extensions/ui/skills/component-patterns.md +100 -100
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/hooks.json +111 -111
- package/hooks/post-session-reflect/index.cjs +189 -189
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -71
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +147 -2
- package/skills/autopsy/SKILL.md +335 -335
- package/skills/ba/SKILL.md +85 -1
- package/skills/brainstorm/SKILL.md +380 -342
- package/skills/browser-pilot/SKILL.md +169 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +408 -404
- package/skills/cook/SKILL.md +917 -863
- package/skills/db/SKILL.md +273 -273
- package/skills/debug/SKILL.md +465 -465
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +590 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +178 -177
- package/skills/fix/SKILL.md +332 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +220 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +241 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +269 -251
- package/skills/marketing/SKILL.md +351 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +359 -362
- package/skills/onboard/SKILL.md +432 -403
- package/skills/onboard/references/invariants-template.md +76 -0
- package/skills/onboard/scripts/detect-invariants.js +439 -0
- package/skills/onboard/scripts/inject-claude-md.js +150 -0
- package/skills/onboard/scripts/onboard-invariants.js +194 -0
- package/skills/perf/SKILL.md +347 -346
- package/skills/plan/SKILL.md +435 -428
- package/skills/preflight/SKILL.md +415 -415
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -474
- package/skills/research/SKILL.md +4 -0
- package/skills/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +614 -588
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -287
- package/skills/scope-guard/SKILL.md +183 -180
- package/skills/scout/SKILL.md +269 -263
- package/skills/sentinel/SKILL.md +384 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +595 -543
- package/skills/session-bridge/scripts/load-invariants.js +397 -0
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/slides/SKILL.md +19 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +557 -537
- package/skills/test/SKILL.md +620 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +334 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "mv3-scaffold"
|
|
3
|
-
pack: "@rune/chrome-ext"
|
|
4
|
-
description: "Manifest V3 project scaffolding — detect extension type, generate minimal-permission manifest, scaffold service worker with correct lifecycle patterns, scaffold content script, and generate build config."
|
|
5
|
-
model: sonnet
|
|
6
|
-
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# mv3-scaffold
|
|
10
|
-
|
|
11
|
-
Manifest V3 project scaffolding — detect extension type, generate minimal-permission manifest, scaffold service worker with correct lifecycle patterns, scaffold content script, and generate build config. Prevents the #1 MV3 mistake: carrying MV2 mental models (background pages, remote scripts, setTimeout for keepalive) into an MV3 project.
|
|
12
|
-
|
|
13
|
-
#### Workflow
|
|
14
|
-
|
|
15
|
-
**Step 1 — Detect or clarify extension type**
|
|
16
|
-
Use `Read` on any existing `manifest.json` or project description to classify the extension type:
|
|
17
|
-
- **popup**: user-triggered UI (toolbar button → popup.html)
|
|
18
|
-
- **sidebar**: persistent panel (chrome.sidePanel API, Chrome 114+)
|
|
19
|
-
- **content-injector**: modifies host pages (content scripts + optional popup)
|
|
20
|
-
- **background-only**: no visible UI, reacts to events (alarms, network, tabs)
|
|
21
|
-
- **devtools**: extends Chrome DevTools panel
|
|
22
|
-
|
|
23
|
-
If undetectable from files, ask the user. Extension type determines which APIs, permissions, and scaffold components are generated.
|
|
24
|
-
|
|
25
|
-
**Step 2 — Generate minimal-permission manifest.json**
|
|
26
|
-
Emit `manifest.json` with only the permissions required for the detected type. Flag over-permissioning immediately — requesting `<all_urls>` when only `activeTab` is needed is the #1 CWS rejection cause.
|
|
27
|
-
|
|
28
|
-
Key MV3 manifest rules:
|
|
29
|
-
- `"manifest_version": 3` — mandatory, MV2 deprecated Jan 2023
|
|
30
|
-
- `"background"` uses `{ "service_worker": "background.js" }` — NOT `"scripts"` array
|
|
31
|
-
- `"action"` replaces `"browser_action"` and `"page_action"`
|
|
32
|
-
- No `"content_security_policy"` that relaxes `script-src` (blocks CWS review)
|
|
33
|
-
- No `"web_accessible_resources"` with `matches: ["<all_urls>"]` unless justified
|
|
34
|
-
- External URLs in `"host_permissions"` require justification in CWS dashboard
|
|
35
|
-
|
|
36
|
-
**Step 3 — Scaffold service worker (CRITICAL lifecycle patterns)**
|
|
37
|
-
Generate `background.ts` / `background.js` with the following non-negotiable patterns:
|
|
38
|
-
|
|
39
|
-
CRITICAL: service workers terminate after 30 seconds of idle. Every assumption that breaks because of this:
|
|
40
|
-
- JS variables reset on termination — use `chrome.storage.session` for ephemeral state
|
|
41
|
-
- `setTimeout` / `setInterval` — NOT reliable across terminations, use `chrome.alarms`
|
|
42
|
-
- Pending async operations mid-flight get killed — use alarm + storage to resume
|
|
43
|
-
- `fetch()` initiated in a response to a non-event call may not complete
|
|
44
|
-
|
|
45
|
-
All event listeners MUST be registered at the top level synchronously — NOT inside `async` functions, Promises, or conditionals. Chrome only registers listeners present during the initial synchronous execution of the service worker.
|
|
46
|
-
|
|
47
|
-
**Step 4 — Scaffold content script**
|
|
48
|
-
Generate `content.ts` with correct isolation model:
|
|
49
|
-
- Runs in an **isolated world** — own JS context, cannot access page's JS variables
|
|
50
|
-
- Has access to the DOM but NOT to `chrome.storage`, `chrome.tabs`, most `chrome.*` APIs (exceptions: `chrome.runtime`, `chrome.storage`, `chrome.i18n`)
|
|
51
|
-
- Must message the service worker for privileged operations
|
|
52
|
-
- Inject only when needed — prefer `"run_at": "document_idle"` over `"document_start"`
|
|
53
|
-
|
|
54
|
-
**Step 5 — Scaffold popup/sidebar UI**
|
|
55
|
-
For popup and sidebar types, generate `popup.html` + `popup.ts`:
|
|
56
|
-
- Popup HTML MUST NOT load remote scripts (`<script src="https://...">`) — blocked by CSP
|
|
57
|
-
- All scripts must be local and listed in `web_accessible_resources` if loaded from content scripts
|
|
58
|
-
- Popup closes when user clicks away — don't depend on popup state for background operations
|
|
59
|
-
- For sidebar: register `chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true })`
|
|
60
|
-
|
|
61
|
-
**Step 6 — Generate build config**
|
|
62
|
-
Emit a build configuration based on detected tooling:
|
|
63
|
-
- If `vite` in `package.json` → emit `vite.config.ts` using `@crxjs/vite-plugin` (hot-reload for extension dev)
|
|
64
|
-
- Otherwise → emit vanilla TypeScript config with `tsc` + file copy script
|
|
65
|
-
- Include `web-ext` config for local loading and reload
|
|
66
|
-
|
|
67
|
-
#### Example
|
|
68
|
-
|
|
69
|
-
```json
|
|
70
|
-
// manifest.json — content-injector type, minimal permissions
|
|
71
|
-
{
|
|
72
|
-
"manifest_version": 3,
|
|
73
|
-
"name": "Page Summarizer",
|
|
74
|
-
"version": "1.0.0",
|
|
75
|
-
"description": "Summarize any page using built-in AI or an external API.",
|
|
76
|
-
"permissions": ["activeTab", "storage", "sidePanel"],
|
|
77
|
-
"host_permissions": [],
|
|
78
|
-
"background": {
|
|
79
|
-
"service_worker": "background.js",
|
|
80
|
-
"type": "module"
|
|
81
|
-
},
|
|
82
|
-
"content_scripts": [
|
|
83
|
-
{
|
|
84
|
-
"matches": ["<all_urls>"],
|
|
85
|
-
"js": ["content.js"],
|
|
86
|
-
"run_at": "document_idle"
|
|
87
|
-
}
|
|
88
|
-
],
|
|
89
|
-
"action": {
|
|
90
|
-
"default_title": "Summarize this page",
|
|
91
|
-
"default_icon": { "128": "icons/icon128.png" }
|
|
92
|
-
},
|
|
93
|
-
"side_panel": {
|
|
94
|
-
"default_path": "sidebar.html"
|
|
95
|
-
},
|
|
96
|
-
"icons": { "128": "icons/icon128.png" },
|
|
97
|
-
"content_security_policy": {
|
|
98
|
-
"extension_pages": "script-src 'self'; object-src 'self'"
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
// background.ts — correct MV3 service worker patterns
|
|
105
|
-
// CRITICAL: all listeners registered synchronously at top level
|
|
106
|
-
|
|
107
|
-
chrome.runtime.onInstalled.addListener(({ reason }) => {
|
|
108
|
-
if (reason === 'install') {
|
|
109
|
-
console.log('[SW] Extension installed');
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
// Use chrome.alarms — NOT setTimeout (alarms survive service worker termination)
|
|
114
|
-
chrome.runtime.onInstalled.addListener(() => {
|
|
115
|
-
chrome.alarms.create('heartbeat', { periodInMinutes: 1 });
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
chrome.alarms.onAlarm.addListener((alarm) => {
|
|
119
|
-
if (alarm.name === 'heartbeat') {
|
|
120
|
-
// periodic work here — service worker woke up for this
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
// Message handler — registered synchronously, NOT inside async function
|
|
125
|
-
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
126
|
-
if (message.type === 'SUMMARIZE_PAGE') {
|
|
127
|
-
// Return true to keep the message channel open for async response
|
|
128
|
-
handleSummarize(message.payload).then(sendResponse);
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
async function handleSummarize(payload: { text: string }): Promise<{ summary: string }> {
|
|
134
|
-
// Service worker is alive for the duration of this message handler
|
|
135
|
-
const summary = await callExternalApi(payload.text);
|
|
136
|
-
return { summary };
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
// content.ts — isolated world, limited chrome.* access
|
|
142
|
-
const selectedText = window.getSelection()?.toString() ?? '';
|
|
143
|
-
|
|
144
|
-
if (selectedText.length > 0) {
|
|
145
|
-
// Content scripts can message service worker
|
|
146
|
-
chrome.runtime.sendMessage(
|
|
147
|
-
{ type: 'SUMMARIZE_PAGE', payload: { text: selectedText } },
|
|
148
|
-
(response: { summary: string }) => {
|
|
149
|
-
if (chrome.runtime.lastError) {
|
|
150
|
-
console.error('[Content] Message failed:', chrome.runtime.lastError.message);
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
displaySummary(response.summary);
|
|
154
|
-
}
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function displaySummary(summary: string): void {
|
|
159
|
-
const panel = document.createElement('div');
|
|
160
|
-
panel.id = 'rune-summarizer-panel';
|
|
161
|
-
panel.textContent = summary;
|
|
162
|
-
document.body.appendChild(panel);
|
|
163
|
-
}
|
|
164
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: "mv3-scaffold"
|
|
3
|
+
pack: "@rune/chrome-ext"
|
|
4
|
+
description: "Manifest V3 project scaffolding — detect extension type, generate minimal-permission manifest, scaffold service worker with correct lifecycle patterns, scaffold content script, and generate build config."
|
|
5
|
+
model: sonnet
|
|
6
|
+
tools: [Read, Edit, Write, Grep, Glob, Bash]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# mv3-scaffold
|
|
10
|
+
|
|
11
|
+
Manifest V3 project scaffolding — detect extension type, generate minimal-permission manifest, scaffold service worker with correct lifecycle patterns, scaffold content script, and generate build config. Prevents the #1 MV3 mistake: carrying MV2 mental models (background pages, remote scripts, setTimeout for keepalive) into an MV3 project.
|
|
12
|
+
|
|
13
|
+
#### Workflow
|
|
14
|
+
|
|
15
|
+
**Step 1 — Detect or clarify extension type**
|
|
16
|
+
Use `Read` on any existing `manifest.json` or project description to classify the extension type:
|
|
17
|
+
- **popup**: user-triggered UI (toolbar button → popup.html)
|
|
18
|
+
- **sidebar**: persistent panel (chrome.sidePanel API, Chrome 114+)
|
|
19
|
+
- **content-injector**: modifies host pages (content scripts + optional popup)
|
|
20
|
+
- **background-only**: no visible UI, reacts to events (alarms, network, tabs)
|
|
21
|
+
- **devtools**: extends Chrome DevTools panel
|
|
22
|
+
|
|
23
|
+
If undetectable from files, ask the user. Extension type determines which APIs, permissions, and scaffold components are generated.
|
|
24
|
+
|
|
25
|
+
**Step 2 — Generate minimal-permission manifest.json**
|
|
26
|
+
Emit `manifest.json` with only the permissions required for the detected type. Flag over-permissioning immediately — requesting `<all_urls>` when only `activeTab` is needed is the #1 CWS rejection cause.
|
|
27
|
+
|
|
28
|
+
Key MV3 manifest rules:
|
|
29
|
+
- `"manifest_version": 3` — mandatory, MV2 deprecated Jan 2023
|
|
30
|
+
- `"background"` uses `{ "service_worker": "background.js" }` — NOT `"scripts"` array
|
|
31
|
+
- `"action"` replaces `"browser_action"` and `"page_action"`
|
|
32
|
+
- No `"content_security_policy"` that relaxes `script-src` (blocks CWS review)
|
|
33
|
+
- No `"web_accessible_resources"` with `matches: ["<all_urls>"]` unless justified
|
|
34
|
+
- External URLs in `"host_permissions"` require justification in CWS dashboard
|
|
35
|
+
|
|
36
|
+
**Step 3 — Scaffold service worker (CRITICAL lifecycle patterns)**
|
|
37
|
+
Generate `background.ts` / `background.js` with the following non-negotiable patterns:
|
|
38
|
+
|
|
39
|
+
CRITICAL: service workers terminate after 30 seconds of idle. Every assumption that breaks because of this:
|
|
40
|
+
- JS variables reset on termination — use `chrome.storage.session` for ephemeral state
|
|
41
|
+
- `setTimeout` / `setInterval` — NOT reliable across terminations, use `chrome.alarms`
|
|
42
|
+
- Pending async operations mid-flight get killed — use alarm + storage to resume
|
|
43
|
+
- `fetch()` initiated in a response to a non-event call may not complete
|
|
44
|
+
|
|
45
|
+
All event listeners MUST be registered at the top level synchronously — NOT inside `async` functions, Promises, or conditionals. Chrome only registers listeners present during the initial synchronous execution of the service worker.
|
|
46
|
+
|
|
47
|
+
**Step 4 — Scaffold content script**
|
|
48
|
+
Generate `content.ts` with correct isolation model:
|
|
49
|
+
- Runs in an **isolated world** — own JS context, cannot access page's JS variables
|
|
50
|
+
- Has access to the DOM but NOT to `chrome.storage`, `chrome.tabs`, most `chrome.*` APIs (exceptions: `chrome.runtime`, `chrome.storage`, `chrome.i18n`)
|
|
51
|
+
- Must message the service worker for privileged operations
|
|
52
|
+
- Inject only when needed — prefer `"run_at": "document_idle"` over `"document_start"`
|
|
53
|
+
|
|
54
|
+
**Step 5 — Scaffold popup/sidebar UI**
|
|
55
|
+
For popup and sidebar types, generate `popup.html` + `popup.ts`:
|
|
56
|
+
- Popup HTML MUST NOT load remote scripts (`<script src="https://...">`) — blocked by CSP
|
|
57
|
+
- All scripts must be local and listed in `web_accessible_resources` if loaded from content scripts
|
|
58
|
+
- Popup closes when user clicks away — don't depend on popup state for background operations
|
|
59
|
+
- For sidebar: register `chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true })`
|
|
60
|
+
|
|
61
|
+
**Step 6 — Generate build config**
|
|
62
|
+
Emit a build configuration based on detected tooling:
|
|
63
|
+
- If `vite` in `package.json` → emit `vite.config.ts` using `@crxjs/vite-plugin` (hot-reload for extension dev)
|
|
64
|
+
- Otherwise → emit vanilla TypeScript config with `tsc` + file copy script
|
|
65
|
+
- Include `web-ext` config for local loading and reload
|
|
66
|
+
|
|
67
|
+
#### Example
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
// manifest.json — content-injector type, minimal permissions
|
|
71
|
+
{
|
|
72
|
+
"manifest_version": 3,
|
|
73
|
+
"name": "Page Summarizer",
|
|
74
|
+
"version": "1.0.0",
|
|
75
|
+
"description": "Summarize any page using built-in AI or an external API.",
|
|
76
|
+
"permissions": ["activeTab", "storage", "sidePanel"],
|
|
77
|
+
"host_permissions": [],
|
|
78
|
+
"background": {
|
|
79
|
+
"service_worker": "background.js",
|
|
80
|
+
"type": "module"
|
|
81
|
+
},
|
|
82
|
+
"content_scripts": [
|
|
83
|
+
{
|
|
84
|
+
"matches": ["<all_urls>"],
|
|
85
|
+
"js": ["content.js"],
|
|
86
|
+
"run_at": "document_idle"
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"action": {
|
|
90
|
+
"default_title": "Summarize this page",
|
|
91
|
+
"default_icon": { "128": "icons/icon128.png" }
|
|
92
|
+
},
|
|
93
|
+
"side_panel": {
|
|
94
|
+
"default_path": "sidebar.html"
|
|
95
|
+
},
|
|
96
|
+
"icons": { "128": "icons/icon128.png" },
|
|
97
|
+
"content_security_policy": {
|
|
98
|
+
"extension_pages": "script-src 'self'; object-src 'self'"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// background.ts — correct MV3 service worker patterns
|
|
105
|
+
// CRITICAL: all listeners registered synchronously at top level
|
|
106
|
+
|
|
107
|
+
chrome.runtime.onInstalled.addListener(({ reason }) => {
|
|
108
|
+
if (reason === 'install') {
|
|
109
|
+
console.log('[SW] Extension installed');
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Use chrome.alarms — NOT setTimeout (alarms survive service worker termination)
|
|
114
|
+
chrome.runtime.onInstalled.addListener(() => {
|
|
115
|
+
chrome.alarms.create('heartbeat', { periodInMinutes: 1 });
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
chrome.alarms.onAlarm.addListener((alarm) => {
|
|
119
|
+
if (alarm.name === 'heartbeat') {
|
|
120
|
+
// periodic work here — service worker woke up for this
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Message handler — registered synchronously, NOT inside async function
|
|
125
|
+
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
126
|
+
if (message.type === 'SUMMARIZE_PAGE') {
|
|
127
|
+
// Return true to keep the message channel open for async response
|
|
128
|
+
handleSummarize(message.payload).then(sendResponse);
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
async function handleSummarize(payload: { text: string }): Promise<{ summary: string }> {
|
|
134
|
+
// Service worker is alive for the duration of this message handler
|
|
135
|
+
const summary = await callExternalApi(payload.text);
|
|
136
|
+
return { summary };
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
// content.ts — isolated world, limited chrome.* access
|
|
142
|
+
const selectedText = window.getSelection()?.toString() ?? '';
|
|
143
|
+
|
|
144
|
+
if (selectedText.length > 0) {
|
|
145
|
+
// Content scripts can message service worker
|
|
146
|
+
chrome.runtime.sendMessage(
|
|
147
|
+
{ type: 'SUMMARIZE_PAGE', payload: { text: selectedText } },
|
|
148
|
+
(response: { summary: string }) => {
|
|
149
|
+
if (chrome.runtime.lastError) {
|
|
150
|
+
console.error('[Content] Message failed:', chrome.runtime.lastError.message);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
displaySummary(response.summary);
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function displaySummary(summary: string): void {
|
|
159
|
+
const panel = document.createElement('div');
|
|
160
|
+
panel.id = 'rune-summarizer-panel';
|
|
161
|
+
panel.textContent = summary;
|
|
162
|
+
document.body.appendChild(panel);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "@rune/content"
|
|
3
|
-
description: Content platform patterns — blog systems, CMS integration, MDX authoring, internationalization, SEO, video repurposing pipelines, and content scoring.
|
|
4
|
-
metadata:
|
|
5
|
-
author: runedev
|
|
6
|
-
version: "0.3.0"
|
|
7
|
-
layer: L4
|
|
8
|
-
price: "$9"
|
|
9
|
-
target: Content creators
|
|
10
|
-
format: split
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# @rune/content
|
|
14
|
-
|
|
15
|
-
## Purpose
|
|
16
|
-
|
|
17
|
-
Content-driven sites break in ways that don't show up until production: blog pages that return 404 after a CMS slug change, MDX files that crash the build when a custom component is missing, translations that show raw keys because the fallback chain is misconfigured, and pages that rank poorly because structured data is malformed or canonical URLs point to the wrong locale. This pack covers the full content stack — authoring, management, localization, discovery, performance, and analytics — with patterns that keep content sites correct, fast, and findable.
|
|
18
|
-
|
|
19
|
-
## Triggers
|
|
20
|
-
|
|
21
|
-
- Auto-trigger: when `contentlayer`, `@sanity`, `contentful`, `strapi`, `mdx`, `next-intl`, `i18next`, `*.mdx` detected
|
|
22
|
-
- `/rune blog-patterns` — build or audit blog architecture
|
|
23
|
-
- `/rune cms-integration` — set up or audit headless CMS
|
|
24
|
-
- `/rune mdx-authoring` — configure MDX pipeline with custom components
|
|
25
|
-
- `/rune i18n` — implement or audit internationalization
|
|
26
|
-
- `/rune seo-patterns` — audit SEO, structured data, and meta tags
|
|
27
|
-
- `/rune video-repurpose` — build long-to-short video repurposing pipeline
|
|
28
|
-
- `/rune content-scoring` — implement engagement/virality scoring for content
|
|
29
|
-
- Called by `cook` (L1) when content project detected
|
|
30
|
-
- Called by `marketing` (L2) when creating blog content
|
|
31
|
-
|
|
32
|
-
## Skills Included
|
|
33
|
-
|
|
34
|
-
| Skill | Model | Description |
|
|
35
|
-
|-------|-------|-------------|
|
|
36
|
-
| [blog-patterns](skills/blog-patterns.md) | sonnet | Post management, RSS, pagination, categories |
|
|
37
|
-
| [cms-integration](skills/cms-integration.md) | sonnet | Sanity/Contentful/Strapi, preview, webhooks |
|
|
38
|
-
| [mdx-authoring](skills/mdx-authoring.md) | sonnet | Custom components, TOC, syntax highlighting |
|
|
39
|
-
| [i18n](skills/i18n.md) | sonnet | Locale routing, translations, hreflang, RTL |
|
|
40
|
-
| [seo-patterns](skills/seo-patterns.md) | sonnet | JSON-LD, sitemap, meta tags, Core Web Vitals |
|
|
41
|
-
| [video-repurpose](skills/video-repurpose.md) | sonnet | Long→short video pipeline, captions, face-crop |
|
|
42
|
-
| [content-scoring](skills/content-scoring.md) | sonnet | Virality scoring, engagement metrics, hook analysis |
|
|
43
|
-
| [reference](skills/reference.md) | — | Shared patterns: migration, search, email, perf, analytics, scheduling, a11y, rich media |
|
|
44
|
-
|
|
45
|
-
## Workflows
|
|
46
|
-
|
|
47
|
-
| Workflow | Skills Invoked | Trigger |
|
|
48
|
-
|----------|----------------|---------|
|
|
49
|
-
| New blog from scratch | blog-patterns → mdx-authoring → seo-patterns | `/rune blog-patterns` on empty project |
|
|
50
|
-
| CMS migration | cms-integration → seo-patterns → blog-patterns | New CMS detected, old slugs present |
|
|
51
|
-
| Launch-ready audit | seo-patterns + blog-patterns + i18n (parallel) | Pre-deploy checklist |
|
|
52
|
-
| Multilingual blog | i18n → blog-patterns → seo-patterns | `next-intl` or i18next detected |
|
|
53
|
-
| MDX component library | mdx-authoring → blog-patterns | `*.mdx` files without component registry |
|
|
54
|
-
| Performance audit | seo-patterns (CWV check) + blog-patterns (images) | LCP > 2.5s detected |
|
|
55
|
-
| Search setup | cms-integration + blog-patterns → search integration | Algolia/Meilisearch env vars detected |
|
|
56
|
-
|
|
57
|
-
## Connections
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
Calls → research (L3): SEO data and competitor analysis
|
|
61
|
-
Calls → marketing (L2): content promotion
|
|
62
|
-
Calls → @rune/ui (L4): typography system, article layout patterns, palette for content sites
|
|
63
|
-
Called By ← cook (L1): when content project detected
|
|
64
|
-
Called By ← marketing (L2): when creating blog content
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
| Pack | Connection | When |
|
|
68
|
-
|------|-----------|------|
|
|
69
|
-
| `@rune/analytics` | Page views, scroll depth, read time events → analytics pipeline | Any content site with tracking |
|
|
70
|
-
| `@rune/ui` | Article layout components, image galleries, typography system | Custom component-heavy MDX sites |
|
|
71
|
-
| `@rune/saas` | Auth-gated content (members-only posts), subscription paywalls | Premium content model |
|
|
72
|
-
| `@rune/ecommerce` | Product-linked blog posts, shoppable content, affiliate links | Commerce + content hybrid sites |
|
|
73
|
-
|
|
74
|
-
## Sharp Edges
|
|
75
|
-
|
|
76
|
-
| Failure Mode | Severity | Mitigation |
|
|
77
|
-
|---|---|---|
|
|
78
|
-
| CMS slug change breaks all inbound links (404 on old URLs) | HIGH | Implement redirect map in CMS; check for broken links on content publish webhook |
|
|
79
|
-
| Missing translation key shows raw key string to users | HIGH | Configure fallback to default locale; run missing key detection in CI |
|
|
80
|
-
| MDX build crashes because custom component removed but still referenced | HIGH | Register fallback component that renders warning in dev, empty div in prod |
|
|
81
|
-
| Search index out of sync after CMS publish | HIGH | Trigger index update in CMS publish webhook, same endpoint as ISR revalidation |
|
|
82
|
-
| Whisper large-v3 halluccinates on audio silence | HIGH | Preprocess audio: detect silence > 2s, split segments, skip silent chunks |
|
|
83
|
-
| yt-dlp breaks on YouTube bot detection (HTTP 429) | HIGH | Use browser-mimicking headers, exponential backoff, rotate user agents |
|
|
84
|
-
| Sitemap includes draft/unpublished pages | MEDIUM | Filter sitemap to `status === 'published'` only; add `noindex` to draft preview pages |
|
|
85
|
-
| `hreflang` tags point to wrong locale | MEDIUM | Generate hreflang from route params, not hardcoded; test with hreflang validator |
|
|
86
|
-
|
|
87
|
-
## Done When
|
|
88
|
-
|
|
89
|
-
- Blog architecture set up with pagination, RSS feed, and canonical URLs all resolving correctly
|
|
90
|
-
- CMS integration live with preview mode, publish webhooks triggering ISR revalidation and search index updates
|
|
91
|
-
- All translation keys resolved with fallback locale — no raw keys visible in any locale
|
|
92
|
-
- SEO audit passing: valid JSON-LD structured data, complete sitemap (published pages only), and hreflang tags verified
|
|
93
|
-
|
|
94
|
-
## Cost Profile
|
|
95
|
-
|
|
96
|
-
~16,000–28,000 tokens per full pack run (all 7 skills). Individual skill: ~2,000–5,000 tokens. Sonnet default. Use haiku for detection scans and alt-text audits; escalate to sonnet for CMS integration, SEO audit, video pipeline, and content scoring.
|
|
1
|
+
---
|
|
2
|
+
name: "@rune/content"
|
|
3
|
+
description: Content platform patterns — blog systems, CMS integration, MDX authoring, internationalization, SEO, video repurposing pipelines, and content scoring.
|
|
4
|
+
metadata:
|
|
5
|
+
author: runedev
|
|
6
|
+
version: "0.3.0"
|
|
7
|
+
layer: L4
|
|
8
|
+
price: "$9"
|
|
9
|
+
target: Content creators
|
|
10
|
+
format: split
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# @rune/content
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
|
|
17
|
+
Content-driven sites break in ways that don't show up until production: blog pages that return 404 after a CMS slug change, MDX files that crash the build when a custom component is missing, translations that show raw keys because the fallback chain is misconfigured, and pages that rank poorly because structured data is malformed or canonical URLs point to the wrong locale. This pack covers the full content stack — authoring, management, localization, discovery, performance, and analytics — with patterns that keep content sites correct, fast, and findable.
|
|
18
|
+
|
|
19
|
+
## Triggers
|
|
20
|
+
|
|
21
|
+
- Auto-trigger: when `contentlayer`, `@sanity`, `contentful`, `strapi`, `mdx`, `next-intl`, `i18next`, `*.mdx` detected
|
|
22
|
+
- `/rune blog-patterns` — build or audit blog architecture
|
|
23
|
+
- `/rune cms-integration` — set up or audit headless CMS
|
|
24
|
+
- `/rune mdx-authoring` — configure MDX pipeline with custom components
|
|
25
|
+
- `/rune i18n` — implement or audit internationalization
|
|
26
|
+
- `/rune seo-patterns` — audit SEO, structured data, and meta tags
|
|
27
|
+
- `/rune video-repurpose` — build long-to-short video repurposing pipeline
|
|
28
|
+
- `/rune content-scoring` — implement engagement/virality scoring for content
|
|
29
|
+
- Called by `cook` (L1) when content project detected
|
|
30
|
+
- Called by `marketing` (L2) when creating blog content
|
|
31
|
+
|
|
32
|
+
## Skills Included
|
|
33
|
+
|
|
34
|
+
| Skill | Model | Description |
|
|
35
|
+
|-------|-------|-------------|
|
|
36
|
+
| [blog-patterns](skills/blog-patterns.md) | sonnet | Post management, RSS, pagination, categories |
|
|
37
|
+
| [cms-integration](skills/cms-integration.md) | sonnet | Sanity/Contentful/Strapi, preview, webhooks |
|
|
38
|
+
| [mdx-authoring](skills/mdx-authoring.md) | sonnet | Custom components, TOC, syntax highlighting |
|
|
39
|
+
| [i18n](skills/i18n.md) | sonnet | Locale routing, translations, hreflang, RTL |
|
|
40
|
+
| [seo-patterns](skills/seo-patterns.md) | sonnet | JSON-LD, sitemap, meta tags, Core Web Vitals |
|
|
41
|
+
| [video-repurpose](skills/video-repurpose.md) | sonnet | Long→short video pipeline, captions, face-crop |
|
|
42
|
+
| [content-scoring](skills/content-scoring.md) | sonnet | Virality scoring, engagement metrics, hook analysis |
|
|
43
|
+
| [reference](skills/reference.md) | — | Shared patterns: migration, search, email, perf, analytics, scheduling, a11y, rich media |
|
|
44
|
+
|
|
45
|
+
## Workflows
|
|
46
|
+
|
|
47
|
+
| Workflow | Skills Invoked | Trigger |
|
|
48
|
+
|----------|----------------|---------|
|
|
49
|
+
| New blog from scratch | blog-patterns → mdx-authoring → seo-patterns | `/rune blog-patterns` on empty project |
|
|
50
|
+
| CMS migration | cms-integration → seo-patterns → blog-patterns | New CMS detected, old slugs present |
|
|
51
|
+
| Launch-ready audit | seo-patterns + blog-patterns + i18n (parallel) | Pre-deploy checklist |
|
|
52
|
+
| Multilingual blog | i18n → blog-patterns → seo-patterns | `next-intl` or i18next detected |
|
|
53
|
+
| MDX component library | mdx-authoring → blog-patterns | `*.mdx` files without component registry |
|
|
54
|
+
| Performance audit | seo-patterns (CWV check) + blog-patterns (images) | LCP > 2.5s detected |
|
|
55
|
+
| Search setup | cms-integration + blog-patterns → search integration | Algolia/Meilisearch env vars detected |
|
|
56
|
+
|
|
57
|
+
## Connections
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Calls → research (L3): SEO data and competitor analysis
|
|
61
|
+
Calls → marketing (L2): content promotion
|
|
62
|
+
Calls → @rune/ui (L4): typography system, article layout patterns, palette for content sites
|
|
63
|
+
Called By ← cook (L1): when content project detected
|
|
64
|
+
Called By ← marketing (L2): when creating blog content
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
| Pack | Connection | When |
|
|
68
|
+
|------|-----------|------|
|
|
69
|
+
| `@rune/analytics` | Page views, scroll depth, read time events → analytics pipeline | Any content site with tracking |
|
|
70
|
+
| `@rune/ui` | Article layout components, image galleries, typography system | Custom component-heavy MDX sites |
|
|
71
|
+
| `@rune/saas` | Auth-gated content (members-only posts), subscription paywalls | Premium content model |
|
|
72
|
+
| `@rune/ecommerce` | Product-linked blog posts, shoppable content, affiliate links | Commerce + content hybrid sites |
|
|
73
|
+
|
|
74
|
+
## Sharp Edges
|
|
75
|
+
|
|
76
|
+
| Failure Mode | Severity | Mitigation |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| CMS slug change breaks all inbound links (404 on old URLs) | HIGH | Implement redirect map in CMS; check for broken links on content publish webhook |
|
|
79
|
+
| Missing translation key shows raw key string to users | HIGH | Configure fallback to default locale; run missing key detection in CI |
|
|
80
|
+
| MDX build crashes because custom component removed but still referenced | HIGH | Register fallback component that renders warning in dev, empty div in prod |
|
|
81
|
+
| Search index out of sync after CMS publish | HIGH | Trigger index update in CMS publish webhook, same endpoint as ISR revalidation |
|
|
82
|
+
| Whisper large-v3 halluccinates on audio silence | HIGH | Preprocess audio: detect silence > 2s, split segments, skip silent chunks |
|
|
83
|
+
| yt-dlp breaks on YouTube bot detection (HTTP 429) | HIGH | Use browser-mimicking headers, exponential backoff, rotate user agents |
|
|
84
|
+
| Sitemap includes draft/unpublished pages | MEDIUM | Filter sitemap to `status === 'published'` only; add `noindex` to draft preview pages |
|
|
85
|
+
| `hreflang` tags point to wrong locale | MEDIUM | Generate hreflang from route params, not hardcoded; test with hreflang validator |
|
|
86
|
+
|
|
87
|
+
## Done When
|
|
88
|
+
|
|
89
|
+
- Blog architecture set up with pagination, RSS feed, and canonical URLs all resolving correctly
|
|
90
|
+
- CMS integration live with preview mode, publish webhooks triggering ISR revalidation and search index updates
|
|
91
|
+
- All translation keys resolved with fallback locale — no raw keys visible in any locale
|
|
92
|
+
- SEO audit passing: valid JSON-LD structured data, complete sitemap (published pages only), and hreflang tags verified
|
|
93
|
+
|
|
94
|
+
## Cost Profile
|
|
95
|
+
|
|
96
|
+
~16,000–28,000 tokens per full pack run (all 7 skills). Individual skill: ~2,000–5,000 tokens. Sonnet default. Use haiku for detection scans and alt-text audits; escalate to sonnet for CMS integration, SEO audit, video pipeline, and content scoring.
|