Mason Brick Development

VerifiedSafe

Provides guidance for creating, updating, and removing Mason bricks (templates) for project scaffolding. Includes steps to define brick structure, configuration, template files with Mustache syntax, and corresponding tests. Automates CI workflow integration for parallel brick testing.

Sby Skills Guide Bot
DevelopmentIntermediate
6/2/2026
Claude Code
#mason#bricks#templates#testing#ci

Recommended for

Automated summary

This skill guides the creation, modification, and removal of Mason bricks with test coverage and CI workflow integration.

Strengths

  • Clear structure with separation of bricks, tests, and CI.
  • Dynamic generation using Mustache variables and helpers.
  • Complete process including unit tests for bricks.
  • Automated addition to parallelized CI jobs.

Limitations

  • Requires prior knowledge of Mason and its ecosystem.
  • CI configuration is specific to GitHub Actions.
  • Tests depend on exact generated file structure.
When to use it

Use this skill when you need to create or maintain Mason bricks in a structured Dart/Flutter project.

When not to use it

Avoid this skill if you are not working with Mason or the project lacks a standardized brick structure.

Security analysis

Safe
Quality score90/100

The skill provides a guide for developing Mason bricks, including file system commands like mkdir and rm. The commands are specific to project directories and not destructive in a malicious sense. No external network calls, no exfiltration, no obfuscated payloads.

No concerns found

How this analysis is made

Examples

Create a new Mason brick
Create a new Mason brick named 'my_widget' that generates a Flutter widget with a customizable name and optional styling.
Update an existing brick
Update the 'my_widget' brick to add a new variable 'color' of type string and regenerate the template files accordingly.
Add tests for a brick
Add a test for the 'my_widget' brick that checks the generated structure and variables.

name: template-mason-brick description: Guide for creating, updating, or removing Mason bricks with corresponding tests and CI workflow (project)

Mason Brick Development Skill

This skill guides the creation, modification, and removal of Mason bricks, ensuring test coverage and CI workflow integration.

When to Use

Trigger this skill when:

  • Creating a new Mason brick template
  • Updating an existing brick's structure or variables
  • Removing a brick from the project
  • User asks to "create a brick", "add a mason template", "update brick", or "remove brick"

Project Structure

Bricks are organized in three locations:

bricks/                    # Mason template definitions
├── brick_name/
│   ├── brick.yaml         # Brick configuration and variables
│   ├── __brick__/         # Template files with Mustache syntax
│   └── hooks/             # Optional pre/post generation hooks

test_bricks/               # Brick tests (one folder per brick)
├── brick_name/
│   └── brick_name_test.dart

.github/workflows/
└── brick-test.yml         # Parallel CI jobs for each brick

Creating a New Brick

Step 1: Create Brick Directory

mkdir -p bricks/new_brick/__brick__

Step 2: Create brick.yaml

name: new_brick
description: Description of what this brick generates
version: 0.1.0+1

environment:
  mason: ^0.1.1

vars:
  name:
    type: string
    description: The name for the generated component
    prompt: What is the name?

  # Add more variables as needed
  optional_var:
    type: boolean
    description: Optional feature flag
    default: true

Step 3: Create Template Files

In __brick__/, create files using Mustache syntax:

__brick__/
├── {{name.snakeCase()}}/
│   ├── lib/
│   │   └── {{name.snakeCase()}}.dart
│   ├── pubspec.yaml
│   └── README.md

