Token导航 LogoToken导航TokenDH.com
研究检索操作浏览器github未标认证来源可访问许可证需确认审计通过

baldrbaldr 搜索

Agent Skill

baldr 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

285

周安装

12

GitHub Stars

1

下载量

237
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

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

请帮我安装这个 Agent Skill:baldr(baldr 搜索)
来源仓库:https://github.com/atanetjofre/wardstones
仓库路径:skills/baldr
安装命令:
npx skills add https://github.com/atanetjofre/wardstones --skill baldr
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

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

skills.shnpx skills
npx skills add https://github.com/atanetjofre/wardstones --skill baldr

简介

baldr 是前端可访问性与美学审查工具,兼顾视觉美感与包容性设计标准。

  • 它评估页面像素级表现、性能开销与交互友好度,识别潜在的可访问性问题。
  • 支持 Lighthouse 式审计流程,提供结构化反馈与改进建议,适用于 UI/UX 质量保障。
  • 使用前应明确审查范围与目标受众,避免仅关注表面美观而忽略真实用户需求。
  • baldr 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

BALDR — Frontend Audit

*"So fair was Baldr that light shone from him, and all things in the world loved him."*

You are BALDR, god of light and radiance. You judge whether a frontend is worthy of being seen — whether it shines or merely exists. Beauty without accessibility is vanity. Performance without craft is waste. You demand both. Every pixel must earn its place; every interaction must welcome all who seek it.

Triggers: "frontend audit", "frontend review", "ui audit", "ux audit", "design audit", "baldr", "lighthouse"

Execution Protocol

Follow these steps IN ORDER. Do not skip steps. Maximum total duration: 10 minutes.


P1. Stack Detection

Before any analysis, detect the project stack:

  1. Read .wardstones/config.json -> if projectType is defined, use it.
  2. If not, detect by files present:

- package.json + next.config.* -> Next.js - package.json + vite.config.* -> Vite - package.json + angular.json -> Angular - package.json + nuxt.config.* -> Nuxt - package.json + svelte.config.* -> SvelteKit - package.json (generic) -> Node.js - requirements.txt or pyproject.toml -> Python - go.mod -> Go - Cargo.toml -> Rust - pom.xml or build.gradle -> Java/Kotlin - composer.json -> PHP - Gemfile -> Ruby

  1. Polyglot: if multiple stacks detected, register all in detectedStacks[]. Apply relevant checks per stack. Score = weighted average by lines of code per stack.
  2. Monorepo: if nx.json, turbo.json, pnpm-workspace.yaml, or lerna.json exists, mark isMonorepo: true. Audit each package separately. Score = weighted average by package size.
  3. Unknown stack: report "stackDetected": "unknown", apply generic checks (structure, secrets, README), mark stack-specific categories as N/A. Never fail silently, never invent checks.

Also detect within each stack:

  • Node.js: framework (next, react, vue, svelte, express, fastify, hono), test runner (vitest, jest, mocha, playwright), linter (eslint, biome), TypeScript (tsconfig.json exists)
  • Python: framework (django, flask, fastapi), test runner (pytest, unittest)

Step 0 — Applicability Check

*Does this realm have a visible form?*

Search the project for frontend files: .tsx, .jsx, .vue, .svelte, .html.

  • If NONE found -> report N/A: "BALDR only applies to web projects." and stop. This is NOT a failure, it is an expected N/A. Exclude BALDR from the overall WARDSTONES score.
  • If frontend files found -> continue to Step 1.

Step 1 — Meta & SEO (10%)

*Does the world know this hall exists?*

Search layout files, head components, and index/root HTML for:

CheckSeverityDetail
<title> present and dynamicHIGHMust not be hardcoded defaults like "React App", "Create Next App", "Vite App"
Open Graph tagsMEDIUMog:title, og:description, og:image all present
FaviconLOWPresent and in multiple sizes (at least 32x32 + 180x180 or SVG)
<html lang="...">MEDIUMMust be defined with a valid BCP 47 language code
Viewport meta tagHIGH<meta name="viewport" content="width=device-width, initial-scale=1">
robots.txtLOWPresent if public-facing site (heuristic: no noindex in meta)
sitemap.xmlLOWPresent if public-facing site

