# Signals Lint

> Standardized compiler diagnostics, static analysis lints, and automated IDE quick-fixes.

- Skill: `randalschwartz/signals-lint` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add randalschwartz/signals-lint`
- Raw SKILL.md: https://api.skillmd.com/api/skills/randalschwartz/signals-lint/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: randalschwartz (https://skillmd.com/u/randalschwartz)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/randalschwartz/signals-lint

---


# signals_lint Tooling & Rules

This skill covers working with static code analysis, custom compiler warning diagnostics, and automated quick-fixes in the **signals.dart** ecosystem.

---

## 🚀 Activation & Setup

Ensure the plugin is active in your project to enable real-time IDE diagnostics and fixes:

```yaml
# pubspec.yaml
dev_dependencies:
  custom_lint: ^0.8.1
  signals_lint: ^7.0.0
```

```yaml
# analysis_options.yaml
analyzer:
  plugins:
    - custom_lint
```

---

## 🛡️ Lint Rules Reference

### 1. `signals_avoid_create_in_build_method`
Flags instances where a signal or computed variable is created inside a Flutter `build` method.
- **Problem**: Creating state during build causes state to reset on every rebuild.
- **Solution**: Move the creation to the class fields or initialize inside a state lifecycle hook.

---

### 2. `signals_avoid_deprecated_watch_extension`
Flags uses of deprecated `BuildContext.watch()` and `BuildContext.unwatch()` extensions.
- **Problem**: Watch extensions can cause broad stateful widget lifecycle overhead.
- **Solution**: Use localized `SignalBuilder` or inherit from `SignalWidget`/`SignalStatefulWidget`.

---

### 3. `signals_avoid_deprecated_signals_mixin`
Flags usage of deprecated `with SignalsMixin` mixins on StatefulWidget states.
- **Problem**: Inherits stateful widget tracking hooks unnecessarily.
- **Solution**: Inherit from `SignalStatefulWidget` instead.

---

### 4. `signals_prefer_named_builder`
Enforces named `builder:` callbacks in `SignalBuilder` and `Watch` elements instead of positional arguments.
- **Reason**: Guarantees standard API parameters and readability.

---

### 5. `signals_prefer_unified_options`
Flags direct creator configuration arguments (e.g. `autoDispose: true`).
- **Solution**: Bundle configuration properties under unified options classes (e.g., `options: SignalOptions(autoDispose: true)`).

---

## 💡 Automated IDE Code Assists (Quick-fixes)

Place your cursor on the relevant class name or widget instantiation inside your IDE to reveal these automatic assists via the quick-fix menu (`Cmd+.` or `Alt+Enter`):

1. **`WrapWithSignalBuilder`**: Wraps any widget expression inside `SignalBuilder(builder: (context) => ...)`.
2. **`ConvertStatelessToSignalWidget`**: Refactors a standard `StatelessWidget` into a `SignalWidget` instantly.
3. **`ConvertStatefulToSignalStatefulWidget`**: Refactors a standard `StatefulWidget` to a `SignalStatefulWidget`.
4. **`MigrateSignalsMixinToSignalStatefulWidget`**: Strips the legacy `SignalsMixin` and converts the class structure to `SignalStatefulWidget`.
5. **`MigrateWatchToSignalBuilder`**: Converts legacy `Watch(...)` instances into clean `SignalBuilder` widgets.

