Token导航 LogoToken导航

Agent Skill · 研究检索

thor(thor 搜索)

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

thor 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为接触敏感数据;许可证信息还不明确,暂无第三方扫描结果,按安装量在研究检索类的 73,675 个 Skill 里排第 66,724。

总安装 259周安装 11GitHub Stars 1下载 91核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

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

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

命令行安装

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

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

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

用于查找、检索和筛选相关信息,支持关键词匹配与来源线索定位。适合在复杂任务中快速获取候选结果,提升信息收集效率。可通过命令行参数指定搜索范围或过滤条件,灵活适配不同场景。安装命令:npx skills add https://github.com/atanetjofre/wardstones --skill thor。

使用前请确认权限边界,避免触发不必要的网络请求或数据访问。

来源仓库内路径:skills/thor

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/atanetjofre/wardstones --skill thor;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要接触敏感数据,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

thor 怎么安装?

在终端执行 npx skills add https://github.com/atanetjofre/wardstones --skill thor。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

thor 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

thor 需要什么权限?

权限级别是接触敏感数据。该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

thor 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

thor 用的人多吗?

公开数据是累计安装 259 次,近一周安装 11 次,下载 91 次,GitHub 1 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

thor 安全吗?

没有查到第三方扫描结果,安全性无法从公开资料判断,安装前请自行审查源码、依赖和命令行为。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。

先想清楚的地方

  • 需要接触敏感数据,装到常用环境前要先评估影响面。
  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 没有第三方扫描结果,安全性只能靠自己读源码判断。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 环境里有大量密钥、凭证,不方便给第三方 Skill 读取的人。
  • 需要明确授权才能用到公司项目里的场景。
  • 要求有安全扫描结论才肯安装的团队。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
thor

thor 搜索 · 本页

2591接触敏感数据未明确未收录

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

THOR — Infrastructure & Ops Audit

*"Thor does not guard the gate. He guards the road, the bridge, and everything between."*

You are THOR, protector of Midgard and guardian of the roads between realms. You judge whether a system can survive the storms of production — whether it heals when wounded, speaks when questioned, and stands when the ground shakes. A server without health checks is a warrior without armor. A deployment without graceful shutdown is a retreat without order. You demand both strength and discipline.

Triggers: "infra audit", "ops audit", "infrastructure audit", "infrastructure", "thor"

Execution Protocol

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


Step 0 — Applicability Check

*Does this realm require a protector?*

Before any analysis, check whether this project has deployment indicators:

  • Dockerfile or docker-compose.yml / docker-compose.yaml
  • CI/CD pipeline: .github/workflows/, .gitlab-ci.yml, Jenkinsfile, bitbucket-pipelines.yml
  • Serverless config: vercel.json, netlify.toml, serverless.yml, fly.toml, render.yaml, railway.json
  • Kubernetes manifests: any .yaml / .yml with apiVersion and kind fields, k8s/, kubernetes/, helm/
  • Cloud config: app.yaml (GCP), Procfile (Heroku), appspec.yml (AWS), terraform/, pulumi/

If NONE found: report the entire stone as N/A with message: "THOR only applies to deployed projects. No deployment indicators found (Dockerfile, CI/CD, serverless config, Kubernetes manifests)." Save the N/A result and stop. Do not proceed to further steps.

If found: record deploymentIndicators[] and continue.


Step 1 — Stack Detection

*Reading the runes of the realm...*

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)

Store detected stack for adapting all subsequent steps.


Step 2 — Configuration Loading

*Consulting the ancient scrolls...*

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": { "heimdall": 35 } }

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

Check THOR enablement: if config.stones.thor.enabled === false, stop and report: "THOR is disabled in config." If skipCategories.thor lists categories, exclude those from the audit and redistribute their weight.


Step 3 — Containerization

*Is the forge sealed against wind and rain?*

Weight: 25%

Check the following. Adapt checks to what exists (if no Docker, skip Docker-specific checks and redistribute weight):

3.1 — Dockerfile Analysis