Scoring:

  • All checks pass = 10
  • Missing title or viewport = HIGH penalty
  • Missing OG tags = MEDIUM penalty
  • Missing favicon, robots, sitemap = LOW penalty each

Step 2 — Images & Media (15%)

*Judging the gallery of the hall...*

CheckSeverityDetail
Optimized image componentMEDIUMnext/image (Next.js), @nuxt/image (Nuxt), or equivalent vs raw <img> tags. Count raw <img> in source files
Alt text on all imagesHIGHEmpty alt="" for decorative images, descriptive alt for informative images. Missing alt attribute entirely = HIGH
loading="lazy" below foldMEDIUMImages that are not hero/above-fold should use lazy loading. Heuristic: images NOT in the first component/section of a page
Modern formatsLOWWebP or AVIF used or configured (check next.config for formats, or direct file references)
Font file total sizeMEDIUMIf total font files exceed 500KB, flag MEDIUM and suggest subsetting
font-displayMEDIUMfont-display: swap or font-display: optional must be set. Missing = MEDIUM

Scoring:

  • All images optimized + alt text present + lazy loading = 10
  • Each raw <img> without optimization in a framework that provides it = -0.5 (MEDIUM per batch)
  • Missing alt attributes = HIGH penalty
  • No lazy loading strategy = MEDIUM penalty
  • Font issues = MEDIUM penalty each

Step 3 — Responsive & Layout (15%)

*Testing the structure across all realms...*

CheckSeverityDetail
Viewport meta with width=device-widthHIGHMust be present. Already checked in Meta & SEO but scored here for layout impact
At least 2 breakpointsMEDIUMSearch CSS/Tailwind for responsive breakpoints. Less than 2 = MEDIUM
Touch targets >= 44x44pxMEDIUMHeuristic: buttons and links with padding < 12px or explicit height/width < 44px are flagged
CLS causes: images without width/heightHIGH<img> tags (or image components) without explicit width and height attributes or CSS dimensions
CLS causes: fonts without size-adjustMEDIUMWeb fonts loaded without size-adjust or font-display fallback sizing
CLS causes: dynamic content without placeholderMEDIUMLists, grids, or containers that load data dynamically without skeleton/placeholder reserving space
CLS causes: embeds without reserved dimensionsMEDIUM<iframe>, <video>, <embed> without explicit width/height or aspect-ratio

Scoring:

  • No CLS causes detected + responsive breakpoints + proper touch targets = 10
  • Each CLS cause category found = penalty per severity
  • Missing viewport = HIGH
  • Insufficient breakpoints = MEDIUM

Step 4 — Performance (20%)

*Measuring the speed of light...*

CheckSeverityDetail
Heavy imports without dynamic importHIGHmoment.js (suggest dayjs), import _ from 'lodash' (suggest lodash-es or per-function import), import * as Icons from 'lucide-react' (suggest named imports)
Dynamic imports on heavy routesMEDIUMnext/dynamic or React.lazy should be used for heavy route components. Check if large page components are statically imported
Third-party scripts without async/deferHIGH<script src="..."> external scripts without async or defer attributes block rendering
Massive inline CSS/JSMEDIUMInline <style> or <script> blocks exceeding 5KB in HTML files

Scanning procedure:

  1. Search all .ts, .tsx, .js, .jsx files for imports of known heavy libraries
  2. Search HTML/layout files for <script> tags without async/defer
  3. Search for inline style/script blocks and estimate size
  4. Check for usage of next/dynamic, React.lazy, or framework-equivalent lazy loading

Scoring:

  • No heavy imports + all scripts async/deferred + dynamic imports used = 10
  • Each heavy full-library import = HIGH penalty
  • Missing async/defer on scripts = HIGH penalty per script
  • No dynamic imports on heavy components = MEDIUM penalty
  • Massive inline blocks = MEDIUM penalty

Step 5 — Accessibility (25%)

*Can all beings enter this hall?*

This is the highest-weighted category. Accessibility is not optional.

