Code Review Excellence
andrew-yangy/gru-ai
Provides comprehensive code review guidance for React 19, Vue 3, Rust, TypeScript, Java, Python, and C/C++.
Guidelines and workflows for contributing to the marmite codebase - covers code quality, testing, architecture patterns, and contribution checklists
$ npx skills add rochacbruno/marmite --skill marmite-development -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install rochacbruno/marmite marmite-development --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/rochacbruno/marmite.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/marmite-development .claude/skills/marmite-development && 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 "marmite-development" agent skill from https://github.com/rochacbruno/marmite/tree/main/.agents/skills/marmite-development into .claude/skills/marmite-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marmite-development", 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/rochacbruno/marmite/tree/main/.agents/skills/marmite-developmentType 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 rochacbruno/marmite --skill marmite-development -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install rochacbruno/marmite marmite-development --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rochacbruno/marmite.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/marmite-development .agents/skills/marmite-development && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "marmite-development" agent skill from https://github.com/rochacbruno/marmite/tree/main/.agents/skills/marmite-development into .agents/skills/marmite-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marmite-development", 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 rochacbruno/marmite --skill marmite-development -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install rochacbruno/marmite marmite-development --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rochacbruno/marmite.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/marmite-development .cursor/skills/marmite-development && 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 "marmite-development" agent skill from https://github.com/rochacbruno/marmite/tree/main/.agents/skills/marmite-development into .cursor/skills/marmite-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marmite-development", 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/rochacbruno/marmite.git --path .agents/skills/marmite-development--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 rochacbruno/marmite --skill marmite-development -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install rochacbruno/marmite marmite-development --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rochacbruno/marmite.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/marmite-development .gemini/skills/marmite-development && 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 "marmite-development" agent skill from https://github.com/rochacbruno/marmite/tree/main/.agents/skills/marmite-development into .gemini/skills/marmite-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marmite-development", 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 rochacbruno/marmite marmite-developmentInstalls 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 rochacbruno/marmite --skill marmite-development -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/rochacbruno/marmite.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/marmite-development .github/skills/marmite-development && 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 "marmite-development" agent skill from https://github.com/rochacbruno/marmite/tree/main/.agents/skills/marmite-development into .github/skills/marmite-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marmite-development", 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 rochacbruno/marmite --skill marmite-development -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install rochacbruno/marmite marmite-development --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rochacbruno/marmite.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/marmite-development .opencode/skills/marmite-development && 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 "marmite-development" agent skill from https://github.com/rochacbruno/marmite/tree/main/.agents/skills/marmite-development into .opencode/skills/marmite-development/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marmite-development", 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.
marmite-developmentGuidelines and workflows for contributing to the marmite codebase - covers code quality, testing, architecture patterns, and contribution checklists
Marmite Development is an agent skill from rochacbruno/marmite. Guidelines and workflows for contributing to the marmite codebase - covers code quality, testing, architecture patterns, and contribution checklists
Its SKILL.md is about 6.9k 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 Static sites and blogs, Code quality and Software architecture. It works with Rust. The repository describes itself as: Markdown makes sites - A Static Site Generator for Blogs. The licence is AGPL-3.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 303a0bf. 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:
cargogitFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
marmite.blogFrom 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.
Marmite Development loads about 6.9k tokens when it runs. Until then it costs about 42 tokens; SKILL.md has 2,802 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 rochacbruno/marmite at commit 303a0bf, republished under its AGPL-3.0 licence (© rochacbruno). 2,802 words, ~6,864 tokens.
.claude/skills/marmite-development/SKILL.md (or your agent's skills folder).This skill is for developers contributing to the marmite codebase. For building sites with marmite, use the marmite skill instead.
marmite input_folder --show-urls{
"archives": [
"/archive-2027.html",
"/archive.html"
],
"authors": [
"/author-jao.html",
"/authors.html"
],
"feeds": [
"/index.rss",
"/internet.rss",
"/tag-python.rss",
"/author-jao.rss",
"/archive-2026.rss"
],
"file_mappings": [],
"misc": [
"/index.html"
],
"pages": [
"/about.html",
"/pages.html"
],
"pagination": [
"/pages-1.html",
"/tag-dev-1.html",
"/tag-python-1.html",
"/author-jao-1.html",
"/archive-2026-1.html",
"/index-1.html",
],
"posts": [
"/code-django.html",
"/code-python.html",
],
"redirects": [],
"series": [],
"streams": [
"/code.html",
"/streams.html"
],
"summary": {
"archives": 1,
"authors": 1,
"feeds": 5,
"file_mappings": 0,
"meta": {
"absolute_urls": false,
"url": ""
},
"misc": 1,
"pages": 1,
"pagination": 1,
"posts": 2,
"redirects": 0,
"series": 0,
"streams": 2,
"tags": 1,
},
"tags": [
"/tag-python.html",
"/tags.html"
]
}This tool allows the agent to:
marmite input_folder --init-siteInitialize a new site structure from scaffolding.
marmite input_folder --new "title" -t tagCreate a new post.
Use marmite --help to check what else is available.
Every change must pass formatting and linting before it can be committed.
# Format code (always run first)
mask fmt
# Check formatting + clippy lints
mask check
# Pedantic clippy (run before opening a PR)
mask pedanticmask check runs cargo fmt -- --check followed by cargo clippy. Both must pass clean. mask pedantic adds -W clippy::pedantic for stricter analysis - fix pedantic issues only after confirming with the project maintainer.
Do not suppress clippy warnings with #[allow(...)] unless there is a justified reason. If a suppression is needed, use the narrowest possible scope (on the item, not the module).
unwrap() in non-test code. Use Result and Option with proper error propagation (? operator), unwrap_or, unwrap_or_else, unwrap_or_default, or pattern matching. Reserve unwrap() for test code and cases where the value is guaranteed at compile time (e.g., embedded assets loaded via rust_embed).panic! in library code. Return Result or Option instead. Use error! from the log crate to report problems, then return an error or a sensible default.Result types. Do not silently discard errors with let _ = ... unless the discard is intentional and documented.&str over String in function parameters when ownership is not needed.Arc for shared ownership across threads. The project uses Arc<PathBuf> and Arc<Cli> for passing shared state..clone() when a borrow suffices. Cloning is acceptable when the borrow checker requires it or when the data needs to outlive the current scope, but do not clone as a reflex.LazyLock for static initialization instead of lazy_static! in new code. The project is transitioning to std::sync::LazyLock.The project uses the log crate for user-facing messages:
use log::{info, warn, error, debug, trace};
// User-facing progress
info!("Processing {} files", count);
// Recoverable problems the user should know about
warn!("Skipping file with invalid frontmatter: {}", path.display());
// Fatal or important errors
error!("Failed to write output: {}", err);
// Developer debugging (visible with -vv)
debug!("Resolved slug: {}", slug);
// Detailed tracing (visible with -vvv)
trace!("Template context: {:?}", context);Functions that can fail should return Result<T, E> or Option<T>. Use process::exit(1) only in main.rs for top-level CLI errors.
snake_case for functions, methods, variables, and modulesPascalCase for types, structs, enums, and traitsSCREAMING_SNAKE_CASE for constants and static variables#[arg(long)] with descriptive names (e.g., --skip-image-resize, --init-templates). Clap automatically converts underscores to hyphens.snake_case matching the YAML key name. Always add #[serde(default)] with a default function.Every change needs tests. The project has two testing layers:
src/tests/)Unit tests call marmite code directly. Each module has a corresponding test file.
src/tests/
content.rs # Content parsing, slug generation, streams
shortcodes.rs # Shortcode regex matching and expansion
parser.rs # Markdown to HTML conversion
tera_functions.rs # Custom Tera template functions
tera_filter.rs # Custom Tera filters
feed.rs # RSS feed generation
gallery.rs # Image gallery processing
site.rs # Site generation logic
templates.rs # Template initialization
embedded.rs # Embedded asset loading
server.rs # HTTP server
image_resize.rs # Image resizing
image_provider.rs # Image download
theme_manager.rs # Theme installationUnit test pattern:
use super::*;
use crate::config::Marmite;
#[test]
fn test_descriptive_name_of_what_is_tested() {
// Setup
let config = Marmite::default();
// Act
let result = function_under_test(&config);
// Assert
assert_eq!(result, expected_value);
}Run unit tests:
mask test_unit
# or a specific test
cargo test --bin marmite test_nametests/)Integration tests run marmite as a subprocess via std::process::Command and assert on the output files. They test end-to-end behavior.
tests/
basic_functionality.rs # CLI help, version, minimal site generation
content_generation.rs # Content processing end-to-end
features.rs # Feature-specific integration tests
streams.rs # Stream content type
wikilinks_integration.rs # Wikilink resolution
highlight.rs # Syntax highlighting
image_resize_integration.rs # Image resizing pipeline
themes.rs # Theme loading and applicationIntegration test pattern:
use std::fs;
use std::process::Command;
use tempfile::TempDir;
#[test]
fn test_feature_name_end_to_end() {
let temp_dir = TempDir::new().unwrap();
let input_dir = temp_dir.path().join("input");
let output_dir = temp_dir.path().join("output");
fs::create_dir_all(input_dir.join("content")).unwrap();
fs::write(
input_dir.join("marmite.yaml"),
"name: Test Site\ntagline: Test",
).unwrap();
fs::write(
input_dir.join("content").join("test.md"),
"# Test Page\n\nContent here.",
).unwrap();
let output = Command::new("cargo")
.args(["run", "--quiet", "--",
input_dir.to_str().unwrap(),
output_dir.to_str().unwrap()])
.output()
.expect("Failed to execute marmite");
assert!(output.status.success());
// Assert on generated files
let html = fs::read_to_string(output_dir.join("test.html")).unwrap();
assert!(html.contains("Test Page"));
}Run integration tests:
mask test_integration
# or a specific file
cargo test --test basic_functionalityRun all tests:
mask testMarmite is used by people who depend on its current behavior. Follow these principles:
#[serde(default = "default_function")] so that existing marmite.yaml files without the new field continue to work.#[arg(hide = true)] to hide deprecated flags from --help while still accepting them.Every new feature must be documented in multiple places. The marmite website is generated from example/content/, so documentation and the site are the same thing.
Create a new markdown file in example/content/ documenting the feature. Follow existing patterns:
YYYY-MM-DD-feature-name.mdexample/content/2024-11-26-marmite-command-line-interface.mdexample/ai/llms.txt)Add an entry to example/ai/llms.txt under the appropriate section for any significant change: new CLI flag, new config option, new content capability, new template variable, or new shortcode. This file is served at marmite.blog/llms.txt and is used by AI agents to understand marmite's capabilities.
.agents/skills/marmite/references/)Update the corresponding reference file when the feature changes:
| What changed | File to update |
|---|---|
| Config options | references/config-reference.md |
| CLI flags | references/cli-reference.md |
| Frontmatter fields | references/frontmatter.md |
| Template variables or functions | references/tera-templates.md |
| Shortcodes | references/shortcodes.md |
| Content organization (streams, series, fragments) | references/content-organization.md |
| Deployment or hosting | references/deployment-guide.md |
| Comment systems | references/comment-system.md |
These files are compiled into the binary via rust_embed and installed with --skill-install. They must stay accurate.
When adding a new feature, add to the top level SKILL.md
Every new feature and bug fix must be added to the current draft release notes. Find the latest release notes file with stream: draft in frontmatter under example/content/release-notes/. The filename pattern is marmite-X-Y-Z-release-notes.md.
Marmite has two sets of templates that must be kept in sync:
example/templates/ and example/static/)This is the default theme used by marmite when no custom theme is set. Changes to templates, CSS, JavaScript, or static assets go here first.
example/templates/ - Tera HTML templates (base.html, content.html, list.html, group.html)example/static/ - CSS, JavaScript, fonts, colorschemestheme_template (example/theme_template/)This is the scaffolding theme used when users run marmite <folder> --start-theme <name>. It provides a starting point for new custom themes. It has its own copies of templates and static assets:
example/theme_template/templates/ - Template filesexample/theme_template/static/ - Static assets (CSS, JS, fonts, colorschemes)When you change any template or static asset in the main theme, you must also apply the corresponding change to theme_template. The two themes can differ in styling and layout details, but they must both support the same template variables, blocks, and structural features. If a new template block or variable is added in the main theme, theme_template must also include it so that users who scaffold a new theme get a working starting point.
After making template changes, verify both themes work:
# Test with the main theme
mask serve
# Test with theme_template
mask serve_themeWhen you add a new field to marmite.yaml, it must also be settable via a CLI flag. This allows users to override config without editing files, and is essential for CI/CD and scripting.
The full process:
config.rs:#[serde(default = "default_my_feature")]
pub my_feature: bool,Add the default function:
fn default_my_feature() -> bool {
false
}cli.rs inside the Configuration struct:/// Enable my feature
#[arg(long)]
pub my_feature: bool,config.rs inside Marmite::override_from_cli_args():if cli_args.configuration.my_feature {
self.my_feature = true;
}example/marmite.yaml.agents/skills/marmite/references/config-reference.mdexample/content/2024-11-26-marmite-command-line-interface.md if it is a CLI flagCli in cli.rs with #[arg(long)] and a doc comment (becomes --help text).run_cli() in main.rs at the correct position in the command chain.input_folder, handle it before input_folder resolution.determine_verbosity() if the command should auto-set verbosity.tera_functions.rs (implement tera::Function).site.rs where other functions are registered (search for tera.register_function)..agents/skills/marmite/references/tera-templates.md.write_template_context_files in site.rs (the functions vec).TERA_BUILTIN_FILTERS or function completion list in assets/toolbar/editor.js.tera_filter.rs (implement tera::Filter).site.rs where other filters are registered (search for tera.register_filter)..agents/skills/marmite/references/tera-templates.md.write_template_context_files in site.rs (the filters vec).assets/toolbar/editor.js.site.rs (search for context.insert).render_templates function) - available to all templateshandle_content_pages function) - available to content.htmlrender_list_page function) - available to list.htmlrender_group_page function) - available to group.html.agents/skills/marmite/references/tera-templates.md.write_template_context_files in site.rs.Marmite uses Tera 2.0. Key points for contributors:
initialize_tera in site.rs): loads embedded default templates first, then user templates from templates_path which override the defaults. The preprocess_template function in embedded.rs auto-converts Tera 1.x syntax (dot-notation indexing, positional test args, ignore missing includes) to Tera 2.0 syntax._ in the content directory (e.g., _hero.md, _sidebar.md) are rendered through Tera with the global context, then converted to HTML, and injected as variables into all templates.custom_{filename},list.html pattern - Tera tries custom_index.html first, falls back to list.html.--serve, template.{name}.context.json files are written to the output folder listing available variables, functions, and filters per template type. These are consumed by the editor for autocomplete.Marmite uses Tera 2.0. When writing or modifying templates:
{% shortcode name() %} syntax which is processed by marmite's shortcode processor before Tera.items[0] not items.0 (the preprocessor auto-converts old syntax).{{ content?.extra?.key }} is safe for deeply nested access.escape is now escape_html, linebreaksbr is newlines_to_br, as_str is str. Marmite provides compatibility shims for the old names.addslashes, spaceless, get_env, concat are gone from Tera. striptags, slice, trim_start_matches, and date are provided by marmite as custom filters.value is divisible_by(n=3) not value is divisibleby(3).New embedded assets follow the rust_embed pattern in embedded.rs:
#[derive(Embed, Debug)]
#[folder = "$CARGO_MANIFEST_DIR/path/to/folder/"]
pub struct MyAssets;
pub static EMBEDDED_MY_ASSETS: LazyLock<Vec<(String, Vec<u8>)>> = LazyLock::new(|| {
let mut files: Vec<(String, Vec<u8>)> = Vec::new();
for name in MyAssets::iter() {
let file = MyAssets::get(name.as_ref())
.expect("Failed to get embedded asset - this is a build-time error");
files.push((name.clone().to_string(), file.data.clone().to_vec()));
}
files
});Cargo.toml (e.g., serde = "1.0"). Dependabot handles patch and minor updates.cargo audit before adding new crates.walkdir).md file, call Content::from_markdown():frontmatter_gen - supports YAML/TOML/JSON)@/ media refs)When a feature needs to rewrite URLs, paths, or other content in the output, always operate on the rendered HTML rather than on the raw markdown before comrak processes it.
Comrak turns markdown into HTML and applies its own transformations (wrapping images in <figure>, generating anchor links, rendering code fences into <code> blocks, etc.). A naive find-and-replace on the raw markdown cannot distinguish between content the user intends to render (an image src, a link href) and content that should be left literal (code blocks, inline code, plain prose). By the time HTML is produced, that distinction is already made - real attributes live in tags, and literal text is inside <code> or plain text nodes.
Existing functions that follow this pattern:
fix_internal_links() in parser.rs - rewrites <a href="..."> attributes to turn .md references into .html slugs. Runs at the end of get_html_with_options().fix_wikilinks() in parser.rs - rewrites <a data-wikilink="true"> attributes to resolve wikilink targets. Called in site.rs after content is collected.fix_at_media_refs() in content.rs - rewrites src="@/..." and href="@/..." to src="media/{slug}/...". Runs after get_html_with_options() returns in from_markdown().When implementing a new feature that needs to transform paths, URLs, or text in content output, follow the same approach:
src="...", href="...", <a ... >).re.rs with a doc comment.get_html_with_options() returns.main() parses args with cli::Cli::parse(), then run_cli() checks flags in priority order. Each handler returns early after completing its task. Commands that do not need input_folder are handled before the folder resolution.
| Module | Responsibility |
|---|---|
cli.rs | Clap argument definitions |
config.rs | Marmite struct, YAML deserialization, CLI overrides |
content.rs | Content struct, frontmatter parsing, slug generation |
site.rs | Core site generation (~2000 lines), template rendering, taxonomy building |
templates.rs | Template initialization, theme loading |
tera_functions.rs | Custom Tera functions (url_for, group, get_posts, etc.) |
tera_filter.rs | Custom Tera filters (default_date_format, remove_draft) |
shortcodes.rs | Shortcode processing with regex pattern matching |
parser.rs | Markdown to HTML conversion with comrak |
feed.rs | RSS feed generation |
embedded.rs | Embedded assets via rust_embed |
server.rs | Built-in HTTP server with WebSocket live reload |
image_resize.rs | Parallel image resizing with rayon |
mask fmtmask checkmask testmask fmt and mask checksrc/tests/ for module logic, integration tests in tests/ for CLI/end-to-end behaviorexample/content/ documenting the feature (see "Documentation Requirements")example/content/2024-11-26-marmite-command-line-interface.md if CLI flags changedexample/ai/llms.txt under the appropriate sectionstream: draft in example/content/ and add the feature.agents/skills/marmite/references/ (see table in "Documentation Requirements")example/theme_template/ (see "Template Changes")mask fmt and mask checkstream: draft in example/content/ and describe what was broken and how it is fixedmask fmt and mask check - must pass cleanmask test - all tests must passmask pedantic - run and discuss pedantic issues with the maintainer before fixingmask serve, check in a browsermask serve_theme to test the theme_template variant# Install mask task runner
cargo install mask
# Install pre-commit hook (runs mask pedantic before every commit)
mask install_hook
# Build and serve the example site with live reload
mask serveThe site runs at http://localhost:8000 with auto-rebuild on file changes.
Pre-commit hook: The hook runs mask pedantic (format check + clippy with pedantic warnings) before every commit. If a check fails, the commit is blocked. To bypass for work-in-progress commits, use git commit --no-verify.
Agent note: Before starting development work, verify the hook is in place. Check if .git/hooks/pre-commit exists and contains mask pedantic. If not, run mask install_hook.
| Command | What it does |
|---|---|
mask serve | Build and serve example site with live reload and trace logging |
mask watch | Watch for changes, rebuild without serving |
mask fmt | Format code with cargo fmt |
mask check | Check formatting + run clippy |
mask test | Run all tests (unit + integration) |
mask test_unit | Run unit tests only |
mask test_integration | Run integration tests only |
mask build | Build release binary |
mask pedantic | Run clippy with pedantic warnings |
mask install_hook | Install pre-commit hook that runs mask pedantic |
mask fix | Auto-apply clippy fixes |
mask serve_theme | Serve with the theme_template theme |
mask serve_site | Serve the actual marmite.blog site locally |
mask coverage_llvm | Generate HTML coverage report (requires cargo-llvm-cov) |
# A specific unit test by name
cargo test --bin marmite test_name_here
# A specific integration test file
cargo test --test basic_functionality
# All tests with output
cargo test -- --nocapture© rochacbruno, AGPL-3.0. 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 .agents/skills/marmite-development of rochacbruno/marmite.
Open the folder on GitHubat commit 303a0bf
Marmite Development 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 |
|---|---|---|---|---|---|---|
| Marmite Development this skillrochacbruno/marmite | 883 | — | ~6.9k | Automated safety check: Pass | AGPL-3.0 | |
| Code Review Excellenceandrew-yangy/gru-ai | 155 | — | ~1.7k | Automated safety check: Notes | MIT | |
| Code Review Skillawesome-skills/code-review-skill | 2.1k | — | ~2.8k | Automated safety check: Notes | MIT | |
| Deepwiki Rssopaco/deepwiki-rs | 3.1k | — | ~748 | Automated safety check: Pass | MIT | |
| Cross-Language Coding Standardszereight/gitlab-mcp | 2k | 1 repos | ~1.4k | Automated safety check: Pass | MIT | |
| Worktrunk CLI Output Rulesmax-sixty/worktrunk | 9.1k | — | ~12k | Automated safety check: Pass | Custom licence |
andrew-yangy/gru-ai
Provides comprehensive code review guidance for React 19, Vue 3, Rust, TypeScript, Java, Python, and C/C++.
awesome-skills/code-review-skill
Provides comprehensive code review guidance for React 19, Vue 3, Angular 17+, Svelte 5, Rust, TypeScript, Java, Java 8, PHP, Ruby, Rails, Python, Django, FastAPI, Go, C/.NET, Kotlin, Swift, Dart…
sopaco/deepwiki-rs
AI-powered Rust documentation generation engine for comprehensive codebase analysis, C4 architecture diagrams, and automated technical documentation.
zereight/gitlab-mcp
Shared reference for naming, function size, complexity and error handling rules that reviewer agents apply across TypeScript, Python, Go, Rust, Java, C# and Swift.
max-sixty/worktrunk
CLI output standards for worktrunk: message functions, ANSI color nesting and the shell integration that changes directory after the wt command exits.
Rain-kl/OpenFlare
Provides comprehensive code review guidance for React 19, Vue 3, Angular 17+, Svelte 5, Rust, TypeScript, Java, PHP, Python, Django, Go, C/.NET, Kotlin, Swift, NestJS, C/C++, and more.
Works with
Categories
Guidelines and workflows for contributing to the marmite codebase - covers code quality, testing, architecture patterns, and contribution checklists. Marmite Development is an agent skill from rochacbruno/marmite.
Marmite Development fits situations like: tasks that involve Static sites and blogs; tasks that involve Code quality; tasks that involve Software architecture.
Run `npx skills add rochacbruno/marmite --skill marmite-development -a claude-code`. Or copy the skill folder (.agents/skills/marmite-development in rochacbruno/marmite) into .claude/skills/marmite-development in your project. Claude Code loads it when a task matches its description.
Run `npx skills add rochacbruno/marmite --skill marmite-development -a codex`. Or copy the skill folder (.agents/skills/marmite-development in rochacbruno/marmite) into .agents/skills/marmite-development 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 rochacbruno/marmite --skill marmite-development -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/marmite-development, .gemini/skills/marmite-development, .github/skills/marmite-development and .opencode/skills/marmite-development in your project.
Going by SKILL.md and its folder, Marmite Development needs the command-line tools its instructions call (cargo and git).
SKILL.md names 1 domain. As links in the text: marmite.blog. 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.
Marmite Development is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.9k tokens (SKILL.md is roughly 27k 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 Marmite Development: Code Review Excellence (andrew-yangy/gru-ai, 155 stars), Code Review Skill (awesome-skills/code-review-skill, 2.1k stars), Deepwiki Rs (sopaco/deepwiki-rs, 3.1k stars) and Cross-Language Coding Standards (zereight/gitlab-mcp, 2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
rochacbruno (a GitHub user) maintains it in rochacbruno/marmite, which has 883 GitHub stars. The repository was last updated on October 3, 2026.
Source: rochacbruno/marmite on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.