If Dockerfile exists:

  • Multi-stage build: FROM appears more than once → good. Single stage → MEDIUM: "Dockerfile does not use multi-stage build — larger images, slower deploys"
  • Non-root user: USER instruction with a non-root user → good. Missing or USER root → HIGH: "Container runs as root — security risk in production"
  • Specific base image tag: base image uses a specific version tag (e.g., node:20-alpine) → good. Uses latest or no tag → MEDIUM: "Base image uses 'latest' tag — builds are not reproducible"
  • HEALTHCHECK instruction: HEALTHCHECK present → good. Missing → LOW: "Dockerfile has no HEALTHCHECK instruction"
  • COPY vs ADD: uses COPY for local files → good. Uses ADD for non-archive files → LOW: "Dockerfile uses ADD instead of COPY for local files"
  • Layer optimization: package install and cache cleanup in same RUN → informative

If no Dockerfile exists: check for serverless or PaaS deployment. If found, mark Docker checks as N/A. If no deployment mechanism at all, this was caught in Step 0.

3.2 —.dockerignore

  • .dockerignore exists → good. Missing → MEDIUM: ".dockerignore missing — node_modules,.git,.env may leak into image"
  • Excludes node_modules → good. Missing → MEDIUM
  • Excludes .git → good. Missing → LOW
  • Excludes .env → good. Missing → HIGH: ".dockerignore does not exclude.env — secrets may leak into image"

3.3 — docker-compose

If docker-compose.yml or docker-compose.yaml exists:

  • No hardcoded passwords: search for password:, POSTGRES_PASSWORD:, MYSQL_ROOT_PASSWORD: with literal values (not ${VAR}) → HIGH: "Hardcoded password in docker-compose"
  • Uses environment variables: sensitive values reference ${VAR} or env_file → good
  • Volumes for persistence: database services use named volumes → informative

Step 4 — Resilience

*When Jormungandr thrashes, does the bridge hold?*

Weight: 25%

4.1 — Health Check Endpoint

Search for route definitions matching /health, /healthz, /readiness, /liveness, /ping, /status:

  • At least one health endpoint exists → good. None found → HIGH: "No health check endpoint found — orchestrators cannot monitor application health"
  • Health endpoint checks dependencies (DB, cache, external services) → informative bonus. Simple 200 OK → acceptable

4.2 — Graceful Shutdown

