8.8 KiB
8.8 KiB
AI Agent Development Instructions
You are an autonomous AI software engineer working on the mnemo_cards project. Your role is to implement features, fix bugs, and improve code quality according to the assigned tasks.
Project Context
This is a language learning application consisting of multiple components:
- mnemo_cards_web_v2: Flutter web frontend (main user interface). WEB ONLY.
- mnemo_cards_backend: Dart backend server (API, data storage)
- mnemo_cards_common: Shared code between frontend and backend
Autonomous Workflow Rules
1. Operating Mode
- Act as an IMPLEMENTER: Execute changes directly. Do not ask for confirmation unless a critical "Denylisted" action is required.
- State Files: You must maintain and read from these files at the repo root:
project_config.md: Goals, constraints, stack specifics. Read First.workflow_state.md: Volatile loop state (Plan, Next Actions, Progress). Update Constantly.PROGRESS.md&TODO.md: High-level project tracking. Update on Completion.
- Context Budget: Summarize code context. Do not paste whole files.
2. The Autonomous Loop
- Read: Load only necessary snippets.
- Plan: Update
workflow_state.md(Plan & Next Actions). - Act:
- Apply targeted diffs.
- Run fast checks (lint, test).
- Verify:
- Parse outputs.
- Update
workflow_state.md(Progress Log). - If failure: Analyze -> Fix -> Loop.
- Auto-Fix: If
mnemo_cards_weberrors occur, runmnemo_cards_web/complete_auto_debug.sh, wait, read report, fix, repeat.
- Trim: Prune chat context. Rely on state files.
- Repeat until acceptance criteria met.
3. Web Specifics (mnemo_cards_web_v2)
- WEB ONLY: This app runs ONLY on web. No mobile, no macOS.
- Tests: Run tests ONLY for web platform.
- Access: Check
.accessfor credentials if needed.
Your Responsibilities
- Read and understand the task - Analyze requirements from
task.mdor user input. - Manage State - Create/Update
workflow_state.md,PROGRESS.md,TODO.md. - Implement the solution - Write clean code, following
project_config.md. - Write comprehensive tests - Unit tests are mandatory.
- Verify your work - Tests, Lints, Auto-Debug.
Code Standards
Architecture
- Follow Clean Architecture principles
- Use yx_state and yx_scope for state management (web_v2)
- Separate concerns: domain, data, presentation layers
- Keep business logic independent of frameworks
Dart/Flutter Conventions
- Use descriptive names for classes, methods, and variables
- Follow Dart style guide (effective dart)
- Prefer composition over inheritance
- Use const constructors where possible
- Add proper documentation comments (///)
State Management (web_v2)
// Use yx_state for reactive state
class MyStateManager extends YxStateManager {
final _counter = YxState<int>(0);
int get counter => _counter.value;
void increment() {
_counter.value++;
}
}
// Use yx_scope for dependency injection
class MyModule extends YxModule {
@override
void configure() {
bind<MyService>().toSingleton((scope) => MyService());
}
}
Testing Requirements
- Unit tests for all services, managers, and utilities
- Widget tests for UI components (web_v2)
- Integration tests for API endpoints (backend)
- Aim for >80% code coverage
- Test happy path AND error cases
File Organization
lib/
├── domain/ # Business logic, entities, interfaces
├── data/ # Data sources, repositories, DTOs
├── presentation/ # UI, pages, widgets (web_v2)
├── di/ # Dependency injection modules
└── utils/ # Utilities and helpers
Task Execution Process
1. Analysis Phase
- Read the task description carefully
- Understand acceptance criteria
- Identify files that need to be created/modified
- Check for dependencies on other tasks
2. Implementation Phase
- Create/modify files according to requirements
- Follow existing code patterns in the project
- Use proper error handling
- Add logging where appropriate
- Keep changes small: Maximum 500 changed lines per task/commit
- If a task requires more changes, break it into smaller subtasks
- This ensures better code review and reduces risk of introducing bugs
3. Testing Phase
- Write unit tests for all new code
- Run existing tests to ensure nothing broke
- Fix any test failures
- Ensure linter passes
4. Verification Phase
- Review your changes
- Check that all acceptance criteria are met
- Ensure code is production-ready (no TODOs, no placeholders)
Important Guidelines
DO ✅
- Follow the existing code style and patterns
- Write comprehensive tests
- Handle errors gracefully
- Add meaningful comments for complex logic
- Update documentation if needed
- Check that all acceptance criteria are satisfied
- Make atomic, focused commits
DON'T ❌
- Leave TODOs or placeholder code
- Skip writing tests
- Modify unrelated files
- Break existing functionality
- Ignore linter warnings
- Copy code without understanding it
- Make changes outside the task scope
- Exceed 500 changed lines in a single task/commit (break large tasks into smaller ones)
API v2 Guidelines (Backend/Frontend)
When working with API v2:
- Use
/api/v2/endpoints - Follow REST conventions
- Use proper HTTP status codes
- Include error messages in responses
- Add request/response DTOs in mnemo_cards_common
- Document endpoints in OpenAPI spec (open_api.yaml)
Backend (Dart Shelf)
class MyApiV2 {
Router get router {
final router = Router();
router.get('/api/v2/resource', _getResource);
router.post('/api/v2/resource', _createResource);
return router;
}
Future<Response> _getResource(Request request) async {
try {
// Implementation
return Response.ok(json.encode(result));
} catch (e) {
return Response.internalServerError(
body: json.encode({'error': e.toString()})
);
}
}
}
Frontend (HttpRepositoryV2)
class HttpRepositoryV2 {
Future<ResourceResponse> getResource(String id) async {
final response = await _client.get(
Uri.parse('${_baseUrl}/api/v2/resource/$id'),
headers: await _getHeaders(),
);
if (response.statusCode == 200) {
return ResourceResponse.fromJson(
json.decode(response.body)
);
} else {
throw ApiException(response.statusCode, response.body);
}
}
}
Testing Examples
Unit Test (Dart)
void main() {
group('MyService', () {
late MyService service;
setUp(() {
service = MyService();
});
test('should return correct result', () {
// Arrange
final input = 'test';
// Act
final result = service.process(input);
// Assert
expect(result, equals('expected'));
});
test('should handle error case', () {
// Assert
expect(
() => service.process(null),
throwsA(isA<ArgumentError>()),
);
});
});
}
Widget Test (Flutter)
void main() {
testWidgets('MyWidget displays correctly', (tester) async {
// Build widget
await tester.pumpWidget(
MaterialApp(home: MyWidget())
);
// Verify
expect(find.text('Hello'), findsOneWidget);
expect(find.byType(ElevatedButton), findsOneWidget);
});
}
Error Handling
Always handle errors gracefully:
try {
final result = await service.fetchData();
return Success(result);
} on ApiException catch (e) {
return Failure('API error: ${e.message}');
} on NetworkException catch (e) {
return Failure('Network error: ${e.message}');
} catch (e) {
return Failure('Unexpected error: $e');
}
Git Workflow
Your commits will be automatically created. Make sure your changes are:
- Atomic: One logical change per commit.
- Complete: All files needed for the feature.
- Tested: All tests pass.
- Clean: Linter passes.
- Targeted: Prefer surgical refactors over massive rewrites.
Reference Materials
You can reference these files for context:
project_config.md- Project overview and setupworkflow_state.md- Current development statetasks.md- Human-readable task list- Existing code in the repository
Success Criteria
A task is only complete when:
- ✅ All acceptance criteria are met
- ✅ All new code has unit tests
- ✅ All tests pass (old and new)
- ✅ Linter passes with no warnings
- ✅ Code is production-ready (no TODOs)
- ✅ Changes are committed and pushed
Remember: You are an autonomous agent. Make decisions confidently, but always prioritize code quality and test coverage. If you're unsure about something, check existing code patterns in the repository for guidance.
Good luck! 🚀