skillsaw 0.22.0 lints Goose recipes and keeps CI logs short

3 hours ago

skillsaw lints the files that steer your AI coding agents. Version 0.22.0 starts reading Goose recipes, and a new quiet flag cuts a CI log down to the findings. It also checks Codex and Pi MCP servers, and brings the rule count to 110.

Ask about this presentation

Chapters

  1. 0:00skillsaw 0.22.0
  2. 0:19Quiet CI logs
  3. 0:36Goose recipes
  4. 0:58Goose opt-in rules
  5. 1:21Codex MCP headers
  6. 1:45Pi MCP servers
  7. 2:10Claude Code fixes
  8. 2:29OpenClaw and APM
  9. 2:50What to expect
  10. 3:11Upgrade
Show transcript
  1. skillsaw lints the files that steer your AI coding agents. Version 0.22.0 starts reading Goose recipes, and a new quiet flag cuts a CI log down to the findings. It also checks Codex and Pi MCP servers, and brings the rule count to 110.

    Slide text
    skillsaw logo

    skillsaw 0.22.0 lints Goose recipes and keeps CI logs short

    plus Codex and Pi MCP checks · 110 rules
  2. With -q, a clean run prints nothing. When there are findings, the banner and the scan stats go away, and you keep every finding, the summary and the same exit code. Only the text on screen is trimmed, so a report file from --output is still written in full.

    Slide text
    skillsaw lint -q / --quiet

    A clean run with -q prints nothing at all

    Dropped
    skillsaw 0.22.0
    Linting: .
    Scanned: repo type, plugins,
    skills, rules run, time
    Kept
    Errors: every finding
    Warnings: every finding
    Summary: the counts
    Same exit code as a normal run
    $ skillsaw lint --quiet --output skillsaw-summary.html .
    Text on stdout only. Files from --output and JSON output stay complete.
  3. skillsaw now finds Goose recipes in the .goose/recipes folder. Instructions, prompts and activities get the same content and security checks as a skill. External extensions get the MCP credential checks, and built-in ones are skipped. YAML, Desktop and JSON recipes all count, including ones nested in a monorepo.

    Slide text
    skillsaw .goose/recipes/

    Goose recipes now get skillsaw's content and security checks

    title: Review a patch
    description: Check a proposed change against the repository conventions.
    instructions: |
      Read the changed modules and their tests.
      Explain any correctness defects with a concrete example.
    prompt: Review {{ component }} and report required changes.
    # …
    extensions:
      - type: builtin
        name: developer
      - type: streamable_http
        name: remote
        uri: https://mcp.example.com/mcp
        headers:
          Authorization: "Bearer ${MCP_TOKEN}"
    Instructions, prompt, activities
    Shared content, reference and security checks
    External extensions
    MCP credential checks and server policy. Built-ins are skipped.
    YAML, Desktop .yml, JSON
    Found in nested monorepo workspaces too
  4. The Goose rules themselves are opt-in. One checks a recipe's fields, and the other warns when a local subrecipe path is missing. For a folder of standalone recipes, pass type goose and name both rules. These are static checks against Goose 1.52. skillsaw never runs a recipe or renders a template, so keep running Goose's own validate command.

    Slide text
    skillsaw --type goose

    Two opt-in rules check recipe fields and subrecipe paths

    goose-recipe-valid
    Title, description, instructions or prompt, parameters, extension fields
    error
    goose-subrecipe-references
    Local sub_recipes paths exist inside the lint root
    warning
    $ uvx skillsaw lint my-recipes --type goose \
        --rule goose-recipe-valid \
        --rule goose-subrecipe-references
    limit Static checks against Goose v1.52.0. Recipes never run and templates never render, so keep goose recipe validate.
  5. In a Codex project config, headers on an HTTP MCP server load fine, but Codex ignores them, so requests go out without them. Codex reads http_headers for literal values and env_http_headers for variable names. The new rule warns automatically in Codex projects. It has no autofix, because moving the values changes what Codex sends.

    Slide text
    skillsaw codex-mcp-headers

    Codex ignores headers on an HTTP MCP server, and skillsaw now warns

    Ignored
    [mcp_servers.catalog]
    url = "https://catalog.example.test/mcp"
    headers = { "X-Client" = "release-review" }
    Sent
    [mcp_servers.catalog]
    url = "https://catalog.example.test/mcp"
    http_headers = { "X-Client" = "release-review" }
    env_http_headers = { Authorization = "CATALOG_AUTHORIZATION" }
    Warning, on automatically for .codex/config.toml. No autofix: moving values changes what Codex sends.
  6. Pi added project MCP servers in a file of its own, and skillsaw now finds it. The shared credential and policy checks run on it automatically. Turn on the Pi MCP rule for the field types and transports of Pi 1.0. It rejects the legacy SSE transport. Values that Pi resolves through a command are never run, but skillsaw still scans them for embedded tokens.

    Slide text
    skillsaw .pi/mcp.json

    Pi's project MCP servers in .pi/mcp.json are now checked

    {
      "mcpServers": {
        "docs": {
          "url": "https://docs.example.com/mcp",
          "headers": {
            "Authorization": "${DOCS_TOKEN}"
          },
          "exposure": "codemode"
        }
      }
    }
    Always on
    Shared MCP credential and server policy checks
    Opt-in · pi-mcp-valid
    Pi 1.0 field types and transports. Legacy sse is rejected.
    Never executed
    !command values are still scanned for tokens
  7. Two Claude Code fixes remove false errors. Agents inside a plugin can skip the name field, since Claude Code falls back to the file name. Project agents still need one. And plugin versions no longer have to be semver. Calendar versions and labels pass, and only a version that isn't a string gets flagged.

    Slide text
    skillsaw Claude Code

    Claude plugin checks now accept what Claude Code accepts

    Plugin agents can skip name
    Claude Code falls back to the filename inside the plugin's namespace. Project agents still need one.
    version is any string
    "2026.10" "release-candidate" 2026
    Only a non-string fails: 'version' must be a string
  8. For OpenClaw, the opt-in manifest rule now checks theme and artwork declarations, because one bad theme makes OpenClaw reject the whole plugin. For APM, a memory folder now counts as a package folder, and memory files get the security rules, so an instruction hidden in an HTML comment gets caught.

    Slide text
    skillsaw OpenClaw · APM

    OpenClaw themes and APM memory files are covered too

    OpenClawopenclaw-manifest-valid · opt-in
    Checks themes, hats and critters against OpenClaw v2026.9.7, which rejects the whole plugin over one bad theme declaration.
    APM.apm/memory/
    A recognized primitive folder. *.memory.md files now go through the content and security rules.
  9. The release notes list no breaking changes, but wider coverage can turn up new findings. You may see the Codex headers warning, and first-time checks on Goose recipes, Pi MCP files and APM memory files. By default only errors fail the build, and skillsaw baseline accepts the existing findings, so only new ones fail.

    Slide text

    The notes list no breaking changes, but new checks can find new things

    Codex projects
    codex-mcp-headers warnings, on automatically
    Goose and Pi MCP
    Recipe prose and MCP credentials scanned for the first time
    APM memory
    *.memory.md files reach the security rules
    By default only errors fail the build; --strict adds warnings
    skillsaw baseline accepts existing findings and fails only on new ones
  10. To upgrade, pin 0.22.0 with pip, bump the pre-commit rev, or set the version in the GitHub Action. The Goose and Pi MCP rules stay off until you enable them. Then skillsaw 0.22.0 lints your Goose recipes, and with -q, your CI log stays short.

    Slide text

    Upgrade to skillsaw 0.22.0

    pip
    pip install skillsaw==0.22.0
    pre-commit
    - repo: https://github.com/stbenjam/skillsaw
      rev: v0.22.0
    GitHub Action
    uses: stbenjam/skillsaw@v0
    with:
      version: '0.22.0'
    goose-recipe-valid, goose-subrecipe-references and pi-mcp-valid stay off until you enable them.
    skillsaw logo skillsaw

What happened in AI today, in your inbox

One short email each evening. Read it and you’re caught up.

Built in New York with ❤️