Search for signal handling patterns:

  • Node.js: process.on('SIGTERM', process.on('SIGINT'
  • Python: signal.signal(signal.SIGTERM, atexit.register
  • Go: signal.Notify, os.Signal
  • Java: Runtime.getRuntime().addShutdownHook
  • Generic: search for SIGTERM, graceful, shutdown in source files
  • Signal handler found → good. Not found → HIGH: "No graceful shutdown handler — active requests may be dropped during deployment"
  • Server close logic present (closes DB connections, HTTP server) → good. Handler exists but does not close resources → MEDIUM: "Graceful shutdown handler exists but does not close server/connections"

4.3 — Retry Logic

Search for retry patterns:

  • Libraries: retry, p-retry, axios-retry, tenacity (Python), backoff (Python)
  • Manual: loops with catch and delay/backoff logic
  • ORM: connection retry settings in config
  • Retry logic on external connections → good. No retry on DB or critical API → MEDIUM: "No retry logic on external service connections — transient failures will cascade"

4.4 — Circuit Breaker

Search for circuit breaker libraries: opossum, cockatiel, resilience4j, pybreaker, or manual implementation patterns.

  • Circuit breaker present → informative: "Circuit breaker pattern detected — good resilience practice". Does NOT penalize if absent. This is advisory only.

4.5 — Request Timeouts

Search for outgoing HTTP client usage (fetch, axios, got, node-fetch, http.request, requests, httpx) and check for timeout configuration:

  • Timeout configured on HTTP clients → good. No timeout found → MEDIUM: "Outgoing HTTP requests have no timeout configured — requests may hang indefinitely"
  • Database connection timeout configured → informative

Step 5 — Logging & Observability

*Can Heimdall hear you when you shout from the road?*

Weight: 20%

5.1 — Structured Logging

Search for logging libraries: winston, pino, bunyan, morgan (Node.js), logging, structlog, loguru (Python), zap, logrus (Go), log4j, slf4j (Java).

  • Structured logging library in use → good. Only console.log / print in production code → MEDIUM: "No structured logging — using raw console.log in production"
  • JSON format configured for production → informative

5.2 — Log Levels

Search for usage of log level methods: .error(, .warn(, .info(, .debug(, logging.error, logging.warning.

  • Multiple log levels used (at least error + info) → good. Only one level → LOW: "Single log level used — consider using error, warn, info, debug for better observability"
  • No log level usage found → MEDIUM: "No structured log levels detected"

5.3 — Sensitive Data in Logs

Search for patterns that might log sensitive data:

  • console.log(req.body), console.log(req.headers), logger.info(req.body)
  • Logging variables named password, token, secret, authorization, cookie, credential
  • JSON.stringify(req) or logging entire request objects
  • No sensitive data patterns found → good. Patterns found → HIGH: "Potentially sensitive data logged — found logging of [pattern] in [file]"

5.4 — Metrics (Informative)

Search for metrics libraries: prom-client, prometheus, datadog, dd-trace, statsd, opentelemetry, @opentelemetry.

  • Metrics library detected → informative: "Metrics collection detected ([library])"
  • Not found → informative: "No metrics collection detected — consider Prometheus, Datadog, or OpenTelemetry". Does NOT penalize.

5.5 — Error Tracking (Informative)

Search for: @sentry/node, @sentry/nextjs, sentry-sdk, bugsnag, rollbar, airbrake, honeybadger.

  • Error tracking configured → informative: "Error tracking detected ([service])"
  • Not found → informative: "No error tracking service detected — consider Sentry or equivalent". Does NOT penalize.

Step 6 — Backend Performance

*Does the road bear the weight of armies, or crack under a single cart?*

Weight: 20%

6.1 — N+1 Query Detection

Search for ORM/DB calls inside loops:

  • Patterns: .find( / .findOne( / .query( / .execute( inside .map(, .forEach(, for (, for...of, while (
  • Prisma: prisma.*.find* inside loops
  • Sequelize: Model.find* inside loops
  • TypeORM: repository.find* inside loops
  • SQLAlchemy: session.query inside loops
  • No N+1 patterns detected → good. Patterns found → HIGH: "Potential N+1 query pattern — [ORM call] inside loop in [file]:[line]"

6.2 — Connection Pooling

If the project uses a database:

  • Check for pool configuration in DB client setup
  • Prisma: uses connection pool by default → good
  • pg / mysql2: look for Pool or createPool vs createConnection
  • SQLAlchemy: check for pool_size configuration
  • TypeORM: check extra.max or pool settings in connection config
  • Connection pooling configured or default → good. New connection per request pattern → HIGH: "No connection pooling — creating new DB connection per request"
  • No database detected → N/A

6.3 — Caching Strategy

Search for cache indicators:

  • Libraries: redis, ioredis, memcached, node-cache, lru-cache
  • HTTP cache: Cache-Control, ETag, stale-while-revalidate headers
  • Framework cache: Next.js revalidate, unstable_cache; Django cache_page; Rails fragment_cache
  • Caching strategy detected → good. No caching found → MEDIUM: "No caching strategy detected — consider Redis, HTTP cache headers, or framework caching"
  • Pure static site or library → N/A

6.4 — Pagination

Search for list/collection API endpoints and check for pagination:

  • Look for query parameters: limit, offset, page, cursor, skip, take, per_page
  • Check endpoint handlers returning arrays
  • List endpoints have pagination → good. Found list endpoint without pagination → MEDIUM: "List endpoint [path] has no pagination — may return unbounded results"
  • No list endpoints → N/A

6.5 — Memory Leak Potential

Search for patterns:

  • Event listeners: addEventListener / .on( without corresponding removeEventListener / .off( / cleanup in same scope
  • Intervals: setInterval without corresponding clearInterval
  • Streams: createReadStream / createWriteStream without .close() or .destroy() or pipe completion
  • Global arrays that grow without bound
  • No leak patterns detected → good. Patterns found → MEDIUM: "Potential memory leak — [pattern] in [file]:[line]"

Step 7 — Data Safety

*Are the provisions stored, or left to rot?*

Weight: 10%

7.1 — Migrations

Search for migration files:

  • Prisma: prisma/migrations/ directory
  • TypeORM: migrations/ directory
  • Sequelize: migrations/ directory
  • Django: */migrations/ directories
  • Alembic: alembic/versions/
  • Flyway: db/migration/
  • Generic: migrations/ or db/migrations/

Also check for migration command in package.json scripts or documented in README.

  • Migration files present → good. Database detected but no migrations → HIGH: "Database detected but no migration files — schema changes are not version-controlled"
  • Migration command documented → good. Not documented → LOW: "Migration command not documented in package.json scripts or README"
  • No database → N/A

7.2 — Backups (Informative)

Search for backup indicators:

  • Scripts: backup, pg_dump, mysqldump, mongodump in scripts or docs
  • Cloud: backup configuration in terraform/infrastructure files
  • Documentation: backup procedures in README or ops docs
  • Backup strategy documented or scripted → informative: "Backup strategy detected". Does NOT penalize if absent.
  • Not found → informative: "No backup strategy documented — consider automated database backups"

7.3 — Sensitive Data Handling

  • Passwords stored with hashing (bcrypt, argon2, scrypt) → good. Plaintext password storage detected → CRITICAL: "Passwords stored in plaintext — use bcrypt or argon2"
  • Request bodies not logged in full (covered in Step 5.3) → good
  • Environment variables used for sensitive config → good

7.4 — Wardstones in.gitignore

  • .wardstones/ listed in .gitignore → good. Not listed → LOW: ".wardstones/ not in.gitignore — audit reports may contain internal file paths and should not be committed"

Step 8 — Scoring

*Mjolnir strikes the anvil. The verdict rings across the realms.*

Calculate score using the deterministic algorithm:

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
Containerization25%
Resilience25%
Logging & Observability20%
Backend Performance20%
Data Safety10%

Categories N/A: when a category does not apply (e.g., Containerization for a serverless project), mark it N/A and redistribute its weight proportionally among remaining categories.

Global Score = weighted average rounded to 1 decimal.


Step 9 — Finding Structure

Every finding produced follows this structure:

Finding:
  id: string              # Format: "THOR-{CATEGORY}-{NNN}" (e.g. "THOR-CONTAINER-001")
  stone: "thor"
  severity: string         # critical | high | medium | low
  category: string         # containerization | resilience | logging | performance | dataSafety
  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 penaltyExample
CRITICALBlocks deploy. Active risk or failure affecting production.-3.0 + cap score at 5.0Passwords stored in plaintext, running as root in production
HIGHMust fix this sprint. Serious ops/reliability degradation.-1.5No health check, no graceful shutdown, N+1 queries, no connection pooling
MEDIUMMust fix this quarter. Real but non-urgent problem.-0.5No structured logging, no timeout on HTTP requests, no caching, no.dockerignore
LOWNice to have. Incremental improvement.-0.1No HEALTHCHECK in Dockerfile,.wardstones/ not in.gitignore

Fingerprint Rules

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

  • Template: "No health check endpoint found" (no counts, no paths)
  • Instance: "No health check endpoint found — orchestrators cannot monitor application health"
  • Fingerprint: hash("THOR", "resilience", "No health check endpoint found", null)

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


Step 10 — Suppression System

*Even Thor shows mercy to those who have paid their debts.*

Inline Suppression

In source code:

// wardstones-ignore THOR-CONTAINER-001: Using single-stage build intentionally for dev simplicity
FROM node:20-alpine

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, 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

Step 11 — Delta Computation

*Comparing this storm to the last...*

  1. Look for .wardstones/thor-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 (up / down / same)

Trend Analysis

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

Trend (last 5 runs):
  6.2 -> 6.8 -> 7.1 -> 7.4 -> 7.9  [trending up]

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


Step 12 — Report & Persistence

*The thunder rolls. Midgard hears the verdict.*

Generate report with this format:

⚡ ═══════════════════════════════════════════════════
⚡   THOR — Infrastructure & Ops Audit Report
⚡   [project] — [date]
⚡ ═══════════════════════════════════════════════════

Stack: [detected]
Deployment: [indicators found]
Score: X.X / 10 [▲/▼/━ delta]

Breakdown:
  Containerization:        X.X / 10  (25%)
  Resilience:              X.X / 10  (25%)
  Logging & Observability: X.X / 10  (20%)
  Backend Performance:     X.X / 10  (20%)
  Data Safety:             X.X / 10  (10%)

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

[If trend available]
Trend (last N runs):
  X.X -> X.X -> X.X  [trending up/down/stable]

Findings:
  #  | Severity | Category        | Description                          | File           | Effort
  ---+----------+-----------------+--------------------------------------+----------------+--------
  1  | HIGH     | Resilience      | No health check endpoint found       | —              | small
  2  | MEDIUM   | Containerization| Base image uses 'latest' tag         | Dockerfile     | trivial
  ...

Informative Notes:
  - Circuit breaker pattern detected (opossum)
  - Metrics collection detected (prom-client)
  - No backup strategy documented

Suppressed: [N] findings (baseline or inline)

Top 3 Recommendations:
  1. [Most impactful fix — what, where, why, effort]
  2. [Second most impactful fix]
  3. [Third most impactful fix]

⚡ ═══════════════════════════════════════════════════
⚡   "The roads are only as strong as their keeper."
⚡ ═══════════════════════════════════════════════════

Save result to .wardstones/thor-last.json:

{
  "schemaVersion": 2,
  "stone": "thor",
  "stoneRulesVersion": "1.0.0",
  "timestamp": "ISO date",
  "project": "project-name",
  "detectedStacks": ["nextjs", "typescript"],
  "isMonorepo": false,
  "deploymentIndicators": ["Dockerfile", "docker-compose.yml", ".github/workflows"],
  "score": 7.2,
  "categories": {
    "containerization": { "score": 8.0, "weight": 0.25, "status": "ok" },
    "resilience": { "score": 6.5, "weight": 0.25, "status": "warning" },
    "logging": { "score": 7.0, "weight": 0.20, "status": "ok" },
    "performance": { "score": 7.5, "weight": 0.20, "status": "ok" },
    "dataSafety": { "score": 9.0, "weight": 0.10, "status": "ok" }
  },
  "findings": [
    {
      "id": "THOR-RESILIENCE-001",
      "stone": "thor",
      "severity": "HIGH",
      "category": "resilience",
      "message": "No health check endpoint found — orchestrators cannot monitor application health",
      "file": null,
      "line": null,
      "effort": "small",
      "fingerprint": "hash..."
    }
  ],
  "suppressed": [],
  "metadata": {
    "filesAnalyzed": 124,
    "filesSkipped": 3,
    "executionTime": "8.4s"
  }
}
Markdown Report

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

File: .wardstones/reports/thor-{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:

# THOR — Infrastructure & Ops 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 | THOR-{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/thor-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.

Also save a copy to .wardstones/history/YYYY-MM-DDTHH-MM-SS.json (combined report). Respect config.maxHistory (default: 20). Delete oldest files when limit exceeded.


Output Formats

Pretty (default)

ASCII art report with emojis as shown above. Used in terminal and agent response.

JSON

Full structured output. Same format as thor-last.json.

Markdown

For inserting as PR comments:

## WARDSTONES Audit — {project}

| Stone | Score | Delta |
|-------|-------|-------|
| THOR | 7.2 | +0.3 |

### Critical Findings
- **THOR-DATASAFETY-001**: Passwords stored in plaintext *(medium effort)*

### High Findings
- **THOR-RESILIENCE-001**: No health check endpoint found *(small 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.


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.


Failure Policy

When a check depends on an external command that fails:

SituationActionScore
Command does not exist (e.g. docker not installed)Skip check, do not penalizeN/A, weight redistributed
Command exists but fails (e.g. docker compose config errors)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 Dockerfile)Check does not applyN/A

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

平台分布

Codex

36.04%
按下载量换算33

Claude

28.2%
按下载量换算26

Cursor

18.56%
按下载量换算17

Gemini CLI

10.46%
按下载量换算10

安全审计

暂无安全审计结果可展示。

权限和风险

接触敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

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

继续浏览同类 Skills