Jinja Codegen
xberg-io/alef
Mechanics of alef's Minijinja template system: which templateenv module to call, how to register a template, inline-template rules, and engine settings.
Whistler-local autonomous work loop. An agent skill from atgreen/Whistler.
$ npx skills add atgreen/Whistler --skill grind -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install atgreen/Whistler grind --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/atgreen/Whistler.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/grind .claude/skills/grind && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "grind" agent skill from https://github.com/atgreen/Whistler/tree/main/.claude/skills/grind into .claude/skills/grind/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grind", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/atgreen/Whistler/tree/main/.claude/skills/grindType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add atgreen/Whistler --skill grind -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install atgreen/Whistler grind --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/atgreen/Whistler.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/grind .agents/skills/grind && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "grind" agent skill from https://github.com/atgreen/Whistler/tree/main/.claude/skills/grind into .agents/skills/grind/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grind", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add atgreen/Whistler --skill grind -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install atgreen/Whistler grind --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/atgreen/Whistler.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/grind .cursor/skills/grind && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "grind" agent skill from https://github.com/atgreen/Whistler/tree/main/.claude/skills/grind into .cursor/skills/grind/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grind", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/atgreen/Whistler.git --path .claude/skills/grind--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add atgreen/Whistler --skill grind -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install atgreen/Whistler grind --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/atgreen/Whistler.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/grind .gemini/skills/grind && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "grind" agent skill from https://github.com/atgreen/Whistler/tree/main/.claude/skills/grind into .gemini/skills/grind/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grind", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install atgreen/Whistler grindInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add atgreen/Whistler --skill grind -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/atgreen/Whistler.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/grind .github/skills/grind && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "grind" agent skill from https://github.com/atgreen/Whistler/tree/main/.claude/skills/grind into .github/skills/grind/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grind", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add atgreen/Whistler --skill grind -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install atgreen/Whistler grind --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/atgreen/Whistler.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/grind .opencode/skills/grind && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "grind" agent skill from https://github.com/atgreen/Whistler/tree/main/.claude/skills/grind into .opencode/skills/grind/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "grind", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
grindWhistler-local autonomous work loop. An agent skill from atgreen/Whistler.
Grind is an agent skill from atgreen/Whistler. Whistler-local autonomous work loop. Survey the Beads queue, pick the highest-value next task (prioritizing correctness of generated eBPF and progress toward the Lisp→eBPF compiler goal), reprioritize the queue accordingly, then execute it end-to-end with the project's validation discipline (verifier-correct codegen, instruction-count/disassembly parity, test + kernel-load suites). Trigger when the user says "/grind", "grind", "pick the next thing and do it", "keep making progress", or wants an autonomous session…
Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Project scaffolding and End-to-end testing. The repository describes itself as: A lisp that compiles to eBPF. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit efb7cae. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
makegitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Grind loads about 2.4k tokens when it runs. Until then it costs about 142 tokens; SKILL.md has 1,151 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from atgreen/Whistler at commit efb7cae, republished under its MIT licence (© atgreen). 1,151 words, ~2,400 tokens.
.claude/skills/grind/SKILL.md (or your agent's skills folder).You are advancing Whistler: a Lisp that compiles to eBPF, written in Common
Lisp (SBCL). The pipeline is source → macro expansion → lowering → SSA IR →
optimization (ssa-opt, sccp) → register allocation → BPF emission → peephole →
ELF, with a pure-CL userspace loader (no libbpf/CFFI), a bpftrace frontend, and
a standalone symbolizer. The north star: correct, verifier-passing eBPF that
holds its own against clang -O2 on instruction count, across every program
type and frontend.
/grind = decide what to work on next, reprioritize the queue so that
decision is legible, then do the work to completion. One good increment,
committed and closed, beats a half-finished heroic epic. Prefer correctness and
demonstrable progress toward the goal over breadth.
bd prime # workflow + memories (if context is stale)
bd ready # claimable work
bd stats # open/blocked/in-progress shapeSkim CLAUDE.md (Architecture + Conventions) for the subsystem you're about to
touch — do not re-read all of src/. The pass ordering and the "must include
this op" invariants (ir-insn-side-effect-p, regalloc call-positions,
shared-definition single-source-of-truth in compiler.lisp) are where correctness
bugs hide; re-read the relevant Conventions bullet before editing that pass.
Build the system:
make # loads/compiles the whistler ASDF systemCompile a program the standard way (state is auto-isolated by compile-file* /
with-bpf-session; in the REPL call (reset-compilation-state) between separate
compile-to-elf runs):
sbcl --noinform --non-interactive \
--eval '(require :asdf)' \
--eval '(push #P"/home/green/git/whistler/" asdf:*central-registry*)' \
--eval '(asdf:load-system "whistler")' \
--eval '(whistler::compile-file* "examples/synflood-xdp.lisp" "output.bpf.o")'Score candidates in this order and pick the highest that is tractable now:
clang -O2 on real benchmarks
(e.g. nodeport-lb4: Whistler 76 vs clang 75 instructions).compiler.lisp), loader/
session parity (both paths must patch the same relocations). Value work that
makes the compiler better, not incidental surface.Deprioritize: cosmetic cleanups, speculative features, anything with no line to the goal, and tracking/rollup epics — don't "work" a rollup; decompose it into a concrete child and do that.
When the top candidate is a large epic, carve off the smallest child that delivers real, verifiable value and do that this run.
Whistler emits code the BPF verifier must accept and the kernel must run correctly. Two disciplines protect that:
ir-insn-side-effect-p (stores, calls, tail-call, struct-alloc, branches) or
DCE will silently delete it. Any call-like op (map-lookup, map-lookup-ptr,
tail-call, …) must be in regalloc's call-positions list or R1–R5 clobbering
corrupts live values. Peephole passes are order-dependent. A violation here is
exactly a silent miscompile — treat it as the top-priority failure mode.compiler.lisp; lower.lisp, the bpftrace
frontend, and the loader reference them, never copy. When you change a
kfunc/helper/reloc, update the one registry and confirm both load paths
still patch it (ELF loader patch-kfunc-relocations, session
session-load-progs).Prove it before committing on any codegen path you touched:
whistler::disassemble-cu on the compilation-unit from
compile-to-elf). For codegen changes, compare instruction counts and
disassembly against the prior output — a count that went up unexpectedly,
or a changed instruction you can't explain, is a regression until proven
otherwise.make test plus a clean disassembly diff is
the cheapest evidence a codegen change is correct.make test-torture actually loads compiled programs (needs CAP_BPF). Use
/usr/bin/sbcl (it carries the BPF caps), not the Homebrew SBCL, for any
kernel-load test.An unexplained instruction-count change, a verifier rejection under torture, or a relocation the loader no longer patches means you broke something — find it before committing.
Make the decision legible by aligning priorities with the rubric — before you start coding:
bd update <id> --priority N.bd comment on anything you re-rank, saying why (e.g.
"raise: verifier-reject on the tail-call path" / "lower: cosmetic, off
critical path"). Keep churn minimal — reprioritize to reflect the plan, not
to reshuffle the whole board.// TODO or a mental
note): bd create "…" -t bug|task -p N. Model blockers with bd dep add.bd update <id> --claimcompiler.lisp authoritative (§3).make); drive the affected flow and observe the result (the
/verify discipline) — compile the relevant example and read its disassembly,
don't trust tests alone. Wrong-code bugs demand you see the right
instructions now.make test # FiveAM (whistler/tests)
make bpftrace-parse-test # when the bpftrace frontend is touched
make test-torture # kernel-load, needs CAP_BPF (use /usr/bin/sbcl)Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>bd close <id> with the commit hash and what was verified (tests green,
disassembly diff, kernel-load result); bd sync. git push only when the
user asks. If not on a branch and about to commit, branch first.Report: what you picked and why (the rubric line it satisfied), the change, how you verified it (tests, instruction-count/disassembly diff, and any kernel-load evidence), what you re-ranked, and any new Beads filed. Then pick the next task (repeat) until told to stop or the queue has no tractable correctness/goal work left — at which point say so plainly rather than inventing busywork.
© atgreen, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/grind of atgreen/Whistler.
Open the folder on GitHubat commit efb7cae
Grind next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Grind this skillatgreen/Whistler | 101 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Jinja Codegenxberg-io/alef | 100 | — | ~735 | Automated safety check: Pass | MIT | |
| Dx Harnesspproenca/dot-skills | 215 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Add Full Slicefullstackhero/dotnet-starter-kit | 6.8k | — | ~783 | Automated safety check: Pass | MIT | |
| Release WorkflowGoldziher/spikard | 123 | — | ~909 | Automated safety check: Pass | MIT | |
| Bmad Testarch Atddbmad-code-org/bmad-method-test-architecture-enterprise | 104 | 3 repos | ~1.2k | Automated safety check: Pass | Custom licence |
xberg-io/alef
Mechanics of alef's Minijinja template system: which templateenv module to call, how to register a template, inline-template rules, and engine settings.
pproenca/dot-skills
Developer-experience friction auditing and fixing — slow onboarding, repeated manual setup steps, missing bootstrap/reset/seed scripts, undiscoverable conventions.
fullstackhero/dotnet-starter-kit
Build a capability end-to-end — backend vertical slice (Contracts→handler→validator→endpoint) AND the React page wired to it.
Goldziher/spikard
Release/publish the spikard Rust core crate and CLI end-to-end.
bmad-code-org/bmad-method-test-architecture-enterprise
Generate red-phase acceptance test scaffolds using the TDD cycle.
Jeffallan/claude-skills
Scaffolds NestJS modules, controllers, services, DTOs and guards for TypeScript backends, with validation, JWT and Passport auth, Swagger docs and unit and E2E tests.
atgreen/Whistler
Cut a new Whistler release. An agent skill from atgreen/Whistler.
Categories
Whistler-local autonomous work loop. An agent skill from atgreen/Whistler. Grind is an agent skill from atgreen/Whistler. Whistler-local autonomous work loop.
Grind fits situations like: the user says /grind; pick the next thing and do it; keep making progress; wants an autonomous session that decides and works without hand-holding.
Run `npx skills add atgreen/Whistler --skill grind -a claude-code`. Or copy the skill folder (.claude/skills/grind in atgreen/Whistler) into .claude/skills/grind in your project. Claude Code loads it when a task matches its description.
Run `npx skills add atgreen/Whistler --skill grind -a codex`. Or copy the skill folder (.claude/skills/grind in atgreen/Whistler) into .agents/skills/grind in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add atgreen/Whistler --skill grind -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/grind, .gemini/skills/grind, .github/skills/grind and .opencode/skills/grind in your project.
Going by SKILL.md and its folder, Grind needs the command-line tools its instructions call (make and git).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Grind is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Grind: Jinja Codegen (xberg-io/alef, 100 stars), Dx Harness (pproenca/dot-skills, 215 stars), Add Full Slice (fullstackhero/dotnet-starter-kit, 6.8k stars) and Release Workflow (Goldziher/spikard, 123 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
atgreen (a GitHub user) maintains it in atgreen/Whistler, which has 101 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on September 16, 2026.
Source: atgreen/Whistler on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.