Skip to content
v6.1.0MIT

Mine an architecture graph out of a repository that has none: grain propose reads the code and the full git history and writes node types, nodes, relations, cycles and the rules the repository's own code can prove, each one carrying the evidence that produced it and the count of places that already break it, as a tree Yggdrasil loads and accepts with one command. The agent-facing questions it has always answered still work from the same model: where <intent> (where such things live, what is expected there, exemplars to copy), what <term>, how <query>, check <file> (how a change sits against the local norm), review, completeness, status/report/rules, export, decide steer|boundary|waive — plus hooks that speak unbidden and an MCP server exposing every command as a tool to any MCP client. Statistical answers mined from syntax trees and git history; no model calls, no network, never blocks.

MCP servers

Declared configuration, as published in mcp.json. The directory shows indexed content; it never connects to or executes these servers.

grainstdio
{
  "type": "stdio",
  "command": "node",
  "args": [
    "-e",
    "const f=process.argv[1];if(!require('fs').existsSync(f)){console.error('grain: '+f+' is not reachable from this environment (a host path inside a container?), so grain did not run');process.exit(0)}const r=require('child_process').spawnSync(process.execPath,process.argv.slice(1),{stdio:'inherit'});process.exit(r.status===null?1:r.status)",
    "${PLUGIN_ROOT}/bin/grain-mcp.mjs"
  ]
}

What this package declares

The files a client reads when it loads this plugin, exactly as this revision carries them.

{
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
  "name": "grain",
  "version": "6.1.0",
  "description": "Mine an architecture graph out of a repository that has none: grain propose reads the code and the full git history and writes node types, nodes, relations, cycles and the rules the repository's own code can prove, each one carrying the evidence that produced it and the count of places that already break it, as a tree Yggdrasil loads and accepts with one command. The agent-facing questions it has always answered still work from the same model: where <intent> (where such things live, what is expected there, exemplars to copy), what <term>, how <query>, check <file> (how a change sits against the local norm), review, completeness, status/report/rules, export, decide steer|boundary|waive — plus hooks that speak unbidden and an MCP server exposing every command as a tool to any MCP client. Statistical answers mined from syntax trees and git history; no model calls, no network, never blocks.",
  "author": {
    "name": "Krzysztof Dudek",
    "url": "https://github.com/krzysztofdudek"
  },
  "homepage": "https://github.com/krzysztofdudek/Grain",
  "repository": "https://github.com/krzysztofdudek/Grain.git",
  "license": "MIT",
  "keywords": [
    "conventions",
    "codebase-analysis",
    "tree-sitter",
    "coding-agents",
    "context-engineering",
    "claude-code-plugin",
    "repo-conventions"
  ],
  "extensions": {
    "com.openai": {
      "hooks": "./hooks/codex-hooks.json",
      "interface": {
        "displayName": "grain"
      }
    }
  }
}

What else this package ships

These files come with the package and this site does not publish them. They are listed so you know what is there before you install it.

  • hooks.json
View on GitHub

Client extensions

Data this package carries for particular clients. The directory lists the clients named and never reads what is addressed to them.

  • com.github.copilotships a directory of files
  • com.openai