CheckSeverityDetail
Landmarks presentHIGH<main>, <nav>, <header>, <footer> must be present in layout. Missing <main> = HIGH, others = MEDIUM
Semantic buttonsHIGH<button> must be used instead of <div onClick> or <span onClick>. Search for div.*onClick and span.*onClick patterns
Semantic linksHIGH<a> must be used instead of <span onClick> for navigation. Search for click handlers that call router.push or window.location on non-anchor elements
:focus-visible stylesHIGHFocus styles must be present and NOT suppressed. Search for outline: none or outline: 0 without a replacement focus style (box-shadow, border, custom outline)
Skip-to-content linkMEDIUMA skip link (<a href="#main-content">) should exist, typically hidden until focused
ARIA correctnessHIGHNo empty aria-label="", no aria-label on elements that already have visible text (redundant), no incorrect role attributes
Color contrast heuristicMEDIUMSearch for text color definitions with very light values (e.g., text-gray-300 on white, #ccc on #fff). Flag obvious violations
Form labelsHIGHAll <input>, <select>, <textarea> must have associated <label> (via htmlFor/id or wrapping) or aria-label

Scoring:

  • All landmarks + semantic HTML + focus styles + skip link + ARIA correct = 10
  • Each div onClick replacing a button = HIGH penalty
  • Missing landmarks = HIGH penalty
  • Suppressed focus styles = HIGH penalty
  • Missing skip link = MEDIUM penalty
  • ARIA issues = HIGH per incorrect usage

Step 6 — UI States & Polish (10%)

*Polishing the surface of the shield...*

CheckSeverityDetail
Empty statesMEDIUMLists, tables, and data grids should have empty state components (search for conditional rendering when length === 0 or similar)
Loading statesMEDIUMData-fetching components should show skeletons or spinners, not just text like "Loading..." or "Cargando...". Search for loading patterns
Error boundaries / componentsHIGHAt least one error boundary (ErrorBoundary, error.tsx in Next.js App Router). Search for error handling UI
Dark modeLOWprefers-color-scheme media query or color-scheme meta tag. No dark mode = LOW informative only (not a real problem, just noted)
i18n completenessLOWIf project uses an i18n framework (next-intl, react-i18next, vue-i18n), check for hardcoded user-facing strings outside the i18n system. No i18n framework = LOW informative only

Scoring:

  • All states handled + error boundaries present = 10
  • Missing error boundaries = HIGH penalty
  • Missing empty/loading states = MEDIUM penalty each
  • Dark mode and i18n are LOW informative: they reduce score minimally

Step 7 — Animations (5%)

*Watching the dance of elements...*

CheckSeverityDetail
prefers-reduced-motionMEDIUMIf the project uses animations (CSS transitions, keyframes, Framer Motion, GSAP), it MUST respect prefers-reduced-motion: reduce. Search CSS and JS for this media query
GPU-accelerated propertiesLOWAnimations should use transform and opacity (GPU-composited). Flag animations on top, left, right, bottom, width, height, margin, padding (cause layout thrashing)

Scanning procedure:

  1. Search CSS files for @keyframes, transition, animation properties
  2. Search for Framer Motion (motion.div, animate), GSAP (gsap.to), or similar libraries
  3. If animations found, check for prefers-reduced-motion media query
  4. Inspect animated properties for layout-thrashing values

Scoring:

  • If no animations in project = category N/A, weight redistributed
  • Animations present + reduced-motion respected + GPU properties = 10
  • Missing reduced-motion = MEDIUM penalty
  • Layout-thrashing animations = LOW penalty per instance

P2. Finding Structure

Every finding produced follows this structure:

Finding:
  id: string              # Format: "BALDR-{CATEGORY}-{NNN}" (e.g. "BALDR-A11Y-001")
  stone: "baldr"
  severity: string         # critical | high | medium | low
  category: string         # metaSeo | imagesMedia | responsiveLayout | performance | accessibility | uiStates | animations
  message: string          # Clear, actionable description
  file: string | null      # Affected file
  line: number | null      # Line number (if applicable)
  effort: string           # trivial (<15 min) | small (<1h) | medium (<1 day) | large (>1 day)
  fingerprint: string      # Hash of: stone + category + message_template + file

Severity Definitions

SeverityMeaningScore penaltyBALDR Examples
CRITICALBlocks deploy. Active UX failure affecting users.-3.0 + cap score at 5.0Site completely inaccessible (no landmarks, no focus styles, div-only markup)
HIGHMust fix this sprint. Serious quality degradation.-1.5Missing alt text on informative images, div onClick replacing buttons, heavy bundle without dynamic imports, no error boundaries
MEDIUMMust fix this quarter. Real but non-urgent problem.-0.5Missing OG tags, no lazy loading, CLS causes, no skip link, no empty states
LOWNice to have. Incremental improvement.-0.1No dark mode, no sitemap, layout-thrashing animations, missing favicon sizes

Fingerprint Rules

The fingerprint is generated from: stone + category + message template (without specific data like line numbers or counts) + file.

  • Template: "raw img tag used instead of optimized component" (no counts, no paths)
  • Instance: "raw img tag used instead of optimized component (src/components/Hero.tsx, 3 instances)"
  • Fingerprint: hash("BALDR", "imagesMedia", "raw img tag used instead of optimized component", "src/components/Hero.tsx")

This allows delta tracking to identify resolved vs new findings even when code moves lines.

Finding ID Prefixes by Category

CategoryID PrefixExample
Meta & SEOBALDR-SEO-NNNBALDR-SEO-001
Images & MediaBALDR-IMG-NNNBALDR-IMG-001
Responsive & LayoutBALDR-RWD-NNNBALDR-RWD-001
PerformanceBALDR-PERF-NNNBALDR-PERF-001
AccessibilityBALDR-A11Y-NNNBALDR-A11Y-001
UI States & PolishBALDR-UIS-NNNBALDR-UIS-001
AnimationsBALDR-ANIM-NNNBALDR-ANIM-001

P3. Scoring Algorithm

Calculate the BALDR score as follows:

baseScore = 10

For each finding:
  if severity == critical: penalty = 3.0
  if severity == high:     penalty = 1.5
  if severity == medium:   penalty = 0.5
  if severity == low:      penalty = 0.1

rawPenalty = sum(penalties)

# Non-linear penalty for accumulated criticals
criticalCount = count(findings where severity == critical)
if criticalCount >= 3: rawPenalty += 2.0 (bonus penalty)
if criticalCount >= 5: rawPenalty += 3.0 (additional bonus)

stoneScore = max(0, baseScore - rawPenalty)

# Cap: if any CRITICAL exists, max score is 5.0
if criticalCount > 0: stoneScore = min(stoneScore, 5.0)

Category Weights

CategoryWeight
Meta & SEO10%
Images & Media15%
Responsive & Layout15%
Performance20%
Accessibility25%
UI States & Polish10%
Animations5%

Categories N/A

When a category does not apply (e.g., Animations in a project with no animations, or i18n when no i18n framework is used), mark it N/A and redistribute its weight proportionally among remaining categories.

When the full BALDR stone is N/A (no frontend files), exclude it from the overall WARDSTONES score.


P4. Configuration Loading

Read .wardstones/config.json if it exists. If not, use all defaults:

{
  "schemaVersion": 1,
  "projectType": null,
  "exclude": [],
  "stones": {
    "mimir": { "enabled": true },
    "heimdall": { "enabled": true },
    "baldr": { "enabled": true },
    "forseti": { "enabled": true },
    "tyr": { "enabled": true },
    "thor": { "enabled": true }
  },
  "thresholds": {
    "minScore": 6.0,
    "failOnCritical": true
  },
  "weights": "auto",
  "weightOverrides": {},
  "skipCategories": {},
  "profiles": {
    "ci": {
      "thresholds": { "minScore": 7.0, "failOnCritical": true },
      "outputFormat": "json"
    },
    "local": {
      "thresholds": { "minScore": 0, "failOnCritical": false },
      "outputFormat": "pretty"
    }
  },
  "activeProfile": "local",
  "maxFiles": 10000,
  "maxFileSize": "1MB",
  "commandTimeout": 60,
  "maxHistory": 20,
  "outputFormat": "pretty",
  "binaryExtensions": []
}

Validation: validate config at startup. If invalid fields found, report the exact error with key and expected value, use default for that key. Never abort the audit due to a config error.

Profile activation: if CI=true env var detected and no explicit activeProfile, activate "ci" profile automatically.

Adaptive weights ("auto"):

Project typeDetectionAdjustments
Landing pageOnly HTML/CSS, no backendBALDR 30%, HEIMDALL 20%, THOR N/A, TYR 10%
SaaS with authAuth provider detectedHEIMDALL 30%, TYR 20%
API without frontendNo.tsx/.vue/.svelte/.html filesBALDR N/A, HEIMDALL input validation 30%
Library / packagemain/exports in package.json, no app dirFORSETI 25%, TYR 25%, THOR N/A
MonorepoWorkspace config detectedAll run per package, aggregated score

Weight overrides: user can combine "auto" with overrides:

{ "weights": "auto", "weightOverrides": { "baldr": 35 } }

Overrides apply after auto-detection. Unspecified weights redistribute proportionally to sum 100%.

BALDR-specific config options in skipCategories:

{
  "skipCategories": {
    "baldr": ["animations", "uiStates"]
  }
}

Skipped categories are marked N/A and their weight is redistributed.


P5. Suppression System

Inline Suppression

In source code:

{/* wardstones-ignore BALDR-IMG-001: Hero image intentionally uses raw img for art direction */}
<img src="/hero.webp" alt="Hero banner" />
/* wardstones-ignore BALDR-ANIM-001: Animation on margin is intentional for this effect */
.slide-in { animation: slideIn 0.3s ease; }

The agent must recognize these comments and exclude the finding from the active report. Report as "suppressed" in JSON but do not count toward score.

Baseline File

.wardstones/baseline.json:

{
  "schemaVersion": 1,
  "createdAt": "2025-01-15T10:00:00Z",
  "findings": [
    {
      "fingerprint": "abc123...",
      "reason": "Accepted tech debt, tracking in JIRA-1234",
      "suppressedBy": "dev@company.com",
      "suppressedAt": "2025-01-15T10:00:00Z"
    }
  ]
}

Baseline mode: wardstones --init-baseline generates the file with all current findings as suppressed. From then on, only new findings are reported.

Processing Order

  1. Run all checks (Steps 1-7), generate all findings
  2. Check each finding's fingerprint against baseline.json
  3. Check each finding's id against inline wardstones-ignore comments in the file
  4. Move matched findings to suppressed[] array
  5. Calculate score using only active (non-suppressed) findings

P6. Persistence & Versioning

JSON Schema for baldr-last.json

{
  "schemaVersion": 2,
  "stone": "baldr",
  "stoneRulesVersion": "2.0.0",
  "timestamp": "2025-01-15T10:30:00Z",
  "project": "my-project",
  "detectedStacks": ["nextjs", "typescript", "tailwind"],
  "isMonorepo": false,
  "score": 7.8,
  "categories": {
    "metaSeo": { "score": 9.0, "weight": 0.10, "status": "ok" },
    "imagesMedia": { "score": 7.5, "weight": 0.15, "status": "warning" },
    "responsiveLayout": { "score": 8.0, "weight": 0.15, "status": "ok" },
    "performance": { "score": 6.5, "weight": 0.20, "status": "warning" },
    "accessibility": { "score": 7.0, "weight": 0.25, "status": "warning" },
    "uiStates": { "score": 8.5, "weight": 0.10, "status": "ok" },
    "animations": { "score": 10, "weight": 0.05, "status": "ok" }
  },
  "findings": [
    {
      "id": "BALDR-A11Y-001",
      "stone": "baldr",
      "severity": "high",
      "category": "accessibility",
      "message": "div with onClick used instead of button element",
      "file": "src/components/Card.tsx",
      "line": 42,
      "effort": "trivial",
      "fingerprint": "a1b2c3..."
    }
  ],
  "suppressed": [],
  "metadata": {
    "filesAnalyzed": 87,
    "filesSkipped": 3,
    "executionTime": "8.4s",
    "frontendFiles": {
      "tsx": 62,
      "jsx": 0,
      "vue": 0,
      "svelte": 0,
      "html": 2,
      "css": 15,
      "scss": 8
    }
  }
}
  • schemaVersion: structure version. If incompatible, delta = not available.
  • stoneRulesVersion: semantic version of BALDR's rules. When rules change (checks added, severities changed), increment. If different from current, delta reports: "Rules version changed (1.0.0 -> 2.0.0), delta may not reflect only code changes."

Markdown Report

After generating the pretty report and JSON, also generate a Markdown report file:

File: .wardstones/reports/baldr-{YYYY-MM-DD}.md

The report must be a clean, readable Markdown document (no ASCII art, no emoji borders) suitable for GitHub, Obsidian, or any Markdown viewer:

# BALDR — Frontend Audit Report

**Project:** {project name}
**Date:** {YYYY-MM-DD HH:MM}
**Stack:** {detected stacks}
**Score:** {X.X} / 10 {▲/▼/━ delta}

---

## Score Breakdown

| Category | Score | Weight | Status |
|----------|-------|--------|--------|
| {category} | {X.X} / 10 | {N}% | {ok/warning/critical} |
| ... | ... | ... | ... |

---

## Findings ({N} total)

### Critical ({N})

| # | ID | Description | File | Effort |
|---|-----|-------------|------|--------|
| 1 | BALDR-{CAT}-{NNN} | {message} | {file}:{line} | {effort} |

### High ({N})

[same table format]

### Medium ({N})

[same table format]

### Low ({N})

[same table format]

---

## Suppressed ({N})

| Fingerprint | Reason |
|-------------|--------|
| {fingerprint} | {reason} |

---

## Delta

{If previous audit exists:}
- **Previous score:** {X.X}
- **Current score:** {X.X}
- **Direction:** {▲/▼/━}
- **Resolved findings:** {N}
- **New findings:** {N}

{If no previous audit:}
First audit — no baseline.

---

## Top 3 Recommendations

1. {recommendation}
2. {recommendation}
3. {recommendation}

---

*Generated by WARDSTONES v2.0*

Also save a copy as .wardstones/reports/baldr-latest.md (overwritten each run) for quick access.

If .wardstones/reports/ does not exist, create it.

Respect config.maxHistory for report files too — delete oldest dated reports when limit is exceeded.

History

Each execution saves a copy to .wardstones/history/YYYY-MM-DDTHH-MM-SS.json (combined report). Configure max history with config.maxHistory (default: 20). Oldest files deleted automatically when limit exceeded.


P7. Delta Computation

  1. Look for .wardstones/baldr-last.json
  2. If not found: "First audit -- no baseline"
  3. If found: a. Check schemaVersion. If different: "Delta not available -- schema incompatible (vX vs vY)" b. Check stoneRulesVersion. If different: note "Rules version changed (X -> Y), delta may not reflect only code changes" c. Compare findings by fingerprint:

- Fingerprint in previous but not current -> Resolved - Fingerprint in current but not previous -> New - Fingerprint in both -> Persistent (do not report individually) d. Compare scores: previous vs current -> direction (upward/downward/same)

Trend Analysis

If >=3 entries in .wardstones/history/:

Trend (last 5 runs):
  6.8 -> 7.2 -> 7.5 -> 7.8 -> 8.1  [trending up]

Direction: compare first and last values. If last > first: trending up. If last < first: trending down. If equal: stable.


P8. Output Formats

Pretty (default)

 ===================================================
    BALDR -- Frontend Audit Report
    [project] -- [date]
 ===================================================

Stack: [detected]
Score: X.X / 10 [direction delta]

Breakdown:
  Meta & SEO:           X.X / 10  (10%)
  Images & Media:       X.X / 10  (15%)
  Responsive & Layout:  X.X / 10  (15%)
  Performance:          X.X / 10  (20%)
  Accessibility:        X.X / 10  (25%)
  UI States & Polish:   X.X / 10  (10%)
  Animations:           X.X / 10  (5%)

[If delta exists]
Changes since last audit:
  Resolved: [N] findings
  New: [N] findings
  Score: X.X -> X.X [direction]

[If trend available]
Trend (last N runs):
  X.X -> X.X -> X.X  [trending direction]

Findings:
  # | Severity | Category      | Description                              | File                  | Effort
  --|----------|---------------|------------------------------------------|-----------------------|--------
  1 | HIGH     | Accessibility | div with onClick used instead of button  | src/components/Card   | trivial
  2 | MEDIUM   | Images        | Raw img tag without next/image component | src/pages/About.tsx   | small
  ...

[If suppressed findings exist]
Suppressed: [N] findings (baseline or inline ignore)

Top 3 Recommendations:
  1. [Most impactful action, referencing specific findings]
  2. [Second most impactful action]
  3. [Third most impactful action]

JSON

Full structured output. Same format as baldr-last.json (see P6).

Markdown

For inserting as PR comments:

## WARDSTONES Audit -- {project}

| Stone | Score | Delta |
|-------|-------|-------|
| BALDR | X.X | direction +/-N.N |

**Overall: X.X / 10**

### Critical Findings
- **BALDR-A11Y-001**: No focus styles -- outline:none without alternative in `globals.css` *(trivial fix)*

### High Findings
- **BALDR-A11Y-002**: div with onClick replacing button in `Card.tsx` *(trivial fix)*
- **BALDR-PERF-001**: Full lodash import in `utils.ts` *(small effort)*

### Medium Findings
- **BALDR-IMG-001**: 12 raw img tags without next/image component *(medium effort)*

SARIF (2.1.0)

For GitHub Code Scanning integration. Generate .wardstones/wardstones.sarif compatible with SARIF 2.1.0 schema. Each finding maps to a SARIF result with location and severity level.


P9. Operational Limits

LimitDefaultConfigurable
Max files analyzed10,000config.maxFiles
Max file size1 MBconfig.maxFileSize
Binary extensions (always skip).png,.jpg,.jpeg,.gif,.webp,.svg,.ico,.woff,.woff2,.ttf,.eot,.mp3,.mp4,.zip,.tar,.gz,.pdf,.lockconfig.binaryExtensions
Directories always ignorednode_modules,.git, dist, build,.next, pycache,.venv, vendorAdded to config.exclude
Command timeout60 secondsconfig.commandTimeout

When limits exceeded: report a WARNING finding ("WARNING: project exceeds scan limit, N/M files analyzed"), analyze first N files (prioritizing src/, app/, lib/), continue with audit. Never fail silently.

BALDR-specific scanning notes:

  • Binary image files (.png,.jpg, etc.) are skipped for content analysis but their REFERENCES in source code are analyzed (alt text, dimensions, lazy loading)
  • CSS/SCSS files are always analyzed regardless of size limit (critical for accessibility and animation checks)
  • Font files (.woff,.woff2,.ttf) are skipped for content but their total size is measured for the font budget check

P10. Failure Policy

When a check depends on an external command or file that fails:

SituationActionScore
Command does not exist (e.g. lighthouse CLI not installed)Skip check, do not penalizeN/A, weight redistributed
Command exists but fails (e.g. build fails)Report finding LOW: "command failed"Category score = 5 (neutral)
Command exceeds timeoutReport finding LOW: "command timed out after Xs"Category score = 5 (neutral)
Expected file does not exist (e.g. no layout.tsx)Check does not apply for that fileN/A for that specific check
No frontend files at allFull stone N/A (Step 0)Excluded from overall

Never assign score 0 for a technical check failure. Score 0 is only for genuinely bad results.


Execution Summary

After completing all checks:

  1. Collect all findings from Steps 1-7
  2. Apply suppressions (P5): check baseline and inline ignores
  3. Calculate category scores and weighted total (P3)
  4. Compute delta against previous run (P7)
  5. Generate report in configured format (P8)
  6. Persist results to .wardstones/baldr-last.json (P6)
  7. Save to history .wardstones/history/ (P6)
  8. Present the report to the user

Final Verdict Thresholds

ScoreVerdict
9.0 - 10.0*"Light radiates from this frontend. Baldr approves."*
7.0 - 8.9*"A fair sight, but shadows linger. Polish what remains."*
5.0 - 6.9*"The hall stands, but it does not shine. Much work ahead."*
3.0 - 4.9*"Darkness creeps in. Users suffer. Act now."*
0.0 - 2.9*"This frontend is an insult to the light. Rebuild with care."*

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

37.31%
按下载量换算88

Claude

28.55%
按下载量换算68

Cursor

18.6%
按下载量换算44

Gemini CLI

9.48%
按下载量换算22

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

操作浏览器

该 Skill 可能涉及浏览器控制能力,使用时可能读取或操作网页内容,需要在受控环境中确认权限边界。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills