A fast, minimal CLI project task manager for efficient task and project management
FlowCLI is a keyboard-first task and project manager built for speed. Create projects and track tasks with priorities, deadlines, and completion states, then slice the list instantly with filtering and sorting. Use concise inline commands when you know exactly what you want, or switch to interactive prompts for a guided flow. When you’re done, export a clean text report for sharing or record‑keeping.
1. Export infrastructure and view-state design
What it does: Core export infrastructure (TaskWithProject, TaskCollector, TaskExporter) with cross-platform filename validation and I/O error handling. Legacy prototype (LegacyExportSupport) demonstrated view-state awareness.
Justification: Export requires cross-project aggregation, consistent formatting, and robust error handling. Early validation prevents partial runs; prototype validated exporting last displayed list.
Highlights:
TaskWithProject associates tasks with project names; TaskCollector with getAllTasksWithProjects() and getTasksFromProject()TaskExporter handles error scenarios with actionable messages; isValidFilename() validates illegal chars; .txt extension enforced in ExportCommandHandlerLegacyExportSupport prototype with chained filter/sort and view-state tracking; core infrastructure used by ExportCommandHandler; view-state enables smart defaultsCode: TaskWithProject, TaskCollector, TaskExporter, ExportCommandHandler, LegacyExportSupport
2. Command validation utilities
What it does: Centralized validation framework (CommandValidator, ValidationConstants) and index parsing/validation (parseIndexOrNull, validateProjectIndex), eliminating duplication.
Justification: Scattered validation logic with inconsistent rules. Centralization ensures DRY, consistency, and easier maintenance.
Highlights:
parseIndexOrNull() and validateProjectIndex() for index parsing with format/range checksValidationConstants centralizes valid values; priorityToInt() normalizes prioritiesCode: CommandValidator, ValidationConstants
3. Error handling and custom exceptions
What it does: Implemented 6 specific exception classes in an exception hierarchy (all extend FlowCLIException). InvalidCommandSyntaxException refactored syntax errors from InvalidArgumentException (structure vs values).
Justification: Specific exceptions improve error boundaries, testability, and precise messages. Textual feedback quality impacts CLI UX.
Highlights:
InvalidCommandSyntaxException for syntax errors; domain-specific exceptions for dates, filenames, indices, and extra argumentsIndexOutOfRangeException distinguishes task vs project indices; integrated across all validation flowsCode: seedu.flowcli.exceptions
--all flag, project-specific exports, filter/sort combinations, and smart defaults (cached view export). Included detailed examples, file format specifications, path handling guidance, and interactive mode options.add-task, update-task, sort-tasks, filter-tasks, and export-tasks commands. Each block provides specific error messages with actionable solutions (e.g., “Invalid filename” → “Avoid illegal characters and ensure the name ends with .txt”, “Export failed: Permission denied” → “Export to a writable location”).CommandValidator methods, ValidationConstants structure, parser integration (parseIndexOrNull, validateProjectIndex), exception hierarchy, 3-layer validation flow, and best practices. Included usage examples, sequence diagram, and exception type reference.ExportCommandHandler, TaskCollector, TaskExporter, TaskWithProject), design principles, export workflow (5-step process), and integration details. Included class and sequence diagrams, code examples showing view state caching, and file format specifications.export-tasks command including interactive mode prompts, parameter collection sequence, confirmation dialogs, and success message formatting. Ensured seamless integration with existing sort/filter commands through view-state caching.CommandValidator, ValidationConstants) that became the standard for all command implementations, reducing code duplication and ensuring consistent validation behavior across the project.CommandValidator, parseIndexOrNull, validateProjectIndex) and exception hierarchy, helping them adopt consistent patterns in their implementations.The following are extracts from the DeveloperGuide.md that I contributed to.
The validation framework provides centralized input validation across all commands, ensuring consistent error handling and user feedback.
Architecture Overview:
The validation framework operates in 3 main layers:
ArgumentParser.validateProjectIndex() validates project index format and range (throws MissingArgumentException, IndexOutOfRangeException, InvalidIndexFormatException) - always executed firstCommandParser.parseIndexOrNull() validates task index format and range (throws MissingIndexException, InvalidIndexFormatException, IndexOutOfRangeException) - only for commands that need task indices (Mark, Update, DeleteTask, Unmark)CommandValidator methods for domain-specific validation (priorities, dates, filters, sort options) which reference ValidationConstants for valid valuesException Types:
InvalidIndexFormatException - Index cannot be parsed as integerInvalidDateException - Date format is invalid (expects yyyy-MM-dd)InvalidFilenameException - Filename format is invalidInvalidCommandSyntaxException - Command syntax is malformed or incompleteExtraArgumentException - Unexpected extra parameters provided to commandsValidation Flow:
The following sequence diagram illustrates the validation process, showing both success and exception paths:

Best Practices:
ArgumentParser.validateProjectIndex() before accessing project datavalidatePriority() followed by priorityToInt() to normalize and convert prioritiesThe export algorithm supports saving project and task data to text files with filtering and sorting capabilities.
Architecture Overview:

Key Components:
Export Workflow:
The following sequence diagram illustrates the export workflow:

TaskExporter:
Utility class that writes tasks to text files with comprehensive error handling:
Method: exportTasksToFile(List<TaskWithProject> tasks, String filename, String header) throws FileWriteException
Uses try-with-resources for automatic cleanup. All I/O exceptions are translated to FileWriteException with user-friendly messages covering: permission denied, directory not found, disk space issues, file locking, path length limits, read-only filesystem, and security policy violations. Error messages follow the pattern "'<filename>': <description>" with actionable suggestions.
Integration with ExportCommandHandler:
The export workflow consists of 5 steps:
TaskCollector based on parameters with 4 strategies (all tasks, specific project, cached view, or default)TaskFilter and TaskSorter if specified in export commandTaskExporter.exportTasksToFile() with headerConsoleUi.showExportSuccess()The following are extracts from the UserGuide.md that I contributed to.
Saves tasks to a plain-text file with flexible export options.
Export behavior:
--all flag: Always exports all tasks from all projects
export-tasks all-tasks.txt --all
export-tasks party-plan.txt 1
export-tasks high-priority.txt filter-tasks --priority high sort-tasks --deadline ascending
sort-tasks or filter-tasks, exports that cached viewlist command), exports all tasks--all flagCommon mistakes and fixes:
.txt and cannot contain invalid characters (< > : " / \ | ? *).Export file format example:
When you export tasks, FlowCLI creates a plain text file like this:
Exported tasks (filter by priority high, sort by deadline ascending)
========================================
Project1: [X] Complete feature implementation (Due: 2025-11-15) [high]
Project1: [ ] Write documentation (Due: 2025-11-20) [high]
Project2: [ ] Review code (Due: 2025-11-18) [high]
Added troubleshooting blocks throughout the User Guide to help users quickly resolve common errors:
Export-related errors:
Validation errors:
YYYY-MM-DD)low, medium, or high)Each error includes specific causes and actionable solutions to help users resolve issues independently.