Not in the top 1,000 by GitHub stars
SupportPages-io/wtfm
WTFM: Write the F***ing Manual. A plugin for your coding agent that writes your user docs, screenshots included.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
engine/detect-project/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
e6c0b52f5379 → e6c0b52f5379
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → e6c0b52f5379
No earlier version was observed for comparison.
engine/generate-illustrated-article/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
e6c0b52f5379 → e6c0b52f5379
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → e6c0b52f5379
No earlier version was observed for comparison.
scripts/skills/supportpages/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
e6c0b52f5379 → e6c0b52f5379
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → e6c0b52f5379
No earlier version was observed for comparison.
Verified commit e6c0b52f53793d2a45e6268a449e67c7d976d755
git clone --filter=blob:none --no-checkout https://github.com/SupportPages-io/wtfm.git .hotskills/supportpages-io-wtfm && git -C .hotskills/supportpages-io-wtfm checkout --detach e6c0b52f53793d2a45e6268a449e67c7d976d755
# Copy each selected skill directory from .hotskills/supportpages-io-wtfm into .claude/skills/<skill-name>/Heat
4.5- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- detect-project
engine/detect-project - generate-illustrated-article
engine/generate-illustrated-article - supportpages
scripts/skills/supportpages
How it works
detect-project
When your agent uses it
One-shot project setup for the mockup tools (generate-illustrated-article, generate-walkthrough). Detects the CSS framework, design tokens, brand colours, and fonts, compiles or synthesises a CSS bundle, maps the project structure (framework, routes/controllers/views locations, layouts, shared chrome), and recommends a provider-agnostic low/medium/high mockup model tier so generated output visually matches the real app without overspending on straightforward projects. Terminal (CLI/TUI) apps get a vendored WebTUI terminal stylesheet and a command index instead; mobile apps (React Native incl. Expo, and Flutter) get a vendored Framework7 device-frame stylesheet re-tinted to the app's brand, and a screen index; desktop apps (Electron, Tauri) keep their real compiled CSS and gain a vendored OS-window frame stylesheet; web/canvas games (vanilla canvas, Phaser, PixiJS) keep their real compiled CSS and gain a vendored playfield frame plus a per-scene draw anatomy extracted from the game's render code. The app type is auto-classified from the repo when no app_type hint is given (an explicit hint always wins; on ambiguous multi-surface repos the model adjudicates the product's primary surface from in-repo evidence, diverting from the classifier only when the evidence is one-sided). Use when the user asks to set up / detect / refresh the project's branding or structure, choose an appropriate model tier for mockup generation, or when mockup output doesn't look like the real app. One run per project — result cached in `./.rtfm/`. (Formerly named detect-branding.)
What it loads into context
Frontmatter
887 tokensAlways available to the agent
SKILL.md
34,083 tokensWhen the skill is activated
Reference documents
1,960 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- STEP 0 — Bootstrap
- STEP 1 — Static baseline detection
- STEP 2 — In-session refinement (YOU do this, not a subprocess)
- STEP 3 — Compile the project's real CSS
- STEP 4 — Finalise `branding.json`
- STEP 4.5 — Project structure map
- STEP 4.6 — Mandatory structure enrichment
- STEP 4.7 — CSS health gate (deterministic — do not skip)
- STEP 5 — Print a summary the user can sanity-check
- STEP T1 — Identify the CLI surface (YOU do this; source-only)
- STEP T2 — Assemble branding.css from the vendored WebTUI bundle
- STEP T3 — Write branding.json
- STEP T4 — Structure map: command_index instead of route_index
- Terminal summary
- STEP M1 — Identify the mobile surface (YOU do this; source-only)
- STEP M2 — Extract the app's brand (YOU do this; the mobile analogue of STEP 2)
- STEP M3 — Assemble branding.css (vendored bundle + generated brand-overrides.css)
- STEP M4 — Write branding.json
- STEP M5 — Structure map: screen_index + app_shell instead of route_index
- Mobile summary
- STEP D1 — Identify the desktop surface (YOU do this; source-only)
- STEP D2 — Window frame + desktop keys (after STEPS 1–4)
- STEP D3 — Structure map: route_index + desktop_metadata + app_shell
- Desktop summary
- STEP W1 — Identify the Win32 surface (YOU do this; source-only)
- STEP W2 — Assemble branding.css from the vendored bundles
- STEP W3 — Write branding.json
- STEP W4 — Structure map: dialog_index instead of route_index
- Win32 summary
- STEP C1 — Identify the macOS surface (YOU do this; source-only)
- STEP C2 — Assemble branding.css from the vendored bundles
- STEP C3 — Write branding.json
- STEP C4 — Structure map: view_index instead of route_index
- macOS summary
- STEP G1 — Identify the game surface (YOU do this; source-only)
- STEP G2 — Playfield frame + game keys (after STEPS 1–4)
- STEP G3 — Structure map: route_index + scene_anatomy + game_metadata + app_shell
- Game summary
- STEP 6 — Codebase analysis (MANDATORY when RTFM_ANALYZE=full)
- Notes for the user
Scripts executed separately
assets/macosui/LICENSE-puppertino.txtassets/mobileui/f7-color-theme.mjspackage.jsonscripts/apply_runtime_profiles.jsscripts/check_css_health.jsscripts/check_project_map.jsscripts/check_runtime_coverage.jsscripts/check_runtime_recipe_quality.jsscripts/classify_app_type.shscripts/classify_surface.shscripts/classify_workspace.jsscripts/compile_css.shscripts/detect_static.jsscripts/detect_structure.jsscripts/include_census.jsscripts/json_get.jsscripts/merge_json.jsscripts/recommend_model_tier.jsscripts/resolve_route_chains.jsscripts/run_css_build.shscripts/sanitize_css.jsscripts/test_classify_surface.jsscripts/test_node_helpers.jsscripts/test_recommend_model_tier.jsscripts/test_resolve_route_chains.jsscripts/test_runtime_coverage.jsscripts/test_runtime_recipe_quality.jsscripts/theme_overrides.jsscripts/write_branding.js
Files
../../.claude-plugin/marketplace.jsonasset603 bytesREADME.mddoc8,544 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesSKILL.mdcore133,584 bytesassets/desktop/desktop-frame.cssasset14,731 bytesassets/game/game-frame.cssasset5,028 bytesassets/macosui/LICENSE-puppertino.txtruns1,069 bytesassets/macosui/VERSIONS.txtdoc86 bytesassets/macosui/fonts.cssasset129,654 bytesassets/macosui/macos-frame.cssasset12,416 bytesassets/macosui/puppertino.cssasset36,024 bytesassets/mobileui/LICENSE-fonts.txtdoc755 bytesassets/mobileui/LICENSE-framework7.txtdoc2,658 bytesassets/mobileui/VERSIONS.txtdoc436 bytesassets/mobileui/device-frame.cssasset8,914 bytesassets/mobileui/f7-color-theme.mjsruns75,616 bytesassets/mobileui/f7-icons-names.jsonasset24,414 bytesassets/mobileui/fonts.cssasset115,181 bytesassets/mobileui/framework7-components.cssasset143,482 bytesassets/mobileui/framework7-core.cssasset166,421 bytesassets/mobileui/icons.cssasset144,168 bytesassets/mobileui/md3-defaults.cssasset3,132 bytesassets/mobileui/platforms.jsonasset1,005 bytesassets/tailwind-fallback.cssasset71,444 bytesassets/webtui/LICENSE-webtui.txtdoc1,429 bytesassets/webtui/VERSIONS.txtdoc189 bytesassets/webtui/terminal-frame.cssasset5,613 bytesassets/webtui/theme-catppuccin.cssasset10,482 bytesassets/webtui/theme-everforest.cssasset8,562 bytesassets/webtui/theme-gruvbox.cssasset6,826 bytesassets/webtui/theme-nord.cssasset8,845 bytesassets/webtui/theme-vitesse.cssasset6,242 bytesassets/webtui/themes.jsonasset837 bytesassets/webtui/webtui-core.cssasset39,377 bytesassets/win32ui/7css.cssasset83,803 bytesassets/win32ui/LICENSE-7css.txtdoc1,094 bytesassets/win32ui/VERSIONS.txtdoc43 bytesassets/win32ui/win32-frame.cssasset8,746 bytespackage-lock.jsonasset203 bytespackage.jsonruns516 bytesscripts/apply_runtime_profiles.jsruns21,794 bytesscripts/check_css_health.jsruns19,969 bytesscripts/check_project_map.jsruns8,641 bytesscripts/check_runtime_coverage.jsruns19,094 bytesscripts/check_runtime_recipe_quality.jsruns10,400 bytesscripts/classify_app_type.shruns14,835 bytesscripts/classify_surface.shruns5,347 bytesscripts/classify_workspace.jsruns1,588 bytesscripts/compile_css.shruns19,667 bytesscripts/detect_static.jsruns28,449 bytesscripts/detect_structure.jsruns7,237 bytesscripts/include_census.jsruns27,174 bytesscripts/json_get.jsruns5,293 bytesscripts/merge_json.jsruns1,691 bytesscripts/recommend_model_tier.jsruns9,607 bytesscripts/resolve_route_chains.jsruns7,707 bytesscripts/run_css_build.shruns1,728 bytesscripts/sanitize_css.jsruns2,411 bytesscripts/test_classify_surface.jsruns6,117 bytesscripts/test_node_helpers.jsruns9,359 bytesscripts/test_recommend_model_tier.jsruns5,930 bytesscripts/test_resolve_route_chains.jsruns13,455 bytesscripts/test_runtime_coverage.jsruns16,380 bytesscripts/test_runtime_recipe_quality.jsruns13,612 bytesscripts/theme_overrides.jsruns7,250 bytesscripts/write_branding.jsruns5,022 bytes../../plugin/.claude-plugin/icon.pngasset30,718 bytes../../plugin/.claude-plugin/plugin.jsonasset734 bytes../../plugin/hooks/hooks.jsonasset503 bytes../../plugin/hooks/hooks.jsonasset503 bytes../../plugin/hooks/hooks.jsonasset503 bytes../../plugin/hooks/hooks.jsonasset503 bytes
Read SKILL.md
You are detecting and compiling the visual identity AND structure of the software project at the path the user invoked this skill for (default: cwd). The output is a unified project-level cache at `./.rtfm/` that the article + walkthrough skills consume to make their mockups look like the actual product and to skip re-discovering the project's layout on every run.
CODEBASE: `$codebase_path` (defaults to `.` if blank)
## STEP 0 — Bootstrap
```bash
echo "rtfm-skills v$(cat ${RTFM_SKILLS_DIR:-$HOME/.rtfm-skills}/VERSION 2>/dev/null || echo '?') — detect-project"
RTFM_WORKSPACE="${RTFM_WORKSPACE:-$(${RTFM_SKILLS_DIR:-$HOME/.rtfm-skills}/generate-illustrated-article/scripts/resolve_workspace.sh)}"
cd "$RTFM_WORKSPACE" || exit 1
echo "workspace=$RTFM_WORKSPACE"
echo "related_repos:"; bash ${RTFM_SKILLS_DIR:-$HOME/.rtfm-skills}/generate-illustrated-article/scripts/related_repos.sh
CODEBASE="${codebase_path:-.}"
if [ ! -d "$CODEBASE" ]; thenView the complete source on GitHubgenerate-illustrated-article
When your agent uses it
Produce a COMPLETE illustrated help-centre article in one pass — draft the prose, deliberately choose which steps benefit from a screenshot, render source-grounded mockups, and optionally generate missing raster content or separately-ledgered external surfaces with OpenAI. Use when the user asks for a how-to guide, user-facing documentation, or help-centre article. Triggers on "write an article", "generate a guide", "document how to…", "write an illustrated article", "article with screenshots".
What it loads into context
Frontmatter
417 tokensAlways available to the agent
SKILL.md
18,823 tokensWhen the skill is activated
Reference documents
13,681 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Phase 1 — Draft the article prose
- Phase 2 — Cover user actions, then choose supplementary illustrations (at most `$max_images`)
- Phase 2.5 — Generate missing content images or external surfaces only when required
- Phase 3 — Progressively render the selected mockups, CHROME AUTHORED ONCE
- Phase 4 — POLISH: look at every screenshot, compare it with its sources, add what is missing
- When done
Scripts executed separately
package.jsonscripts/article_blocks.jsscripts/check_article_json.jsscripts/content_locale.jsscripts/emit_walkthrough_signals.jsscripts/extract_images.jsscripts/find_locale_files.jsscripts/generate_content_images.jsscripts/include_census.jsscripts/inject_assets.jsscripts/jit_mockup_css.jsscripts/label_evidence.jsscripts/lint_article_copy.jsscripts/lint_mockup_fidelity.jsscripts/polish_tickets.jsscripts/related_repos.shscripts/render_all.jsscripts/render_mockup.jsscripts/render_ready.jsscripts/resolve_workspace.shscripts/runtime_region_geometry.jsscripts/source_paths.jsscripts/test_control_visibility.jsscripts/test_emit_walkthrough_signals.jsscripts/test_find_locale_files.jsscripts/test_generate_content_images.jsscripts/test_include_census.jsscripts/test_label_evidence.jsscripts/test_lint_article_copy.jsscripts/test_lint_mockup_fidelity.jsscripts/test_node_ports.jsscripts/test_polish_tickets.jsscripts/test_related_repos.jsscripts/test_render_ready.jsscripts/test_source_paths.jsscripts/trace_hook.jsscripts/trace_hook.shscripts/validate_html.jsscripts/watermark.js
Files
SKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytesSKILL.mdcore82,046 bytescontracts/desktop.mddoc15,021 bytescontracts/game.mddoc6,702 bytescontracts/label-evidence.mddoc3,251 bytescontracts/macos.mddoc10,424 bytescontracts/mobile.mddoc8,001 bytescontracts/terminal.mddoc5,934 bytescontracts/win32.mddoc7,677 bytespackage-lock.jsonasset12,837 bytespackage.jsonruns789 bytesscripts/article_blocks.jsruns1,630 bytesscripts/check_article_json.jsruns4,326 bytesscripts/content_locale.jsruns4,009 bytesscripts/emit_walkthrough_signals.jsruns4,126 bytesscripts/extract_images.jsruns7,009 bytesscripts/find_locale_files.jsruns7,133 bytesscripts/generate_content_images.jsruns16,130 bytesscripts/include_census.jsruns27,174 bytesscripts/inject_assets.jsruns82,481 bytesscripts/jit_mockup_css.jsruns10,707 bytesscripts/label_evidence.jsruns7,012 bytesscripts/lint_article_copy.jsruns16,663 bytesscripts/lint_mockup_fidelity.jsruns134,894 bytesscripts/polish_tickets.jsruns69,686 bytesscripts/related_repos.shruns2,005 bytesscripts/render_all.jsruns8,647 bytesscripts/render_mockup.jsruns35,534 bytesscripts/render_ready.jsruns7,550 bytesscripts/resolve_workspace.shruns2,217 bytesscripts/runtime_region_geometry.jsruns3,139 bytesscripts/source_paths.jsruns2,440 bytesscripts/test_control_visibility.jsruns2,583 bytesscripts/test_emit_walkthrough_signals.jsruns6,801 bytesscripts/test_find_locale_files.jsruns5,823 bytesscripts/test_generate_content_images.jsruns9,370 bytesscripts/test_include_census.jsruns6,608 bytesscripts/test_label_evidence.jsruns4,806 bytesscripts/test_lint_article_copy.jsruns12,124 bytesscripts/test_lint_mockup_fidelity.jsruns39,268 bytesscripts/test_node_ports.jsruns9,291 bytesscripts/test_polish_tickets.jsruns34,087 bytesscripts/test_related_repos.jsruns2,962 bytesscripts/test_render_ready.jsruns5,035 bytesscripts/test_source_paths.jsruns3,924 bytesscripts/trace_hook.jsruns3,007 bytesscripts/trace_hook.shruns237 bytesscripts/validate_html.jsruns3,774 bytesscripts/watermark.jsruns3,324 bytes
Read SKILL.md
You are producing a **complete illustrated help-centre article** for "$topic" — prose plus rendered PNG screenshots — in **this single session**. Doing both phases in one session lets you reuse the project map, branding, and resolved view sources instead of re-loading them cold.
The crucial difference from illustrating everything: **you deliberately cover the user-performed UI actions on the main path, then choose whether any non-action steps also earn a screenshot.** `$max_images` is a **hard limit** — the `max_images` argument, else `RTFM_MAX_IMAGES` (echoed in STEP 0), else 3 — and the lint fails an article with more screenshots. Reuse one action-ready screenshot across same-surface actions; when the actions still do not fit, cover the main path first and leave conditional branches and secondary tasks as text. Rendering each mockup is the slowest part of the job, so fewer, well-chosen screenshots are the goal.
Publish the article progressively: write `article.json` as soon as the prose is complete, then publish each `block_<id>.png` immediately after that section mockup is ready. Do not hold completed screenshots until every mockup has been authored. **The reader is waiting from the first second and sees nothing until `article.json` exists, so the prose is written from a minimal grounding (Phase 1's reading budget) and the deep source resolution the mockups need happens in Phase 3, after the article is on disk — the same reading, later.** Final output remains `./output/articles/<slug>/` with `article.json`, `view_sources.json`, `block_<id>.html`, `block_<id>.png`, `lint_report.json`, and `branding.css`, plus generated-asset files only when needed.
## Phase 1 — Draft the article prose
Resolve the topic's source files and author the prose:
- STEP 0 bootstrap. Derive the slug and **write the run-trace marker** (so the trace hook logs this run for later analysis), then build the image manifest:
```bash
echo "rtfm-skills v$(cat ${RTFM_SKILLS_DIR:-$HOME/.rtfm-skills}/VERSION 2>/dev/null || echo '?') — generate-illustrated-article"View the complete source on GitHubsupportpages
When your agent uses it
Create or retry illustrated help articles with WTFM (by SupportPages.io) using its MCP connection and article writer. Use for WTFM or SupportPages.io article requests, including generating an unpublished draft for review.
What it loads into context
Frontmatter
49 tokensAlways available to the agent
SKILL.md
1,496 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
Files
SKILL.mdcore7,521 bytes
Read SKILL.md
<!-- Managed by SupportPages: article coordination v1 -->
# WTFM articles
Use the SupportPages.io MCP connection for the current project.
For inventory questions such as "what support articles do we have?", call
`supportpages_list_articles` directly, without status or initialization first.
When signed out or in local mode it reads the project's current local article
files. Report those titles and paths without asking the user to sign in. An empty
local list means no local articles were found, not that the hosted help centre is
empty. Do not infer the inventory from Git status. Use `source: "hosted"` only
when the user explicitly asks what is on SupportPages.io.
View the complete source on GitHubSkills included
- detect-project
- generate-illustrated-article
- supportpages
Repository facts
- License
- Apache-2.0
- Created
- Sep 25, 2026
- Last pushed
- Nov 5, 2026
- Forks
- 10
- Open issues
- 1
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 7, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 291 notes
engine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedengine/detect-project/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- 2 broad permissionsin 2 files: detect-project/SKILL.md:1 generate-illustrated-article/SKILL.md:1
- 5 dangerous shell commandsin 2 files: generate-illustrated-article/SKILL.md:38 detect-project/scripts/compile_css.sh:273
- 249 network referencesin 17 files: generate-illustrated-article/package-lock.json:17 generate-illustrated-article/scripts/inject_assets.js:57 detect-project/assets/mobileui/f7-color-theme.mjs:101 and 14 more
- No hidden or obfuscated text
- No instruction overrides
- 68 executable scriptsin 68 files: detect-project/assets/macosui/LICENSE-puppertino.txt:1 detect-project/assets/mobileui/f7-color-theme.mjs:1 detect-project/package.json:1 and 65 more
- 5 references to secretsin 2 files: generate-illustrated-article/scripts/test_label_evidence.js:11 generate-illustrated-article/scripts/generate_content_images.js:258
- No requests to vote in Hot
Show all 329 signals by file
.claude-plugin/marketplace.json
- Network accessline 1
{ "name": "supportpages", "owner": { "name": "SupportPages.io", "url": "https://supportpages.io" }, - Network accessline 2
"name": "supportpages", "owner": { "name": "SupportPages.io", "url": "https://supportpages.io" }, "description": "WTFM by SupportPages.io: your coding agent writes the user docs from your codebase, screenshots included.", - Network accessline 3
"owner": { "name": "SupportPages.io", "url": "https://supportpages.io" }, - Network accessline 7
"name": "wtfm", "description": "Your coding agent writes the user docs from your codebase, screenshots included.", "source": { "source": "url", "url": "https://github.com/SupportPages-io/wtfm.git", "ref": "claude-plugin" }, - Network accessline 8
"description": "Your coding agent writes the user docs from your codebase, screenshots included.", "source": { "source": "url", "url": "https://github.com/SupportPages-io/wtfm.git", "ref": "claude-plugin" }, "homepage": "https:/ - Network accessline 9
"source": { "source": "url", "url": "https://github.com/SupportPages-io/wtfm.git", "ref": "claude-plugin" }, - Network accessline 10
"homepage": "https://github.com/SupportPages-io/wtfm#readme",
engine/detect-project/SKILL.md
- Broad permissionsline 1
Read Glob Grep Bash Write - Network accessline 169
**f. Backend-loaded branding (use the defaults!).** Many apps load brand colours dynamically — from a database column, an ENV var, an admin-configured settings panel, or a multi-tenant theme system. The static detector picks up many such pa
engine/detect-project/assets/macosui/LICENSE-puppertino.txt
- Executable scriptline 1
Executable file
engine/detect-project/assets/mobileui/LICENSE-fonts.txt
- Network accessline 4
font stack resolves it offline) — Copyright The Inter Project Authors, licensed under the SIL Open Font License 1.1 (https://github.com/rsms/inter/blob/master/LICENSE.txt). - Network accessline 5
licensed under the SIL Open Font License 1.1 (https://github.com/rsms/inter/blob/master/LICENSE.txt). Source: https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2 - Network accessline 6
(https://github.com/rsms/inter/blob/master/LICENSE.txt). - Network accessline 7
Source: https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2 - Network accessline 8
- Roboto — Copyright The Roboto Project Authors, licensed under the Apache License 2.0 (https://github.com/googlefonts/roboto-classic). Source: https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBHMdazQ.woff2 - Network accessline 9
Apache License 2.0 (https://github.com/googlefonts/roboto-classic). - Network accessline 10
Source: https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBHMdazQ.woff2
engine/detect-project/assets/mobileui/LICENSE-framework7.txt
- Network accessline 1
framework7-core.css, framework7-components.css, md3-defaults.css and f7-color-theme.mjs are built from the framework7 npm package (https://github.com/framework7io/framework7), MIT. icons.css embeds the - Network accessline 2
f7-color-theme.mjs are built from the framework7 npm package (https://github.com/framework7io/framework7), MIT. icons.css embeds the framework7-icons font (https://github.com/framework7io/framework7-icons), - Network accessline 3
(https://github.com/framework7io/framework7), MIT. icons.css embeds the - Network accessline 4
framework7-icons font (https://github.com/framework7io/framework7-icons),
engine/detect-project/assets/mobileui/VERSIONS.txt
- Network accessline 3
framework7-icons@5.0.5 esbuild@0.21.5 (build-time only) Inter: https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2 sha256=c940764593d0fe5d596be327ca7558855e018039fb78509aa21921fd3644c3e4 - Network accessline 4
esbuild@0.21.5 (build-time only) Inter: https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2 sha256=c940764593d0fe5d596be327ca7558855e018039fb78509aa21921fd3644c3e4 Roboto: https://fonts.gstatic.com/s/robot - Network accessline 5
Inter: https://fonts.gstatic.com/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7W0Q5nw.woff2 sha256=c940764593d0fe5d596be327ca7558855e018039fb78509aa21921fd3644c3e4 - Network accessline 6
Roboto: https://fonts.gstatic.com/s/roboto/v51/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBHMdazQ.woff2 sha256=0a44e0bb6ba5c8537e8814c148ef7755f1bce12112361231f595ecc584a18d7a
engine/detect-project/assets/mobileui/f7-color-theme.mjs
- Executable scriptline 1
Executable file - Network accessline 101
let d = discountingIlluminant ? 1 : f * (1 - 1 / 3.6 * Math.exp((-adaptingLuminance - 42) / 92)); d = d > 1 ? 1 : d < 0 ? 0 : d; const nc = f, rgbD = [d * (100 / rW) + 1 - d, d * (100 / gW) + 1 - d, d * (100 / bW) + 1 - d], k = 1 / - Network accessline 102
d = d > 1 ? 1 : d < 0 ? 0 : d; const nc = f, rgbD = [d * (100 / rW) + 1 - d, d * (100 / gW) + 1 - d, d * (100 / bW) + 1 - d], k = 1 / (5 * adaptingLuminance + 1), k4 = k * k * k * k, k4F = 1 - k4, fl = k4 * adaptingLuminance + 0.1 * k4F - Network accessline 103
const nc = f, rgbD = [d * (100 / rW) + 1 - d, d * (100 / gW) + 1 - d, d * (100 / bW) + 1 - d], k = 1 / (5 * adaptingLuminance + 1), k4 = k * k * k * k, k4F = 1 - k4, fl = k4 * adaptingLuminance + 0.1 * k4F * k4F * Math.cbrt(5 * adaptingLumi - Network accessline 105
} constructor(n, aw, nbb, ncb, c, nc, rgbD, fl, fLRoot, z) { this.n = n, this.aw = aw, this.nbb = nbb, this.ncb = ncb, this.c = c, this.nc = nc, this.rgbD = rgbD, this.fl = fl, this.fLRoot = fLRoot, this.z = z; - Network accessline 106
constructor(n, aw, nbb, ncb, c, nc, rgbD, fl, fLRoot, z) { this.n = n, this.aw = aw, this.nbb = nbb, this.ncb = ncb, this.c = c, this.nc = nc, this.rgbD = rgbD, this.fl = fl, this.fLRoot = fLRoot, this.z = z; } - Network accessline 107
this.n = n, this.aw = aw, this.nbb = nbb, this.ncb = ncb, this.c = c, this.nc = nc, this.rgbD = rgbD, this.fl = fl, this.fLRoot = fLRoot, this.z = z; - Network accessline 121
} static fromIntInViewingConditions(argb, viewingConditions) { const green = (65280 & argb) >> 8, blue = 255 & argb, redL = linearized((16711680 & argb) >> 16), greenL = linearized(green), blueL = linearized(blue), x = 0.41233895 * re - Network accessline 122
static fromIntInViewingConditions(argb, viewingConditions) { const green = (65280 & argb) >> 8, blue = 255 & argb, redL = linearized((16711680 & argb) >> 16), greenL = linearized(green), blueL = linearized(blue), x = 0.41233895 * redL + - Network accessline 123
const green = (65280 & argb) >> 8, blue = 255 & argb, redL = linearized((16711680 & argb) >> 16), greenL = linearized(green), blueL = linearized(blue), x = 0.41233895 * redL + 0.35762064 * greenL + 0.18051042 * blueL, y = 0.2126 * redL + 0. - Network accessline 145
} viewed(viewingConditions) { const alpha = 0 === this.chroma || 0 === this.j ? 0 : this.chroma / Math.sqrt(this.j / 100), t = Math.pow(alpha / Math.pow(1.64 - Math.pow(0.29, viewingConditions.n), 0.73), 1 / 0.9), hRad = this.hue * Ma - Network accessline 146
viewed(viewingConditions) { const alpha = 0 === this.chroma || 0 === this.j ? 0 : this.chroma / Math.sqrt(this.j / 100), t = Math.pow(alpha / Math.pow(1.64 - Math.pow(0.29, viewingConditions.n), 0.73), 1 / 0.9), hRad = this.hue * Math.P - Network accessline 147
const alpha = 0 === this.chroma || 0 === this.j ? 0 : this.chroma / Math.sqrt(this.j / 100), t = Math.pow(alpha / Math.pow(1.64 - Math.pow(0.29, viewingConditions.n), 0.73), 1 / 0.9), hRad = this.hue * Math.PI / 180, eHue = 0.25 * (Math.cos - Network accessline 149
} static fromXyzInViewingConditions(x, y, z, viewingConditions) { const rC = 0.401288 * x + 0.650173 * y - 0.051461 * z, gC = -0.250268 * x + 1.204414 * y + 0.045854 * z, bC = -2079e-6 * x + 0.048952 * y + 0.953127 * z, rD = viewingCo - Network accessline 150
static fromXyzInViewingConditions(x, y, z, viewingConditions) { const rC = 0.401288 * x + 0.650173 * y - 0.051461 * z, gC = -0.250268 * x + 1.204414 * y + 0.045854 * z, bC = -2079e-6 * x + 0.048952 * y + 0.953127 * z, rD = viewingCondit - Network accessline 151
const rC = 0.401288 * x + 0.650173 * y - 0.051461 * z, gC = -0.250268 * x + 1.204414 * y + 0.045854 * z, bC = -2079e-6 * x + 0.048952 * y + 0.953127 * z, rD = viewingConditions.rgbD[0] * rC, gD = viewingConditions.rgbD[1] * gC, bD = viewing - Network accessline 153
} xyzInViewingConditions(viewingConditions) { const alpha = 0 === this.chroma || 0 === this.j ? 0 : this.chroma / Math.sqrt(this.j / 100), t = Math.pow(alpha / Math.pow(1.64 - Math.pow(0.29, viewingConditions.n), 0.73), 1 / 0.9), hRad - Network accessline 154
xyzInViewingConditions(viewingConditions) { const alpha = 0 === this.chroma || 0 === this.j ? 0 : this.chroma / Math.sqrt(this.j / 100), t = Math.pow(alpha / Math.pow(1.64 - Math.pow(0.29, viewingConditions.n), 0.73), 1 / 0.9), hRad = t - Network accessline 155
const alpha = 0 === this.chroma || 0 === this.j ? 0 : this.chroma / Math.sqrt(this.j / 100), t = Math.pow(alpha / Math.pow(1.64 - Math.pow(0.29, viewingConditions.n), 0.73), 1 / 0.9), hRad = this.hue * Math.PI / 180, eHue = 0.25 * (Math.cos - Network accessline 243
static findResultByJ(hueRadians, chroma, y) { let j = 11 * Math.sqrt(y); const viewingConditions = ViewingConditions.DEFAULT, tInnerCoeff = 1 / Math.pow(1.64 - Math.pow(0.29, viewingConditions.n), 0.73), p1 = 0.25 * (Math.cos(hueRad - Network accessline 244
let j = 11 * Math.sqrt(y); const viewingConditions = ViewingConditions.DEFAULT, tInnerCoeff = 1 / Math.pow(1.64 - Math.pow(0.29, viewingConditions.n), 0.73), p1 = 0.25 * (Math.cos(hueRadians + 2) + 3.8) * (5e4 / 13) * viewingConditions. - Network accessline 245
const viewingConditions = ViewingConditions.DEFAULT, tInnerCoeff = 1 / Math.pow(1.64 - Math.pow(0.29, viewingConditions.n), 0.73), p1 = 0.25 * (Math.cos(hueRadians + 2) + 3.8) * (5e4 / 13) * viewingConditions.nc * viewingConditions.ncb, hSi
engine/detect-project/assets/mobileui/framework7-core.css
engine/detect-project/assets/webtui/LICENSE-webtui.txt
- Network accessline 1
The CSS files in this directory named webtui-core.css and theme-*.css are built verbatim from the WebTUI packages (https://github.com/webtui/webtui), - Network accessline 2
built verbatim from the WebTUI packages (https://github.com/webtui/webtui), - Network accessline 7
Copyright (c) WebTUI contributors (https://github.com/webtui/webtui)
engine/detect-project/assets/win32ui/7css.css
- Network accessline 1
/*! 7.css v0.21.1 - https://khang-nd.github.io/7.css */[role=tooltip]{background:linear-gradient(180deg,#fff,#ebebeb);border:1px solid #0006;border-radius:3px;box-shadow:5px 5px 3px -3px #0006;padding:1em 1em 1em 2.5em;position:relative}[ro
engine/detect-project/package.json
- Executable scriptline 1
Executable file
engine/detect-project/scripts/apply_runtime_profiles.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/check_css_health.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/check_project_map.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/check_runtime_coverage.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/check_runtime_recipe_quality.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/classify_app_type.sh
- Executable scriptline 1
#!/usr/bin/env bash
engine/detect-project/scripts/classify_surface.sh
- Executable scriptline 1
#!/usr/bin/env bash
engine/detect-project/scripts/classify_workspace.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/compile_css.sh
- Executable scriptline 1
#!/bin/bash - Dangerous shell operationline 273
[ -n "$tmp_input" ] && rm -f "$tmp_input" - Dangerous shell operationline 277
[ -n "$tmp_input" ] && rm -f "$tmp_input" - Network accessline 353
bs_ver=$(echo "$bs_ver" | sed 's/^[v^~]//') echo " Fetching Bootstrap $bs_ver..." >&2 curl -sL "https://cdn.jsdelivr.net/npm/bootstrap@${bs_ver}/dist/css/bootstrap.min.css" >> "$OUTPUT_CSS" 2>/dev/null || \ - Network accessline 354
echo " Fetching Bootstrap $bs_ver..." >&2 curl -sL "https://cdn.jsdelivr.net/npm/bootstrap@${bs_ver}/dist/css/bootstrap.min.css" >> "$OUTPUT_CSS" 2>/dev/null || \ curl -sL "https://cdn.jsdelivr.net/npm/bootstrap - Network accessline 355
curl -sL "https://cdn.jsdelivr.net/npm/bootstrap@${bs_ver}/dist/css/bootstrap.min.css" >> "$OUTPUT_CSS" 2>/dev/null || \ - Network accessline 356
curl -sL "https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" >> "$OUTPUT_CSS" 2>/dev/null || true - Network accessline 364
curl -sL "https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" >> "$OUTPUT_CSS" 2>/dev/null || true - Network accessline 365
echo "" >> "$OUTPUT_CSS" curl -sL "https://cdn.jsdelivr.net/npm/@webpixels/css@${wp_ver}/dist/index.css" >> "$OUTPUT_CSS" 2>/dev/null || true echo "" >> "$OUTPUT_CSS" - Network accessline 366
curl -sL "https://cdn.jsdelivr.net/npm/@webpixels/css@${wp_ver}/dist/index.css" >> "$OUTPUT_CSS" 2>/dev/null || true - Network accessline 371
bl_ver=$(echo "$bl_ver" | sed 's/^[v^~]//') echo " Fetching Bulma $bl_ver..." >&2 curl -sL "https://cdn.jsdelivr.net/npm/bulma@${bl_ver}/css/bulma.min.css" >> "$OUTPUT_CSS" 2>/dev/null || true - Network accessline 372
echo " Fetching Bulma $bl_ver..." >&2 curl -sL "https://cdn.jsdelivr.net/npm/bulma@${bl_ver}/css/bulma.min.css" >> "$OUTPUT_CSS" 2>/dev/null || true echo "" >> "$OUTPUT_CSS" - Network accessline 373
curl -sL "https://cdn.jsdelivr.net/npm/bulma@${bl_ver}/css/bulma.min.css" >> "$OUTPUT_CSS" 2>/dev/null || true - Network accessline 378
fd_ver=$(echo "$fd_ver" | sed 's/^[v^~]//') echo " Fetching Foundation $fd_ver..." >&2 curl -sL "https://cdn.jsdelivr.net/npm/foundation-sites@${fd_ver}/dist/css/foundation.min.css" >> "$OUTPUT_CSS" 2>/dev/null || t - Network accessline 379
echo " Fetching Foundation $fd_ver..." >&2 curl -sL "https://cdn.jsdelivr.net/npm/foundation-sites@${fd_ver}/dist/css/foundation.min.css" >> "$OUTPUT_CSS" 2>/dev/null || true echo "" >> "$OUTPUT_CSS" - Network accessline 380
curl -sL "https://cdn.jsdelivr.net/npm/foundation-sites@${fd_ver}/dist/css/foundation.min.css" >> "$OUTPUT_CSS" 2>/dev/null || true - Network accessline 411
[ -z "$url" ] || [ "$url" = "null" ] && continue echo " Fetching CDN: $url" >&2 curl -sL "$url" >> "$OUTPUT_CSS" 2>/dev/null || true - Network accessline 412
echo " Fetching CDN: $url" >&2 curl -sL "$url" >> "$OUTPUT_CSS" 2>/dev/null || true echo "" >> "$OUTPUT_CSS" - Network accessline 413
curl -sL "$url" >> "$OUTPUT_CSS" 2>/dev/null || true
engine/detect-project/scripts/detect_static.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 401
// Pattern B: ENV.fetch("PRIMARY_COLOR", "#hex") (env-var with default) - Network accessline 507
function frameworkCdn(framework, version) { if (!framework) return null; if (framework.includes('tailwind')) return 'https://cdn.tailwindcss.com'; - Network accessline 508
if (!framework) return null; if (framework.includes('tailwind')) return 'https://cdn.tailwindcss.com'; const cleanVersion = (version || '').replace(/^[\^~]/, ''); - Network accessline 509
if (framework.includes('tailwind')) return 'https://cdn.tailwindcss.com'; - Network accessline 511
if (framework.includes('webpixels')) { const v = cleanVersion || 'latest'; return `https://cdn.jsdelivr.net/npm/@webpixels/css@${v}/dist/index.css`; - Network accessline 512
const v = cleanVersion || 'latest'; return `https://cdn.jsdelivr.net/npm/@webpixels/css@${v}/dist/index.css`; } - Network accessline 513
return `https://cdn.jsdelivr.net/npm/@webpixels/css@${v}/dist/index.css`; - Network accessline 515
if (framework.includes('bootstrap')) { const v = cleanVersion || '5.3.2'; return `https://cdn.jsdelivr.net/npm/bootstrap@${v}/dist/css/bootstrap.min.css`; - Network accessline 516
const v = cleanVersion || '5.3.2'; return `https://cdn.jsdelivr.net/npm/bootstrap@${v}/dist/css/bootstrap.min.css`; } - Network accessline 517
return `https://cdn.jsdelivr.net/npm/bootstrap@${v}/dist/css/bootstrap.min.css`; - Network accessline 519
if (framework.includes('bulma')) { const v = cleanVersion || '0.9.4'; return `https://cdn.jsdelivr.net/npm/bulma@${v}/css/bulma.min.css`; - Network accessline 520
const v = cleanVersion || '0.9.4'; return `https://cdn.jsdelivr.net/npm/bulma@${v}/css/bulma.min.css`; } - Network accessline 521
return `https://cdn.jsdelivr.net/npm/bulma@${v}/css/bulma.min.css`; - Network accessline 523
if (framework.includes('foundation')) { const v = cleanVersion || '6.7.5'; return `https://cdn.jsdelivr.net/npm/foundation-sites@${v}/dist/css/foundation.min.css`; - Network accessline 524
const v = cleanVersion || '6.7.5'; return `https://cdn.jsdelivr.net/npm/foundation-sites@${v}/dist/css/foundation.min.css`; } - Network accessline 525
return `https://cdn.jsdelivr.net/npm/foundation-sites@${v}/dist/css/foundation.min.css`;
engine/detect-project/scripts/detect_structure.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/include_census.js
- Executable scriptline 1
Executable file
engine/detect-project/scripts/json_get.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/merge_json.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/recommend_model_tier.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/resolve_route_chains.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/run_css_build.sh
- Executable scriptline 1
#!/bin/bash
engine/detect-project/scripts/sanitize_css.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/test_classify_surface.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/test_node_helpers.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/test_recommend_model_tier.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/test_resolve_route_chains.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/test_runtime_coverage.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/test_runtime_recipe_quality.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/theme_overrides.js
- Executable scriptline 1
#!/usr/bin/env node
engine/detect-project/scripts/write_branding.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/SKILL.md
- Broad permissionsline 1
Read Glob Grep Bash Write - Dangerous shell operationline 38
rm -f "$OUT/generated_image_requests.json" "$OUT/generated_images.json"; rm -rf "$OUT/generated-assets" - Dangerous shell operationline 45
**`polish=only`** (re-polish an existing article): run STEP 0 WITHOUT its `rm -f … generated_image_requests.json …` line (the existing `$OUT` is the input, keep every file), skip STEP 0.5 through Phase 3 entirely, and go straight to **Phase - Dangerous shell operationline 464
Remove the run-trace marker: `rm -f ./.rtfm-trace/CURRENT`.
engine/generate-illustrated-article/package-lock.json
- Network accessline 17
"node_modules/@puppeteer/browsers": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.6.tgz", - Network accessline 18
"version": "3.2.6", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.6.tgz", "integrity": "sha512-MJP29gVoHznmqmwhH1tlZqzfeQ3aylTpSSa6WKZXtkwYUH02i9imBmWGTyZrbnAou5paX78SE4jMAUqnEPf8ug==", - Network accessline 19
"resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.6.tgz", - Network accessline 45
"node_modules/ansi-regex": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", - Network accessline 46
"version": "6.4.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", - Network accessline 47
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", - Network accessline 52
}, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" - Network accessline 53
"funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } - Network accessline 54
"url": "https://github.com/chalk/ansi-regex?sponsor=1" - Network accessline 57
"node_modules/ansi-styles": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - Network accessline 58
"version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - Network accessline 59
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - Network accessline 64
}, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 65
"funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } - Network accessline 66
"url": "https://github.com/chalk/ansi-styles?sponsor=1" - Network accessline 69
"node_modules/chromium-bidi": { "version": "157.0.8090-0", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-157.0.8090-0.tgz", - Network accessline 70
"version": "157.0.8090-0", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-157.0.8090-0.tgz", "integrity": "sha512-KJw7IQgqXwxpJgJlEIPg5mr2ZoqA+jkTRtc5EABI7sUJ3bu3cpI7NuEBoj4Gn1AsF78CaT9So5WQWspK3/wYag==", - Network accessline 71
"resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-157.0.8090-0.tgz", - Network accessline 85
"node_modules/cliui": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - Network accessline 86
"version": "9.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - Network accessline 87
"resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - Network accessline 99
"node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - Network accessline 100
"version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - Network accessline 101
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - Network accessline 111
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 112
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 113
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 116
"node_modules/devtools-protocol": { "version": "0.0.1704951", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1704951.tgz", - Network accessline 117
"version": "0.0.1704951", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1704951.tgz", "integrity": "sha512-GQhQOs9u/Mvm1zMtJIH872JS4AskuZdUSsPNPk4ChahtWAUqgz6atEtIsMt+nO7MqF1Ic4HxII/k8Cu36JivN - Network accessline 118
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1704951.tgz", - Network accessline 122
"node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - Network accessline 123
"version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - Network accessline 124
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - Network accessline 128
"node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - Network accessline 129
"version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - Network accessline 130
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - Network accessline 137
"node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - Network accessline 138
"version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - Network accessline 139
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - Network accessline 146
"node_modules/get-east-asian-width": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", - Network accessline 147
"version": "1.7.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", - Network accessline 148
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", - Network accessline 153
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 154
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 155
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 158
"node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - Network accessline 159
"version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - Network accessline 160
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - Network accessline 165
}, "funding": { "url": "https://github.com/sponsors/antonk52" - Network accessline 166
"funding": { "url": "https://github.com/sponsors/antonk52" } - Network accessline 167
"url": "https://github.com/sponsors/antonk52" - Network accessline 170
"node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - Network accessline 171
"version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - Network accessline 172
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - Network accessline 176
"node_modules/modern-tar": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.8.6.tgz", - Network accessline 177
"version": "0.8.6", "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.8.6.tgz", "integrity": "sha512-LYSks0tNVqbtez/9OB0YFP6qLRSqkdAxJWOQpVaR67lNTbj2zNLyYpowkRMia5lXLCZKzxwoxkxH2MbbBR2aEg==", - Network accessline 178
"resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.8.6.tgz", - Network accessline 185
"node_modules/puppeteer": { "version": "25.16.0", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.16.0.tgz", - Network accessline 186
"version": "25.16.0", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.16.0.tgz", "integrity": "sha512-LOr3reYnxAYYfQkpopz1fQnL0LdvqhpR5U2Fu+QnwzTX2gpVTHsn91UETo5NNC1md2/oC54Zu1ChBXgZDNSP1A==", - Network accessline 187
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.16.0.tgz", - Network accessline 206
"node_modules/puppeteer-core": { "version": "25.16.0", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.16.0.tgz", - Network accessline 207
"version": "25.16.0", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.16.0.tgz", "integrity": "sha512-VA5Pf54N8shfopNkZZXCdiiwfnnY8ZJYAMqFQRhlH5mGUhfwf53Ar770GPtdpTDLUqvQeYpIBtC9/G2Jij2IJw==", - Network accessline 208
"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.16.0.tgz", - Network accessline 223
"node_modules/string-width": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", - Network accessline 224
"version": "8.3.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", - Network accessline 225
"resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", - Network accessline 234
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 235
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 236
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 239
"node_modules/strip-ansi": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - Network accessline 240
"version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - Network accessline 241
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - Network accessline 249
}, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" - Network accessline 250
"funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } - Network accessline 251
"url": "https://github.com/chalk/strip-ansi?sponsor=1" - Network accessline 254
"node_modules/typed-query-selector": { "version": "2.12.3", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.3.tgz", - Network accessline 255
"version": "2.12.3", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.3.tgz", "integrity": "sha512-/dtuMZyutHLlrxWhhC1uib00ELUr2dZ8C9B8YzZYsJmeE3V56OxRblrSM2UaF142pcMtak7ehZ6+poWGeehNIg==" - Network accessline 256
"resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.3.tgz", - Network accessline 260
"node_modules/webdriver-bidi-protocol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-1.0.1.tgz", - Network accessline 261
"version": "1.0.1", "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-1.0.1.tgz", "integrity": "sha512-WXWs/aXF2a6Al1Z2/V/7Gp2oPZOAAmHjJOTmv4KCXRJ122IMj3tSSMc6a4q3K4QOmhQbse/Ahr+oTVJOU2dUi - Network accessline 262
"resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-1.0.1.tgz", - Network accessline 266
"node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - Network accessline 267
"version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - Network accessline 268
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - Network accessline 278
}, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - Network accessline 279
"funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } - Network accessline 280
"url": "https://github.com/chalk/wrap-ansi?sponsor=1" - Network accessline 283
"node_modules/wrap-ansi/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - Network accessline 284
"version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - Network accessline 285
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - Network accessline 295
}, "funding": { "url": "https://github.com/sponsors/sindresorhus" - Network accessline 296
"funding": { "url": "https://github.com/sponsors/sindresorhus" } - Network accessline 297
"url": "https://github.com/sponsors/sindresorhus" - Network accessline 300
"node_modules/ws": { "version": "8.22.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", - Network accessline 301
"version": "8.22.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", - Network accessline 302
"resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", - Network accessline 321
"node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - Network accessline 322
"version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - Network accessline 323
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - Network accessline 330
"node_modules/yargs": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.2.0.tgz", - Network accessline 331
"version": "18.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.2.0.tgz", "integrity": "sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==", - Network accessline 332
"resolved": "https://registry.npmjs.org/yargs/-/yargs-18.2.0.tgz", - Network accessline 347
"node_modules/yargs-parser": { "version": "22.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - Network accessline 348
"version": "22.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - Network accessline 349
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - Network accessline 356
"node_modules/zod": { "version": "4.6.7", "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", - Network accessline 357
"version": "4.6.7", "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", - Network accessline 358
"resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", - Network accessline 360
"license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" - Network accessline 361
"funding": { "url": "https://github.com/sponsors/colinhacks" } - Network accessline 362
"url": "https://github.com/sponsors/colinhacks"
engine/generate-illustrated-article/package.json
- Executable scriptline 1
Executable file
engine/generate-illustrated-article/scripts/article_blocks.js
- Executable scriptline 1
Executable file
engine/generate-illustrated-article/scripts/check_article_json.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/content_locale.js
- Executable scriptline 1
Executable file
engine/generate-illustrated-article/scripts/emit_walkthrough_signals.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/extract_images.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/find_locale_files.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/generate_content_images.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 211
async function callOpenAI({ apiKey, model, prompt, size, fetchImpl = globalThis.fetch, apiBase }) { if (typeof fetchImpl !== 'function') throw new Error('fetch is unavailable; Node.js 18+ is required'); const base = (apiBase || proc - Network accessline 212
if (typeof fetchImpl !== 'function') throw new Error('fetch is unavailable; Node.js 18+ is required'); const base = (apiBase || process.env.OPENAI_API_BASE_URL || 'https://api.openai.com/v1').replace(/\/$/, ''); const response = awa - Network accessline 213
const base = (apiBase || process.env.OPENAI_API_BASE_URL || 'https://api.openai.com/v1').replace(/\/$/, ''); - Access to secretsline 258
[Credential-related source omitted] - Access to secretsline 346
[Credential-related source omitted]
engine/generate-illustrated-article/scripts/include_census.js
- Executable scriptline 1
Executable file
engine/generate-illustrated-article/scripts/inject_assets.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 57
const TAILWIND_CDN = '<script src="https://cdn.tailwindcss.com"></script>'; - Network accessline 559
fontawesome: { detect: /class=["'][^"']*\bfa[srlbd]?\s+fa-|class=["'][^"']*\bfa-[a-z]/, cssUrl: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css', - Network accessline 560
detect: /class=["'][^"']*\bfa[srlbd]?\s+fa-|class=["'][^"']*\bfa-[a-z]/, cssUrl: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css', }, - Network accessline 561
cssUrl: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css', - Network accessline 563
'bootstrap-icons': { detect: /class=["'][^"']*\bbi[\s-]/, cssUrl: 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css', - Network accessline 564
detect: /class=["'][^"']*\bbi[\s-]/, cssUrl: 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css', }, - Network accessline 565
cssUrl: 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css', - Network accessline 569
detect: /class=["'][^"']*\bmaterial-icons/, cssUrl: 'https://fonts.googleapis.com/icon?family=Material+Icons', - Network accessline 570
cssUrl: 'https://fonts.googleapis.com/icon?family=Material+Icons', - Network accessline 574
detect: /class=["'][^"']*\bmaterial-symbols-/, cssUrl: 'https://fonts.googleapis.com/css2' - Network accessline 575
cssUrl: 'https://fonts.googleapis.com/css2' - Network accessline 582
detect: /class=["'][^"']*\bbx\s+bx[sl]?-/, cssUrl: 'https://cdn.jsdelivr.net/npm/boxicons@2.1.4/css/boxicons.min.css', - Network accessline 583
cssUrl: 'https://cdn.jsdelivr.net/npm/boxicons@2.1.4/css/boxicons.min.css', - Network accessline 587
detect: /class=["'][^"']*\bri-[a-z0-9-]+/, cssUrl: 'https://cdn.jsdelivr.net/npm/remixicon@4.2.0/fonts/remixicon.css', - Network accessline 588
cssUrl: 'https://cdn.jsdelivr.net/npm/remixicon@4.2.0/fonts/remixicon.css', - Network accessline 594
detect: /class=["'][^"']*\bglyphicon\b/, cssUrl: 'https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css', - Network accessline 595
cssUrl: 'https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css', - Network accessline 605
const ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'; const response = await fetch(url, { headers: { 'User-Agent': ua }, signal: AbortSignal.time - Network accessline 606
+ '(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'; const response = await fetch(url, { headers: { 'User-Agent': ua }, signal: AbortSignal.timeout(timeoutMs) }); if (!response.ok) throw new Error(`HTTP Error ${response.status}: - Network accessline 607
const response = await fetch(url, { headers: { 'User-Agent': ua }, signal: AbortSignal.timeout(timeoutMs) }); - Network accessline 707
/** * Extract the first font family name from branding.google_fonts entries, * e.g. https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap - Network accessline 708
* Extract the first font family name from branding.google_fonts entries, * e.g. https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap * -> "Inter". Descriptor objects contribute their `family`. Used to put the - Network accessline 709
* e.g. https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap - Network accessline 731
* {"family": "Plus Jakarta Sans", "weights": ["500","600","700"], "source": ...} * (what detect-project records for a next/font/google import), which is turned * into https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@500;600 - Network accessline 732
* (what detect-project records for a next/font/google import), which is turned * into https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@500;600;700&display=swap. * Returns null for anything unusable. - Network accessline 733
* into https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@500;600;700&display=swap. - Network accessline 742
if (!/^(https?:)?\/\//.test(s) && !s.includes('/')) { return `https://fonts.googleapis.com/css2?family=${s.replaceAll(' ', '+')}&display=swap`; - Network accessline 743
return `https://fonts.googleapis.com/css2?family=${s.replaceAll(' ', '+')}&display=swap`; - Network accessline 750
const famQ = family.replaceAll(' ', '+'); const weights = (truthy(item.weights) ? item.weights : []).map(w => String(w).trim()).filter(Boolean); if (weights.length) return `https://fonts.googleapis.com/css2?family=${famQ}:wg - Network accessline 751
const weights = (truthy(item.weights) ? item.weights : []).map(w => String(w).trim()).filter(Boolean); if (weights.length) return `https://fonts.googleapis.com/css2?family=${famQ}:wght@${weights.join(';')}&display=swap`; ret - Network accessline 752
if (weights.length) return `https://fonts.googleapis.com/css2?family=${famQ}:wght@${weights.join(';')}&display=swap`; - Network accessline 753
return `https://fonts.googleapis.com/css2?family=${famQ}&display=swap`; - Network accessline 996
if (symbols.size) { const spriteSvg = '<svg xmlns="http://www.w3.org/2000/svg" style="display:none" ' - Network accessline 997
const spriteSvg = '<svg xmlns="http://www.w3.org/2000/svg" style="display:none" '
engine/generate-illustrated-article/scripts/jit_mockup_css.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/label_evidence.js
- Executable scriptline 1
Executable file
engine/generate-illustrated-article/scripts/lint_article_copy.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/lint_mockup_fidelity.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/polish_tickets.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/related_repos.sh
- Executable scriptline 1
#!/usr/bin/env bash
engine/generate-illustrated-article/scripts/render_all.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/render_mockup.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 103
font-weight: 100 900; } @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap'); - Network accessline 104
} @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap'); .tui-app, .tui-container, [data-viewport="tui"] body { - Network accessline 105
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap');
engine/generate-illustrated-article/scripts/render_ready.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/resolve_workspace.sh
- Executable scriptline 1
#!/usr/bin/env bash
engine/generate-illustrated-article/scripts/runtime_region_geometry.js
- Executable scriptline 1
Executable file
engine/generate-illustrated-article/scripts/source_paths.js
- Executable scriptline 1
Executable file
engine/generate-illustrated-article/scripts/test_control_visibility.js
- Executable scriptline 1
Executable file
engine/generate-illustrated-article/scripts/test_emit_walkthrough_signals.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/test_find_locale_files.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/test_generate_content_images.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/test_include_census.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/test_label_evidence.js
engine/generate-illustrated-article/scripts/test_lint_article_copy.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/test_lint_mockup_fidelity.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/test_node_ports.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 91
{ assert.strictEqual(buildCssHeadBlock(null, null), '<script src="https://cdn.tailwindcss.com"></script>'); - Network accessline 92
assert.strictEqual(buildCssHeadBlock(null, null), '<script src="https://cdn.tailwindcss.com"></script>'); - Network accessline 102
assert(head.includes('--brand-text-muted: #999;')); assert(!head.includes('cdn.tailwindcss.com'), 'compiled non-Tailwind CSS needs no CDN'); assert.strictEqual(firstGoogleFontFamily({ google_fonts: ['https://fonts.googleapis.com/css - Network accessline 103
assert(!head.includes('cdn.tailwindcss.com'), 'compiled non-Tailwind CSS needs no CDN'); assert.strictEqual(firstGoogleFontFamily({ google_fonts: ['https://fonts.googleapis.com/css2?family=Open+Sans:wght@400'] }), 'Open Sans'); asse - Network accessline 104
assert.strictEqual(firstGoogleFontFamily({ google_fonts: ['https://fonts.googleapis.com/css2?family=Open+Sans:wght@400'] }), 'Open Sans');
engine/generate-illustrated-article/scripts/test_polish_tickets.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/test_related_repos.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/test_render_ready.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/test_source_paths.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/trace_hook.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/trace_hook.sh
- Executable scriptline 1
#!/usr/bin/env bash
engine/generate-illustrated-article/scripts/validate_html.js
- Executable scriptline 1
#!/usr/bin/env node
engine/generate-illustrated-article/scripts/watermark.js
- Executable scriptline 1
Executable file
plugin/.claude-plugin/plugin.json
- Network accessline 6
"author": { "name": "SupportPages.io", "url": "https://supportpages.io" - Network accessline 7
"name": "SupportPages.io", "url": "https://supportpages.io" }, - Network accessline 8
"url": "https://supportpages.io" - Network accessline 9
}, "homepage": "https://github.com/SupportPages-io/wtfm#readme", "repository": "https://github.com/SupportPages-io/wtfm", - Network accessline 10
"homepage": "https://github.com/SupportPages-io/wtfm#readme", - Network accessline 11
"repository": "https://github.com/SupportPages-io/wtfm", - Network accessline 12
"documentationUrl": "https://help.wtfm.sh/", - Network accessline 13
"supportUrl": "https://github.com/SupportPages-io/wtfm/issues", - Network accessline 14
"privacyPolicyUrl": "https://supportpages.io/legal/privacy", - Network accessline 15
"termsOfServiceUrl": "https://supportpages.io/legal/terms",
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 10 facts
- Contacts cdn.jsdelivr.net, which SKILL.md, the README and the plugin manifest do not mentiondetect-project/scripts/compile_css.sh:355High confidence
- Contacts cdn.tailwindcss.com, which SKILL.md, the README and the plugin manifest do not mentiondetect-project/scripts/detect_static.js:509High confidence
- Contacts cdn.jsdelivr.net, which SKILL.md, the README and the plugin manifest do not mentiondetect-project/scripts/detect_static.js:513High confidence
- Contacts api.openai.com, which SKILL.md, the README and the plugin manifest do not mentiongenerate-illustrated-article/scripts/generate_content_images.js:213High confidence
- Contacts cdn.tailwindcss.com, which SKILL.md, the README and the plugin manifest do not mentiongenerate-illustrated-article/scripts/inject_assets.js:57High confidence
- Contacts cdnjs.cloudflare.com, which SKILL.md, the README and the plugin manifest do not mentiongenerate-illustrated-article/scripts/inject_assets.js:561High confidence
- Contacts cdn.jsdelivr.net, which SKILL.md, the README and the plugin manifest do not mentiongenerate-illustrated-article/scripts/inject_assets.js:565High confidence
- Contacts fonts.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentiongenerate-illustrated-article/scripts/inject_assets.js:570High confidence
- Contacts www.w3.org, which SKILL.md, the README and the plugin manifest do not mentiongenerate-illustrated-article/scripts/inject_assets.js:997High confidence
- Contacts fonts.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentiongenerate-illustrated-article/scripts/render_mockup.js:105High confidence
Signal confidence: 197 facts
- Broad permissions in the frontmatter of the SKILL.mddetect-project/SKILL.md:1High confidence
- Network access in prose of the SKILL.mddetect-project/SKILL.md:169Low confidence
- Executable script in prose of a file that runsdetect-project/assets/macosui/LICENSE-puppertino.txt:1Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-fonts.txt:4Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-fonts.txt:5Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-fonts.txt:6Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-fonts.txt:7Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-fonts.txt:8Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-fonts.txt:9Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-fonts.txt:10Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-framework7.txt:1Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-framework7.txt:2Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-framework7.txt:3Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/LICENSE-framework7.txt:4Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/VERSIONS.txt:3Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/VERSIONS.txt:4Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/VERSIONS.txt:5Low confidence
- Network access in prose of documentationdetect-project/assets/mobileui/VERSIONS.txt:6Low confidence
- Executable script in a comment of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:1Low confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:101High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:102High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:103High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:105High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:106High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:107High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:121High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:122High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:123High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:145High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:146High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:147High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:149High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:150High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:151High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:153High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:154High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:155High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:243High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:244High confidence
- Network access in code of a file that runsdetect-project/assets/mobileui/f7-color-theme.mjs:245High confidence
- Network access in prose of documentationdetect-project/assets/webtui/LICENSE-webtui.txt:1Low confidence
- Network access in prose of documentationdetect-project/assets/webtui/LICENSE-webtui.txt:2Low confidence
- Network access in prose of documentationdetect-project/assets/webtui/LICENSE-webtui.txt:7Low confidence
- Executable script in code of a file that runsdetect-project/package.json:1High confidence
- Executable script in code of a file that runsdetect-project/scripts/apply_runtime_profiles.js:1High confidence
- Executable script in code of a file that runsdetect-project/scripts/check_css_health.js:1High confidence
- Executable script in code of a file that runsdetect-project/scripts/check_project_map.js:1High confidence
- Executable script in code of a file that runsdetect-project/scripts/check_runtime_coverage.js:1High confidence
- Executable script in code of a file that runsdetect-project/scripts/check_runtime_recipe_quality.js:1High confidence
- Executable script in code of a file that runsdetect-project/scripts/classify_app_type.sh:1High confidence
and 147 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md engine/detect-project/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md engine/detect-project/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md engine/detect-project/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md engine/detect-project/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md engine/detect-project/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.