.cursor/skills/controller-pattern/SKILL.md
Guides controller implementation for complex workflows, reservation creation, quantum matching, group matching. Use when creating controllers for multi-step processes or complex state management.
npx skillsauth add avra-cadavra/avrai controller-patternInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Controllers are used for complex workflows that require:
import 'dart:developer' as developer;
import 'package:avrai/core/services/logger.dart';
class MyController {
final RequiredService _requiredService;
final AppLogger _logger = const AppLogger(
defaultTag: 'MyController',
minimumLevel: LogLevel.debug,
);
MyController({
required RequiredService requiredService,
}) : _requiredService = requiredService;
Future<Result<void>> executeWorkflow() async {
_logger.info('Starting workflow');
try {
// Step 1
final step1Result = await _step1();
if (step1Result.isFailure) return step1Result;
// Step 2
final step2Result = await _step2(step1Result.value);
if (step2Result.isFailure) return step2Result;
// Step 3
final step3Result = await _step3(step2Result.value);
return step3Result;
} catch (e, st) {
_logger.error('Workflow failed', error: e, stackTrace: st);
return Result.failure('Workflow execution failed');
}
}
Future<Result<Step1Data>> _step1() async {
// Implementation
}
Future<Result<Step2Data>> _step2(Step1Data data) async {
// Implementation
}
Future<Result<void>> _step3(Step2Data data) async {
// Implementation
}
}
Register controllers in dependency injection:
// In injection container
sl.registerLazySingleton(() => MyController(
requiredService: sl<RequiredService>(),
));
Controllers are used in services or BLoCs:
class MyBloc extends Bloc<MyEvent, MyState> {
final MyController _controller;
MyBloc({required MyController controller}) : _controller = controller;
Future<void> _onExecuteWorkflow(
ExecuteWorkflow event,
Emitter<MyState> emit,
) async {
emit(MyLoading());
final result = await _controller.executeWorkflow();
if (result.isSuccess) {
emit(MySuccess());
} else {
emit(MyError(result.error));
}
}
}
For multi-step workflows, use base workflow controller:
abstract class WorkflowController<T> {
Future<Result<T>> execute();
Future<Result<StepData>> step1();
Future<Result<StepData>> step2(StepData previous);
Future<Result<T>> step3(StepData previous);
}
class MyWorkflowController extends WorkflowController<OutputType> {
@override
Future<Result<OutputType>> execute() async {
try {
final step1Result = await step1();
if (step1Result.isFailure) return step1Result.toFailure();
final step2Result = await step2(step1Result.value);
if (step2Result.isFailure) return step2Result.toFailure();
return await step3(step2Result.value);
} catch (e, st) {
return Result.failure('Workflow failed: ${e.toString()}');
}
}
}
class ReservationCreationController {
final ReservationService _reservationService;
final PaymentService _paymentService;
final AppLogger _logger = const AppLogger(defaultTag: 'ReservationController');
ReservationCreationController({
required ReservationService reservationService,
required PaymentService paymentService,
}) : _reservationService = reservationService,
_paymentService = paymentService;
Future<Result<Reservation>> createReservation({
required String eventId,
required int ticketCount,
}) async {
try {
// Step 1: Validate availability
final availability = await _reservationService.checkAvailability(eventId);
if (!availability.hasCapacity(ticketCount)) {
return Result.failure('Not enough tickets available');
}
// Step 2: Create reservation
final reservation = await _reservationService.createReservation(
eventId: eventId,
ticketCount: ticketCount,
);
// Step 3: Process payment
final payment = await _paymentService.processPayment(reservation);
if (payment.isFailure) {
await _reservationService.cancelReservation(reservation.id);
return payment.toFailure();
}
return Result.success(reservation);
} catch (e, st) {
_logger.error('Reservation creation failed', error: e, stackTrace: st);
return Result.failure('Failed to create reservation');
}
}
}
See existing controllers in:
lib/core/controllers/reservation_creation_controller.dartlib/core/controllers/group_matching_controller.dartlib/core/controllers/quantum_matching_controller.dartlib/core/controllers/base/workflow_controller.dartdevelopment
--- name: world-model-development description: Guides world model development patterns: state/action encoders, ONNX inference, feature extraction pipeline, latency budgets. Use when implementing world model components, state encoders, action encoders, feature extractors, or ONNX models. Core skill for Phases 3-6. --- # World Model Development Patterns ## Core Principle All world model components follow LeCun's autonomous machine intelligence framework. State observations flow through a percep
tools
Implements base workflow controller patterns for multi-step processes. Use when creating complex workflows that require orchestration of multiple steps with error handling and rollback.
testing
--- name: widget-test-patterns description: Guides widget test patterns: BLoC testing, user interactions, state changes, material app setup. Use when writing widget tests, testing UI components, or validating widget behavior. --- # Widget Test Patterns ## Core Pattern Widget tests verify UI behavior: user interactions, state changes, and visual display. ## Basic Widget Test Setup ```dart testWidgets('widget displays correctly', (WidgetTester tester) async { // Arrange: Create widget awa
testing
--- name: test-template-generation description: Generates test templates: unit, widget, integration, service tests following project patterns. Use when creating new tests or ensuring tests follow project standards. --- # Test Template Generation ## Available Templates Test templates are located in `test/templates/`: - `unit_test_template.dart` - `widget_test_template.dart` - `integration_test_template.dart` - `service_test_template.dart` ## Unit Test Template ```dart /// SPOTS Component Uni