Use these Mustache helpers:

  • {{name}} - raw value
  • {{name.snakeCase()}} - snake_case
  • {{name.pascalCase()}} - PascalCase
  • {{name.camelCase()}} - camelCase
  • {{name.paramCase()}} - param-case
  • {{#flag}}...{{/flag}} - conditional block
  • {{^flag}}...{{/flag}} - inverted conditional

Step 4: Create Brick Test

Create test_bricks/new_brick/new_brick_test.dart:

import 'dart:io';
import 'package:mason/mason.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';

void main() {
  group('New Brick Tests', () {
    late Directory tempDir;

    setUp(() async {
      tempDir = await Directory.systemTemp.createTemp('new_brick_test_');
    });

    tearDown(() async {
      if (await tempDir.exists()) {
        await tempDir.delete(recursive: true);
      }
    });

    test('generates correct structure', () async {
      final brick = Brick.path(path.join('..', '..', 'bricks', 'new_brick'));

      final generator = await MasonGenerator.fromBrick(brick);
      await generator.generate(
        DirectoryGeneratorTarget(tempDir),
        vars: {'name': 'test_name'},
      );

      // Verify generated files exist
      final file = File(path.join(tempDir.path, 'test_name', 'pubspec.yaml'));
      expect(await file.exists(), isTrue);
    });

    // Add more tests for different variable combinations
  });
}

Step 5: Add Workflow Job

Add a new job to .github/workflows/brick-test.yml:

  new-brick:
    name: Test new_brick
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - uses: flutter-actions/setup-flutter@v4

      - name: Cache dependencies
        uses: actions/cache@v5
        with:
          path: |
            ~/.pub-cache
            .dart_tool
          key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: ${{ runner.os }}-pub-

      - name: Install tools
        run: dart pub global activate melos

      - name: Prepare project
        run: |
          melos run prepare
          mason get

      - name: Test new_brick brick
        run: dart run test_bricks/new_brick/new_brick_test.dart

Step 6: Register Brick

Add to root mason.yaml:

bricks:
  new_brick:
    path: bricks/new_brick

Then run mason get to register.

Updating an Existing Brick

When modifying a brick:

  1. Update brick.yaml if adding/removing variables
  2. Update template files in __brick__/
  3. Update tests in test_bricks/brick_name/ to cover changes
  4. Run test locally: dart run test_bricks/brick_name/brick_name_test.dart
  5. Increment version in brick.yaml

Removing a Brick

When removing a brick, update all three locations:

  1. Remove brick directory: rm -rf bricks/brick_name
  2. Remove test directory: rm -rf test_bricks/brick_name
  3. Remove workflow job from .github/workflows/brick-test.yml
  4. Remove from mason.yaml
  5. Update CLAUDE.md if the brick was documented

Testing Locally

# Register bricks
mason get

# Test a specific brick
dart run test_bricks/brick_name/brick_name_test.dart

# Test brick generation manually
mason make brick_name -o /tmp/test_output --var1=value1

Existing Bricks Reference

| Brick | Purpose | Key Variables | |-------|---------|---------------| | screen | Flutter screen with routing | name, folder, has_adaptive_scaffold | | widget | Reusable widget | name, type, folder | | simple_bloc | Basic BLoC package | name | | list_bloc | List management BLoC | name | | form_bloc | Form validation BLoC | name, field_names | | repository | Data repository | name | | api_client | API client package | package_name | | native_federation_plugin | Federated native plugin | name, package_prefix, support_* |

Checklist

When creating/updating a brick:

  • [ ] brick.yaml has name, description, version, and vars
  • [ ] Template files use correct Mustache syntax
  • [ ] Test file exists in test_bricks/brick_name/
  • [ ] Tests cover main generation paths
  • [ ] Workflow job added/updated in brick-test.yml
  • [ ] Brick registered in mason.yaml
  • [ ] Run mason get to verify registration
  • [ ] Run test locally before committing

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/mason-brick-development-mm5t8adt/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/mason-brick-development-mm5t8adt' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/mason-brick-development-mm5t8adt/download' --output '.skill-downloads/mason-brick-development-mm5t8adt/SKILL.md.part' && mv '.skill-downloads/mason-brick-development-mm5t8adt/SKILL.md.part' '.skill-downloads/mason-brick-development-mm5t8adt/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/mason-brick-development-mm5t8adt/SKILL.md' && test -s '.skill-downloads/mason-brick-development-mm5t8adt/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/template-mason-brick' && cp -R '.skill-downloads/mason-brick-development-mm5t8adt' '.claude/skills/template-mason-brick'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/mason-brick-development-mm5t8adt'

openskills read 'mason-brick-development-mm5t8adt'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/mason-brick-development-mm5t8adt/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills