From a865878fab299b08d852a076d55180cfc4987a53 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 06:42:11 +0000 Subject: [PATCH 01/19] chore: exclude workflow directory from git tracking Add workflow/ to .gitignore to prevent tracking of workflow-related files and clean up cursor rules directory structure. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9ff8602..142ff7c 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ logs/ .cache/ *.lock *.bin +workflow/ \ No newline at end of file -- 2.30.2 From eff7e339af50321a0acf1d9e67aa72622d9c0ad6 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 06:43:22 +0000 Subject: [PATCH 02/19] refactor: restructure cursor rules with new meta-rule architecture - Remove legacy rule files (documentation.mdc, general_development.mdc, etc.) - Implement new meta-rule system with core, app, and feature categories - Add meta-rule files for different workflows (bug diagnosis, feature planning, etc.) - Create organized directory structure: core/, app/, features/, database/, etc. - Add comprehensive README.md for rules documentation - Establish new rule architecture with always-on and workflow-specific rules This restructuring improves rule organization, enables better workflow management, and provides clearer separation of concerns for different development tasks. --- .cursor/rules/README.md | 306 ++++++++++++++ .cursor/rules/always_on_rules.mdc | 192 +++++++++ .../app/architectural_decision_record.mdc | 193 +++++++++ .cursor/rules/app/architectural_examples.mdc | 246 +++++++++++ .../app/architectural_implementation.mdc | 139 +++++++ .cursor/rules/app/architectural_patterns.mdc | 214 ++++++++++ .cursor/rules/app/timesafari.mdc | 173 ++++++++ .cursor/rules/app/timesafari_development.mdc | 174 ++++++++ .cursor/rules/app/timesafari_platforms.mdc | 167 ++++++++ .cursor/rules/architecture/README.md | 75 ++++ .../architecture/build_architecture_guard.mdc | 186 +++++++++ .cursor/rules/architecture/build_testing.mdc | 248 ++++++++++++ .../rules/architecture/build_validation.mdc | 224 ++++++++++ .cursor/rules/core/base_context.mdc | 217 ++++++++++ .cursor/rules/core/harbor_pilot_universal.mdc | 202 +++++++++ .cursor/rules/core/less_complex.mdc | 99 +++++ .cursor/rules/database/absurd-sql.mdc | 273 +++++++++++++ .cursor/rules/database/legacy_dexie.mdc | 62 +++ .../rules/development/asset_configuration.mdc | 105 +++++ .../development/complexity_assessment.mdc | 177 ++++++++ .../development/dependency_management.mdc | 177 ++++++++ .../rules/development/development_guide.mdc | 33 ++ .../historical_comment_management.mdc | 119 ++++++ .../historical_comment_patterns.mdc | 139 +++++++ .../investigation_report_example.mdc | 178 ++++++++ .../rules/development/logging_migration.mdc | 358 ++++++++++++++++ .../rules/development/logging_standards.mdc | 176 ++++++++ .../rules/development/planning_examples.mdc | 160 ++++++++ .../development/realistic_time_estimation.mdc | 128 ++++++ .../rules/development/research_diagnostic.mdc | 262 ++++++++++++ .../development/software_development.mdc | 227 +++++++++++ .cursor/rules/development/time.mdc | 146 +++++++ .cursor/rules/development/time_examples.mdc | 243 +++++++++++ .../rules/development/time_implementation.mdc | 285 +++++++++++++ .../rules/development/type_safety_guide.mdc | 212 ++++++++++ .cursor/rules/docs/documentation.mdc | 37 ++ .cursor/rules/docs/markdown_core.mdc | 210 ++++++++++ .cursor/rules/docs/markdown_templates.mdc | 314 ++++++++++++++ .cursor/rules/docs/markdown_workflow.mdc | 168 ++++++++ .cursor/rules/documentation.mdc | 19 - .../rules/features/camera-implementation.mdc | 163 ++++++++ .cursor/rules/features/camera_platforms.mdc | 225 ++++++++++ .cursor/rules/features/camera_technical.mdc | 203 ++++++++++ .cursor/rules/general_development.mdc | 3 - .cursor/rules/logging.mdc | 6 - .cursor/rules/meta_bug_diagnosis.mdc | 288 +++++++++++++ .cursor/rules/meta_bug_fixing.mdc | 214 ++++++++++ .cursor/rules/meta_change_evaluation.mdc | 383 ++++++++++++++++++ .cursor/rules/meta_core_always_on.mdc | 311 ++++++++++++++ .cursor/rules/meta_documentation.mdc | 275 +++++++++++++ .cursor/rules/meta_feature_implementation.mdc | 226 +++++++++++ .cursor/rules/meta_feature_planning.mdc | 203 ++++++++++ .cursor/rules/meta_research.mdc | 285 +++++++++++++ .cursor/rules/meta_rule_architecture.md | 103 +++++ .cursor/rules/progress_reports.mdc | 6 - .cursor/rules/project.mdc | 242 ----------- .cursor/rules/templates/adr_template.mdc | 98 +++++ .cursor/rules/testing.mdc | 12 - .cursor/rules/time.mdc | 5 - .cursor/rules/version_control.mdc | 7 - .cursor/rules/versioning.mdc | 7 - 61 files changed, 10221 insertions(+), 307 deletions(-) create mode 100644 .cursor/rules/README.md create mode 100644 .cursor/rules/always_on_rules.mdc create mode 100644 .cursor/rules/app/architectural_decision_record.mdc create mode 100644 .cursor/rules/app/architectural_examples.mdc create mode 100644 .cursor/rules/app/architectural_implementation.mdc create mode 100644 .cursor/rules/app/architectural_patterns.mdc create mode 100644 .cursor/rules/app/timesafari.mdc create mode 100644 .cursor/rules/app/timesafari_development.mdc create mode 100644 .cursor/rules/app/timesafari_platforms.mdc create mode 100644 .cursor/rules/architecture/README.md create mode 100644 .cursor/rules/architecture/build_architecture_guard.mdc create mode 100644 .cursor/rules/architecture/build_testing.mdc create mode 100644 .cursor/rules/architecture/build_validation.mdc create mode 100644 .cursor/rules/core/base_context.mdc create mode 100644 .cursor/rules/core/harbor_pilot_universal.mdc create mode 100644 .cursor/rules/core/less_complex.mdc create mode 100644 .cursor/rules/database/absurd-sql.mdc create mode 100644 .cursor/rules/database/legacy_dexie.mdc create mode 100644 .cursor/rules/development/asset_configuration.mdc create mode 100644 .cursor/rules/development/complexity_assessment.mdc create mode 100644 .cursor/rules/development/dependency_management.mdc create mode 100644 .cursor/rules/development/development_guide.mdc create mode 100644 .cursor/rules/development/historical_comment_management.mdc create mode 100644 .cursor/rules/development/historical_comment_patterns.mdc create mode 100644 .cursor/rules/development/investigation_report_example.mdc create mode 100644 .cursor/rules/development/logging_migration.mdc create mode 100644 .cursor/rules/development/logging_standards.mdc create mode 100644 .cursor/rules/development/planning_examples.mdc create mode 100644 .cursor/rules/development/realistic_time_estimation.mdc create mode 100644 .cursor/rules/development/research_diagnostic.mdc create mode 100644 .cursor/rules/development/software_development.mdc create mode 100644 .cursor/rules/development/time.mdc create mode 100644 .cursor/rules/development/time_examples.mdc create mode 100644 .cursor/rules/development/time_implementation.mdc create mode 100644 .cursor/rules/development/type_safety_guide.mdc create mode 100644 .cursor/rules/docs/documentation.mdc create mode 100644 .cursor/rules/docs/markdown_core.mdc create mode 100644 .cursor/rules/docs/markdown_templates.mdc create mode 100644 .cursor/rules/docs/markdown_workflow.mdc delete mode 100644 .cursor/rules/documentation.mdc create mode 100644 .cursor/rules/features/camera-implementation.mdc create mode 100644 .cursor/rules/features/camera_platforms.mdc create mode 100644 .cursor/rules/features/camera_technical.mdc delete mode 100644 .cursor/rules/general_development.mdc delete mode 100644 .cursor/rules/logging.mdc create mode 100644 .cursor/rules/meta_bug_diagnosis.mdc create mode 100644 .cursor/rules/meta_bug_fixing.mdc create mode 100644 .cursor/rules/meta_change_evaluation.mdc create mode 100644 .cursor/rules/meta_core_always_on.mdc create mode 100644 .cursor/rules/meta_documentation.mdc create mode 100644 .cursor/rules/meta_feature_implementation.mdc create mode 100644 .cursor/rules/meta_feature_planning.mdc create mode 100644 .cursor/rules/meta_research.mdc create mode 100644 .cursor/rules/meta_rule_architecture.md delete mode 100644 .cursor/rules/progress_reports.mdc delete mode 100644 .cursor/rules/project.mdc create mode 100644 .cursor/rules/templates/adr_template.mdc delete mode 100644 .cursor/rules/testing.mdc delete mode 100644 .cursor/rules/time.mdc delete mode 100644 .cursor/rules/version_control.mdc delete mode 100644 .cursor/rules/versioning.mdc diff --git a/.cursor/rules/README.md b/.cursor/rules/README.md new file mode 100644 index 0000000..ae4db58 --- /dev/null +++ b/.cursor/rules/README.md @@ -0,0 +1,306 @@ +# .cursor Rules Organization + +This directory contains all the rules and guidelines for AI assistants working +with the TimeSafari project. + +## Directory Structure + +### **`core/`** - Core Principles and Context + +Core rules that apply to all AI interactions and provide fundamental context. + +- **`base_context.mdc`** - Human competence first principles and interaction guidelines +- **`harbor_pilot_universal.mdc`** - Technical guide creation and investigation rules +- **`less_complex.mdc`** - Minimalist solution principle and complexity guidelines + +### **`development/`** - Development Practices and Standards + +Rules for software development, coding standards, and development workflows. + +- **`software_development.mdc`** - Core development principles and evidence requirements +- **`type_safety_guide.mdc`** - TypeScript type safety guidelines and best practices +- **`development_guide.mdc`** - Development environment setup and standards +- **`logging_standards.mdc`** - Logging implementation standards and rules +- **`logging_migration.mdc`** - Migration from console.* to structured logging +- **`time.mdc`** - Time handling principles and UTC standards +- **`time_examples.mdc`** - Practical time implementation examples +- **`time_implementation.mdc`** - Detailed time implementation guidelines +- **`realistic_time_estimation.mdc`** - Time estimation framework and principles +- **`planning_examples.mdc`** - Planning examples and best practices +- **`complexity_assessment.mdc`** - Complexity evaluation and assessment +- **`dependency_management.mdc`** - Dependency management and version control +- **`asset_configuration.mdc`** - Asset configuration and build integration +- **`research_diagnostic.mdc`** - Research and investigation workflows +- **`investigation_report_example.mdc`** - Investigation report templates and examples +- **`historical_comment_management.mdc`** - Historical comment transformation rules +- **`historical_comment_patterns.mdc`** - Comment transformation patterns and examples + +### **`architecture/`** - Architecture and Design Patterns + +Rules for architectural decisions, patterns, and system design. + +- **`build_architecture_guard.mdc`** - Build system protection and change levels +- **`build_validation.mdc`** - Build validation procedures and testing +- **`build_testing.mdc`** - Build testing requirements and feedback collection + +### **`app/`** - Application-Specific Rules + +Rules specific to the TimeSafari application and its architecture. + +- **`timesafari.mdc`** - Core application context and principles +- **`timesafari_platforms.mdc`** - Platform-specific implementation guidelines +- **`timesafari_development.mdc`** - TimeSafari development workflow +- **`architectural_decision_record.mdc`** - ADR creation and management +- **`architectural_implementation.mdc`** - Architecture implementation guidelines +- **`architectural_patterns.mdc`** - Architectural patterns and examples +- **`architectural_examples.mdc`** - Architecture examples and testing + +### **`database/`** - Database and Data Management + +Rules for database operations, migrations, and data handling. + +- **`absurd-sql.mdc`** - Absurd SQL implementation and worker thread setup +- **`legacy_dexie.mdc`** - Legacy Dexie migration guidelines + +### **`workflow/`** - Process and Workflow Management + +Rules for development workflows, version control, and process management. + +- **`version_control.mdc`** - Version control principles and commit guidelines +- **`version_sync.mdc`** - Version synchronization and changelog management +- **`commit_messages.mdc`** - Commit message format and conventions + +### **`features/** - Feature-Specific Implementations + +Rules for implementing specific features across platforms. + +- **`camera-implementation.mdc`** - Camera feature implementation overview +- **`camera_technical.mdc`** - Technical camera implementation details +- **`camera_platforms.mdc`** - Platform-specific camera implementation + +### **`docs/`** - Documentation Standards + +Rules for creating and maintaining documentation. + +- **`markdown_core.mdc`** - Core markdown formatting standards +- **`markdown_templates.mdc`** - Document templates and examples +- **`markdown_workflow.mdc`** - Markdown validation and workflow +- **`documentation.mdc`** - Documentation generation principles +- **`meta_rule_usage_guide.md`** - How to use meta-rules in practice + +### **`templates/`** - Templates and Examples + +Template files and examples for various documentation types. + +- **`adr_template.mdc`** - Architectural Decision Record template + +### **Meta-Rules** - Workflow Bundling + +High-level meta-rules that bundle related sub-rules for specific workflows. + +- **`meta_core_always_on.mdc`** - Core rules that apply to every single prompt +- **`meta_documentation.mdc`** - Documentation writing and education workflow +- **`meta_feature_planning.mdc`** - Feature planning workflow bundling +- **`meta_bug_diagnosis.mdc`** - Bug investigation workflow bundling +- **`meta_bug_fixing.mdc`** - Bug fix implementation workflow bundling +- **`meta_feature_implementation.mdc`** - Feature implementation workflow bundling +- **`meta_research.mdc`** - Investigation and research workflow bundling + +### **Workflow State Management** + +The project uses a sophisticated workflow state management system to ensure systematic development processes and maintain code quality across all phases of development. + +#### **Workflow State System** + +The workflow state is managed through `.cursor/rules/.workflow_state.json` and enforces different modes with specific constraints. The system automatically tracks workflow progression and maintains a complete history of mode transitions. + +**Available Modes**: +- **`diagnosis`** - Investigation and analysis phase (read-only) +- **`fixing`** - Implementation and bug fixing phase (full access) +- **`planning`** - Design and architecture phase (design only) +- **`research`** - Investigation and research phase (investigation only) +- **`documentation`** - Documentation writing phase (writing only) + +**Mode Constraints**: +```json +{ + "diagnosis": { + "mode": "read_only", + "forbidden": ["modify", "create", "build", "commit"], + "allowed": ["read", "search", "analyze", "document"] + }, + "fixing": { + "mode": "implementation", + "forbidden": [], + "allowed": ["modify", "create", "build", "commit", "test"] + } +} +``` + +**Workflow History Tracking**: + +The system automatically maintains a `workflowHistory` array that records all mode transitions and meta-rule invocations: + +```json +{ + "workflowHistory": [ + { + "mode": "research", + "invoked": "meta_core_always_on.mdc", + "timestamp": "2025-08-25T02:14:37Z" + }, + { + "mode": "diagnosis", + "invoked": "meta_bug_diagnosis.mdc", + "timestamp": "2025-08-25T02:14:37Z" + } + ] +} +``` + +**History Entry Format**: +- **`mode`**: The workflow mode that was activated +- **`invoked`**: The specific meta-rule that triggered the mode change +- **`timestamp`**: UTC timestamp when the mode transition occurred + +**History Purpose**: +- **Workflow Continuity**: Track progression through development phases +- **Meta-Rule Usage**: Monitor which rules are invoked and when +- **Temporal Context**: Maintain chronological order of workflow changes +- **State Persistence**: Preserve workflow history across development sessions +- **Debugging Support**: Help diagnose workflow state issues +- **Process Analysis**: Understand development patterns and meta-rule effectiveness + +#### **Commit Override System** + +The workflow includes a flexible commit override mechanism that allows commits on demand while maintaining workflow integrity: + +```json +{ + "overrides": { + "commit": { + "allowed": true, + "requires_override": true, + "override_reason": "user_requested" + } + } +} +``` + +**Override Benefits**: +- ✅ **Investigation Commits**: Document findings during diagnosis phases +- ✅ **Work-in-Progress**: Commit partial solutions during complex investigations +- ✅ **Emergency Fixes**: Commit critical fixes without mode transitions +- ✅ **Flexible Workflow**: Maintain systematic approach while accommodating real needs + +**Override Limitations**: +- ❌ **Does NOT bypass**: Version control rules, commit message standards, or security requirements +- ❌ **Does NOT bypass**: Code quality standards, testing requirements, or documentation requirements + +#### **Workflow Enforcement** + +The system automatically enforces workflow constraints through the core always-on rules: + +**Before Every Interaction**: +1. **Read current workflow state** from `.cursor/rules/.workflow_state.json` +2. **Identify current mode** and its constraints +3. **Validate user request** against current mode constraints +4. **Enforce constraints** before generating response +5. **Guide model behavior** based on current mode + +**Mode-Specific Enforcement**: +- **Diagnosis Mode**: Blocks modification, creation, building, and commits +- **Fixing Mode**: Allows full implementation and testing capabilities +- **Planning Mode**: Focuses on design and architecture, blocks implementation +- **Research Mode**: Enables investigation and analysis, blocks modification +- **Documentation Mode**: Allows writing and editing, blocks implementation + +#### **Workflow Transitions** + +To change workflow modes, invoke the appropriate meta-rule: + +```bash +# Switch to bug fixing mode +@meta_bug_fixing.mdc + +# Switch to feature planning mode +@meta_feature_planning.mdc + +# Switch to documentation mode +@meta_documentation.mdc +``` + +**Transition Requirements**: +- **Mode Changes**: Require explicit meta-rule invocation +- **State Updates**: Automatically update workflow state file +- **Constraint Enforcement**: Immediately apply new mode constraints +- **History Tracking**: Automatically maintained in `workflowHistory` array +- **Timestamp Recording**: Each transition recorded with UTC timestamp + +#### **Integration with Development Process** + +The workflow system integrates seamlessly with existing development practices: + +**Version Control**: +- All commits must follow TimeSafari commit message standards +- Security audit checklists are enforced regardless of workflow mode +- Documentation updates are required for substantial changes + +**Quality Assurance**: +- Code quality standards (PEP8, TypeScript, etc.) are always enforced +- Testing requirements apply to all implementation work +- Documentation standards are maintained across all phases + +**Build System**: +- Build Architecture Guard protects critical build files +- Platform-specific build processes respect workflow constraints +- Asset generation follows established patterns + +**Migration Context**: +- Database migration work respects investigation vs. implementation phases +- Component migration progress is tracked through workflow states + +## Usage Guidelines + +1. **Always-On Rules**: Start with `meta_core_always_on.mdc` for every + single prompt +2. **Core Rules**: Always apply rules from `core/` directory +3. **Context-Specific**: Use rules from appropriate subdirectories based on + your task +4. **Meta-Rules**: Use workflow-specific meta-rules for specialized tasks + - **Documentation**: Use `meta_documentation.mdc` for all documentation work + - **Getting Started**: See `docs/meta_rule_usage_guide.md` for comprehensive usage instructions +5. **Cross-References**: All files contain updated cross-references to + reflect the new structure +6. **Validation**: All files pass markdown validation and maintain + consistent formatting + +## Benefits of New Organization + +1. **Logical grouping** - Related rules are now co-located +2. **Easier navigation** - Developers can quickly find relevant rules +3. **Better maintainability** - Clear separation of concerns +4. **Scalable structure** - Easy to add new rules in appropriate categories +5. **Consistent cross-references** - All file links updated and working +6. **Workflow bundling** - Meta-rules provide high-level workflow guidance +7. **Feedback integration** - Built-in feedback mechanisms for continuous improvement +8. **Educational focus** - Documentation emphasizes human competence over technical description + +## File Naming Convention + +- **Lowercase with underscores**: `file_name.mdc` +- **Descriptive names**: Names clearly indicate the rule's purpose +- **Consistent extensions**: All files use `.mdc` extension + +## Maintenance + +- **Cross-references**: Update when moving files between directories +- **Markdown validation**: Run `npm run markdown:check` after any changes +- **Organization**: Keep related rules in appropriate subdirectories +- **Documentation**: Update this README when adding new rules or directories + +--- + +**Status**: Active organization structure +**Last Updated**: 2025-08-21 +**Maintainer**: Development team diff --git a/.cursor/rules/always_on_rules.mdc b/.cursor/rules/always_on_rules.mdc new file mode 100644 index 0000000..33128c1 --- /dev/null +++ b/.cursor/rules/always_on_rules.mdc @@ -0,0 +1,192 @@ +# Meta-Rule: Core Always-On Rules + +**Author**: Matthew Raymer +**Date**: 2025-08-21 +**Status**: 🎯 **ACTIVE** - Core rules for every prompt + +## Purpose + +This meta-rule bundles the core rules that should be applied to **every single +prompt** because they define fundamental behaviors, principles, and context +that are essential for all AI interactions. + +## When to Use + +**ALWAYS** - These rules apply to every single prompt, regardless of the task +or context. They form the foundation for all AI assistant behavior. + +## Bundled Rules + +### **Core Human Competence Principles** + +- **`core/base_context.mdc`** - Human competence first principles, interaction + guidelines, and output contract requirements +- **`core/less_complex.mdc`** - Minimalist solution principle and complexity + guidelines + +### **Time & Context Standards** + +- **`development/time.mdc`** - Time handling principles and UTC standards +- **`development/time_examples.mdc`** - Practical time implementation examples +- **`development/time_implementation.mdc`** - Detailed time implementation + guidelines + +### **Version Control & Process** + +- **`workflow/version_control.mdc`** - Version control principles and commit + guidelines +- **`workflow/commit_messages.mdc`** - Commit message format and conventions + +### **Application Context** + +- **`app/timesafari.mdc`** - Core TimeSafari application context and + development principles +- **`app/timesafari_development.mdc`** - TimeSafari-specific development + workflow and quality standards + +## Why These Rules Are Always-On + +### **Base Context** + +- **Human Competence First**: Every interaction must increase human competence +- **Output Contract**: All responses must follow the required structure +- **Competence Hooks**: Learning and collaboration must be built into every response + +### **Time Standards** + +- **UTC Consistency**: All timestamps must use UTC for system operations +- **Evidence Collection**: Time context is essential for debugging and investigation +- **Cross-Platform**: Time handling affects all platforms and features + +### **Version Control** + +- **Commit Standards**: Every code change must follow commit message conventions +- **Process Consistency**: Version control affects all development work +- **Team Collaboration**: Commit standards enable effective team communication + +### **Application Context** + +- **Platform Awareness**: Every task must consider web/mobile/desktop platforms +- **Architecture Principles**: All work must follow TimeSafari patterns +- **Development Standards**: Quality and testing requirements apply to all work + +## Application Priority + +### **Primary (Apply First)** + +1. **Base Context** - Human competence and output contract +2. **Time Standards** - UTC and timestamp requirements +3. **Application Context** - TimeSafari principles and platforms + +### **Secondary (Apply as Needed)** + +1. **Version Control** - When making code changes +2. **Complexity Guidelines** - When evaluating solution approaches + +## Integration with Other Meta-Rules + +### **Feature Planning** + +- Base context ensures human competence focus +- Time standards inform planning and estimation +- Application context drives platform considerations + +### **Bug Diagnosis** + +- Base context ensures systematic investigation +- Time standards enable proper evidence collection +- Application context provides system understanding + +### **Bug Fixing** + +- Base context ensures quality implementation +- Time standards maintain logging consistency +- Application context guides testing strategy + +### **Feature Implementation** + +- Base context ensures proper development approach +- Time standards maintain system consistency +- Application context drives architecture decisions + +## Success Criteria + +- [ ] **Base context applied** to every single prompt +- [ ] **Time standards followed** for all timestamps and logging +- [ ] **Version control standards** applied to all code changes +- [ ] **Application context considered** for all platform work +- [ ] **Human competence focus** maintained in all interactions +- [ ] **Output contract structure** followed in all responses + +## Common Pitfalls + +- **Don't skip base context** - loses human competence focus +- **Don't ignore time standards** - creates inconsistent timestamps +- **Don't forget application context** - misses platform considerations +- **Don't skip version control** - creates inconsistent commit history +- **Don't lose competence focus** - reduces learning value + +## Feedback & Improvement + +### **Rule Effectiveness Ratings (1-5 scale)** + +- **Base Context**: ___/5 - Comments: _______________ +- **Time Standards**: ___/5 - Comments: _______________ +- **Version Control**: ___/5 - Comments: _______________ +- **Application Context**: ___/5 - Comments: _______________ + +### **Always-On Effectiveness** + +- **Consistency**: Are these rules applied consistently across all prompts? +- **Value**: Do these rules add value to every interaction? +- **Overhead**: Are these rules too burdensome for simple tasks? + +### **Integration Feedback** + +- **With Other Meta-Rules**: How well do these integrate with workflow rules? +- **Context Switching**: Do these rules help or hinder context switching? +- **Learning Curve**: Are these rules easy for new users to understand? + +### **Overall Experience** + +- **Quality Improvement**: Do these rules improve response quality? +- **Efficiency**: Do these rules make interactions more efficient? +- **Recommendation**: Would you recommend keeping these always-on? + +## Model Implementation Checklist + +### Before Every Prompt + +- [ ] **Base Context**: Ensure human competence principles are active +- [ ] **Time Standards**: Verify UTC and timestamp requirements are clear +- [ ] **Application Context**: Confirm TimeSafari context is loaded +- [ ] **Version Control**: Prepare commit standards if code changes are needed + +### During Response Creation + +- [ ] **Output Contract**: Follow required response structure +- [ ] **Competence Hooks**: Include learning and collaboration elements +- [ ] **Time Consistency**: Apply UTC standards for all time references +- [ ] **Platform Awareness**: Consider all target platforms + +### After Response Creation + +- [ ] **Validation**: Verify all always-on rules were applied +- [ ] **Quality Check**: Ensure response meets competence standards +- [ ] **Context Review**: Confirm application context was properly considered +- [ ] **Feedback Collection**: Note any issues with always-on application + +--- + +**See also**: + +- `.cursor/rules/meta_feature_planning.mdc` for workflow-specific rules +- `.cursor/rules/meta_bug_diagnosis.mdc` for investigation workflows +- `.cursor/rules/meta_bug_fixing.mdc` for fix implementation +- `.cursor/rules/meta_feature_implementation.mdc` for feature development + +**Status**: Active core always-on meta-rule +**Priority**: Critical (applies to every prompt) +**Estimated Effort**: Ongoing reference +**Dependencies**: All bundled sub-rules +**Stakeholders**: All AI interactions, Development team diff --git a/.cursor/rules/app/architectural_decision_record.mdc b/.cursor/rules/app/architectural_decision_record.mdc new file mode 100644 index 0000000..c562272 --- /dev/null +++ b/.cursor/rules/app/architectural_decision_record.mdc @@ -0,0 +1,193 @@ +# TimeSafari Cross-Platform Architecture Guide + +**Author**: Matthew Raymer +**Date**: 2025-08-19 +**Status**: 🎯 **ACTIVE** - Architecture guidelines + +## 1. Platform Support Matrix + +| Feature | Web (PWA) | Capacitor (Mobile) | Electron (Desktop) | +|---------|-----------|--------------------|-------------------| +| QR Code Scanning | WebInlineQRScanner | @capacitor-mlkit/barcode-scanning | + Not Implemented | +| Deep Linking | URL Parameters | App URL Open Events | Not Implemented | +| File System | Limited (Browser API) | Capacitor Filesystem | Electron fs | +| Camera Access | MediaDevices API | Capacitor Camera | Not Implemented | +| Platform Detection | Web APIs | Capacitor.isNativePlatform() | process.env + checks | + +## 2. Project Structure + +### Core Directories + +``` + +src/ +├── components/ # Vue components +├── services/ # Platform services and business logic +├── views/ # Page components +├── router/ # Vue router configuration +├── types/ # TypeScript type definitions +├── utils/ # Utility functions +├── lib/ # Core libraries +├── platforms/ # Platform-specific implementations +├── electron/ # Electron-specific code +├── constants/ # Application constants +├── db/ # Database related code +├── interfaces/ # TypeScript interfaces +└── assets/ # Static assets + +``` + +### Entry Points + +- `main.ts` → Base entry + +- `main.common.ts` → Shared init + +- `main.capacitor.ts` → Mobile entry + +- `main.electron.ts` → Electron entry + +- `main.web.ts` → Web entry + +## 3. Service Architecture + +### Service Organization + +```tree + +services/ +├── QRScanner/ +│ ├── WebInlineQRScanner.ts +│ └── interfaces.ts +├── platforms/ +│ ├── WebPlatformService.ts +│ ├── CapacitorPlatformService.ts +│ └── ElectronPlatformService.ts +└── factory/ + └── PlatformServiceFactory.ts + +``` + +### Factory Pattern + +Use a **singleton factory** to select platform services via +`process.env.VITE_PLATFORM`. + +## 4. Feature Guidelines + +### QR Code Scanning + +- Define `QRScannerService` interface. + +- Implement platform-specific classes (`WebInlineQRScanner`, Capacitor, + + etc). + +- Provide `addListener` and `onStream` hooks for composability. + +### Deep Linking + +- URL format: `timesafari://[/][?query=value]` + +- Web: `router.beforeEach` → parse query + +- Capacitor: `App.addListener("appUrlOpen", …)` + +## 5. Build Process + +- `vite.config.common.mts` → shared config + +- Platform configs: `vite.config.web.mts`, `.capacitor.mts`, + + `.electron.mts` + +- Use `process.env.VITE_PLATFORM` for conditional loading. + +```bash + +npm run build:web +npm run build:capacitor +npm run build:electron + +``` + +## 6. Testing Strategy + +- **Unit Tests**: Jest for business logic and utilities + +- **E2E Tests**: Playwright for critical user journeys + +- **Platform Tests**: Test platform-specific implementations + +- **Integration Tests**: Test service interactions + +## 7. Key Principles + +### Platform Independence + +- **Abstract platform differences** behind interfaces + +- **Use factory pattern** for service selection + +- **Maintain consistent APIs** across platforms + +- **Graceful degradation** when features unavailable + +### Code Organization + +- **Single responsibility** for each service + +- **Interface segregation** for platform services + +- **Dependency injection** via mixins + +- **Composition over inheritance** + +--- + +**See also**: + +- `.cursor/rules/app/architectural_implementation.mdc` for + + detailed implementation details + +- `.cursor/rules/app/architectural_patterns.mdc` for architectural patterns and + + examples + +**Status**: Active architecture guidelines +**Priority**: Critical +**Estimated Effort**: Ongoing reference +**Dependencies**: timesafari.mdc +**Stakeholders**: Development team, Architecture team + +- [ ] Have relevant ADRs been updated/linked? + +- [ ] Did I add competence hooks or prompts for the team? + +- [ ] Was human interaction (sync/review/demo) scheduled? + +## Model Implementation Checklist + +### Before Architectural Decisions + +- [ ] **Decision Context**: Understand the architectural challenge to be addressed +- [ ] **Stakeholder Identification**: Identify all decision makers and affected parties +- [ ] **Research**: Research alternatives and gather evidence +- [ ] **Impact Assessment**: Assess impact on existing architecture + +### During Architectural Decisions + +- [ ] **Context Documentation**: Document the context and forces at play +- [ ] **Decision Recording**: Record the decision and rationale clearly +- [ ] **Consequences Analysis**: Analyze positive, negative, and neutral consequences +- [ ] **Alternatives Documentation**: Document alternatives considered and why rejected + +### After Architectural Decisions + +- [ ] **ADR Creation**: Create or update Architectural Decision Record +- [ ] **Team Communication**: Communicate decision to all stakeholders +- [ ] **Implementation Planning**: Plan implementation of the architectural decision +- [ ] **Documentation Update**: Update relevant architectural documentation diff --git a/.cursor/rules/app/architectural_examples.mdc b/.cursor/rules/app/architectural_examples.mdc new file mode 100644 index 0000000..babc8e1 --- /dev/null +++ b/.cursor/rules/app/architectural_examples.mdc @@ -0,0 +1,246 @@ +# Time Safari Architecture — Examples and Testing + +> **Agent role**: Reference this file for architectural examples and + testing patterns when working with TimeSafari architecture. + +## Error Handling Patterns + +### Global Error Handler + +```typescript + +// main.ts +app.config.errorHandler = (err, instance, info) => { + const componentName = instance?.$options?.name || 'Unknown'; + logger.error(`[${componentName}] Vue error`, err, info); +}; + +window.addEventListener('unhandledrejection', (event) => { + logger.error('[Global] Unhandled promise rejection', event.reason); +}); + +``` + +### Platform-Specific Error Wrapping + +```typescript + +// services/platforms/CapacitorPlatformService.ts +export class CapacitorPlatformService { + async getFileContents(path: string): Promise { + try { + const result = await Filesystem.readFile({ + path: path, + encoding: 'utf8' + }); + return result.data; + } catch (error) { + logger.error('[Capacitor API Error] Failed to read file', error, path); + throw new Error(`Failed to read file: ${path}`); + } + } +} + +``` + +## Testing Patterns + +### Platform-Specific Test Skipping + +```typescript + +// tests/QRScanner.test.ts +describe('QRScanner Service', () => { + test('should start scanning on web', async () => { + test.skip(process.env.VITE_PLATFORM !== 'web', 'Web-only test'); + + const scanner = new WebInlineQRScanner(); + await scanner.startScanning(); + // Assert scanning started + }); + + test('should start scanning on mobile', async () => { + test.skip(process.env.VITE_PLATFORM !== 'capacitor', 'Mobile-only test'); + + const scanner = new CapacitorQRScanner(); + await scanner.startScanning(); + // Assert scanning started + }); +}); + +``` + +### Mock Service Testing + +```typescript + +// tests/mocks/QRScannerMock.ts +export class QRScannerMock implements QRScannerService { + private isScanning = false; + private listeners: Map = new Map(); + + async startScanning(): Promise { + this.isScanning = true; + this.emit('scanningStarted'); + } + + async stopScanning(): Promise { + this.isScanning = false; + this.emit('scanningStopped'); + } + + addListener(event: string, callback: Function): void { + if (!this.listeners.has(event)) { + this.listeners.set(event, []); + } + this.listeners.get(event)!.push(callback); + } + + removeListener(event: string, callback: Function): void { + const callbacks = this.listeners.get(event); + if (callbacks) { + const index = callbacks.indexOf(callback); + if (index > -1) { + callbacks.splice(index, 1); + } + } + } + + private emit(event: string, ...args: any[]): void { + const callbacks = this.listeners.get(event); + if (callbacks) { + callbacks.forEach(callback => callback(...args)); + } + } + + getScanningState(): boolean { + return this.isScanning; + } +} + +``` + +## Integration Examples + +### Service Composition + +```typescript + +// services/QRScannerService.ts +export class QRScannerService { + constructor( + private platformService: PlatformService, + private notificationService: NotificationService + ) {} + + async startScanning(): Promise { + try { + await this.platformService.startCamera(); + this.notificationService.show('Camera started'); + } catch (error) { + this.notificationService.showError('Failed to start camera'); + throw error; + } + } +} + +``` + +### Component Integration + +```typescript + +// components/QRScannerDialog.vue +export default class QRScannerDialog extends Vue { + @Inject() private qrScannerService!: QRScannerService; + + async mounted() { + try { + await this.qrScannerService.startScanning(); + } catch (error) { + this.$notify.error('Failed to start scanner'); + } + } + + beforeDestroy() { + this.qrScannerService.stopScanning(); + } +} + +``` + +## Best Practices + +### Service Design + +- Keep services focused and single-purpose + +- Use dependency injection for service composition + +- Implement proper error handling and logging + +- Provide clear interfaces and contracts + +### Testing Strategy + +- Test platform-specific behavior separately + +- Use mocks for external dependencies + +- Test error conditions and edge cases + +- Validate service contracts and interfaces + +### Error Handling + +- Log errors with appropriate context + +- Provide user-friendly error messages + +- Implement graceful degradation + +- Handle platform-specific error scenarios + +--- + +**See also**: + +- `.cursor/rules/app/architectural_decision_record.mdc` for + + core architecture principles + +- `.cursor/rules/app/architectural_implementation.mdc` for + + implementation details + +- `.cursor/rules/app/architectural_patterns.mdc` for core patterns + +**Status**: Active examples and testing guide +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: architectural_patterns.mdc +**Stakeholders**: Development team, Testing team + +## Model Implementation Checklist + +### Before Architectural Examples + +- [ ] **Pattern Selection**: Choose appropriate architectural pattern for the use + case +- [ ] **Service Design**: Plan service structure and dependencies +- [ ] **Testing Strategy**: Plan testing approach for the example +- [ ] **Error Handling**: Plan error handling and logging strategy + +### During Architectural Examples + +- [ ] **Service Implementation**: Implement focused, single-purpose services +- [ ] **Dependency Injection**: Use proper dependency injection patterns +- [ ] **Error Handling**: Implement proper error handling and logging +- [ ] **Interface Design**: Provide clear interfaces and contracts + +### After Architectural Examples + +- [ ] **Testing Execution**: Test platform-specific behavior separately +- [ ] **Service Validation**: Validate service contracts and interfaces +- [ ] **Error Testing**: Test error conditions and edge cases +- [ ] **Documentation**: Update architectural examples documentation diff --git a/.cursor/rules/app/architectural_implementation.mdc b/.cursor/rules/app/architectural_implementation.mdc new file mode 100644 index 0000000..bd85386 --- /dev/null +++ b/.cursor/rules/app/architectural_implementation.mdc @@ -0,0 +1,139 @@ +# Time Safari Architecture — Implementation Details + +> **Agent role**: Reference this file for detailed implementation details when + working with TimeSafari architecture implementation. + +## Error Handling + +- Global Vue error handler → logs with component name. + +- Platform-specific wrappers log API errors with platform prefix + + (`[Capacitor API Error]`, etc). + +- Use structured logging (not `console.log`). + +## Best Practices + +- Keep platform code **isolated** in `platforms/`. + +- Always define a **shared interface** first. + +- Use feature detection, not platform detection, when possible. + +- Dependency injection for services → improves testability. + +- Maintain **Competence Hooks** in PRs (2–3 prompts for dev + + discussion). + +## Dependency Management + +- Key deps: `@capacitor/core`, `electron`, `vue`. + +- Use conditional `import()` for platform-specific libs. + +## Security Considerations + +- **Permissions**: Always check + request gracefully. + +- **Storage**: Secure storage for sensitive data; encrypt when possible. + +- **Audits**: Schedule quarterly security reviews. + +## ADR Process + +- All major architecture choices → log in `doc/adr/`. + +- Use ADR template with Context, Decision, Consequences, Status. + +- Link related ADRs in PR descriptions. + +> 🔗 **Human Hook:** When proposing a new ADR, schedule a 30-min +> design sync for discussion, not just async review. + +## Collaboration Hooks + +- **QR features**: Sync with Security before merging → permissions & + + privacy. + +- **New platform builds**: Demo in team meeting → confirm UX + + differences. + +- **Critical ADRs**: Present in guild or architecture review. + +## Testing Implementation + +- **Unit tests** for services. + +- **Playwright** for Web + Capacitor: + + - `playwright.config-local.ts` includes web + Pixel 5. + +- **Electron tests**: add `spectron` or Playwright-Electron. + +- Mark tests with platform tags: + + ```ts + + test.skip(!process.env.MOBILE_TEST, "Mobile-only test"); + + ``` + +> 🔗 **Human Hook:** Before merging new tests, hold a short sync (≤15 +> min) with QA to align on coverage and flaky test risks. + +## Self-Check + +- [ ] Does this feature implement a shared interface? + +- [ ] Are fallbacks + errors handled gracefully? + +- [ ] Have relevant ADRs been updated/linked? + +- [ ] Did I add competence hooks or prompts for the team? + +- [ ] Was human interaction (sync/review/demo) scheduled? + +--- + +**See also**: + +- `.cursor/rules/app/architectural_decision_record.mdc` for + + core architecture principles + +- `.cursor/rules/app/architectural_patterns.mdc` for architectural patterns and + + examples + +**Status**: Active implementation guidelines +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: architectural_decision_record.mdc +**Stakeholders**: Development team, Architecture team + +## Model Implementation Checklist + +### Before Architectural Implementation + +- [ ] **Interface Review**: Verify feature implements shared interface +- [ ] **ADR Review**: Check if ADR is required for major changes +- [ ] **Security Assessment**: Assess security implications for QR features +- [ ] **Platform Planning**: Plan platform-specific implementation details + +### During Architectural Implementation + +- [ ] **Interface Implementation**: Implement shared interfaces consistently +- [ ] **Error Handling**: Implement graceful fallbacks and error handling +- [ ] **Testing Strategy**: Plan unit tests for services and E2E tests +- [ ] **Human Interaction**: Schedule syncs/reviews/demos as needed + +### After Architectural Implementation + +- [ ] **Interface Validation**: Verify shared interfaces are properly implemented +- [ ] **Testing Execution**: Run unit tests and platform-specific tests +- [ ] **ADR Updates**: Update relevant ADRs and link in PR descriptions +- [ ] **Team Communication**: Share implementation results with team diff --git a/.cursor/rules/app/architectural_patterns.mdc b/.cursor/rules/app/architectural_patterns.mdc new file mode 100644 index 0000000..026a835 --- /dev/null +++ b/.cursor/rules/app/architectural_patterns.mdc @@ -0,0 +1,214 @@ +# Time Safari Architecture — Patterns and Examples + +> **Agent role**: Reference this file for architectural patterns and +> examples when working with TimeSafari architecture design. + +## Architectural Patterns + +### Factory Pattern Implementation + +```typescript +// PlatformServiceFactory.ts +export class PlatformServiceFactory { + private static instance: PlatformServiceFactory; + + static getInstance(): PlatformServiceFactory { + if (!PlatformServiceFactory.instance) { + PlatformServiceFactory.instance = new PlatformServiceFactory(); + } + return PlatformServiceFactory.instance; + } + + getQRScannerService(): QRScannerService { + const platform = process.env.VITE_PLATFORM; + + switch (platform) { + case 'web': + return new WebInlineQRScanner(); + case 'capacitor': + return new CapacitorQRScanner(); + case 'electron': + return new ElectronQRScanner(); + default: + throw new Error(`Unsupported platform: ${platform}`); + } + } +} +``` + +### Service Interface Definition + +```typescript +// interfaces/QRScannerService.ts +export interface QRScannerService { + startScanning(): Promise; + stopScanning(): Promise; + addListener(event: string, callback: Function): void; + removeListener(event: string, callback: Function): void; +} +``` + +### Platform-Specific Implementation + +```typescript +// services/QRScanner/WebInlineQRScanner.ts +export class WebInlineQRScanner implements QRScannerService { + private listeners: Map = new Map(); + + async startScanning(): Promise { + // Web-specific implementation + const stream = await navigator.mediaDevices.getUserMedia({ video: true }); + // Process video stream for QR codes + } + + async stopScanning(): Promise { + // Stop video stream + } + + addListener(event: string, callback: Function): void { + if (!this.listeners.has(event)) { + this.listeners.set(event, []); + } + this.listeners.get(event)!.push(callback); + } + + removeListener(event: string, callback: Function): void { + const callbacks = this.listeners.get(event); + if (callbacks) { + const index = callbacks.indexOf(callback); + if (index > -1) { + callbacks.splice(index, 1); + } + } + } +} +``` + +## Deep Linking Implementation + +### URL Format + +``` +timesafari://[/][?query=value] +``` + +### Web Implementation + +```typescript +// router/index.ts +router.beforeEach((to, from, next) => { + // Parse deep link parameters + if (to.query.deepLink) { + const deepLink = to.query.deepLink as string; + // Process deep link + handleDeepLink(deepLink); + } + next(); +}); + +function handleDeepLink(deepLink: string) { + // Parse and route deep link + const url = new URL(deepLink); + const route = url.pathname; + const params = url.searchParams; + + // Navigate to appropriate route + router.push({ name: route, query: Object.fromEntries(params) }); +} +``` + +### Capacitor Implementation + +```typescript +// main.capacitor.ts +import { App } from '@capacitor/app'; + +App.addListener('appUrlOpen', (data) => { + const url = data.url; + // Parse deep link and navigate + handleDeepLink(url); +}); +``` + +## Platform Detection + +### Feature Detection vs Platform Detection + +```typescript +// ✅ Good: Feature detection +function hasCameraAccess(): boolean { + return 'mediaDevices' in navigator && + 'getUserMedia' in navigator.mediaDevices; +} + +// ❌ Bad: Platform detection +function isWeb(): boolean { + return process.env.VITE_PLATFORM === 'web'; +} +``` + +### Conditional Imports + +```typescript +// services/platforms/index.ts +export async function getPlatformService() { + const platform = process.env.VITE_PLATFORM; + + switch (platform) { + case 'capacitor': + const { CapacitorPlatformService } = + await import('./CapacitorPlatformService'); + return new CapacitorPlatformService(); + case 'electron': + const { ElectronPlatformService } = + await import('./ElectronPlatformService'); + return new ElectronPlatformService(); + default: + const { WebPlatformService } = + await import('./WebPlatformService'); + return new WebPlatformService(); + } +} +``` + +--- + +**See also**: + +- `.cursor/rules/app/architectural_decision_record.mdc` for core + architecture principles +- `.cursor/rules/app/architectural_implementation.mdc` for + implementation details +- `.cursor/rules/app/architectural_examples.mdc` for examples and + testing patterns + +**Status**: Active patterns and examples +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: architectural_decision_record.mdc, + architectural_implementation.mdc +**Stakeholders**: Development team, Architecture team + +## Model Implementation Checklist + +### Before Architectural Patterns + +- [ ] **Pattern Selection**: Choose appropriate architectural pattern for the use + case +- [ ] **Platform Analysis**: Identify platform-specific requirements +- [ ] **Service Planning**: Plan service structure and dependencies +- [ ] **Testing Strategy**: Plan testing approach for the pattern + +### During Architectural Patterns + +- [ ] **Pattern Implementation**: Implement chosen architectural pattern +- [ ] **Platform Abstraction**: Use platform abstraction layers appropriately +- [ ] **Service Composition**: Compose services using dependency injection +- [ ] **Interface Design**: Provide clear interfaces and contracts + +### After Architectural Patterns + +- [ ] **Pattern Validation**: Verify pattern is implemented correctly +- [ ] **Platform Testing**: Test across all target platforms +- [ ] **Service Testing**: Test service composition and dependencies +- [ ] **Documentation**: Update architectural patterns documentation diff --git a/.cursor/rules/app/timesafari.mdc b/.cursor/rules/app/timesafari.mdc new file mode 100644 index 0000000..ad8a224 --- /dev/null +++ b/.cursor/rules/app/timesafari.mdc @@ -0,0 +1,173 @@ +--- +alwaysApply: false +--- +# Time Safari Context + +**Author**: Matthew Raymer +**Date**: 2025-08-19 +**Status**: 🎯 **ACTIVE** - Core application context + +## Project Overview + +Time Safari is an application designed to foster community building through +gifts, gratitude, and collaborative projects. The app makes it easy and +intuitive for users of any age and capability to recognize contributions, +build trust networks, and organize collective action. It is built on services +that preserve privacy and data sovereignty. + +## Core Goals + +1. **Connect**: Make it easy, rewarding, and non-threatening for people to + + connect with others who have similar interests, and to initiate activities + together. + +2. **Reveal**: Widely advertise the great support and rewards that are being + + given and accepted freely, especially non-monetary ones, showing the impact + gifts make in people's lives. + +## Technical Foundation + +### Architecture + +- **Privacy-preserving claims architecture** via endorser.ch + +- **Decentralized Identifiers (DIDs)**: User identities based on + + public/private key pairs stored on devices + +- **Cryptographic Verification**: All claims and confirmations are + + cryptographically signed + +- **User-Controlled Visibility**: Users explicitly control who can see their + + identifiers and data + +- **Cross-Platform**: Web (PWA), Mobile (Capacitor), Desktop (Electron) + +### Current Database State + +- **Database**: SQLite via Absurd SQL (browser) and native SQLite + + (mobile/desktop) + +- **Legacy Support**: IndexedDB (Dexie) for backward compatibility + +- **Status**: Modern database architecture fully implemented + +### Core Technologies + +- **Frontend**: Vue 3 + TypeScript + vue-facing-decorator + +- **Styling**: TailwindCSS + +- **Build**: Vite with platform-specific configs + +- **Testing**: Playwright E2E, Jest unit tests + +- **Database**: SQLite (Absurd SQL in browser), IndexedDB (legacy) + +- **State**: Pinia stores + +- **Platform Services**: Abstracted behind interfaces with factory pattern + +## Development Principles + +### Code Organization + +- **Platform Services**: Abstract platform-specific code behind interfaces + +- **Service Factory**: Use `PlatformServiceFactory` for platform selection + +- **Type Safety**: Strict TypeScript, no `any` types, use type guards + +- **Modern Architecture**: Use current platform service patterns + +### Architecture Patterns + +- **Dependency Injection**: Services injected via mixins and factory pattern + +- **Interface Segregation**: Small, focused interfaces over large ones + +- **Composition over Inheritance**: Prefer mixins and composition + +- **Single Responsibility**: Each component/service has one clear purpose + +### Testing Strategy + +- **E2E**: Playwright for critical user journeys + +- **Unit**: Jest with F.I.R.S.T. principles + +- **Platform Coverage**: Web + Capacitor (Pixel 5) in CI + +- **Quality Assurance**: Comprehensive testing and validation + +## Current Development Focus + +### Active Development + +- **Feature Development**: Build new functionality using modern platform + + services + +- **Performance Optimization**: Improve app performance and user experience + +- **Platform Enhancement**: Leverage platform-specific capabilities + +- **Code Quality**: Maintain high standards and best practices + +### Development Metrics + +- **Code Quality**: High standards maintained across all platforms + +- **Performance**: Optimized for all target devices + +- **Testing**: Comprehensive coverage maintained + +- **User Experience**: Focus on intuitive, accessible interfaces + +--- + +**See also**: + +- `.cursor/rules/app/timesafari_platforms.mdc` for platform-specific details + +- `.cursor/rules/app/timesafari_development.mdc` for + + development workflow details + +**Status**: Active application context +**Priority**: Critical +**Estimated Effort**: Ongoing reference +**Dependencies**: None +**Stakeholders**: Development team, Product team + +- **Dependencies**: Vue 3, TypeScript, SQLite, Capacitor, Electron + +- **Stakeholders**: Development team, Product team + +## Model Implementation Checklist + +### Before TimeSafari Development + +- [ ] **Application Context**: Understand TimeSafari's community-building purpose +- [ ] **Platform Analysis**: Identify target platforms (web, mobile, desktop) +- [ ] **Architecture Review**: Review current platform service patterns +- [ ] **Testing Strategy**: Plan testing approach for all platforms + +### During TimeSafari Development + +- [ ] **Platform Services**: Use abstracted platform services via interfaces +- [ ] **Type Safety**: Implement strict TypeScript with type guards +- **Modern Architecture**: Follow current platform service patterns +- [ ] **Performance Focus**: Ensure performance on all target devices + +### After TimeSafari Development + +- [ ] **Cross-Platform Testing**: Test functionality across all platforms +- [ ] **Performance Validation**: Verify performance meets requirements +- [ ] **Code Quality**: Ensure high standards maintained +- [ ] **Documentation Update**: Update relevant documentation diff --git a/.cursor/rules/app/timesafari_development.mdc b/.cursor/rules/app/timesafari_development.mdc new file mode 100644 index 0000000..e72c68d --- /dev/null +++ b/.cursor/rules/app/timesafari_development.mdc @@ -0,0 +1,174 @@ +# Time Safari Development — Workflow and Processes + +> **Agent role**: Reference this file for development workflow details when + working with TimeSafari development processes. + +## Development Workflow + +### Build Commands + +```bash + +# Web (development) + +npm run build:web + +# Mobile + +npm run build:capacitor +npm run build:native + +# Desktop + +npm run build:electron +npm run build:electron:appimage +npm run build:electron:deb +npm run build:electron:dmg + +``` + +### Testing Commands + +```bash + +# Web E2E + +npm run test:web + +# Mobile + +npm run test:mobile +npm run test:android +npm run test:ios + +# Type checking + +npm run type-check +npm run lint-fix + +``` + +## Development Principles + +### Code Organization + +- **Platform Services**: Abstract platform-specific code behind interfaces + +- **Service Factory**: Use `PlatformServiceFactory` for platform selection + +- **Type Safety**: Strict TypeScript, no `any` types, use type guards + +- **Modern Architecture**: Use current platform service patterns + +### Architecture Patterns + +- **Dependency Injection**: Services injected via mixins and factory pattern + +- **Interface Segregation**: Small, focused interfaces over large ones + +- **Composition over Inheritance**: Prefer mixins and composition + +- **Single Responsibility**: Each component/service has one clear purpose + +### Testing Strategy + +- **E2E**: Playwright for critical user journeys + +- **Unit**: Jest with F.I.R.S.T. principles + +- **Platform Coverage**: Web + Capacitor (Pixel 5) in CI + +- **Quality Assurance**: Comprehensive testing and validation + +## Current Development Focus + +### Active Development + +- **Feature Development**: Build new functionality using modern platform + + services + +- **Performance Optimization**: Improve app performance and user experience + +- **Platform Enhancement**: Leverage platform-specific capabilities + +- **Code Quality**: Maintain high standards and best practices + +### Development Metrics + +- **Code Quality**: High standards maintained across all platforms + +- **Performance**: Optimized for all target devices + +- **Testing**: Comprehensive coverage maintained + +- **User Experience**: Focus on intuitive, accessible interfaces + +## Development Environment + +### Required Tools + +- **Node.js**: LTS version with npm + +- **Git**: Version control with proper branching strategy + +- **IDE**: VS Code with recommended extensions + +- **Platform Tools**: Android Studio, Xcode (for mobile development) + +### Environment Setup + +1. **Clone Repository**: `git clone ` + +2. **Install Dependencies**: `npm install` + +3. **Environment Variables**: Copy `.env.example` to `.env.local` + +4. **Platform Setup**: Follow platform-specific setup guides + +### Quality Assurance + +- **Linting**: ESLint with TypeScript rules + +- **Formatting**: Prettier for consistent code style + +- **Type Checking**: TypeScript strict mode enabled + +- **Testing**: Comprehensive test coverage requirements + +--- + +**See also**: + +- `.cursor/rules/app/timesafari.mdc` for core application context + +- `.cursor/rules/app/timesafari_platforms.mdc` for platform-specific details + +**Status**: Active development workflow +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: timesafari.mdc, timesafari_platforms.mdc +**Stakeholders**: Development team, DevOps team + +## Model Implementation Checklist + +### Before TimeSafari Development + +- [ ] **Environment Setup**: Verify development environment is ready +- [ ] **Platform Tools**: Ensure platform-specific tools are available +- [ ] **Dependencies**: Check all required dependencies are installed +- [ ] **Environment Variables**: Configure local environment variables + +### During TimeSafari Development + +- [ ] **Platform Services**: Use modern platform service patterns +- [ ] **Code Quality**: Follow ESLint and TypeScript strict rules +- [ ] **Testing**: Implement comprehensive testing strategy +- [ ] **Performance**: Optimize for all target platforms + +### After TimeSafari Development + +- [ ] **Quality Checks**: Run linting, formatting, and type checking +- [ ] **Testing**: Execute comprehensive tests across platforms +- [ ] **Performance Validation**: Verify performance meets requirements +- [ ] **Documentation**: Update development documentation diff --git a/.cursor/rules/app/timesafari_platforms.mdc b/.cursor/rules/app/timesafari_platforms.mdc new file mode 100644 index 0000000..158e61f --- /dev/null +++ b/.cursor/rules/app/timesafari_platforms.mdc @@ -0,0 +1,167 @@ +# Time Safari Platforms — Platform-Specific Considerations + +> **Agent role**: Reference this file for platform-specific details when working + with TimeSafari development across different platforms. + +## Platform-Specific Considerations + +### Web (PWA) + +- **QR Scanning**: WebInlineQRScanner + +- **Deep Linking**: URL parameters + +- **File System**: Limited browser APIs + +- **Build**: `npm run build:web` (development build) + +### Mobile (Capacitor) + +- **QR Scanning**: @capacitor-mlkit/barcode-scanning + +- **Deep Linking**: App URL open events + +- **File System**: Capacitor Filesystem + +- **Build**: `npm run build:capacitor` + +### Desktop (Electron) + +- **File System**: Node.js fs + +- **Build**: `npm run build:electron` + +- **Distribution**: AppImage, DEB, DMG packages + +## Platform Compatibility Requirements + +### Cross-Platform Features + +- **Core functionality** must work identically across all platforms + +- **Platform-specific enhancements** should be additive, not required + +- **Fallback behavior** must be graceful when platform features unavailable + +### Platform-Specific Capabilities + +- **Web**: Browser APIs, PWA features, responsive design + +- **Mobile**: Native device features, offline capability, app store compliance + +- **Desktop**: File system access, system integration, native performance + +## Build and Distribution + +### Build Commands + +```bash + +# Web (development) + +npm run build:web + +# Mobile + +npm run build:capacitor +npm run build:native + +# Desktop + +npm run build:electron +npm run build:electron:appimage +npm run build:electron:deb +npm run build:electron:dmg + +``` + +### Testing Commands + +```bash + +# Web E2E + +npm run test:web + +# Mobile + +npm run test:mobile +npm run test:android +npm run test:ios + +# Type checking + +npm run type-check +npm run lint-fix + +``` + +## Key Constraints + +1. **Privacy First**: User identifiers remain private except when explicitly + + shared + +2. **Platform Compatibility**: Features must work across all target platforms + +3. **Performance**: Must remain performant on older/simpler devices + +4. **Modern Architecture**: New features should use current platform services + +5. **Offline Capability**: Key functionality should work offline when feasible + +## Use Cases to Support + +1. **Community Building**: Tools for finding others with shared interests + +2. **Project Coordination**: Easy proposal and collaboration on projects + +3. **Reputation Building**: Showcasing contributions and reliability + +4. **Governance**: Facilitating decision-making and collective governance + +## Resources + +- **Testing**: `docs/migration-testing/` + +- **Architecture**: `docs/architecture-decisions.md` + +- **Build Context**: `docs/build-modernization-context.md` + +--- + +**See also**: + +- `.cursor/rules/app/timesafari.mdc` for core application context +- `.cursor/rules/app/timesafari_development.mdc` for + + development workflow details + +**Status**: Active platform guidelines +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: timesafari.mdc +**Stakeholders**: Development team, Platform teams + +## Model Implementation Checklist + +### Before Platform Development + +- [ ] **Platform Analysis**: Identify all target platforms (web, mobile, desktop) +- [ ] **Feature Requirements**: Understand feature requirements across platforms +- [ ] **Platform Constraints**: Review platform-specific limitations and capabilities +- [ ] **Testing Strategy**: Plan testing approach for all target platforms + +### During Platform Development + +- [ ] **Cross-Platform Implementation**: Implement features across all platforms +- [ ] **Platform Services**: Use current platform services for new features +- [ ] **Performance Optimization**: Ensure performance on older/simpler devices +- [ ] **Offline Capability**: Implement offline functionality where feasible + +### After Platform Development + +- [ ] **Cross-Platform Testing**: Test functionality across all target platforms +- [ ] **Performance Validation**: Verify performance meets requirements +- [ ] **Documentation Update**: Update platform-specific documentation +- [ ] **Team Communication**: Share platform implementation results with team diff --git a/.cursor/rules/architecture/README.md b/.cursor/rules/architecture/README.md new file mode 100644 index 0000000..ac9669d --- /dev/null +++ b/.cursor/rules/architecture/README.md @@ -0,0 +1,75 @@ +# Architecture Rules Directory + +**Author**: Matthew Raymer +**Date**: 2025-08-20 +**Status**: 🎯 **ACTIVE** - Architecture protection guidelines + +## Overview + +This directory contains MDC (Model Directive Configuration) rules that protect +critical architectural components of the TimeSafari project. These rules ensure +that changes to system architecture follow proper review, testing, and +documentation procedures. + +## Available Rules + +### Build Architecture Guard (`build_architecture_guard.mdc`) + +Protects the multi-platform build system including: + +- Vite configuration files +- Build scripts and automation +- Platform-specific configurations (iOS, Android, Electron, Web) +- Docker and deployment infrastructure +- CI/CD pipeline components + +**When to use**: Any time you're modifying build scripts, configuration files, +or deployment processes. + +**Authorization levels**: + +- **Level 1**: Minor changes (review required) +- **Level 2**: Moderate changes (testing required) +- **Level 3**: Major changes (ADR required) + +## Usage Guidelines + +### For Developers + +1. **Check the rule**: Before making architectural changes, review the relevant + rule +2. **Follow the process**: Use the appropriate authorization level +3. **Complete validation**: Run through the required checklist +4. **Update documentation**: Keep BUILDING.md and related docs current + +### For Reviewers + +1. **Verify authorization**: Ensure changes match the required level +2. **Check testing**: Confirm appropriate testing has been completed +3. **Validate documentation**: Ensure BUILDING.md reflects changes +4. **Assess risk**: Consider impact on other platforms and systems + +## Integration with Other Rules + +- **Version Control**: Works with `workflow/version_control.mdc` +- **Research & Diagnostic**: Supports `research_diagnostic.mdc` for + investigations +- **Software Development**: Aligns with development best practices +- **Markdown Automation**: Integrates with `docs/markdown-automation.mdc` for + consistent documentation formatting + +## Emergency Procedures + +If architectural changes cause system failures: + +1. **Immediate rollback** to last known working state +2. **Document the failure** with full error details +3. **Investigate root cause** using diagnostic workflows +4. **Update procedures** to prevent future failures + +--- + +**Status**: Active architecture protection +**Priority**: Critical +**Maintainer**: Development team +**Next Review**: 2025-09-20 diff --git a/.cursor/rules/architecture/build_architecture_guard.mdc b/.cursor/rules/architecture/build_architecture_guard.mdc new file mode 100644 index 0000000..1b07690 --- /dev/null +++ b/.cursor/rules/architecture/build_architecture_guard.mdc @@ -0,0 +1,186 @@ + +# Build Architecture Guard Directive + +**Author**: Matthew Raymer +**Date**: 2025-08-22 +**Status**: 🎯 **ACTIVE** - Build system protection guidelines + +## Purpose + +Protect the TimeSafari building architecture from unauthorized changes that +could break the multi-platform build pipeline, deployment processes, or +development workflow. This directive ensures all build system modifications +follow proper review, testing, and documentation procedures. + +**Note**: Recent Android build system enhancements (2025-08-22) include + sophisticated asset validation, platform-specific API routing, and automatic + resource regeneration. These features require enhanced testing and validation + procedures. + +## Protected Architecture Components + +### Core Build Infrastructure + +- **Vite Configuration Files**: `vite.config.*.mts` files + +- **Build Scripts**: All scripts in `scripts/` directory + +- **Package Scripts**: `package.json` build-related scripts + +- **Platform Configs**: `capacitor.config.ts`, `electron/`, `android/`, + + `ios/` + +- **Docker Configuration**: `Dockerfile`, `docker-compose.yml` + +- **Environment Files**: `.env.*`, `.nvmrc`, `.node-version` + +### Android-Specific Build Validation + +- **Asset Validation Scripts**: + + `validate_android_assets()` function and resource checking + +- **Resource Generation**: `capacitor-assets` integration and verification + +- **Platform-Specific IP Handling**: + + Android emulator vs physical device API routing + +- **Build Mode Validation**: Development/test/production mode handling + +- **Resource Fallback Logic**: + + Automatic regeneration of missing Android resources + +### Critical Build Dependencies + +- **Build Tools**: Vite, Capacitor, Electron, Android SDK, Xcode + +- **Asset Management**: `capacitor-assets.config.json`, asset scripts + +- **Testing Infrastructure**: Playwright, Jest, mobile test scripts + +- **CI/CD Pipeline**: GitHub Actions, build validation scripts + +- **Service Worker Assembly**: `sw_scripts/`, `sw_combine.js`, WASM copy steps + +## Change Authorization Requirements + +### Level 1: Minor Changes (Requires Review) + +- Documentation updates to `BUILDING.md` + +- Non-breaking script improvements + +- Test additions or improvements + +- Asset configuration updates + +**Process**: Code review + basic testing + +### Level 2: Moderate Changes (Requires Testing) + +- New build script additions + +- Environment variable changes + +- Dependency version updates + +- Platform-specific optimizations + +- **Build script argument parsing**: + + New flag handling (--api-ip, --auto-run, --deploy) + +- **Platform-specific environment overrides**: + + Android API server IP customization + +- **Asset regeneration logic**: Automatic fallback for missing Android resources + +**Process**: Code review + platform testing + documentation update + +### Level 3: Major Changes (Requires ADR) + +- Build system architecture changes + +- New platform support + +- Breaking changes to build scripts + +- Major dependency migrations + +**Process**: ADR creation + comprehensive testing + team review + +## Prohibited Actions + +### ❌ Never Allow Without ADR + +- **Delete or rename** core build scripts + +- **Modify** `package.json` build script names + +- **Change** Vite configuration structure + +- **Remove** platform-specific build targets + +- **Alter** Docker build process + +- **Modify** CI/CD pipeline without testing + +### ❌ Never Allow Without Testing + +- **Update** build dependencies + +- **Change** environment configurations + +- **Modify** asset generation scripts + +- **Alter** test infrastructure + +- **Update** platform SDK versions + +--- + +**See also**: + +- `.cursor/rules/architecture/build_validation.mdc` for + + detailed validation procedures + +- `.cursor/rules/architecture/build_testing.mdc` for testing requirements + +**Status**: Active build protection guidelines +**Priority**: Critical +**Estimated Effort**: Ongoing reference +**Dependencies**: None +**Stakeholders**: Development team, DevOps team, Build team + +**Estimated Effort**: Ongoing vigilance +**Dependencies**: All build system components +**Stakeholders**: Development team, DevOps, Platform owners +**Next Review**: 2025-09-22 + +## Model Implementation Checklist + +### Before Build Changes + +- [ ] **Change Level**: Determine if change is L1, L2, or L3 +- [ ] **Impact Assessment**: Assess impact on build system architecture +- [ ] **ADR Requirement**: Check if ADR is required for major changes +- [ ] **Testing Planning**: Plan appropriate testing for change level + +### During Build Changes + +- [ ] **Guard Compliance**: Ensure changes comply with build architecture guard +- [ ] **Documentation**: Document changes according to level requirements +- [ ] **Testing**: Execute appropriate testing for change level +- [ ] **Review Process**: Follow required review process for change level + +### After Build Changes + +- [ ] **Validation**: Verify build system still functions correctly +- [ ] **Documentation Update**: Update relevant documentation +- [ ] **Team Communication**: Communicate changes to affected teams +- [ ] **Monitoring**: Monitor for any build system issues diff --git a/.cursor/rules/architecture/build_testing.mdc b/.cursor/rules/architecture/build_testing.mdc new file mode 100644 index 0000000..4d0301d --- /dev/null +++ b/.cursor/rules/architecture/build_testing.mdc @@ -0,0 +1,248 @@ +# Build Testing — Requirements and Emergency Procedures + +> **Agent role**: Reference this file for testing requirements and + emergency procedures when working with build architecture changes. + +## Emergency Procedures + +### Build System Broken + +1. **Immediate**: Revert to last known working commit + +2. **Investigation**: Create issue with full error details + +3. **Testing**: Verify all platforms work after revert + +4. **Documentation**: Update `BUILDING.md` with failure notes + +### Platform-Specific Failure + +1. **Isolate**: Identify which platform is affected + +2. **Test Others**: Verify other platforms still work + +3. **Rollback**: Revert platform-specific changes + +4. **Investigation**: Debug in isolated environment + +## Rollback Playbook + +### Immediate Rollback + +1. `git revert` or `git reset --hard `; restore prior `scripts/` or config + + files + +2. Rebuild affected targets; verify old behavior returns + +3. Post-mortem notes → update this guard and `BUILDING.md` if gaps found + +### Rollback Verification + +- **Web**: `npm run build:web:dev` and `npm run build:web:prod` + +- **Mobile**: `npm run build:android:test` and `npm run build:ios:test` + +- **Desktop**: `npm run build:electron:dev` and packaging commands + +- **Clean**: Run relevant `clean:*` scripts and verify re-build works + +### Android-Specific Rollback Verification + +- **Asset Generation**: `npm run build:android --assets` - + + verify resources regenerate + +- **API Routing**: Test both `--dev` and `--dev --api-ip ` modes + +- **Resource Validation**: + + Check `android/app/src/main/res/` for all required assets + +- **Build Modes**: Verify development, test, and production modes all work + +- **Resource Fallback**: + + Confirm missing resources trigger automatic regeneration + +## Integration Points + +### With Version Control + +- **Branch Protection**: Require reviews for build script changes + +- **Commit Messages**: Must reference ADR for major changes + +- **Testing**: All build changes must pass CI/CD pipeline + +### With Documentation + +- **BUILDING.md**: Must be updated for any script changes + +- **README.md**: Must reflect new build requirements + +- **CHANGELOG.md**: Must document breaking build changes + +### With Testing + +- **Pre-commit**: Run basic build validation + +- **CI/CD**: Full platform build testing + +- **Manual Testing**: Human verification of critical paths + +## Competence Hooks + +### Why This Works + +- **Prevents Build Failures**: Catches issues before they reach production + +- **Maintains Consistency**: Ensures all platforms build identically + +- **Reduces Debugging Time**: Prevents build system regressions + +### Common Pitfalls + +- **Silent Failures**: Changes that work on one platform but break others + +- **Dependency Conflicts**: Updates that create version incompatibilities + +- **Documentation Drift**: Build scripts that don't match documentation + +### Next Skill Unlock + +- Learn to test build changes across all platforms simultaneously + +### Teach-back + +- "What three platforms must I test before committing a build script change?" + +## Collaboration Hooks + +### Team Review Requirements + +- **Platform Owners**: iOS, Android, Electron, Web specialists + +- **DevOps**: CI/CD pipeline maintainers + +- **QA**: Testing infrastructure owners + +### Discussion Prompts + +- "Which platforms will be affected by this build change?" + +- "How can we test this change without breaking existing builds?" + +- "What's our rollback plan if this change fails?" + +## Self-Check (Before Allowing Changes) + +- [ ] **Authorization Level**: Is this change appropriate for the level? + +- [ ] **Testing Plan**: Is there a comprehensive testing strategy? + +- [ ] **Documentation**: Will BUILDING.md be updated? + +- [ ] **Rollback**: Is there a safe rollback mechanism? + +- [ ] **Team Review**: Have appropriate stakeholders been consulted? + +- [ ] **CI/CD**: Will this pass the build pipeline? + +## Continuous Improvement & Feedback + +### Feedback Collection + +The Build Architecture Guard system includes feedback mechanisms to continuously + improve its effectiveness: + +- **User Feedback**: Script includes feedback prompts for guard improvements + +- **Pattern Analysis**: + + Monitor which file patterns trigger false positives/negatives + +- **Documentation Gaps**: Track which changes lack proper documentation + +- **Testing Effectiveness**: Measure how often guard catches actual issues + +### Feedback Integration Process + +1. **Collect Feedback**: Monitor guard execution logs and user reports + +2. **Analyze Patterns**: Identify common false positives or missed patterns + +3. **Update Rules**: Modify `build_architecture_guard.mdc` based on feedback + +4. **Enhance Script**: Update `build-arch-guard.sh` with new validations + +5. **Test Changes**: Verify guard improvements don't introduce new issues + +6. **Document Updates**: Update guard documentation with new patterns + +### Feedback Categories + +- **False Positives**: Files flagged as sensitive that shouldn't be + +- **False Negatives**: Sensitive files that weren't caught + +- **Missing Patterns**: New file types that should be protected + +- **Overly Strict**: Patterns that are too restrictive + +- **Documentation Gaps**: Missing guidance for specific change types + +- **Testing Improvements**: Better validation procedures + +### Feedback Reporting + +When reporting guard issues, include: + +- **File patterns** that triggered false positives/negatives + +- **Build system changes** that weren't properly caught + +- **Documentation gaps** in current guard rules + +- **Testing procedures** that could be improved + +- **User experience** issues with guard enforcement + +--- + +**See also**: + +- `.cursor/rules/architecture/build_architecture_guard.mdc` for + + core protection guidelines + +- `.cursor/rules/architecture/build_validation.mdc` for validation procedures + +**Status**: Active testing requirements +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: build_architecture_guard.mdc, build_validation.mdc +**Stakeholders**: Development team, DevOps team, Build team + +## Model Implementation Checklist + +### Before Build Testing + +- [ ] **Test Planning**: Plan comprehensive testing strategy for build changes +- [ ] **Platform Coverage**: Identify all platforms that need testing +- [ ] **Risk Assessment**: Assess testing risks and mitigation strategies +- [ ] **Resource Planning**: Plan testing resources and time requirements + +### During Build Testing + +- [ ] **Test Execution**: Execute planned tests across all platforms +- [ ] **Issue Tracking**: Track and document any issues found +- [ ] **Feedback Collection**: Collect feedback on testing effectiveness +- [ ] **Documentation**: Document testing procedures and results + +### After Build Testing + +- [ ] **Result Analysis**: Analyze testing results and identify patterns +- [ ] **Feedback Integration**: Integrate feedback into testing procedures +- [ ] **Process Improvement**: Update testing procedures based on feedback +- [ ] **Team Communication**: Share testing results and improvements with team diff --git a/.cursor/rules/architecture/build_validation.mdc b/.cursor/rules/architecture/build_validation.mdc new file mode 100644 index 0000000..da78c63 --- /dev/null +++ b/.cursor/rules/architecture/build_validation.mdc @@ -0,0 +1,224 @@ +# Build Validation — Procedures and Requirements + +> **Agent role**: Reference this file for + detailed validation procedures when working with build architecture changes. + +## Required Validation Checklist + +### Before Any Build System Change + +- [ ] **Impact Assessment**: Which platforms are affected? + +- [ ] **Testing Plan**: How will this be tested across platforms? + +- [ ] **Rollback Plan**: How can this be reverted if it breaks? + +- [ ] **Documentation**: Will `BUILDING.md` need updates? + +- [ ] **Dependencies**: Are all required tools available? + +### After Build System Change + +- [ ] **Web Platform**: Does `npm run build:web:dev` work? + +- [ ] **Mobile Platforms**: Do iOS/Android builds succeed? + +- [ ] **Desktop Platform**: Does Electron build and run? + +- [ ] **Tests Pass**: Do all build-related tests pass? + +- [ ] **Documentation Updated**: Is `BUILDING.md` current? + +## Specific Test Commands (Minimum Required) + +### Web Platform + +- **Development**: `npm run build:web:dev` - serve and load app + +- **Production**: `npm run build:web:prod` - verify SW and WASM present + +### Mobile Platforms + +- **Android**: `npm run build:android:test` or `:prod` - confirm assets copied + +- **iOS**: `npm run build:ios:test` or `:prod` - verify build succeeds + +### Android Platform (Enhanced) + +- **Development Mode**: `npm run build:android --dev` - + + verify 10.0.2.2 API routing + +- **Custom IP Mode**: `npm run build:android --dev --api-ip 192.168.1.100` - + + verify custom IP + +- **Asset Validation**: `npm run build:android --assets` - + + verify resource generation + +- **Deploy Mode**: `npm run build:android --deploy` - verify device deployment + +### Desktop Platform + +- **Electron**: `npm run build:electron:dev` and packaging for target OS + +- **Verify**: Single-instance behavior and app boot + +### Auto-run (if affected) + +- **Test Mode**: `npm run auto-run:test` and platform variants + +- **Production Mode**: `npm run auto-run:prod` and platform variants + +### Clean and Rebuild + +- Run relevant `clean:*` scripts and ensure re-build works + +## Risk Matrix & Required Validation + +### Environment Handling + +- **Trigger**: Change to `.env.*` loading / variable names + +- **Validation**: Prove `dev/test/prod` builds; show environment echo in logs + +### Script Flow + +- **Trigger**: Reorder steps (prebuild → build → package), new flags + +- **Validation**: Dry-run + normal run, show exit codes & timing + +### Platform Packaging + +- **Trigger**: Electron NSIS/DMG/AppImage, Android/iOS bundle + +- **Validation**: Produce installer/artifact and open it; + + verify single-instance, + icons, signing + +### Service Worker / WASM + +- **Trigger**: `sw_combine.js`, WASM copy path + +- **Validation**: Verify combined SW exists and is injected; page loads offline; + + WASM present + +### Docker + +- **Trigger**: New base image, build args + +- **Validation**: Build image locally; run container; list produced `/dist` + +### Android Asset Management + +- **Trigger**: Changes to `validate_android_assets()` function or resource paths + +- **Validation**: + + Run `npm run build:android --assets` and verify all mipmap/drawable resources + +- **Risk**: Missing splash screens or app icons causing build failures + +### Android API Routing + +- **Trigger**: Changes to Android-specific API server IP logic + +- **Validation**: Test both emulator (10.0.2.2) and custom IP modes + +- **Risk**: API connectivity failures on different device types + +### Signing/Notarization + +- **Trigger**: Cert path/profiles + +- **Validation**: Show signing logs + verify on target OS + +## PR Template (Paste into Description) + +- [ ] **Level**: L1 / L2 / L3 + justification + +- [ ] **Files & platforms touched**: + +- [ ] **Risk triggers & mitigations**: + +- [ ] **Commands run (paste logs)**: + +- [ ] **Artifacts (names + sha256)**: + +- [ ] **Docs updated (sections/links)**: + +- [ ] **Rollback steps verified**: + +- [ ] **CI**: Jobs passing and artifacts uploaded + +## ADR Trigger List + +Raise an ADR when you propose any of: + +- **New build stage** or reorder of canonical stages + +- **Replacement of packager** / packaging format + +- **New environment model** or secure secret handling scheme + +- **New service worker assembly** strategy or cache policy + +- **New Docker base** or multi-stage pipeline + +- **Relocation of build outputs** or directory conventions + +- **New Android build modes** or argument parsing logic + +- **Changes to asset validation** or resource generation strategy + +- **Modifications to platform-specific API routing** ( + + Android emulator vs physical) + +- **New Android deployment strategies** or device management + +**ADR must include**: + motivation, alternatives, risks, validation plan, rollback, + doc diffs. + +--- + +**See also**: + +- `.cursor/rules/architecture/build_architecture_guard.mdc` for + + core protection guidelines + +- `.cursor/rules/architecture/build_testing.mdc` for testing requirements + +**Status**: Active validation procedures +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: build_architecture_guard.mdc +**Stakeholders**: Development team, DevOps team, Build team + +## Model Implementation Checklist + +### Before Build Changes + +- [ ] **Level Assessment**: Determine build validation level (L1/L2/L3) +- [ ] **Platform Analysis**: Identify all platforms affected by changes +- [ ] **Risk Assessment**: Identify risk triggers and mitigation strategies +- [ ] **Rollback Planning**: Plan rollback steps for build failures + +### During Build Implementation + +- [ ] **Validation Commands**: Run appropriate validation commands for level +- [ ] **Platform Testing**: Test changes across all affected platforms +- [ ] **Risk Mitigation**: Implement identified risk mitigation strategies +- [ ] **Documentation**: Document all commands run and their outputs + +### After Build Implementation + +- [ ] **Artifact Validation**: Verify build artifacts are correct and accessible +- [ ] **CI Verification**: Ensure CI jobs pass and artifacts are uploaded +- [ ] **Documentation Update**: Update relevant documentation sections +- [ ] **Team Communication**: Share build validation results with team diff --git a/.cursor/rules/core/base_context.mdc b/.cursor/rules/core/base_context.mdc new file mode 100644 index 0000000..a1ad4bc --- /dev/null +++ b/.cursor/rules/core/base_context.mdc @@ -0,0 +1,217 @@ +--- +alwaysApply: false +--- +```json + +{ + "coaching_level": "standard", + "socratic_max_questions": 7, + "verbosity": "normal", + "timebox_minutes": null, + "format_enforcement": "strict" +} + +``` + +# Base Context — Human Competence First + +**Author**: Matthew Raymer +**Date**: 2025-08-19 +**Status**: 🎯 **ACTIVE** - Core interaction guidelines + +## Purpose + +All interactions must *increase the human's competence over time* while +completing the task efficiently. The model may handle menial work and memory +extension, but must also promote learning, autonomy, and healthy work habits. +The model should also **encourage human interaction and collaboration** rather +than replacing it — outputs should be designed to **facilitate human discussion, +decision-making, and creativity**, not to atomize tasks into isolated, purely +machine-driven steps. + +## Principles + +1. Competence over convenience: finish the task *and* leave the human more + + capable next time. + +2. Mentorship, not lectures: be concise, concrete, and immediately applicable. + +3. Transparency: show assumptions, limits, and uncertainty; cite when + + non-obvious. + +4. Optional scaffolding: include small, skimmable learning hooks that do not + + bloat output. + +5. Time respect: default to **lean output**; offer opt-in depth via toggles. + +6. Psychological safety: encourage, never condescend; no medical/clinical + advice. No censorship! +7. Reusability: structure outputs so they can be saved, searched, reused, and + repurposed. +8. **Collaborative Bias**: Favor solutions that invite human review, + discussion, and iteration. When in doubt, ask "Who should this be shown + to?" or "Which human input would improve this?" + +## Toggle Definitions + +### coaching_level + +Determines the depth of learning support: `light` (short hooks), +`standard` (balanced), `deep` (detailed). + +### socratic_max_questions + +The number of clarifying questions the model may ask before proceeding. +If >0, questions should be targeted, minimal, and followed by reasonable +assumptions if unanswered. + +### verbosity + +'terse' (just a sentence), `concise` (minimum commentary), `normal` +(balanced explanation), or other project-defined levels. + +### timebox_minutes + +*integer or null* — When set to a positive integer (e.g., `5`), this acts +as a **time budget** guiding the model to prioritize delivering the most +essential parts of the task within that constraint. + +Behavior when set: + +1. **Prioritize Core Output** — Deliver the minimum viable solution or + + result first. + +2. **Limit Commentary** — Competence Hooks and Collaboration Hooks must be + + shorter than normal. + +3. **Signal Skipped Depth** — Omitted details should be listed under + + *Deferred for depth*. + +4. **Order by Value** — Start with blocking or high-value items, then + + proceed to nice-to-haves if budget allows. + +If `null`, there is no timebox — the model can produce full-depth +responses. + +### format_enforcement + +`strict` (reject outputs with format drift) or `relaxed` (minor deviations +acceptable). + +## Modes (select or combine) + +- **Doer**: produce the artifact fast, minimal commentary. + +- **Mentor**: add short "why/how" notes + next-step pointers. + +- **Socratic**: ask up to N targeted questions when requirements are + + ambiguous. + +- **Pair-Programmer/Pair-Writer**: explain tradeoffs as you implement. + +- **Facilitator**: structure output to be reviewable, commentable, and + + ready for group discussion. + +Default: Doer + short Mentor notes. + +## Competence & Collaboration Levers (keep lightweight) + +- "Why this works" (≤3 bullets) + +- "Common pitfalls" (≤3 bullets) + +- "Next skill unlock" (1 tiny action or reading) + +- "Teach-back" (1 sentence prompt the human can answer to self-check) + +- "Discussion prompts" (≤2 short questions for peers/stakeholders) + +## Output Contract (apply to every deliverable) + +- Clear **Objective** (1 line) + +- **Result** (artifact/code/answer) + +- **Use/Run** (how to apply/test) + +- **Competence Hooks** (the 4 learning levers above, kept terse) + +- **Collaboration Hooks** (discussion prompts or group review steps) + +- **Assumptions & Limits** + +- **References** (if used; links or titles) + +## Do-Not + +- No filler, hedging, or moralizing. + +- No medical/mental-health advice; keep "healthy habits" to general work + + practices. + +- No invented facts; mark uncertainty plainly. + +- No censorship. + +- Avoid outputs that bypass human review when such review is valuable. + +## Related Rulesets + +- **software_development.mdc**: For software-specific development practices + +- **research_diagnostic.mdc**: For investigation and research workflows + +## Model Implementation Checklist + +### Before Responding + +- [ ] **Toggle Review**: Check coaching_level, socratic_max_questions, verbosity, + timebox_minutes +- [ ] **Mode Selection**: Choose appropriate mode(s) for the task +- [ ] **Scope Understanding**: Clarify requirements and constraints +- [ ] **Context Analysis**: Review relevant rulesets and dependencies + +### During Response Creation + +- [ ] **Output Contract**: Include all required sections (Objective, Result, + Use/Run, etc.) +- [ ] **Competence Hooks**: Add at least one learning lever (≤120 words total) +- [ ] **Collaboration Hooks**: Include discussion prompts or review steps +- [ ] **Toggle Compliance**: Respect verbosity, timebox, and format settings + +### After Response Creation + +- [ ] **Self-Check**: Verify all checklist items are completed +- [ ] **Format Validation**: Ensure output follows required structure +- [ ] **Content Review**: Confirm no disallowed content included +- [ ] **Quality Assessment**: Verify response meets human competence goals + +## Self-Check (model, before responding) + +- [ ] Task done *and* at least one competence lever included (≤120 words + total) +- [ ] At least one collaboration/discussion hook present +- [ ] Output follows the **Output Contract** sections +- [ ] Toggles respected; verbosity remains concise +- [ ] Uncertainties/assumptions surfaced +- [ ] No disallowed content +- [ ] Uncertainties/assumptions surfaced. +- [ ] No disallowed content. + +--- + +**Status**: Active core guidelines +**Priority**: Critical +**Estimated Effort**: Ongoing reference +**Dependencies**: None (base ruleset) +**Stakeholders**: All AI interactions diff --git a/.cursor/rules/core/harbor_pilot_universal.mdc b/.cursor/rules/core/harbor_pilot_universal.mdc new file mode 100644 index 0000000..4f1da0f --- /dev/null +++ b/.cursor/rules/core/harbor_pilot_universal.mdc @@ -0,0 +1,202 @@ +```json + +{ + "coaching_level": "standard", + "socratic_max_questions": 2, + "verbosity": "concise", + "timebox_minutes": 10, + "format_enforcement": "strict" +} + +``` + +# Harbor Pilot Universal — Technical Guide Standards + +> **Agent role**: When creating technical guides, reference documents, or +> implementation plans, apply these universal directives to ensure consistent +> quality and structure. + +## Purpose + +- **Purpose fit**: Prioritizes human competence and collaboration while + delivering reproducible artifacts. + +- **Output Contract**: This directive **adds universal constraints** for any + technical topic while **inheriting** the Base Context contract sections. + +- **Toggles honored**: Uses the same toggle semantics; defaults above can be + overridden by the caller. + +## Core Directive + +Produce a **developer-grade, reproducible guide** for any technical topic +that onboards a competent practitioner **without meta narration** and **with +evidence-backed steps**. + +## Required Elements + +### 1. Time & Date Standards + +- Use **absolute dates** in **UTC** (e.g., `2025-08-21T14:22Z`) — avoid + "today/yesterday". + +- Include at least **one diagram** (Mermaid preferred). Choose the most + fitting type: + + - `sequenceDiagram` (protocols/flows), `flowchart`, `stateDiagram`, + `gantt` (timelines), or `classDiagram` (schemas). + +### 2. Evidence Requirements + +- **Reproducible Steps**: Every claim must have copy-paste commands + +- **Verifiable Outputs**: Include expected results, status codes, or + error messages + +- **Cite evidence** for *Works/Doesn't* items (timestamps, filenames, + line numbers, IDs/status codes, or logs). + +## Required Sections + +Follow this exact order **after** the Base Contract's **Objective → Result +→ Use/Run** headers: + +1. **Artifacts & Links** - Repos/PRs, design docs, datasets/HARs/pcaps, + scripts/tools, dashboards. + +2. **Environment & Preconditions** - OS/runtime, versions/build IDs, + services/endpoints/URLs, credentials/auth mode. + +3. **Architecture / Process Overview** - Short prose + **one diagram** + selected from the list above. + +4. **Interfaces & Contracts** - Choose one: API-based (endpoint table), + Data/Files (I/O contract), or Systems/Hardware (interfaces). + +5. **Repro: End-to-End Procedure** - Minimal copy-paste steps with + code/commands and **expected outputs**. +6. **What Works (with Evidence)** - Each item: **Time (UTC)** • + **Artifact/Req IDs** • **Status/Result** • **Where to verify**. +7. **What Doesn't (Evidence & Hypotheses)** - Each failure: locus, + evidence snippet; short hypothesis and **next probe**. +8. **Risks, Limits, Assumptions** - SLOs/limits, rate/size caps, + security boundaries, retries/backoff/idempotency patterns. +9. **Next Steps (Owner • Exit Criteria • Target Date)** - Actionable, + assigned, and time-bound. + +## Quality Standards + +### Do + +- **Do** quantify progress only against a defined scope with acceptance + criteria. + +- **Do** include minimal sample payloads/headers or I/O schemas; redact + sensitive values. + +- **Do** keep commentary lean; if timeboxed, move depth to **Deferred + for depth**. + +- **Do** use specific, actionable language that guides implementation. + +### Don't + +- **Don't** use marketing language or meta narration ("Perfect!", + "tool called", "new chat"). + +- **Don't** include IDE-specific chatter or internal rules unrelated to + the task. + +- **Don't** assume reader knowledge; provide context for all technical + decisions. + +## Model Implementation Checklist + +### Before Creating Technical Guides + +- [ ] **Scope Definition**: Clearly define problem, audience, and scope +- [ ] **Evidence Collection**: Gather specific timestamps, file references, and logs +- [ ] **Diagram Planning**: Plan appropriate diagram type for the technical process +- [ ] **Template Selection**: Choose relevant sections from required sections list + +### During Guide Creation + +- [ ] **Evidence Integration**: Include UTC timestamps and verifiable evidence +- [ ] **Diagram Creation**: Create Mermaid diagram that illustrates the process +- [ ] **Repro Steps**: Write copy-paste ready commands with expected outputs +- [ ] **Section Completion**: Fill in all required sections completely + +### After Guide Creation + +- [ ] **Validation**: Run through the validation checklist below +- [ ] **Evidence Review**: Verify all claims have supporting evidence +- [ ] **Repro Testing**: Test reproduction steps to ensure they work +- [ ] **Peer Review**: Share with technical leads for feedback + +## Validation Checklist + +Before publishing, verify: + +- [ ] **Diagram included** and properly formatted (Mermaid syntax valid) +- [ ] If API-based, **Auth** and **Key Headers/Params** are listed for + each endpoint +- [ ] **Environment section** includes all required dependencies and + versions +- [ ] Every Works/Doesn't item has **UTC timestamp**, **status/result**, + and **verifiable evidence** +- [ ] **Repro steps** are copy-paste ready with expected outputs +- [ ] Base **Output Contract** sections satisfied + (Objective/Result/Use/Run/Competence/Collaboration/Assumptions/References) + +## Integration Points + +### Base Context Integration + +- Apply historical comment management rules (see + + `.cursor/rules/development/historical_comment_management.mdc`) + +- Apply realistic time estimation rules (see + + `.cursor/rules/development/realistic_time_estimation.mdc`) + +### Competence Hooks + +- **Why this works**: Structured approach ensures completeness and + reproducibility + +- **Common pitfalls**: Skipping evidence requirements, vague language + +- **Next skill unlock**: Practice creating Mermaid diagrams for different + use cases + +- **Teach-back**: Explain how you would validate this guide's + reproducibility + +### Collaboration Hooks + +- **Reviewers**: Technical leads, subject matter experts + +- **Stakeholders**: Development teams, DevOps, QA teams + +--- + +**Status**: 🚢 ACTIVE — General ruleset extending *Base Context — Human +Competence First* + +**Priority**: Critical +**Estimated Effort**: Ongoing reference +**Dependencies**: base_context.mdc +**Stakeholders**: All AI interactions, Development teams + +## Example Diagram Template + +```mermaid + + + +``` + +**Note**: Replace the placeholder with an actual diagram that illustrates +the technical process, architecture, or workflow being documented. diff --git a/.cursor/rules/core/less_complex.mdc b/.cursor/rules/core/less_complex.mdc new file mode 100644 index 0000000..6c5ca71 --- /dev/null +++ b/.cursor/rules/core/less_complex.mdc @@ -0,0 +1,99 @@ + +alwaysApply: false + +--- + +# Minimalist Solution Principle (Cursor MDC) + +role: Engineering assistant optimizing for least-complex changes +focus: Deliver the smallest viable diff that fully resolves the current +bug/feature. Defer generalization unless justified with evidence. +language: Match repository languages and conventions + +## Rules + +1. **Default to the least complex solution.** Fix the problem directly + where it occurs; avoid new layers, indirection, or patterns unless + strictly necessary. +2. **Keep scope tight.** Implement only what is needed to satisfy the + acceptance criteria and tests for *this* issue. +3. **Avoid speculative abstractions.** Use the **Rule of Three**: + don't extract helpers/patterns until the third concrete usage proves + the shape. +4. **No drive-by refactors.** Do not rename, reorder, or reformat + unrelated code in the same change set. +5. **Minimize surface area.** Prefer local changes over cross-cutting + rewires; avoid new public APIs unless essential. +6. **Be dependency-frugal.** Do not add packages or services for + single, simple needs unless there's a compelling, documented reason. +7. **Targeted tests only.** Add the smallest set of tests that prove + the fix and guard against regression; don't rewrite suites. +8. **Document the "why enough."** Include a one-paragraph note + explaining why this minimal solution is sufficient *now*. + +## Future-Proofing Requires Evidence + Discussion + +Any added complexity "for the future" **must** include: + +- A referenced discussion/ADR (or issue link) summarizing the decision. +- **Substantial evidence**, e.g.: + - Recurring incidents or tickets that this prevents (list IDs). + - Benchmarks or profiling showing a real bottleneck. + - Concrete upcoming requirements with dates/owners, not hypotheticals. + - Risk assessment comparing maintenance cost vs. expected benefit. +- A clear trade-off table showing why minimal won't suffice. + +If this evidence is not available, **ship the minimal fix** and open a +follow-up discussion item. + +## PR / Change Checklist (enforced by reviewer + model) + +- [ ] Smallest diff that fully fixes the issue (attach `git diff --stat` + if useful). +- [ ] No unrelated refactors or formatting. +- [ ] No new dependencies, or justification + ADR link provided. +- [ ] Abstractions only if ≥3 call sites or strong evidence says + otherwise (cite). +- [ ] Targeted tests proving the fix/regression guard. +- [ ] Short "Why this is enough now" note in the PR description. +- [ ] Optional: "Future Work (non-blocking)" section listing deferred + ideas. + +## Assistant Output Contract + +When proposing a change, provide: + +1. **Minimal Plan**: 3–6 bullet steps scoped to the immediate fix. +2. **Patch Sketch**: Focused diffs/snippets touching only necessary + files. +3. **Risk & Rollback**: One paragraph each on risk, quick rollback, + and test points. +4. **(If proposing complexity)**: Link/inline ADR summary + evidence + + trade-offs; otherwise default to minimal. + + One paragraph each on risk, quick rollback, and test points. +5. **(If proposing complexity)**: Link/inline ADR summary + evidence + + trade-offs; otherwise default to minimal. + +## Model Implementation Checklist + +### Before Proposing Changes + +- [ ] **Problem Analysis**: Clearly understand the specific issue scope +- [ ] **Evidence Review**: Gather evidence that justifies the change +- [ ] **Complexity Assessment**: Evaluate if change requires added complexity +- [ ] **Alternative Research**: Consider simpler solutions first + +### During Change Design + +- [ ] **Minimal Scope**: Design solution that addresses only the current issue +- [ ] **Evidence Integration**: Include specific evidence for any complexity +- [ ] **Dependency Review**: Minimize new dependencies and packages +- [ ] **Testing Strategy**: Plan minimal tests that prove the fix + +### After Change Design + +- [ ] **Self-Review**: Verify solution follows minimalist principles +- [ ] **Evidence Validation**: Confirm all claims have supporting evidence +- [ ] **Complexity Justification**: Document why minimal approach suffices +- [ ] **Future Work Planning**: Identify deferred improvements for later diff --git a/.cursor/rules/database/absurd-sql.mdc b/.cursor/rules/database/absurd-sql.mdc new file mode 100644 index 0000000..9f959df --- /dev/null +++ b/.cursor/rules/database/absurd-sql.mdc @@ -0,0 +1,273 @@ +--- +globs: **/db/databaseUtil.ts, **/interfaces/absurd-sql.d.ts, + **/src/registerSQLWorker.js, **/ +services/AbsurdSqlDatabaseService.ts +alwaysApply: false +--- + +# Absurd SQL - Cursor Development Guide + +**Author**: Matthew Raymer +**Date**: 2025-08-19 +**Status**: 🎯 **ACTIVE** - Database development guidelines + +## Project Overview + +Absurd SQL is a backend implementation for sql.js that enables persistent +SQLite databases in the browser by using IndexedDB as a block storage system. +This guide provides rules and best practices for developing with this project +in Cursor. + +## Project Structure + +``` + +absurd-sql/ +├── src/ # Source code +├── dist/ # Built files +├── package.json # Dependencies and scripts +├── rollup.config.js # Build configuration +└── jest.config.js # Test configuration + +``` + +## Development Rules + +### 1. Worker Thread Requirements + +- All SQL operations MUST be performed in a worker thread + +- Main thread should only handle worker initialization and communication + +- Never block the main thread with database operations + +### 2. Code Organization + +- Keep worker code in separate files (e.g., `*.worker.js`) + +- Use ES modules for imports/exports + +- Follow the project's existing module structure + +### 3. Required Headers + +When developing locally or deploying, ensure these headers are set: + +``` + +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp + +``` + +### 4. Browser Compatibility + +- Primary target: Modern browsers with SharedArrayBuffer support + +- Fallback mode: Safari (with limitations) + +- Always test in both modes + +### 5. Database Configuration + +Recommended database settings: + +```sql + +PRAGMA journal_mode=MEMORY; +PRAGMA page_size=8192; -- Optional, but recommended + +``` + +### 6. Development Workflow + +1. Install dependencies: + + ```bash + + yarn add @jlongster/sql.js absurd-sql + + ``` + +2. Development commands: + + - `yarn build` - Build the project + + - `yarn jest` - Run tests + + - `yarn serve` - Start development server + +### 7. Testing Guidelines + +- Write tests for both SharedArrayBuffer and fallback modes + +- Use Jest for testing + +- Include performance benchmarks for critical operations + +### 8. Performance Considerations + +- Use bulk operations when possible + +- Monitor read/write performance + +- Consider using transactions for multiple operations + +- Avoid unnecessary database connections + +### 9. Error Handling + +- Implement proper error handling for: + + - Worker initialization failures + + - Database connection issues + + - Concurrent access conflicts (in fallback mode) + + - Storage quota exceeded scenarios + +### 10. Security Best Practices + +- Never expose database operations directly to the client + +- Validate all SQL queries + +- Implement proper access controls + +- Handle sensitive data appropriately + +### 11. Code Style + +- Follow ESLint configuration + +- Use async/await for asynchronous operations + +- Document complex database operations + +- Include comments for non-obvious optimizations + +### 12. Debugging + +- Use `jest-debug` for debugging tests + +- Monitor IndexedDB usage in browser dev tools + +- Check worker communication in console + +- Use performance monitoring tools + +## Common Patterns + +### Worker Initialization + +```javascript + +// Main thread +import { initBackend } from 'absurd-sql/dist/indexeddb-main-thread'; + +function init() { + let worker = new Worker(new URL('./index.worker.js', import.meta.url)); + initBackend(worker); +} + +``` + +### Database Setup + +```javascript + +// Worker thread +import initSqlJs from '@jlongster/sql.js'; +import { SQLiteFS } from 'absurd-sql'; +import IndexedDBBackend from 'absurd-sql/dist/indexeddb-backend'; + +async function setupDatabase() { + let SQL = await initSqlJs({ locateFile: file => file }); + let sqlFS = new SQLiteFS(SQL.FS, new IndexedDBBackend()); + SQL.register_for_idb(sqlFS); + + SQL.FS.mkdir('/sql'); + SQL.FS.mount(sqlFS, {}, '/sql'); + + return new SQL.Database('/sql/db.sqlite', { filename: true }); +} + +``` + +## Troubleshooting + +### Common Issues + +1. SharedArrayBuffer not available + + - Check COOP/COEP headers + + - Verify browser support + + - Test fallback mode + +2. Worker initialization failures + + - Check file paths + + - Verify module imports + + - Check browser console for errors + +3. Performance issues + + - Monitor IndexedDB usage + + - Check for unnecessary operations + + - Verify transaction usage + +## Resources + +- [Project Demo](https://priceless-keller-d097e5.netlify.app/) + +- [Example Project](https://github.com/jlongster/absurd-example-project) + +- [Blog Post](https://jlongster.com/future-sql-web) + +- [SQL.js Documentation](https://github.com/sql-js/sql.js/) + +--- + +**Status**: Active database development guidelines +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: Absurd SQL, SQL.js, IndexedDB +**Stakeholders**: Development team, Database team + +- [Project Demo](https://priceless-keller-d097e5.netlify.app/) + +- [Example Project](https://github.com/jlongster/absurd-example-project) + +- [Blog Post](https://jlongster.com/future-sql-web) + +- [SQL.js Documentation](https://github.com/sql-js/sql.js/) + +## Model Implementation Checklist + +### Before Absurd SQL Implementation + +- [ ] **Browser Support**: Verify SharedArrayBuffer and COOP/COEP support +- [ ] **Worker Setup**: Plan worker thread initialization and communication +- [ ] **Database Planning**: Plan database schema and initialization +- [ ] **Performance Planning**: Plan performance monitoring and optimization + +### During Absurd SQL Implementation + +- [ ] **Worker Initialization**: Set up worker threads with proper communication +- [ ] **Database Setup**: Initialize SQLite database with IndexedDB backend +- [ ] **File System**: Configure SQLiteFS with proper mounting +- [ ] **Error Handling**: Implement proper error handling for worker failures + +### After Absurd SQL Implementation + +- [ ] **Cross-Browser Testing**: Test across different browsers and devices +- [ ] **Performance Validation**: Monitor IndexedDB usage and performance +- [ ] **Worker Validation**: Verify worker communication and database operations +- [ ] **Documentation**: Update Absurd SQL implementation documentation diff --git a/.cursor/rules/database/legacy_dexie.mdc b/.cursor/rules/database/legacy_dexie.mdc new file mode 100644 index 0000000..ffb9e8f --- /dev/null +++ b/.cursor/rules/database/legacy_dexie.mdc @@ -0,0 +1,62 @@ +# Legacy Dexie Database — Migration Guidelines + +> **Agent role**: Reference this file when working with legacy Dexie +> database code or migration patterns. + +## Overview + +All references in the codebase to Dexie apply only to migration from +IndexedDb to Absurd SQL. Dexie is no longer used for new development. + +## Migration Status + +- **Legacy Code**: Existing Dexie implementations being migrated +- **Target**: Absurd SQL with IndexedDB backend +- **Timeline**: Gradual migration as features are updated + +## Key Principles + +- **No New Dexie**: All new database operations use Absurd SQL +- **Migration Path**: Legacy code should be migrated when updated +- **Backward Compatibility**: Maintain existing functionality during + migration + +## Integration Points + +- Apply these rules when updating database-related code +- Use during feature development and refactoring +- Include in database architecture decisions + +--- + +**Status**: Legacy migration guidelines +**Priority**: Low +**Estimated Effort**: Ongoing reference +**Dependencies**: absurd-sql.mdc +**Stakeholders**: Database team, Development team + +All references in the codebase to Dexie apply only to migration from IndexedDb +to Sqlite and will be deprecated in future versions. + +## Model Implementation Checklist + +### Before Legacy Dexie Work + +- [ ] **Migration Analysis**: Identify legacy Dexie code that needs migration +- [ ] **Target Planning**: Plan migration to Absurd SQL with IndexedDB backend +- [ ] **Backward Compatibility**: Plan to maintain existing functionality +- [ ] **Testing Strategy**: Plan testing approach for migration + +### During Legacy Dexie Migration + +- [ ] **No New Dexie**: Ensure no new Dexie code is introduced +- [ ] **Migration Implementation**: Implement migration to Absurd SQL +- [ ] **Functionality Preservation**: Maintain existing functionality during migration +- [ ] **Error Handling**: Implement proper error handling for migration + +### After Legacy Dexie Migration + +- [ ] **Functionality Testing**: Verify all functionality still works correctly +- [ ] **Performance Validation**: Ensure performance meets or exceeds legacy +- [ ] **Documentation Update**: Update database documentation +- [ ] **Legacy Cleanup**: Remove deprecated Dexie code diff --git a/.cursor/rules/development/asset_configuration.mdc b/.cursor/rules/development/asset_configuration.mdc new file mode 100644 index 0000000..a53e9ff --- /dev/null +++ b/.cursor/rules/development/asset_configuration.mdc @@ -0,0 +1,105 @@ +--- +description: when doing anything with capacitor assets +alwaysApply: false +--- + +# Asset Configuration Directive + +**Author**: Matthew Raymer +**Date**: 2025-08-19 +**Status**: 🎯 **ACTIVE** - Asset management guidelines + +*Scope: Assets Only (icons, splashes, image pipelines) — not overall build +orchestration* + +## Intent + +- Version **asset configuration files** (optionally dev-time generated). + +- **Do not** version platform asset outputs (Android/iOS/Electron); generate + + them **at build-time** with standard tools. + +- Keep existing per-platform build scripts unchanged. + +## Source of Truth + +- **Preferred (Capacitor default):** `resources/` as the single master source. + +- **Alternative:** `assets/` is acceptable **only** if `capacitor-assets` is + + explicitly configured to read from it. + +- **Never** maintain both `resources/` and `assets/` as parallel sources. + + Migrate and delete the redundant folder. + +## Config Files + +- Live under: `config/assets/` (committed). + +- Examples: + + - `config/assets/capacitor-assets.config.json` (or the path the tool + + expects) + + - `config/assets/android.assets.json` + + - `config/assets/ios.assets.json` + + - `config/assets/common.assets.yaml` (optional shared layer) + +- **Dev-time generation allowed** for these configs; **build-time + + generation is forbidden**. + +## Build-Time Behavior + +- Build generates platform assets (not configs) using the standard chain: + +```bash + +npm run build:capacitor # web build via Vite (.mts) +npx cap sync +npx capacitor-assets generate # produces platform assets; not committed + +# then platform-specific build steps + +``` + +--- + +**Status**: Active asset management directive +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: capacitor-assets toolchain +**Stakeholders**: Development team, Build team + + npx capacitor-assets generate # produces platform assets; not committed + +# then platform-specific build steps + +## Model Implementation Checklist + +### Before Asset Configuration + +- [ ] **Source Review**: Identify current asset source location (`resources/` or + `assets/`) +- [ ] **Tool Assessment**: Verify capacitor-assets toolchain is available +- [ ] **Config Planning**: Plan configuration file structure and location +- [ ] **Platform Analysis**: Understand asset requirements for all target platforms + +### During Asset Configuration + +- [ ] **Source Consolidation**: Ensure single source of truth (prefer `resources/`) +- [ ] **Config Creation**: Create platform-specific asset configuration files +- [ ] **Tool Integration**: Configure capacitor-assets to read from correct source +- [ ] **Build Integration**: Integrate asset generation into build pipeline + +### After Asset Configuration + +- [ ] **Build Testing**: Verify assets generate correctly at build time +- [ ] **Platform Validation**: Test asset generation across all platforms +- [ ] **Documentation**: Update build documentation with asset generation steps +- [ ] **Team Communication**: Communicate asset workflow changes to team diff --git a/.cursor/rules/development/complexity_assessment.mdc b/.cursor/rules/development/complexity_assessment.mdc new file mode 100644 index 0000000..02b9756 --- /dev/null +++ b/.cursor/rules/development/complexity_assessment.mdc @@ -0,0 +1,177 @@ +# Complexity Assessment — Evaluation Frameworks + +> **Agent role**: Reference this file for + complexity evaluation frameworks when assessing project complexity. + +## 📊 Complexity Assessment Framework + +### **Technical Complexity Factors** + +#### **Code Changes** + +- **Simple**: Text, styling, configuration updates + +- **Medium**: New components, refactoring existing code + +- **Complex**: Architecture changes, new patterns, integrations + +- **Unknown**: New technologies, APIs, or approaches + +#### **Platform Impact** + +- **Single platform**: Web-only or mobile-only changes + +- **Two platforms**: Web + mobile or web + desktop + +- **Three platforms**: Web + mobile + desktop + +- **Cross-platform consistency**: Ensuring behavior matches across all platforms + +#### **Testing Requirements** + +- **Basic**: Unit tests for new functionality + +- **Comprehensive**: Integration tests, cross-platform testing + +- **User acceptance**: User testing, feedback integration + +- **Performance**: Load testing, optimization validation + +### **Dependency Complexity** + +#### **Internal Dependencies** + +- **Low**: Self-contained changes, no other components affected + +- **Medium**: Changes affect related components or services + +- **High**: Changes affect core architecture or multiple systems + +- **Critical**: Changes affect data models or core business logic + +#### **External Dependencies** + +- **None**: No external services or APIs involved + +- **Low**: Simple API calls or service integrations + +- **Medium**: Complex integrations with external systems + +- **High**: Third-party platform dependencies or complex APIs + +#### **Infrastructure Dependencies** + +- **None**: No infrastructure changes required + +- **Low**: Configuration updates or environment changes + +- **Medium**: New services or infrastructure components + +- **High**: Platform migrations or major infrastructure changes + +## 🔍 Complexity Evaluation Process + +### **Step 1: Technical Assessment** + +1. **Identify scope of changes** - what files/components are affected + +2. **Assess platform impact** - which platforms need updates + +3. **Evaluate testing needs** - what testing is required + +4. **Consider performance impact** - will this affect performance + +### **Step 2: Dependency Mapping** + +1. **Map internal dependencies** - what other components are affected + +2. **Identify external dependencies** - what external services are involved + +3. **Assess infrastructure needs** - what infrastructure changes are required + +4. **Evaluate risk factors** - what could go wrong + +### **Step 3: Complexity Classification** + +1. **Assign complexity levels** to each factor + +2. **Identify highest complexity** areas that need attention + +3. **Plan mitigation strategies** for high-complexity areas + +4. **Set realistic expectations** based on complexity assessment + +## 📋 Complexity Assessment Checklist + +- [ ] Technical scope identified and mapped + +- [ ] Platform impact assessed across all targets + +- [ ] Testing requirements defined and planned + +- [ ] Internal dependencies mapped and evaluated + +- [ ] External dependencies identified and assessed + +- [ ] Infrastructure requirements evaluated + +- [ ] Risk factors identified and mitigation planned + +- [ ] Complexity levels assigned to all factors + +- [ ] Realistic expectations set based on assessment + +## 🎯 Complexity Reduction Strategies + +### **Scope Reduction** + +- Break large features into smaller, manageable pieces + +- Focus on core functionality first, add polish later + +- Consider phased rollout to reduce initial complexity + +### **Dependency Management** + +- Minimize external dependencies when possible + +- Use abstraction layers to isolate complex integrations + +- Plan for dependency failures and fallbacks + +### **Testing Strategy** + +- Start with basic testing and expand coverage + +- Use automated testing to reduce manual testing complexity + +- Plan for iterative testing and feedback cycles + +## **See also** + +- `.cursor/rules/development/realistic_time_estimation.mdc` for the core principles + +- `.cursor/rules/development/planning_examples.mdc` for planning examples + +## Model Implementation Checklist + +### Before Complexity Assessment + +- [ ] **Problem Scope**: Clearly define the problem to be assessed +- [ ] **Stakeholder Identification**: Identify all parties affected by complexity +- [ ] **Context Analysis**: Understand technical and business context +- [ ] **Assessment Criteria**: Define what factors determine complexity + +### During Complexity Assessment + +- [ ] **Technical Mapping**: Map technical scope and platform impact +- [ ] **Dependency Analysis**: Identify internal and external dependencies +- [ ] **Risk Evaluation**: Assess infrastructure needs and risk factors +- [ ] **Complexity Classification**: Assign complexity levels to all factors + +### After Complexity Assessment + +- [ ] **Mitigation Planning**: Plan strategies for high-complexity areas +- [ ] **Expectation Setting**: Set realistic expectations based on assessment +- [ ] **Documentation**: Document assessment process and findings +- [ ] **Stakeholder Communication**: Share results and recommendations diff --git a/.cursor/rules/development/dependency_management.mdc b/.cursor/rules/development/dependency_management.mdc new file mode 100644 index 0000000..a92f070 --- /dev/null +++ b/.cursor/rules/development/dependency_management.mdc @@ -0,0 +1,177 @@ +# Dependency Management — Best Practices + +> **Agent role**: Reference this file for dependency management strategies and + best practices when working with software projects. + +## Dependency Management Best Practices + +### Pre-build Validation + +- **Check Critical Dependencies**: + + Validate essential tools before executing build + scripts + +- **Use npx for Local Dependencies**: Prefer `npx tsx` over direct `tsx` to + + avoid PATH issues + +- **Environment Consistency**: Ensure all team members have identical dependency + + versions + +### Common Pitfalls + +- **Missing npm install**: Team members cloning without running `npm install` + +- **PATH Issues**: Direct command execution vs. npm script execution differences + +- **Version Mismatches**: Different Node.js/npm versions across team members + +### Validation Strategies + +- **Dependency Check Scripts**: Implement pre-build validation for critical + + dependencies + +- **Environment Requirements**: + + Document and enforce minimum Node.js/npm versions + +- **Onboarding Checklist**: Standardize team member setup procedures + +### Error Messages and Guidance + +- **Specific Error Context**: + + Provide clear guidance when dependency issues occur + +- **Actionable Solutions**: Direct users to specific commands (`npm install`, + + `npm run check:dependencies`) + +- **Environment Diagnostics**: Implement comprehensive environment validation + + tools + +### Build Script Enhancements + +- **Early Validation**: Check dependencies before starting build processes + +- **Graceful Degradation**: Continue builds when possible but warn about issues + +- **Helpful Tips**: Remind users about dependency management best practices + +## Environment Setup Guidelines + +### Required Tools + +- **Node.js**: Minimum version requirements and LTS recommendations + +- **npm**: Version compatibility and global package management + +- **Platform-specific tools**: Android SDK, Xcode, etc. + +### Environment Variables + +- **NODE_ENV**: Development, testing, production environments + +- **PATH**: Ensure tools are accessible from command line + +- **Platform-specific**: Android SDK paths, Xcode command line tools + +### Validation Commands + +```bash + +# Check Node.js version + +node --version + +# Check npm version + +npm --version + +# Check global packages + +npm list -g --depth=0 + +# Validate platform tools + +npx capacitor doctor + +``` + +## Dependency Troubleshooting + +### Common Issues + +1. **Permission Errors**: Use `sudo` sparingly, prefer `npm config set prefix` + +2. **Version Conflicts**: Use `npm ls` to identify dependency conflicts + +3. **Cache Issues**: Clear npm cache with `npm cache clean --force` + +4. **Lock File Issues**: Delete `package-lock.json` and `node_modules`, + + then reinstall + +### Resolution Strategies + +- **Dependency Audit**: Run `npm audit` to identify security issues + +- **Version Pinning**: Use exact versions for critical dependencies + +- **Peer Dependency Management**: Ensure compatible versions across packages + +- **Platform-specific Dependencies**: Handle different requirements per platform + +## Best Practices for Teams + +### Onboarding + +- **Environment Setup Script**: Automated setup for new team members + +- **Version Locking**: Use `package-lock.json` and `yarn.lock` consistently + +- **Documentation**: Clear setup instructions with troubleshooting steps + +### Maintenance + +- **Regular Updates**: Schedule dependency updates and security patches + +- **Testing**: Validate changes don't break existing functionality + +- **Rollback Plan**: Maintain ability to revert to previous working versions + +**See also**: + `.cursor/rules/development/software_development.mdc` for core development principles. + +**Status**: Active dependency management guidelines +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: software_development.mdc +**Stakeholders**: Development team, DevOps team + +## Model Implementation Checklist + +### Before Dependency Changes + +- [ ] **Current State Review**: Check current dependency versions and status +- [ ] **Impact Analysis**: Assess impact of dependency changes on codebase +- [ ] **Compatibility Check**: Verify compatibility with existing code +- [ ] **Security Review**: Review security implications of dependency changes + +### During Dependency Management + +- [ ] **Version Selection**: Choose appropriate dependency versions +- [ ] **Testing**: Test with new dependency versions +- [ ] **Documentation**: Update dependency documentation +- [ ] **Team Communication**: Communicate changes to team members + +### After Dependency Changes + +- [ ] **Comprehensive Testing**: Test all functionality with new dependencies +- [ ] **Documentation Update**: Update all relevant documentation +- [ ] **Deployment Planning**: Plan and execute deployment strategy +- [ ] **Monitoring**: Monitor for issues after deployment diff --git a/.cursor/rules/development/development_guide.mdc b/.cursor/rules/development/development_guide.mdc new file mode 100644 index 0000000..092ffb9 --- /dev/null +++ b/.cursor/rules/development/development_guide.mdc @@ -0,0 +1,33 @@ +--- +globs: **/src/**/* +alwaysApply: false +--- +✅ use system date command to timestamp all interactions with accurate date and + time +✅ python script files must always have a blank line at their end +✅ remove whitespace at the end of lines +✅ use npm run lint-fix to check for warnings +✅ do not use npm run dev let me handle running and supplying feedback + +## Model Implementation Checklist + +### Before Development Work + +- [ ] **System Date Check**: Use system date command for accurate timestamps +- [ ] **Environment Setup**: Verify development environment is ready +- [ ] **Linting Setup**: Ensure npm run lint-fix is available +- [ ] **Code Standards**: Review project coding standards and requirements + +### During Development + +- [ ] **Timestamp Usage**: Include accurate timestamps in all interactions +- [ ] **Code Quality**: Use npm run lint-fix to check for warnings +- [ ] **File Standards**: Ensure Python files have blank line at end +- [ ] **Whitespace**: Remove trailing whitespace from all lines + +### After Development + +- [ ] **Linting Check**: Run npm run lint-fix to verify code quality +- [ ] **File Validation**: Confirm Python files end with blank line +- [ ] **Whitespace Review**: Verify no trailing whitespace remains +- [ ] **Documentation**: Update relevant documentation with changes diff --git a/.cursor/rules/development/historical_comment_management.mdc b/.cursor/rules/development/historical_comment_management.mdc new file mode 100644 index 0000000..9634e9d --- /dev/null +++ b/.cursor/rules/development/historical_comment_management.mdc @@ -0,0 +1,119 @@ +# Historical Comment Management — Code Clarity Guidelines + +> **Agent role**: When encountering historical comments about removed +> methods, deprecated patterns, or architectural changes, apply these +> guidelines to maintain code clarity and developer guidance. + +## Overview + +Historical comments should either be **removed entirely** or **transformed +into actionable guidance** for future developers. Avoid keeping comments +that merely state what was removed without explaining why or what to do +instead. + +## Decision Framework + +### When to Remove Comments + +- **Obsolete Information**: Comment describes functionality that no + longer exists +- **Outdated Context**: Comment refers to old patterns that are no + longer relevant +- **No Actionable Value**: Comment doesn't help future developers + make decisions + +### When to Transform Comments + +- **Migration Guidance**: Future developers might need to understand + the evolution +- **Alternative Approaches**: The comment can guide future + implementation choices +- **Historical Context**: Understanding the change helps with + current decisions + +## Transformation Patterns + +### 1. **Removed Method** → **Alternative Approach** + +```typescript +// Before: Historical comment +// turnOffNotifyingFlags method removed - notification state is now +// managed by NotificationSection component + +// After: Actionable guidance +// Note: Notification state management has been migrated to +// NotificationSection component +``` + +### 2. **Deprecated Pattern** → **Current Best Practice** + +```typescript +// Before: Historical comment +// Database access has been migrated from direct IndexedDB calls to +// PlatformServiceMixin + +// After: Actionable guidance +// This provides better platform abstraction and consistent error +// handling across web/mobile/desktop + +// When adding new database operations, use this.$getContact(), +// this.$saveSettings(), etc. +``` + +## Best Practices + +### 1. **Use Actionable Language**: Guide future decisions, not just + +document history + +### 2. **Provide Alternatives**: Always suggest what to use instead + +### 3. **Update Related Docs**: If removing from code, consider + +adding to documentation + +### 4. **Keep Context**: Include enough information to understand + +why the change was made + +## Integration Points + +- Apply these rules when reviewing code changes +- Use during code cleanup and refactoring +- Include in code review checklists + +--- + +**See also**: + +- `.cursor/rules/development/historical_comment_patterns.mdc` for detailed + transformation examples and patterns + +**Status**: Active comment management guidelines +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: None +**Stakeholders**: Development team, Code reviewers + +## Model Implementation Checklist + +### Before Comment Review + +- [ ] **Code Analysis**: Review code for historical or outdated comments +- [ ] **Context Understanding**: Understand the current state of the codebase +- [ ] **Pattern Identification**: Identify comments that need transformation or removal +- [ ] **Documentation Planning**: Plan where to move important historical context + +### During Comment Management + +- [ ] **Transformation**: Convert historical comments to actionable guidance +- [ ] **Alternative Provision**: Suggest current best practices and alternatives +- [ ] **Context Preservation**: Maintain enough information to understand changes +- [ ] **Documentation Update**: Move important context to appropriate documentation + +### After Comment Management + +- [ ] **Code Review**: Ensure transformed comments provide actionable value +- [ ] **Documentation Sync**: Verify related documentation is updated +- [ ] **Team Communication**: Share comment transformation patterns with team +- [ ] **Process Integration**: Include comment management in code review checklists diff --git a/.cursor/rules/development/historical_comment_patterns.mdc b/.cursor/rules/development/historical_comment_patterns.mdc new file mode 100644 index 0000000..47dc60b --- /dev/null +++ b/.cursor/rules/development/historical_comment_patterns.mdc @@ -0,0 +1,139 @@ +# Historical Comment Patterns — Transformation Examples + +> **Agent role**: Reference this file for specific patterns and + examples when transforming historical comments into actionable guidance. + +## 🔄 Transformation Patterns + +### 1. From Removal Notice to Migration Note + +```typescript + +// ❌ REMOVE THIS +// turnOffNotifyingFlags method removed - + notification state is now managed by NotificationSection component + +// ✅ TRANSFORM TO THIS +// Note: Notification state management has been migrated to NotificationSection + component +// which handles its own lifecycle and persistence via PlatformServiceMixin + +``` + +### 2. From Deprecation Notice to Implementation Guide + +```typescript + +// ❌ REMOVE THIS +// This will be handled by the NewComponent now +// No need to call oldMethod() as it's no longer needed + +// ✅ TRANSFORM TO THIS +// Note: This functionality has been migrated to NewComponent +// which provides better separation of concerns and testability + +``` + +### 3. From Historical Note to Architectural Context + +```typescript + +// ❌ REMOVE THIS +// Old approach: used direct database calls +// New approach: uses service layer + +// ✅ TRANSFORM TO THIS +// Note: Database access has been abstracted through service layer +// for better testability and platform independence + +``` + +## 🚫 Anti-Patterns to Remove + +- Comments that only state what was removed + +- Comments that don't explain the current approach + +- Comments that reference non-existent methods + +- Comments that are self-evident from the code + +- Comments that don't help future decision-making + +## 📚 Examples + +### Good Historical Comment (Keep & Transform) + +```typescript + +// Note: Database access has been migrated from direct IndexedDB calls to + PlatformServiceMixin +// This provides better platform abstraction and + consistent error handling across web/mobile/desktop +// When adding new database operations, use this.$getContact(), + this.$saveSettings(), etc. + +``` + +### Bad Historical Comment (Remove) + +```typescript + +// Old method getContactFromDB() removed - now handled by PlatformServiceMixin +// No need to call the old method anymore + +``` + +## 🎯 When to Use Each Pattern + +### Migration Notes + +- Use when functionality has moved to a different component/service + +- Explain the new location and why it's better + +- Provide guidance on how to use the new approach + +### Implementation Guides + +- Use when patterns have changed significantly + +- Explain the architectural benefits + +- Show how to implement the new pattern + +### Architectural Context + +- Use when the change represents a system-wide improvement + +- Explain the reasoning behind the change + +- Help future developers understand the evolution + +--- + +**See also**: `.cursor/rules/development/historical_comment_management.mdc` for + the core decision framework and best practices. + +## Model Implementation Checklist + +### Before Comment Review + +- [ ] **Code Analysis**: Review code for historical or outdated comments +- [ ] **Pattern Identification**: Identify comments that need transformation or removal +- [ ] **Context Understanding**: Understand the current state of the codebase +- [ ] **Transformation Planning**: Plan how to transform or remove comments + +### During Comment Transformation + +- [ ] **Pattern Selection**: Choose appropriate transformation pattern +- [ ] **Content Creation**: Create actionable guidance for future developers +- [ ] **Alternative Provision**: Suggest current best practices and approaches +- [ ] **Context Preservation**: Maintain enough information to understand changes + +### After Comment Transformation + +- [ ] **Code Review**: Ensure transformed comments provide actionable value +- [ ] **Pattern Documentation**: Document transformation patterns for team use +- [ ] **Team Communication**: Share comment transformation patterns with team +- [ ] **Process Integration**: Include comment patterns in code review checklists diff --git a/.cursor/rules/development/investigation_report_example.mdc b/.cursor/rules/development/investigation_report_example.mdc new file mode 100644 index 0000000..8014105 --- /dev/null +++ b/.cursor/rules/development/investigation_report_example.mdc @@ -0,0 +1,178 @@ +# Investigation Report Example + +**Author**: Matthew Raymer +**Date**: 2025-08-19 +**Status**: 🎯 **ACTIVE** - Investigation methodology example + +## Investigation — Registration Dialog Test Flakiness + +## Objective + +Identify root cause of flaky tests related to registration dialogs in contact +import scenarios. + +## System Map + +- User action → ContactInputForm → ContactsView.addContact() → + + handleRegistrationPrompt() + +- setTimeout(1000ms) → Modal dialog → User response → Registration API call + +- Test execution → Wait for dialog → Assert dialog content → Click response + + button + +## Findings (Evidence) + +- **1-second timeout causes flakiness** — evidence: + + `src/views/ContactsView.vue:971-1000`; setTimeout(..., 1000) in + handleRegistrationPrompt() + +- **Import flow bypasses dialogs** — evidence: + + `src/views/ContactImportView.vue:500-520`; importContacts() calls + $insertContact() directly, no handleRegistrationPrompt() + +- **Dialog only appears in direct add flow** — evidence: + + `src/views/ContactsView.vue:774-800`; addContact() calls + handleRegistrationPrompt() after database insert + +## Hypotheses & Failure Modes + +- H1: 1-second timeout makes dialog appearance unpredictable; would fail when + + tests run faster than 1000ms + +- H2: Test environment timing differs from development; watch for CI vs local + + test differences + +## Corrections + +- Updated: "Multiple dialogs interfere with imports" → "Import flow never + + triggers dialogs - they only appear in direct contact addition" + +- Updated: "Complex batch registration needed" → "Simple timeout removal and + + test mode flag sufficient" + +## Diagnostics (Next Checks) + +- [ ] Repro on CI environment vs local + +- [ ] Measure actual dialog appearance timing + +- [ ] Test with setTimeout removed + +- [ ] Verify import flow doesn't call handleRegistrationPrompt + +## Risks & Scope + +- Impacted: Contact addition tests, registration workflow tests; Data: None; + + Users: Test suite reliability + +## Decision / Next Steps + +- Owner: Development Team; By: 2025-01-28 + +- Action: Remove 1-second timeout + add test mode flag; Exit criteria: Tests + + pass consistently + +## References + +- `src/views/ContactsView.vue:971-1000` + +- `src/views/ContactImportView.vue:500-520` + +- `src/views/ContactsView.vue:774-800` + +## Competence Hooks + +- Why this works: Code path tracing revealed separate execution flows, + + evidence disproved initial assumptions + +- Common pitfalls: Assuming related functionality without tracing execution + + paths, over-engineering solutions to imaginary problems + +- Next skill: Learn to trace code execution before proposing architectural + + changes + +- Teach-back: "What evidence shows that contact imports bypass registration + + dialogs?" + +## Key Learning Points + +### Evidence-First Approach + +This investigation demonstrates the importance of: + +1. **Tracing actual code execution** rather than making assumptions + +2. **Citing specific evidence** with file:line references + +3. **Validating problem scope** before proposing solutions + +4. **Considering simpler alternatives** before complex architectural changes + +### Code Path Tracing Value + +By tracing the execution paths, we discovered: + +- Import flow and direct add flow are completely separate + +- The "multiple dialog interference" problem didn't exist + +- A simple timeout removal would solve the actual issue + +### Prevention of Over-Engineering + +The investigation prevented: + +- Unnecessary database schema changes + +- Complex batch registration systems + +- Migration scripts for non-existent problems + +- Architectural changes based on assumptions + +--- + +**Status**: Active investigation methodology +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: software_development.mdc +**Stakeholders**: Development team, QA team + +## Model Implementation Checklist + +### Before Investigation + +- [ ] **Problem Definition**: Clearly define the problem to investigate +- [ ] **Scope Definition**: Determine investigation scope and boundaries +- [ ] **Methodology Planning**: Plan investigation approach and methods +- [ ] **Resource Assessment**: Identify required resources and tools + +### During Investigation + +- [ ] **Evidence Collection**: Gather relevant evidence and data systematically +- [ ] **Code Path Tracing**: Map execution flow for software investigations +- [ ] **Analysis**: Analyze evidence using appropriate methods +- [ ] **Documentation**: Document investigation process and findings + +### After Investigation + +- [ ] **Synthesis**: Synthesize findings into actionable insights +- [ ] **Report Creation**: Create comprehensive investigation report +- [ ] **Recommendations**: Provide clear, actionable recommendations +- [ ] **Team Communication**: Share findings and next steps with team diff --git a/.cursor/rules/development/logging_migration.mdc b/.cursor/rules/development/logging_migration.mdc new file mode 100644 index 0000000..bbb0c97 --- /dev/null +++ b/.cursor/rules/development/logging_migration.mdc @@ -0,0 +1,358 @@ +--- +alwaysApply: false +--- + +# Logging Migration — Patterns and Examples + +> **Agent role**: Reference this file for specific migration patterns and + examples when converting console.* calls to logger usage. + +## Migration — Auto‑Rewrites (Apply Every Time) + +### Exact Transforms + +- `console.debug(...)` → `logger.debug(...)` + +- `console.log(...)` → `logger.log(...)` (or `logger.info(...)` when + + clearly stateful) + +- `console.info(...)` → `logger.info(...)` + +- `console.warn(...)` → `logger.warn(...)` + +- `console.error(...)` → `logger.error(...)` + +### Multi-arg Handling + +- First arg becomes `message` (stringify safely if non-string). + +- Remaining args map 1:1 to `...args`: + + `console.info(msg, a, b)` → `logger.info(String(msg), a, b)` + +### Sole `Error` + +- `console.error(err)` → `logger.error(err.message, err)` + +### Object-wrapping Cleanup + +Replace `{{ userId, meta }}` wrappers with separate args: +`logger.info('User signed in', userId, meta)` + +## Level Guidelines with Examples + +### DEBUG Examples + +```typescript + +logger.debug('[HomeView] reloadFeedOnChange() called'); +logger.debug('[HomeView] Current filter settings', + settings.filterFeedByVisible, + settings.filterFeedByNearby, + settings.searchBoxes?.length ?? 0); +logger.debug('[FeedFilters] Toggling nearby filter', + this.isNearby, this.settingChanged, this.activeDid); + +``` + +**Avoid**: Vague messages (`'Processing data'`). + +### INFO Examples + +```typescript + +logger.info('[StartView] Component mounted', process.env.VITE_PLATFORM); +logger.info('[StartView] User selected new seed generation'); +logger.info('[SearchAreaView] Search box stored', + searchBox.name, searchBox.bbox); +logger.info('[ContactQRScanShowView] Contact registration OK', + contact.did); + +``` + +**Avoid**: Diagnostic details that belong in `debug`. + +### WARN Examples + +```typescript + +logger.warn('[ContactQRScanShowView] Invalid scan result – no value', + resultType); +logger.warn('[ContactQRScanShowView] Invalid QR format – no JWT in URL'); +logger.warn('[ContactQRScanShowView] JWT missing "own" field'); + +``` + +**Avoid**: Hard failures (those are `error`). + +### ERROR Examples + +```typescript + +logger.error('[HomeView Settings] initializeIdentity() failed', err); +logger.error('[StartView] Failed to load initialization data', error); +logger.error('[ContactQRScanShowView] Error processing contact QR', + error, rawValue); + +``` + +**Avoid**: Expected user cancels (use `info`/`debug`). + +## Context Hygiene Examples + +### Component Context + +```typescript + +const log = logger.withContext('UserService'); +log.info('User created', userId); +log.error('Failed to create user', error); + +``` + +If not using `withContext`, prefix message with `[ComponentName]`. + +### Emoji Guidelines + +Recommended set for visual scanning: + +- Start/finish: 🚀 / ✅ + +- Retry/loop: 🔄 + +- External call: 📡 + +- Data/metrics: 📊 + +- Inspection: 🔍 + +## Quick Before/After + +### **Before** + +```typescript + +console.log('User signed in', user.id, meta); +console.error('Failed to update profile', err); +console.info('Filter toggled', this.hasVisibleDid); + +``` + +### **After** + +```typescript + +import { logger } from '@/utils/logger'; + +logger.info('User signed in', user.id, meta); +logger.error('Failed to update profile', err); +logger.debug('[FeedFilters] Filter toggled', this.hasVisibleDid); + +``` + +## Checklist (for every PR) + +- [ ] No `console.*` (or properly pragma'd in the allowed locations) + +- [ ] Correct import path for `logger` + +- [ ] Rest-parameter call shape (`message, ...args`) + +- [ ] Right level chosen (debug/info/warn/error) + +- [ ] No secrets / oversized payloads / throwaway context objects + +- [ ] Component context provided (scoped logger or `[Component]` prefix) + +**See also**: + `.cursor/rules/development/logging_standards.mdc` for the core standards and rules. + +# Logging Migration — Patterns and Examples + +> **Agent role**: Reference this file for specific migration patterns and + examples when converting console.* calls to logger usage. + +## Migration — Auto‑Rewrites (Apply Every Time) + +### Exact Transforms + +- `console.debug(...)` → `logger.debug(...)` + +- `console.log(...)` → `logger.log(...)` (or `logger.info(...)` when + + clearly stateful) + +- `console.info(...)` → `logger.info(...)` + +- `console.warn(...)` → `logger.warn(...)` + +- `console.error(...)` → `logger.error(...)` + +### Multi-arg Handling + +- First arg becomes `message` (stringify safely if non-string). + +- Remaining args map 1:1 to `...args`: + + `console.info(msg, a, b)` → `logger.info(String(msg), a, b)` + +### Sole `Error` + +- `console.error(err)` → `logger.error(err.message, err)` + +### Object-wrapping Cleanup + +Replace `{{ userId, meta }}` wrappers with separate args: +`logger.info('User signed in', userId, meta)` + +## Level Guidelines with Examples + +### DEBUG Examples + +```typescript + +logger.debug('[HomeView] reloadFeedOnChange() called'); +logger.debug('[HomeView] Current filter settings', + settings.filterFeedByVisible, + settings.filterFeedByNearby, + settings.searchBoxes?.length ?? 0); +logger.debug('[FeedFilters] Toggling nearby filter', + this.isNearby, this.settingChanged, this.activeDid); + +``` + +**Avoid**: Vague messages (`'Processing data'`). + +### INFO Examples + +```typescript + +logger.info('[StartView] Component mounted', process.env.VITE_PLATFORM); +logger.info('[StartView] User selected new seed generation'); +logger.info('[SearchAreaView] Search box stored', + searchBox.name, searchBox.bbox); +logger.info('[ContactQRScanShowView] Contact registration OK', + contact.did); + +``` + +**Avoid**: Diagnostic details that belong in `debug`. + +### WARN Examples + +```typescript + +logger.warn('[ContactQRScanShowView] Invalid scan result – no value', + resultType); +logger.warn('[ContactQRScanShowView] Invalid QR format – no JWT in URL'); +logger.warn('[ContactQRScanShowView] JWT missing "own" field'); + +``` + +**Avoid**: Hard failures (those are `error`). + +### ERROR Examples + +```typescript + +logger.error('[HomeView Settings] initializeIdentity() failed', err); +logger.error('[StartView] Failed to load initialization data', error); +logger.error('[ContactQRScanShowView] Error processing contact QR', + error, rawValue); + +``` + +**Avoid**: Expected user cancels (use `info`/`debug`). + +## Context Hygiene Examples + +### Component Context + +```typescript + +const log = logger.withContext('UserService'); +log.info('User created', userId); +log.error('Failed to create user', error); + +``` + +If not using `withContext`, prefix message with `[ComponentName]`. + +### Emoji Guidelines + +Recommended set for visual scanning: + +- Start/finish: 🚀 / ✅ + +- Retry/loop: 🔄 + +- External call: 📡 + +- Data/metrics: 📊 + +- Inspection: 🔍 + +## Quick Before/After + +### **Before** + +```typescript + +console.log('User signed in', user.id, meta); +console.error('Failed to update profile', err); +console.info('Filter toggled', this.hasVisibleDid); + +``` + +### **After** + +```typescript + +import { logger } from '@/utils/logger'; + +logger.info('User signed in', user.id, meta); +logger.error('Failed to update profile', err); +logger.debug('[FeedFilters] Filter toggled', this.hasVisibleDid); + +``` + +## Checklist (for every PR) + +- [ ] No `console.*` (or properly pragma'd in the allowed locations) + +- [ ] Correct import path for `logger` + +- [ ] Rest-parameter call shape (`message, ...args`) + +- [ ] Right level chosen (debug/info/warn/error) + +- [ ] No secrets / oversized payloads / throwaway context objects + +- [ ] Component context provided (scoped logger or `[Component]` prefix) + +**See also**: + `.cursor/rules/development/logging_standards.mdc` for the core standards and rules. + +## Model Implementation Checklist + +### Before Logging Migration + +- [ ] **Code Review**: Identify all `console.*` calls in the codebase +- [ ] **Logger Import**: Verify logger utility is available and accessible +- [ ] **Context Planning**: Plan component context for each logging call +- [ ] **Level Assessment**: Determine appropriate log levels for each call + +### During Logging Migration + +- [ ] **Import Replacement**: Replace `console.*` with `logger.*` calls +- [ ] **Context Addition**: Add component context using scoped logger or prefix +- [ ] **Level Selection**: Choose appropriate log level (debug/info/warn/error) +- [ ] **Parameter Format**: Use rest-parameter call shape (`message, ...args`) + +### After Logging Migration + +- [ ] **Console Check**: Ensure no `console.*` methods remain (unless pragma'd) +- [ ] **Context Validation**: Verify all logging calls have proper context +- [ ] **Level Review**: Confirm log levels are appropriate for each situation +- [ ] **Testing**: Test logging functionality across all platforms diff --git a/.cursor/rules/development/logging_standards.mdc b/.cursor/rules/development/logging_standards.mdc new file mode 100644 index 0000000..5086567 --- /dev/null +++ b/.cursor/rules/development/logging_standards.mdc @@ -0,0 +1,176 @@ +# Agent Contract — TimeSafari Logging (Unified, MANDATORY) + +**Author**: Matthew Raymer +**Date**: 2025-08-19 +**Status**: 🎯 **ACTIVE** - Mandatory logging standards + +## Overview + +This document defines unified logging standards for the TimeSafari project, +ensuring consistent, rest-parameter logging style using the project logger. +No `console.*` methods are allowed in production code. + +## Scope and Goals + +**Scope**: Applies to all diffs and generated code in this workspace unless +explicitly exempted below. + +**Goal**: One consistent, rest-parameter logging style using the project +logger; no `console.*` in production code. + +## Non‑Negotiables (DO THIS) + +- You **MUST** use the project logger; **DO NOT** use any `console.*` + + methods. + +- Import exactly as: + + - `import { logger } from '@/utils/logger'` + + - If `@` alias is unavailable, compute the correct relative path (do not + + fail). + +- Call signatures use **rest parameters**: `logger.info(message, ...args)` + +- Prefer primitives/IDs and small objects in `...args`; **never build a + + throwaway object** just to "wrap context". + +- Production defaults: Web = `warn+`, Electron = `error`, Dev/Capacitor = + + `info+` (override via `VITE_LOG_LEVEL`). + +- **Database persistence**: `info|warn|error` are persisted; `debug` is not. + + Use `logger.toDb(msg, level?)` for DB-only. + +## Available Logger API (Authoritative) + +- `logger.debug(message, ...args)` — verbose internals, timings, input/output + + shapes + +- `logger.log(message, ...args)` — synonym of `info` for general info + +- `logger.info(message, ...args)` — lifecycle, state changes, success paths + +- `logger.warn(message, ...args)` — recoverable issues, retries, degraded mode + +- `logger.error(message, ...args)` — failures, thrown exceptions, aborts + +- `logger.toDb(message, level?)` — DB-only entry (default level = `info`) + +- `logger.toConsoleAndDb(message, isError)` — console + DB (use sparingly) + +- `logger.withContext(componentName)` — returns a scoped logger + +## Level Guidelines (Use These Heuristics) + +### DEBUG + +Use for method entry/exit, computed values, filters, loops, retries, and +external call payload sizes. + +### INFO + +Use for user-visible lifecycle and completed operations. + +### WARN + +Use for recoverable issues, fallbacks, unexpected-but-handled conditions. + +### ERROR + +Use for unrecoverable failures, data integrity issues, and thrown +exceptions. + +## Context Hygiene (Consistent, Minimal, Helpful) + +- **Component context**: Prefer scoped logger. + +- **Emojis**: Optional and minimal for visual scanning. + +- **Sensitive data**: Never log secrets (tokens, keys, passwords) or + payloads >10KB. Prefer IDs over objects; redact/hash when needed. + +## DB Logging Rules + +- `debug` **never** persists automatically. + +- `info|warn|error` persist automatically. + +- For DB-only events (no console), call `logger.toDb('Message', + 'info'|'warn'|'error')`. + +## Exceptions (Tightly Scoped) + +Allowed paths (still prefer logger): + +- `**/*.test.*`, `**/*.spec.*` + +- `scripts/dev/**`, `scripts/migrate/**` + +To intentionally keep `console.*`, add a pragma on the previous line: + +```typescript + +// cursor:allow-console reason="short justification" +console.log('temporary output'); + +``` + +## CI & Diff Enforcement + +- Do not introduce `console.*` anywhere outside allowed, pragma'd spots. + +- If an import is missing, insert it and resolve alias/relative path + correctly. + +- Enforce rest-parameter call shape in reviews; replace object-wrapped + context. + +- Ensure environment log level rules remain intact (`VITE_LOG_LEVEL` + respected). + +--- + +**See also**: + `.cursor/rules/development/logging_migration.mdc` for migration patterns and examples. + +**Status**: Active and enforced +**Priority**: Critical +**Estimated Effort**: Ongoing reference +**Dependencies**: TimeSafari logger utility +**Stakeholders**: Development team, Code review team + +## Model Implementation Checklist + +### Before Adding Logging + +- [ ] **Logger Import**: Import logger as `import { logger } from + '@/utils/logger'` +- [ ] **Log Level Selection**: Determine appropriate log level + (debug/info/warn/error) +- [ ] **Context Planning**: Plan what context information to include +- [ ] **Sensitive Data Review**: Identify any sensitive data that needs redaction + +### During Logging Implementation + +- [ ] **Rest Parameters**: Use `logger.info(message, ...args)` format, not object + wrapping +- [ ] **Context Addition**: Include relevant IDs, primitives, or small objects in + args +- [ ] **Level Appropriateness**: Use correct log level for the situation +- [ ] **Scoped Logger**: Use `logger.withContext(componentName)` for + component-specific logging + +### After Logging Implementation + +- [ ] **Console Check**: Ensure no `console.*` methods are used (unless in + allowed paths) +- [ ] **Performance Review**: Verify logging doesn't impact performance +- [ ] **DB Persistence**: Use `logger.toDb()` for database-only logging if needed +- [ ] **Environment Compliance**: Respect `VITE_LOG_LEVEL` environment + variable diff --git a/.cursor/rules/development/planning_examples.mdc b/.cursor/rules/development/planning_examples.mdc new file mode 100644 index 0000000..310d73c --- /dev/null +++ b/.cursor/rules/development/planning_examples.mdc @@ -0,0 +1,160 @@ +# Planning Examples — No Time Estimates + +> **Agent role**: Reference this file for detailed planning examples and + anti-patterns when creating project plans. + +## 🎯 Example Planning (No Time Estimates) + +### **Example 1: Simple Feature** + +``` + +Phase 1: Core implementation + +- Basic functionality + +- Single platform support + +- Unit tests + +Phase 2: Platform expansion + +- Multi-platform support + +- Integration tests + +Phase 3: Polish + +- User testing + +- Edge case handling + +``` + +### **Example 2: Complex Cross-Platform Feature** + +``` + +Phase 1: Foundation + +- Architecture design + +- Core service implementation + +- Basic web platform support + +Phase 2: Platform Integration + +- Mobile platform support + +- Desktop platform support + +- Cross-platform consistency + +Phase 3: Testing & Polish + +- Comprehensive testing + +- Error handling + +- User experience refinement + +``` + +## 🚫 Anti-Patterns to Avoid + +- **"This should take X days"** - Red flag for time estimation + +- **"Just a few hours"** - Ignores complexity and testing + +- **"Similar to X"** - Without considering differences + +- **"Quick fix"** - Nothing is ever quick in software + +- **"No testing needed"** - Testing always takes effort + +## ✅ Best Practices + +### **When Planning:** + +1. **Break down everything** - no work is too small to plan + +2. **Consider all platforms** - web, mobile, desktop differences + +3. **Include testing strategy** - unit, integration, and user testing + +4. **Account for unknowns** - there are always surprises + +5. **Focus on dependencies** - what blocks what + +### **When Presenting Plans:** + +1. **Show the phases** - explain the logical progression + +2. **Highlight dependencies** - what could block progress + +3. **Define milestones** - clear success criteria + +4. **Identify risks** - what could go wrong + +5. **Suggest alternatives** - ways to reduce scope or complexity + +## 🔄 Continuous Improvement + +### **Track Progress** + +- Record planned vs. actual phases completed + +- Identify what took longer than expected + +- Learn from complexity misjudgments + +- Adjust planning process based on experience + +### **Learn from Experience** + +- **Underestimated complexity**: Increase complexity categories + +- **Missed dependencies**: Improve dependency mapping + +- **Platform surprises**: Better platform research upfront + +## 🎯 Integration with Harbor Pilot + +This rule works in conjunction with: + +- **Project Planning**: Focuses on phases and milestones + +- **Resource Allocation**: Based on complexity, not time + +- **Risk Management**: Identifies blockers and dependencies + +- **Stakeholder Communication**: Sets progress-based expectations + +--- + +**See also**: `.cursor/rules/development/realistic_time_estimation.mdc` for + the core principles and framework. + +## Model Implementation Checklist + +### Before Planning + +- [ ] **Requirements Review**: Understand all requirements completely +- [ ] **Stakeholder Input**: Gather input from all stakeholders +- [ ] **Complexity Assessment**: Evaluate technical and business complexity +- [ ] **Platform Analysis**: Consider requirements across all target platforms + +### During Planning + +- [ ] **Phase Definition**: Define clear phases and milestones +- [ ] **Dependency Mapping**: Map dependencies between tasks +- [ ] **Risk Identification**: Identify potential risks and challenges +- [ ] **Testing Strategy**: Plan comprehensive testing approach + +### After Planning + +- [ ] **Stakeholder Review**: Review plan with stakeholders +- [ ] **Documentation**: Document plan clearly with phases and milestones +- [ ] **Team Communication**: Communicate plan to team +- [ ] **Progress Tracking**: Set up monitoring and tracking mechanisms diff --git a/.cursor/rules/development/realistic_time_estimation.mdc b/.cursor/rules/development/realistic_time_estimation.mdc new file mode 100644 index 0000000..f08a439 --- /dev/null +++ b/.cursor/rules/development/realistic_time_estimation.mdc @@ -0,0 +1,128 @@ +# Realistic Time Estimation — Development Guidelines + +> **Agent role**: **DO NOT MAKE TIME ESTIMATES**. Instead, use phases, +> milestones, and complexity levels. Time estimates are consistently wrong +> and create unrealistic expectations. + +## Purpose + +Development time estimates are consistently wrong and create unrealistic +expectations. This rule ensures we focus on phases, milestones, and +complexity rather than trying to predict specific timeframes. + +## Critical Rule + +**NEVER provide specific time estimates** (hours, days, weeks) for +development tasks. Instead, use: + +- **Complexity levels** (Low, Medium, High, Critical) + +- **Phases and milestones** with clear acceptance criteria + +- **Platform-specific considerations** (Web, Mobile, Desktop) + +- **Testing requirements** and validation steps + +## Planning Framework + +### Complexity Assessment + +- **Low**: Simple changes, existing patterns, minimal testing + +- **Medium**: New features, moderate testing, some integration + +- **High**: Complex features, extensive testing, multiple platforms + +- **Critical**: Core architecture changes, full regression testing + +### Platform Categories + +- **Web**: Browser compatibility, responsive design, accessibility + +- **Mobile**: Native APIs, platform-specific testing, deployment + +- **Desktop**: Electron integration, system APIs, distribution + +### Testing Strategy + +- **Unit tests**: Core functionality validation + +- **Integration tests**: Component interaction testing + +- **E2E tests**: User workflow validation + +- **Platform tests**: Cross-platform compatibility + +## Process Guidelines + +### Planning Phase + +1. **Scope Definition**: Clear requirements and acceptance criteria + +2. **Complexity Assessment**: Evaluate technical and business complexity + +3. **Phase Breakdown**: Divide into logical, testable phases + +4. **Milestone Definition**: Define success criteria for each phase + +### Execution Phase + +1. **Phase 1**: Foundation and core implementation + +2. **Phase 2**: Feature completion and integration + +3. **Phase 3**: Testing, refinement, and documentation + +4. **Phase 4**: Deployment and validation + +### Validation Phase + +1. **Acceptance Testing**: Verify against defined criteria + +2. **Platform Testing**: Validate across target platforms + +3. **Performance Testing**: Ensure performance requirements met + +4. **Documentation**: Update relevant documentation + +## Remember + +**Your first estimate is wrong. Your second estimate is probably still +wrong. Focus on progress, not deadlines.** + +--- + +**See also**: + +- `.cursor/rules/development/planning_examples.mdc` for detailed planning examples + +- `.cursor/rules/development/complexity_assessment.mdc` for complexity evaluation + +**Status**: Active development guidelines +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: None +**Stakeholders**: Development team, Project managers + +## Model Implementation Checklist + +### Before Time Estimation + +- [ ] **Requirements Analysis**: Understand all requirements and acceptance criteria +- [ ] **Complexity Assessment**: Evaluate technical and business complexity +- [ ] **Platform Review**: Identify requirements across all target platforms +- [ ] **Stakeholder Input**: Gather input from all affected parties + +### During Time Estimation + +- [ ] **Phase Breakdown**: Divide work into logical, testable phases +- [ ] **Complexity Classification**: Assign complexity levels (Low/Medium/High/Critical) +- [ ] **Platform Considerations**: Account for platform-specific requirements +- [ ] **Testing Strategy**: Plan comprehensive testing approach + +### After Time Estimation + +- [ ] **Milestone Definition**: Define success criteria for each phase +- [ ] **Progress Tracking**: Set up monitoring and tracking mechanisms +- [ ] **Documentation**: Document estimation process and assumptions +- [ ] **Stakeholder Communication**: Share estimation approach and progress focus diff --git a/.cursor/rules/development/research_diagnostic.mdc b/.cursor/rules/development/research_diagnostic.mdc new file mode 100644 index 0000000..9d3c31a --- /dev/null +++ b/.cursor/rules/development/research_diagnostic.mdc @@ -0,0 +1,262 @@ +--- +description: Use this workflow when doing **pre-implementation research, defect + investigations with uncertain repros, or clarifying system architecture and + behaviors**. +alwaysApply: false +--- + +```json + +{ + "coaching_level": "light", + "socratic_max_questions": 2, + "verbosity": "concise", + "timebox_minutes": null, + "format_enforcement": "strict" +} + +``` + +# Research & Diagnostic Workflow (R&D) + +## Purpose + +Provide a **repeatable, evidence-first** workflow to investigate features and +defects **before coding**. Outputs are concise reports, hypotheses, and next +steps—**not** code changes. + +## When to Use + +- Pre-implementation research for new features + +- Defect investigations (repros uncertain, user-specific failures) + +- Architecture/behavior clarifications (e.g., auth flows, merges, migrations) + +--- + +## Enhanced with Software Development Ruleset + +When investigating software issues, also apply: + +- **Code Path Tracing**: Required for technical investigations + +- **Evidence Validation**: Ensure claims are code-backed + +- **Solution Complexity Assessment**: Justify architectural changes + +--- + +## Output Contract (strict) + +1) **Objective** — 1–2 lines +2) **System Map (if helpful)** — short diagram or bullet flow (≤8 bullets) +3) **Findings (Evidence-linked)** — bullets; each with file/function refs +4) **Hypotheses & Failure Modes** — short list, each testable +5) **Corrections** — explicit deltas from earlier assumptions (if any) +6) **Diagnostics** — what to check next (logs, DB, env, repro steps) +7) **Risks & Scope** — what could break; affected components +8) **Decision/Next Steps** — what we'll do, who's involved, by when +9) **References** — code paths, ADRs, docs +10) **Competence & Collaboration Hooks** — brief, skimmable + +> Keep total length lean. Prefer links and bullets over prose. + +--- + +## Quickstart Template + +Copy/paste and fill: + +```md + +# Investigation — + +## Objective + + + +## System Map + +- + +- + +## Findings (Evidence) + +- — + + evidence: `src/path/file.ts:function` (lines X–Y); log snippet/trace id + +- — evidence: `...` + +## Hypotheses & Failure Modes + +- H1: ; would fail when + +- H2: ; watch for + +## Corrections + +- Updated: + +## Diagnostics (Next Checks) + +- [ ] Repro on + +- [ ] Inspect for + +- [ ] Capture + +## Risks & Scope + +- Impacted: ; Data: ; Users: + +## Decision / Next Steps + +- Owner: ; By: (YYYY-MM-DD) + +- Action: ; Exit criteria: + +## References + +- `src/...` + +- ADR: `docs/adr/xxxx-yy-zz-something.md` + +- Design: `docs/...` + +## Competence Hooks + +- Why this works: <≤3 bullets> + +- Common pitfalls: <≤3 bullets> + +- Next skill: <≤1 item> + +- Teach-back: "" + +``` + +--- + +## Evidence Quality Bar + +- **Cite the source** (file:func, line range if possible). + +- **Prefer primary evidence** (code, logs) over inference. + +- **Disambiguate platform** (Web/Capacitor/Electron) and **state** (migration, + + auth). + +- **Note uncertainty** explicitly. + +--- + +## Code Path Tracing (Required for Software Investigations) + +Before proposing solutions, trace the actual execution path: + +- [ ] **Entry Points**: + + Identify where the flow begins (user action, API call, etc.) + +- [ ] **Component Flow**: Map which components/methods are involved + +- [ ] **Data Path**: Track how data moves through the system + +- [ ] **Exit Points**: Confirm where the flow ends and what results + +- [ ] **Evidence Collection**: Gather specific code citations for each step + +--- + +## Collaboration Hooks + +- **Syncs:** 10–15m with QA/Security/Platform owners for high-risk areas. + +- **ADR:** Record major decisions; link here. + +- **Review:** Share repro + diagnostics checklist in PR/issue. + +--- + +## Integration with Other Rulesets + +### With software_development.mdc + +- **Enhanced Evidence Validation**: + + Use code path tracing for technical investigations + +- **Architecture Assessment**: + + Apply complexity justification to proposed solutions + +- **Impact Analysis**: Assess effects on existing systems before recommendations + +### With base_context.mdc + +- **Competence Building**: Focus on technical investigation skills + +- **Collaboration**: Structure outputs for team review and discussion + +--- + +## Self-Check (model, before responding) + +- [ ] Output matches the **Output Contract** sections. + +- [ ] Each claim has **evidence** or **uncertainty** is flagged. + +- [ ] Hypotheses are testable; diagnostics are actionable. + +- [ ] Competence + collaboration hooks present (≤120 words total). + +- [ ] Respect toggles; keep it concise. + +- [ ] **Code path traced** (for software investigations). + +- [ ] **Evidence validated** against actual code execution. + +--- + +## Optional Globs (examples) + +> Uncomment `globs` in the header if you want auto-attach behavior. + +- `src/platforms/**`, `src/services/**` — + + attach during service/feature investigations + +- `docs/adr/**` — attach when editing ADRs + +## Referenced Files + +- Consider including templates as context: `@adr_template.mdc`, + + `@investigation_report_example.mdc` + +## Model Implementation Checklist + +### Before Investigation + +- [ ] **Problem Definition**: Clearly define the research question or issue +- [ ] **Scope Definition**: Determine investigation scope and boundaries +- [ ] **Methodology Planning**: Plan investigation approach and methods +- [ ] **Resource Assessment**: Identify required resources and tools + +### During Investigation + +- [ ] **Evidence Collection**: Gather relevant evidence and data systematically +- [ ] **Code Path Tracing**: Map execution flow for software investigations +- [ ] **Analysis**: Analyze evidence using appropriate methods +- [ ] **Documentation**: Document investigation process and findings + +### After Investigation + +- [ ] **Synthesis**: Synthesize findings into actionable insights +- [ ] **Report Creation**: Create comprehensive investigation report +- [ ] **Recommendations**: Provide clear, actionable recommendations +- [ ] **Team Communication**: Share findings and next steps with team diff --git a/.cursor/rules/development/software_development.mdc b/.cursor/rules/development/software_development.mdc new file mode 100644 index 0000000..bbf3da4 --- /dev/null +++ b/.cursor/rules/development/software_development.mdc @@ -0,0 +1,227 @@ + +--- + +alwaysApply: false +--- + +# Software Development Ruleset + +**Author**: Matthew Raymer +**Date**: 2025-08-19 +**Status**: 🎯 **ACTIVE** - Core development guidelines + +## Purpose + +Specialized guidelines for software development tasks including code review, +debugging, architecture decisions, and testing. + +## Core Principles + +### 1. Evidence-First Development + +- **Code Citations Required**: Always cite specific file:line references when + + making claims + +- **Execution Path Tracing**: Trace actual code execution before proposing + + architectural changes + +- **Assumption Validation**: Flag assumptions as "assumed" vs "evidence-based" + +### 2. Code Review Standards + +- **Trace Before Proposing**: Always trace execution paths before suggesting + + changes + +- **Evidence Over Inference**: Prefer code citations over logical deductions + +- **Scope Validation**: Confirm the actual scope of problems before proposing + + solutions + +### 3. Problem-Solution Validation + +- **Problem Scope**: Does the solution address the actual problem? + +- **Evidence Alignment**: Does the solution match the evidence? + +- **Complexity Justification**: Is added complexity justified by real needs? + +- **Alternative Analysis**: What simpler solutions were considered? + +### 4. Dependency Management & Environment Validation + +- **Pre-build Validation**: + + Always validate critical dependencies before executing + build scripts + +- **Environment Consistency**: Ensure team members have identical development + + environments + +- **Dependency Verification**: Check that required packages are installed and + + accessible + +- **Path Resolution**: Use `npx` for local dependencies to avoid PATH issues + +## Required Workflows + +### Before Proposing Changes + +- [ ] **Code Path Tracing**: Map execution flow from entry to exit + +- [ ] **Evidence Collection**: Gather specific code citations and logs + +- [ ] **Assumption Surfacing**: Identify what's proven vs. inferred + +- [ ] **Scope Validation**: Confirm the actual extent of the problem + +- [ ] **Dependency Validation**: Verify all required dependencies are available + + and accessible + +### During Solution Design + +- [ ] **Evidence Alignment**: Ensure solution addresses proven problems + +- [ ] **Complexity Assessment**: Justify any added complexity + +- [ ] **Alternative Evaluation**: Consider simpler approaches first + +- [ ] **Impact Analysis**: Assess effects on existing systems + +- [ ] **Environment Impact**: Assess how changes affect team member setups + +## Software-Specific Competence Hooks + +### Evidence Validation + +- **"What code path proves this claim?"** + +- **"How does data actually flow through the system?"** + +- **"What am I assuming vs. what can I prove?"** + +### Code Tracing + +- **"What's the execution path from user action to system response?"** + +- **"Which components actually interact in this scenario?"** + +- **"Where does the data originate and where does it end up?"** + +### Architecture Decisions + +- **"What evidence shows this change is necessary?"** + +- **"What simpler solution could achieve the same goal?"** + +- **"How does this change affect the existing system architecture?"** + +### Dependency & Environment Management + +- **"What dependencies does this feature require and are they properly + + declared?"** + +- **"How will this change affect team member development environments?"** + +- **"What validation can we add to catch dependency issues early?"** + +## Integration with Other Rulesets + +### With base_context.mdc + +- Inherits generic competence principles + +- Adds software-specific evidence requirements + +- Maintains collaboration and learning focus + +### With research_diagnostic.mdc + +- Enhances investigation with code path tracing + +- Adds evidence validation to diagnostic workflow + +- Strengthens problem identification accuracy + +## Usage Guidelines + +### When to Use This Ruleset + +- Code reviews and architectural decisions + +- Bug investigation and debugging + +- Performance optimization + +- Feature implementation planning + +- Testing strategy development + +### When to Combine with Others + +- **base_context + software_development**: General development tasks + +- **research_diagnostic + software_development**: Technical investigations + +- **All three**: Complex architectural decisions or major refactoring + +## Self-Check (model, before responding) + +- [ ] Code path traced and documented + +- [ ] Evidence cited with specific file:line references + +- [ ] Assumptions clearly flagged as proven vs. inferred + +- [ ] Solution complexity justified by evidence + +- [ ] Simpler alternatives considered and documented + +- [ ] Impact on existing systems assessed + +- [ ] Dependencies validated and accessible + +- [ ] Environment impact assessed for team members + +- [ ] Pre-build validation implemented where appropriate + +--- + +**See also**: `.cursor/rules/development/dependency_management.mdc` for + detailed dependency management practices. + +**Status**: Active development guidelines +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: base_context.mdc, research_diagnostic.mdc +**Stakeholders**: Development team, Code review team + +## Model Implementation Checklist + +### Before Development Work + +- [ ] **Code Path Tracing**: Map execution flow from entry to exit +- [ ] **Evidence Collection**: Gather specific code citations and logs +- [ ] **Assumption Surfacing**: Identify what's proven vs. inferred +- [ ] **Scope Validation**: Confirm the actual extent of the problem + +### During Development + +- [ ] **Evidence Alignment**: Ensure solution addresses proven problems +- [ ] **Complexity Assessment**: Justify any added complexity +- [ ] **Alternative Evaluation**: Consider simpler approaches first +- [ ] **Impact Analysis**: Assess effects on existing systems + +### After Development + +- [ ] **Code Path Validation**: Verify execution paths are correct +- [ ] **Evidence Documentation**: Document all code citations and evidence +- [ ] **Assumption Review**: Confirm all assumptions are documented +- [ ] **Environment Impact**: Assess how changes affect team member setups diff --git a/.cursor/rules/development/time.mdc b/.cursor/rules/development/time.mdc new file mode 100644 index 0000000..9aeb172 --- /dev/null +++ b/.cursor/rules/development/time.mdc @@ -0,0 +1,146 @@ +# Time Handling in Development Workflow + +**Author**: Matthew Raymer +**Date**: 2025-08-17 +**Status**: 🎯 **ACTIVE** - Production Ready + +## Overview + +This guide establishes **how time should be referenced and used** across the +development workflow. It is not tied to any one project, but applies to **all +feature development, issue investigations, ADRs, and documentation**. + +## General Principles + +- **Explicit over relative**: Always prefer absolute dates (`2025-08-17`) over + + relative references like "last week." + +- **ISO 8601 Standard**: Use `YYYY-MM-DD` format for all date references in + + docs, issues, ADRs, and commits. + +- **Time zones**: Default to **UTC** unless explicitly tied to user-facing + + behavior. + +- **Precision**: Only specify as much precision as needed (date vs. datetime vs. + + timestamp). + +- **Consistency**: Align time references across ADRs, commits, and investigation + + reports. + +## In Documentation & ADRs + +- Record decision dates using **absolute ISO dates**. + +- For ongoing timelines, state start and end explicitly (e.g., `2025-08-01` → + + `2025-08-17`). + +- Avoid ambiguous terms like *recently*, *last month*, or *soon*. + +- For time-based experiments (e.g., A/B tests), always include: + + - Start date + + - Expected duration + + - Review date checkpoint + +## In Code & Commits + +- Use **UTC timestamps** in logs, DB migrations, and serialized formats. + +- In commits, link changes to **date-bound ADRs or investigation docs**. + +- For migrations, include both **applied date** and **intended version window**. + +- Use constants for known fixed dates; avoid hardcoding arbitrary strings. + +## In Investigations & Research + +- Capture **when** an issue occurred (absolute time or version tag). + +- When describing failures: note whether they are **time-sensitive** (e.g., + + after + migrations, cache expirations). + +- Record diagnostic timelines in ISO format (not relative). + +- For performance regressions, annotate both **baseline timeframe** and + + **measurement timeframe**. + +## Collaboration Hooks + +- During reviews, verify **time references are clear, absolute, and + + standardized**. + +- In syncs, reframe relative terms ("this week") into shared absolute + + references. + +- Tag ADRs with both **date created** and **review by** checkpoints. + +## Self-Check Before Submitting + +- [ ] Did I check the time using the **developer's actual system time and + + timezone**? + +- [ ] Am I using absolute ISO dates? + +- [ ] Is UTC assumed unless specified otherwise? + +- [ ] Did I avoid ambiguous relative terms? + +- [ ] If duration matters, did I specify both start and end? + +- [ ] For future work, did I include a review/revisit date? + +--- + +**See also**: + +- `.cursor/rules/development/time_implementation.mdc` for + + detailed implementation instructions + +- `.cursor/rules/development/time_examples.mdc` for practical examples and patterns + +**Status**: Active time handling guidelines +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: None +**Stakeholders**: Development team, Documentation team + +**Maintainer**: Matthew Raymer +**Next Review**: 2025-09-17 + +## Model Implementation Checklist + +### Before Time-Related Work + +- [ ] **Time Context**: Understand what time information is needed +- [ ] **Format Review**: Review time formatting standards (UTC, ISO 8601) +- [ ] **Platform Check**: Identify platform-specific time requirements +- [ ] **User Context**: Consider user's timezone and preferences + +### During Time Implementation + +- [ ] **UTC Usage**: Use UTC for all system and log timestamps +- [ ] **Format Consistency**: Apply consistent time formatting patterns +- [ ] **Timezone Handling**: Properly handle timezone conversions +- [ ] **User Display**: Format times appropriately for user display + +### After Time Implementation + +- [ ] **Validation**: Verify time formats are correct and consistent +- [ ] **Testing**: Test time handling across different scenarios +- [ ] **Documentation**: Update relevant documentation with time patterns +- [ ] **Review**: Confirm implementation follows time standards diff --git a/.cursor/rules/development/time_examples.mdc b/.cursor/rules/development/time_examples.mdc new file mode 100644 index 0000000..f8a3d56 --- /dev/null +++ b/.cursor/rules/development/time_examples.mdc @@ -0,0 +1,243 @@ +# Time Examples — Practical Patterns + +> **Agent role**: Reference this file for practical examples and + patterns when working with time handling in development. + +## Examples + +### Good + +- "Feature flag rollout started on `2025-08-01` and will be reviewed on + + `2025-08-21`." + +- "Migration applied on `2025-07-15T14:00Z`." + +- "Issue reproduced on `2025-08-17T09:00-05:00 (local)` / + + `2025-08-17T14:00Z (UTC)`." + +### Bad + +- "Feature flag rolled out last week." + +- "Migration applied recently." + +- "Now is August, so we assume this was last month." + +### More Examples + +#### Issue Reports + +- ✅ **Good**: "User reported login failure at `2025-08-17T14:30:00Z`. Issue + + persisted until `2025-08-17T15:45:00Z`." + +- ❌ **Bad**: "User reported login failure earlier today. Issue lasted for a + + while." + +#### Release Planning + +- ✅ **Good**: "Feature X scheduled for release on `2025-08-25`. Testing + + window: `2025-08-20` to `2025-08-24`." + +- ❌ **Bad**: "Feature X will be released next week after testing." + +#### Performance Monitoring + +- ✅ **Good**: "Baseline performance measured on `2025-08-10T09:00:00Z`. + + Regression detected on `2025-08-15T14:00:00Z`." + +- ❌ **Bad**: "Performance was good last week but got worse this week." + +## Technical Implementation Examples + +### Database Storage + +```sql + +-- ✅ Good: Store in UTC +created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, +updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP + +-- ❌ Bad: Store in local time +created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, +updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP + +``` + +### API Responses + +```json + +// ✅ Good: Include both UTC and local time +{ + "eventTime": "2025-08-17T14:00:00Z", + "localTime": "2025-08-17T10:00:00-04:00", + "timezone": "America/New_York" +} + +// ❌ Bad: Only local time +{ + "eventTime": "2025-08-17T10:00:00-04:00" +} + +``` + +### Logging + +```python + +# ✅ Good: Log in UTC with timezone info + +logger.info(f"User action at {datetime.utcnow().isoformat()}Z (UTC)") + +# ❌ Bad: Log in local time + +logger.info(f"User action at {datetime.now()}") + +``` + +## Timezone Handling Examples + +### Good Timezone Usage + +```typescript + +// ✅ Good: Store UTC, convert for display +const eventTime = new Date().toISOString(); // Store in UTC +const localTime = new Date().toLocaleString('en-US', { + timeZone: 'America/New_York' +}); // Convert for display + +// ✅ Good: Include timezone context +const timestamp = { + utc: "2025-08-17T14:00:00Z", + local: "2025-08-17T10:00:00-04:00", + timezone: "America/New_York" +}; + +``` + +### Bad Timezone Usage + +```typescript + +// ❌ Bad: Assume timezone +const now = new Date(); // Assumes system timezone + +// ❌ Bad: Mix formats +const timestamp = "2025-08-17 10:00 AM"; // Ambiguous format + +``` + +## Common Patterns + +### Date Range References + +```typescript + +// ✅ Good: Explicit date ranges +const dateRange = { + start: "2025-08-01T00:00:00Z", + end: "2025-08-31T23:59:59Z" +}; + +// ❌ Bad: Relative ranges +const dateRange = { + start: "beginning of month", + end: "end of month" +}; + +``` + +### Duration References + +```typescript + +// ✅ Good: Specific durations +const duration = { + value: 30, + unit: "days", + startDate: "2025-08-01T00:00:00Z" +}; + +// ❌ Bad: Vague durations +const duration = "about a month"; + +``` + +### Version References + +```typescript + +// ✅ Good: Version with date +const version = { + number: "1.2.3", + releaseDate: "2025-08-17T10:00:00Z", + buildDate: "2025-08-17T09:30:00Z" +}; + +// ❌ Bad: Version without context +const version = "latest"; + +``` + +## References + +- [ISO 8601 Date and Time Standard](https://en.wikipedia.org/wiki/ISO_8601) + +- [IANA Timezone Database](https://www.iana.org/time-zones) + +- [ADR Template](./adr_template.md) + +- [Research & Diagnostic Workflow](./research_diagnostic.mdc) + +--- + +**Rule of Thumb**: Every time reference in development artifacts should be +**clear in 6 months without context**, and aligned to the **developer's actual +current time**. + +**Technical Rule of Thumb**: **Store in UTC, display in local time, always +include timezone context.** + +--- + +**See also**: + +- `.cursor/rules/development/time.mdc` for core principles + +- `.cursor/rules/development/time_implementation.mdc` for implementation instructions + +**Status**: Active examples and patterns +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: time.mdc, time_implementation.mdc +**Stakeholders**: Development team, Documentation team + +## Model Implementation Checklist + +### Before Time Implementation + +- [ ] **Time Context**: Understand what time information needs to be implemented +- [ ] **Format Review**: Review time formatting standards (UTC, ISO 8601) +- [ ] **Platform Check**: Identify platform-specific time requirements +- [ ] **User Context**: Consider user's timezone and display preferences + +### During Time Implementation + +- [ ] **UTC Storage**: Use UTC for all system and log timestamps +- [ ] **Format Consistency**: Apply consistent time formatting patterns +- [ ] **Timezone Handling**: Properly handle timezone conversions +- [ ] **User Display**: Format times appropriately for user display + +### After Time Implementation + +- [ ] **Format Validation**: Verify time formats are correct and consistent +- [ ] **Cross-Platform Testing**: Test time handling across different platforms +- [ ] **Documentation**: Update relevant documentation with time patterns +- [ ] **User Experience**: Confirm time display is clear and user-friendly diff --git a/.cursor/rules/development/time_implementation.mdc b/.cursor/rules/development/time_implementation.mdc new file mode 100644 index 0000000..f5c2da2 --- /dev/null +++ b/.cursor/rules/development/time_implementation.mdc @@ -0,0 +1,285 @@ +# Time Implementation — Technical Instructions + +> **Agent role**: Reference this file for detailed implementation instructions + when working with time handling in development. + +## Real-Time Context in Developer Interactions + +- The model must always resolve **"current time"** using the **developer's + + actual system time and timezone**. + +- When generating timestamps (e.g., in investigation logs, ADRs, or examples), + + the model should: + + - Use the **developer's current local time** by default. + + - Indicate the timezone explicitly (e.g., `2025-08-17T10:32-05:00`). + + - Optionally provide UTC alongside if context requires cross-team clarity. + +- When interpreting relative terms like *now*, *today*, *last week*: + + - Resolve them against the **developer's current time**. + + - Convert them into **absolute ISO-8601 values** in the output. + +## LLM Time Checking Instructions + +**CRITICAL**: The LLM must actively query the system for current time rather +than assuming or inventing times. + +### How to Check Current Time + +#### 1. **Query System Time (Required)** + +- **Always start** by querying the current system time using available tools + +- **Never assume** what the current time is + +- **Never use** placeholder values like "current time" or "now" + +#### 2. **Available Time Query Methods** + +- **System Clock**: Use `date` command or equivalent system time function + +- **Programming Language**: Use language-specific time functions (e.g., + + `Date.now()`, `datetime.now()`) + +- **Environment Variables**: Check for time-related environment variables + +- **API Calls**: Use time service APIs if available + +#### 3. **Required Time Information** + +When querying time, always obtain: + +- **Current Date**: YYYY-MM-DD format + +- **Current Time**: HH:MM:SS format (24-hour) + +- **Timezone**: Current system timezone or UTC offset + +- **UTC Equivalent**: Convert local time to UTC for cross-team clarity + +#### 4. **Time Query Examples** + +```bash + +# Example: Query system time + +$ date + +# Expected output: Mon Aug 17 10:32:45 EDT 2025 + +# Example: Query UTC time + +$ date -u + +# Expected output: Mon Aug 17 14:32:45 UTC 2025 + +``` + +```python + +# Example: Python time query + +import datetime +current_time = datetime.datetime.now() +utc_time = datetime.datetime.utcnow() +print(f"Local: {current_time}") +print(f"UTC: {utc_time}") + +``` + +```javascript + +// Example: JavaScript time query +const now = new Date(); +const utc = new Date().toISOString(); +console.log(`Local: ${now}`); +console.log(`UTC: ${utc}`); + +``` + +#### 5. **LLM Time Checking Workflow** + +1. **Query**: Actively query system for current time + +2. **Validate**: Confirm time data is reasonable and current + +3. **Format**: Convert to ISO 8601 format + +4. **Context**: Provide both local and UTC times when helpful + +5. **Document**: Show the source of time information + +#### 6. **Error Handling for Time Queries** + +- **If time query fails**: Ask user for current time or use "unknown time" + + with explanation + +- **If timezone unclear**: Default to UTC and ask for clarification + +- **If time seems wrong**: Verify with user before proceeding + +- **Always log**: Record when and how time was obtained + +#### 7. **Time Query Verification** + +Before using queried time, verify: + +- [ ] Time is recent (within last few minutes) + +- [ ] Timezone information is available + +- [ ] UTC conversion is accurate + +- [ ] Format follows ISO 8601 standard + +## Model Behavior Rules + +- **Never invent a "fake now"**: All "current time" references must come from + + the real system clock available at runtime. + +- **Check developer time zone**: If ambiguous, ask for clarification (e.g., + + "Should I use UTC or your local timezone?"). + +- **Format for clarity**: + + - Local time: `YYYY-MM-DDTHH:mm±hh:mm` + + - UTC equivalent (if needed): `YYYY-MM-DDTHH:mmZ` + +## Technical Implementation Notes + +### UTC Storage Principle + +- **Store all timestamps in UTC** in databases, logs, and serialized formats + +- **Convert to local time only for user display** + +- **Use ISO 8601 format** for all storage: `YYYY-MM-DDTHH:mm:ss.sssZ` + +### Common Implementation Patterns + +#### Database Storage + +```sql + +-- ✅ Good: Store in UTC +created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, +updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP + +``` + +#### API Responses + +```json + +// ✅ Good: Include both UTC and local time +{ + "eventTime": "2025-08-17T14:00:00Z", + "localTime": "2025-08-17T10:00:00-04:00", + "timezone": "America/New_York" +} + +``` + +#### Logging + +```python + +# ✅ Good: Log in UTC with timezone info + +logger.info(f"User action at {datetime.utcnow().isoformat()}Z (UTC)") + +``` + +### Timezone Handling Best Practices + +#### 1. Always Store Timezone Information + +- Include IANA timezone identifier (e.g., `America/New_York`) + +- Store UTC offset at time of creation + +- Handle daylight saving time transitions automatically + +#### 2. User Display Considerations + +- Convert UTC to user's preferred timezone + +- Show timezone abbreviation when helpful + +- Use relative time for recent events ("2 hours ago") + +#### 3. Edge Case Handling + +- **Daylight Saving Time**: Use timezone-aware libraries + +- **Leap Seconds**: Handle gracefully (rare but important) + +- **Invalid Times**: Validate before processing + +### Common Mistakes to Avoid + +#### 1. Timezone Confusion + +- ❌ **Don't**: Assume server timezone is user timezone + +- ✅ **Do**: Always convert UTC to user's local time for display + +#### 2. Format Inconsistency + +- ❌ **Don't**: Mix different time formats in the same system + +- ✅ **Do**: Standardize on ISO 8601 for all storage + +#### 3. Relative Time References + +- ❌ **Don't**: Use relative terms in persistent storage + +- ✅ **Do**: Convert relative terms to absolute timestamps immediately + +--- + +**See also**: + +- `.cursor/rules/development/time.mdc` for core principles + +- `.cursor/rules/development/time_examples.mdc` for practical examples + +**Status**: Active implementation guidelines +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: time.mdc +**Stakeholders**: Development team, DevOps team + +## Model Implementation Checklist + +### Before Time Implementation + +- [ ] **Time Context**: Understand what time information needs to be implemented +- [ ] **Format Review**: Review time formatting standards (UTC, ISO 8601) +- [ ] **Platform Check**: Identify platform-specific time requirements +- [ ] **User Context**: Consider user's timezone and display preferences + +### During Time Implementation + +- [ ] **UTC Storage**: Use UTC for all system and log timestamps +- [ ] **Format Consistency**: Apply consistent time formatting patterns +- [ ] **Timezone Handling**: Properly handle timezone conversions +- [ ] **User Display**: Format times appropriately for user display + +### After Time Implementation + +- [ ] **Format Validation**: Verify time formats are correct and consistent +- [ ] **Cross-Platform Testing**: Test time handling across different platforms +- [ ] **Documentation**: Update relevant documentation with time patterns +- [ ] **User Experience**: Confirm time display is clear and user-friendly diff --git a/.cursor/rules/development/type_safety_guide.mdc b/.cursor/rules/development/type_safety_guide.mdc new file mode 100644 index 0000000..4fa17ee --- /dev/null +++ b/.cursor/rules/development/type_safety_guide.mdc @@ -0,0 +1,212 @@ +--- +description: when dealing with types and Typesript +alwaysApply: false +--- + +```json + +{ + "coaching_level": "light", + "socratic_max_questions": 7, + "verbosity": "concise", + "timebox_minutes": null, + "format_enforcement": "strict" +} + +``` + +# TypeScript Type Safety Guidelines + +**Author**: Matthew Raymer +**Date**: 2025-08-19 +**Status**: 🎯 **ACTIVE** - Type safety enforcement + +## Overview + +Practical rules to keep TypeScript strict and predictable. Minimize exceptions. + +## Core Rules + +1. **No `any`** + + - Use explicit types. If unknown, use `unknown` and **narrow** via guards. + +2. **Error handling uses guards** + + - Reuse guards from `src/interfaces/**` (e.g., `isDatabaseError`, + + `isApiError`). + + - Catch with `unknown`; never cast to `any`. + +3. **Dynamic property access is type‑safe** + + - Use `keyof` + `in` checks: + + ```ts + + obj[k as keyof typeof obj] + + ``` + + - Avoid `(obj as any)[k]`. + +## Type Safety Enforcement + +### Core Type Safety Rules + +- **No `any` Types**: Use explicit types or `unknown` with proper type guards + +- **Error Handling Uses Guards**: + + Implement and reuse type guards from `src/interfaces/**` + +- **Dynamic Property Access**: + + Use `keyof` + `in` checks for type-safe property access + +### Type Guard Patterns + +- **API Errors**: Use `isApiError(error)` guards for API error handling + +- **Database Errors**: + + Use `isDatabaseError(error)` guards for database operations + +- **Axios Errors**: + + Implement `isAxiosError(error)` guards for HTTP error handling + +### Implementation Guidelines + +- **Avoid Type Assertions**: + + Replace `as any` with proper type guards and interfaces + +- **Narrow Types Properly**: Use type guards to narrow `unknown` types safely + +- **Document Type Decisions**: Explain complex type structures and their purpose + +## Minimal Special Cases (document in PR when used) + +- **Vue refs / instances**: Use `ComponentPublicInstance` or specific + + component types for dynamic refs. + +- **3rd‑party libs without types**: Narrow immediately to a **known + + interface**; do not leave `any` hanging. + +## Patterns (short) + +### Database errors + +```ts + +try { await this.$addContact(contact); } +catch (e: unknown) { + if (isDatabaseError(e) && e.message.includes("Key already exists")) { + /* handle duplicate */ + } +} + +``` + +### API errors + +```ts + +try { await apiCall(); } +catch (e: unknown) { + if (isApiError(e)) { + const msg = e.response?.data?.error?.message; + } +} + +``` + +### Dynamic keys + +```ts + +const keys = Object.keys(newSettings).filter( +k => k in newSettings && newSettings[k as keyof typeof newSettings] !== + undefined +); + +``` + +## Checklists + +**Before commit** + +- [ ] No `any` (except documented, justified cases) + +- [ ] Errors handled via guards + +- [ ] Dynamic access uses `keyof`/`in` + +- [ ] Imports point to correct interfaces/types + +**Code review** + +- [ ] Hunt hidden `as any` + +- [ ] Guard‑based error paths verified + +- [ ] Dynamic ops are type‑safe + +- [ ] Prefer existing types over re‑inventing + +## Tools + +- `npm run lint-fix` — lint & auto‑fix + +- `npm run type-check` — strict type compilation (CI + pre‑release) + +- IDE: enable strict TS, ESLint/TS ESLint, Volar (Vue 3) + +## References + +- TS Handbook — + +- TS‑ESLint — + +- Vue 3 + TS — + +--- + +**Status**: Active type safety guidelines +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: TypeScript, ESLint, Vue 3 +**Stakeholders**: Development team + +- TS Handbook — + +- TS‑ESLint — + +- Vue 3 + TS — + +## Model Implementation Checklist + +### Before Type Implementation + +- [ ] **Type Analysis**: Understand current type definitions and usage +- [ ] **Interface Review**: Review existing interfaces and types +- [ ] **Error Handling**: Plan error handling with type guards +- [ ] **Dynamic Access**: Identify dynamic access patterns that need type safety + +### During Type Implementation + +- [ ] **Type Safety**: Ensure types provide meaningful safety guarantees +- [ ] **Error Guards**: Implement proper error handling with type guards +- [ ] **Dynamic Operations**: Use `keyof`/`in` for dynamic access +- [ ] **Import Validation**: Verify imports point to correct interfaces/types + +### After Type Implementation + +- [ ] **Linting Check**: Run `npm run lint-fix` to verify code quality +- [ ] **Type Check**: Run `npm run type-check` for strict type compilation +- [ ] **Code Review**: Hunt for hidden `as any` and type safety issues +- [ ] **Documentation**: Update type documentation and examples diff --git a/.cursor/rules/docs/documentation.mdc b/.cursor/rules/docs/documentation.mdc new file mode 100644 index 0000000..e6e57ba --- /dev/null +++ b/.cursor/rules/docs/documentation.mdc @@ -0,0 +1,37 @@ +--- +alwaysApply: false +--- +# Directive for Documentation Generation + +1. Produce a **small, focused set of documents** rather than an overwhelming volume. +2. Ensure the content is **maintainable and worth preserving**, so that humans + are motivated to keep it up to date. +3. Prioritize **educational value**: the documents must clearly explain the + workings of the system. +4. Avoid **shallow, generic, or filler explanations** often found in AI-generated + documentation. +5. Aim for **clarity, depth, and usefulness**, so readers gain genuine understanding. +6. Always check the local system date to determine current date. + +## Model Implementation Checklist + +### Before Documentation Creation + +- [ ] **Scope Definition**: Define what needs to be documented +- [ ] **Audience Analysis**: Identify target readers and their needs +- [ ] **Content Planning**: Plan focused, educational content structure +- [ ] **Maintenance Planning**: Ensure content will be worth preserving + +### During Documentation Creation + +- [ ] **Educational Focus**: Clearly explain how the system works +- [ ] **Depth and Clarity**: Provide genuine understanding, not surface explanations +- [ ] **Focused Content**: Keep documents small and focused on specific topics +- [ ] **Current Date**: Check local system date for time-sensitive content + +### After Documentation Creation + +- [ ] **Quality Review**: Ensure content is clear, deep, and useful +- [ ] **Maintainability Check**: Verify content motivates humans to keep it updated +- [ ] **Audience Validation**: Confirm content meets target reader needs +- [ ] **Integration**: Integrate with existing documentation structure diff --git a/.cursor/rules/docs/markdown_core.mdc b/.cursor/rules/docs/markdown_core.mdc new file mode 100644 index 0000000..74024bf --- /dev/null +++ b/.cursor/rules/docs/markdown_core.mdc @@ -0,0 +1,210 @@ +# Markdown Core Standards & Automation + +**Author**: Matthew Raymer +**Date**: 2025-08-21 +**Status**: 🎯 **ACTIVE** - Core markdown standards and automation + +## Overview + +This file combines core markdown formatting standards with automation +guidelines. AI agents must follow these rules DURING content generation, +not apply them after the fact. + +**Primary Focus**: Create educational content that increases human +competence, not just technical descriptions. + +## AI Generation Guidelines + +### **MANDATORY**: Follow These Rules While Writing + +When generating markdown content, you MUST: + +1. **Line Length**: Never exceed 80 characters per line +2. **Blank Lines**: Always add blank lines around headings, lists, and + code blocks +3. **Structure**: Use proper heading hierarchy and document templates +4. **Formatting**: Apply consistent formatting patterns immediately +5. **Educational Value**: Focus on increasing reader competence and + understanding + +### **DO NOT**: Generate content that violates these rules + +- ❌ Generate long lines that need breaking +- ❌ Create content without proper blank line spacing +- ❌ Use inconsistent formatting patterns +- ❌ Assume post-processing will fix violations +- ❌ Focus only on technical details without educational context +- ❌ Assume reader has extensive prior knowledge + +### **DO**: Generate compliant content from the start + +- ✅ Write within 80-character limits +- ✅ Add blank lines around all structural elements +- ✅ Use established templates and patterns +- ✅ Apply formatting standards immediately +- ✅ Explain concepts before implementation details +- ✅ Provide context and motivation for technical choices +- ✅ Include examples that illustrate key concepts + +## Core Formatting Standards + +### Line Length + +- **Maximum line length**: 80 characters +- **Exception**: Code blocks (JSON, shell, TypeScript, etc.) - no line + length enforcement +- **Rationale**: Ensures readability across different screen sizes and + terminal widths + +### Blank Lines + +- **Headings**: Must be surrounded by blank lines above and below +- **Lists**: Must be surrounded by blank lines above and below +- **Code blocks**: Must be surrounded by blank lines above and below +- **Maximum consecutive blank lines**: 1 (no multiple blank lines) +- **File start**: No blank lines at the beginning of the file +- **File end**: Single newline character at the end + +### Whitespace + +- **No trailing spaces**: Remove all trailing whitespace from lines +- **No tabs**: Use spaces for indentation +- **Consistent indentation**: 2 spaces for list items and nested content + +## Heading Standards + +### Format + +- **Style**: ATX-style headings (`#`, `##`, `###`, etc.) +- **Case**: Title case for general headings +- **Code references**: Use backticks for file names and technical terms + - ✅ `### Current package.json Scripts` + - ❌ `### Current Package.json Scripts` + +### Hierarchy + +- **H1 (#)**: Document title only +- **H2 (##)**: Major sections +- **H3 (###)**: Subsections +- **H4 (####)**: Sub-subsections +- **H5+**: Avoid deeper nesting + +## List Standards + +### Unordered Lists + +- **Marker**: Use `-` (hyphen) consistently +- **Indentation**: 2 spaces for nested items +- **Blank lines**: Surround lists with blank lines + +### Ordered Lists + +- **Format**: `1.`, `2.`, `3.` (sequential numbering) +- **Indentation**: 2 spaces for nested items +- **Blank lines**: Surround lists with blank lines + +### Task Lists + +- **Format**: `- [ ]` for incomplete, `- [x]` for complete +- **Indentation**: 2 spaces for nested items +- **Blank lines**: Surround lists with blank lines + +## Educational Content Standards + +### **Content Structure for Learning** + +- **Concept First**: Explain what something is before how to use it +- **Context Matters**: Explain why and when to use a feature +- **Progressive Disclosure**: Start simple, add complexity gradually +- **Real Examples**: Use concrete, relatable scenarios +- **Common Questions**: Anticipate and answer reader questions + +### **Writing for Understanding** + +- **Conversational Tone**: Write as if explaining to a colleague +- **Active Voice**: "You can do this" not "This can be done" +- **Question Format**: "What happens when..." to engage thinking +- **Analogies**: Use familiar concepts to explain complex ideas +- **Limitations**: Clearly state what solutions don't do + +## Code Block Standards + +### Inline Code + +- **Format**: Single backticks for inline code +- **Use cases**: File names, commands, variables, technical terms +- **Examples**: `package.json`, `npm run build`, `VITE_PLATFORM` + +### Code Blocks + +- **Format**: Triple backticks with language specification +- **Language**: Always specify the language for syntax highlighting +- **Blank lines**: Surround with blank lines above and below + +## Automation System + +### Available Commands + +- **`npm run markdown:fix`** - Fix formatting in all markdown files + using markdownlint-cli2 --fix +- **`npm run markdown:check`** - Validate formatting without fixing + using markdownlint-cli2 + +### How It Works + +1. **AI Agent Compliance** (Primary): AI follows markdown rules during + generation +2. **Pre-commit Hooks** (Backup): Catches any remaining formatting + issues +3. **GitHub Actions** (Pre-merge): Validates formatting before merge + +### Benefits + +- **No more manual fixes** - AI generates compliant content from start +- **Consistent style** - All files follow same standards +- **Faster development** - No need to fix formatting manually + +## Model Implementation Checklist + +### Before Generating Markdown Content + +- [ ] **Line Length**: Ensure no line exceeds 80 characters +- [ ] **Blank Lines**: Add blank lines around headings, lists, and code blocks +- [ ] **Whitespace**: Remove all trailing spaces, use 2-space indentation +- [ ] **Headings**: Use ATX-style with proper hierarchy (H1 for title only) +- [ ] **Lists**: Use consistent markers (- for unordered, 1. for ordered) +- [ ] **Code**: Specify language for fenced blocks, use backticks for inline +- [ ] **Educational Focus**: Plan content structure for learning progression +- [ ] **Audience Consideration**: Identify target reader knowledge level + +### After Generating Markdown Content + +- [ ] **Validation**: Run `npm run markdown:check` to verify compliance +- [ ] **Auto-fix**: Use `npm run markdown:fix` if any issues found +- [ ] **Review**: Confirm content follows established templates and patterns +- [ ] **Cross-reference**: Link to related documentation and templates +- [ ] **Educational Review**: Verify content increases reader competence +- [ ] **Example Validation**: Ensure examples illustrate key concepts clearly + +### Quality Assurance + +- [ ] **Readability**: Content is clear and follows project conventions +- [ ] **Consistency**: Formatting matches existing documentation style +- [ ] **Completeness**: All required sections and information included +- [ ] **Accuracy**: Technical details are correct and up-to-date +- [ ] **Educational Value**: Content increases reader understanding and competence +- [ ] **Context Clarity**: Reader understands when and why to use the information + +--- + +**See also**: + +- `.cursor/rules/meta_documentation.mdc` for comprehensive documentation workflow +- `.cursor/rules/docs/markdown_templates.mdc` for document templates +- `.cursor/rules/docs/markdown_workflow.mdc` for validation workflows + +**Status**: Active core standards and automation +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: None +**Stakeholders**: Documentation team, Development team diff --git a/.cursor/rules/docs/markdown_templates.mdc b/.cursor/rules/docs/markdown_templates.mdc new file mode 100644 index 0000000..eacb672 --- /dev/null +++ b/.cursor/rules/docs/markdown_templates.mdc @@ -0,0 +1,314 @@ +# Markdown Templates & Examples + +> **Agent role**: Reference this file for document templates, structure, +> and examples when creating new documentation. +> +> **Focus**: Create educational content that increases human competence, +> not just technical descriptions. + +## Document Templates + +### Standard Document Template + +```markdown +# Document Title + +**Author**: Matthew Raymer +**Date**: YYYY-MM-DD +**Status**: 🎯 **STATUS** - Brief description + +## Overview + +Brief description of the document's purpose and scope. + +**Educational Goal**: What will the reader learn and how will it increase +their competence? + +## Current State + +Description of current situation or problem. + +**Why This Matters**: Explain the business value and user benefit of +addressing this situation. + +## Implementation Plan + +### Phase 1: Foundation + +- [ ] Task 1 +- [ ] Task 2 + +**Learning Context**: What concepts should the reader understand before +proceeding with implementation? + +## Next Steps + +1. **Review and approve plan** +2. **Begin implementation** +3. **Test and validate** + +**Continued Learning**: Where can the reader go next to deepen their +understanding? + +--- + +**Status**: Ready for implementation +**Priority**: Medium +**Estimated Effort**: X days +**Dependencies**: None +**Stakeholders**: Development team +``` + +### Technical Specification Template + +```markdown +# Technical Specification: [Feature Name] + +**Author**: Matthew Raymer +**Date**: YYYY-MM-DD +**Status**: 🎯 **DRAFT** - Under Review + +## Overview + +Brief description of the technical specification. + +**Business Context**: Why is this specification needed and what problem +does it solve for users? + +## Requirements + +### Functional Requirements + +- [ ] Requirement 1 +- [ ] Requirement 2 + +### Non-Functional Requirements + +- [ ] Performance requirement +- [ ] Security requirement + +## Technical Design + +### Architecture + +Description of the technical architecture. + +**Design Rationale**: Why was this architecture chosen over alternatives? +What are the trade-offs and benefits? + +### Data Models + +```typescript +interface ExampleModel { + id: string; + name: string; + createdAt: Date; +} +``` + +### API Design + +```typescript +interface APIResponse { + success: boolean; + data: T; + error?: string; +} +``` + +## Testing Strategy + +- [ ] Unit tests + +**Learning from Testing**: What insights does testing provide about the +system's behavior and design? + +--- + +## Educational Documentation Template + +### **Concept Explanation Template** + +```markdown +## What is [Concept Name]? + +Brief, clear definition of the concept. + +## Why Does [Concept Name] Matter? + +Explain the business value and user benefit. + +## How Does [Concept Name] Work? + +High-level explanation of the mechanism. + +## When Would You Use [Concept Name]? + +Real-world scenarios and use cases. + +## Common Misconceptions + +Address typical misunderstandings. + +## Examples + +Concrete examples that illustrate the concept. + +## Next Steps + +Where to learn more about related concepts. +``` + +### **Tutorial Template** + +```markdown +## Learning Objective + +What the reader will accomplish by the end. + +## Prerequisites + +What the reader should know before starting. + +## Step-by-Step Guide + +1. **Step 1**: What to do and why +2. **Step 2**: What to do and why +3. **Step 3**: What to do and why + +## Verification + +How to confirm the tutorial was successful. + +## Troubleshooting + +Common issues and how to resolve them. + +## What You've Learned + +Summary of key concepts and skills. + +## Next Steps + +Where to apply this knowledge next. +``` +- [ ] Integration tests +- [ ] E2E tests + +--- + +**Status**: Draft +**Priority**: High +**Estimated Effort**: X days +**Dependencies**: None +**Stakeholders**: Development team + +``` + +## Content Examples + +### JSON Examples + +```json +{ + "property": "value", + "nested": { + "property": "value" + } +} +``` + +### Shell Commands + +```bash +# Command with comment +npm run build:web + +# Multi-line command +VITE_GIT_HASH=`git log -1 --pretty=format:%h` \ + vite build --config vite.config.web.mts +``` + +### TypeScript Examples + +```typescript +// Function with JSDoc +const getEnvironmentConfig = (env: string) => { + switch (env) { + case 'prod': + return { /* production settings */ }; + default: + return { /* development settings */ }; + } +}; +``` + +## File Structure Standards + +### Document Header + +```markdown +# Document Title + +**Author**: Matthew Raymer +**Date**: YYYY-MM-DD +**Status**: 🎯 **STATUS** - Brief description + +## Overview + +Brief description of the document's purpose and scope. +``` + +### Section Organization + +Standard sections: Overview, Current State, Implementation Plan, +Technical Details, Testing & Validation, Next Steps + +## Common Patterns + +Standard implementation plans follow Phase 1 (Foundation), Phase 2 +(Features), Phase 3 (Testing & Polish) structure. + +## Model Implementation Checklist + +### Before Using Templates + +- [ ] **Template Selection**: Choose appropriate template for document type +- [ ] **Structure Review**: Understand required sections and organization +- [ ] **Content Planning**: Plan what information goes in each section +- [ ] **Audience Analysis**: Ensure template matches target audience needs + +### During Template Usage + +- [ ] **Section Completion**: Fill in all required sections completely +- [ ] **Example Integration**: Include relevant code examples and patterns +- [ ] **Formatting Consistency**: Apply markdown standards from core rules +- [ ] **Cross-references**: Link to related documentation and resources + +### After Template Usage + +- [ ] **Content Review**: Verify all sections contain appropriate content +- [ ] **Formatting Check**: Run `npm run markdown:check` for compliance +- [ ] **Template Validation**: Confirm document follows template structure +- [ ] **Quality Assessment**: Ensure content meets project standards + +### Template-Specific Requirements + +- [ ] **Standard Documents**: Include all required metadata and sections +- [ ] **Technical Specs**: Complete all requirement and design sections +- [ ] **Implementation Plans**: Define clear phases and milestones +- [ ] **Examples**: Provide relevant, working code examples + +--- + +**See also**: + +- `.cursor/rules/meta_documentation.mdc` for comprehensive documentation workflow +- `.cursor/rules/docs/markdown_core.mdc` for core formatting standards +- `.cursor/rules/docs/markdown_workflow.mdc` for validation workflows + +**Status**: Active templates and examples +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: markdown_core.mdc +**Stakeholders**: Documentation team, Development team diff --git a/.cursor/rules/docs/markdown_workflow.mdc b/.cursor/rules/docs/markdown_workflow.mdc new file mode 100644 index 0000000..0afadd2 --- /dev/null +++ b/.cursor/rules/docs/markdown_workflow.mdc @@ -0,0 +1,168 @@ +# Markdown Workflow & Validation + +> **Agent role**: Reference this file for markdown validation rules, +> enforcement procedures, and workflow management. + +## Markdownlint Configuration + +### Core Rules + +```json +{ + "MD013": { "line_length": 80, "code_blocks": false }, + "MD012": true, + "MD022": true, + "MD031": true, + "MD032": true, + "MD047": true, + "MD009": true, + "MD004": { "style": "dash" } +} +``` + +### Rule Explanations + +- **MD013**: Line length (80 chars, disabled for code blocks) +- **MD012**: No multiple consecutive blank lines +- **MD022**: Headings should be surrounded by blank lines +- **MD031**: Fenced code blocks should be surrounded by blank lines +- **MD032**: Lists should be surrounded by blank lines +- **MD047**: Files should end with a single newline +- **MD009**: No trailing spaces +- **MD004**: Consistent list markers (dash style) + +## Validation Commands + +### Check All MDC Files + +```bash +npm run markdown:check +``` + +### Auto-fix Formatting Issues + +```bash +npm run markdown:fix +``` + +### Check Single File + +```bash +npx markdownlint-cli2 .cursor/rules/filename.mdc +``` + +## Enforcement Workflow + +### Pre-commit Hooks + +- **Automatic**: `lint-staged` runs `markdownlint-cli2 --fix` on all + staged `.mdc` files +- **Result**: Files are automatically formatted before commit +- **Blocking**: Commits with unfixable violations are blocked + +### CI/CD Integration + +- **Build Pipeline**: Include markdownlint in automated builds +- **Quality Reports**: Generate documentation quality metrics +- **Build Failure**: Fail builds with critical violations + +### Team Guidelines + +- **PR Requirements**: All documentation PRs must pass markdownlint +- **Templates**: Use provided templates for new documents +- **Patterns**: Follow established patterns for consistency +- **Auto-fixing**: Let automation handle formatting, focus on content + +## Quality Assurance + +### Validation Checklist + +- [ ] All files pass `npm run markdown:check` +- [ ] Line length under 80 characters +- [ ] Proper blank line spacing around elements +- [ ] No trailing spaces +- [ ] Consistent list markers +- [ ] Proper heading hierarchy +- [ ] Code blocks have language specification + +### Common Issues & Fixes + +#### Trailing Spaces + +```bash +# Remove trailing spaces +sed -i 's/[[:space:]]*$//' .cursor/rules/**/*.mdc +``` + +#### Multiple Blank Lines + +```bash +# Remove multiple blank lines +sed -i '/^$/N;/^\n$/D' .cursor/rules/**/*.mdc +``` + +#### Missing Newlines + +```bash +# Add newline at end if missing +find .cursor/rules -name "*.mdc" -exec sed -i -e '$a\' {} \; +``` + +## Integration Points + +### Git Workflow + +1. **Edit**: Make changes to MDC files +2. **Stage**: `git add .cursor/rules/filename.mdc` +3. **Auto-fix**: `lint-staged` runs `markdownlint-cli2 --fix` +4. **Commit**: Changes are committed with perfect formatting + +### Development Workflow + +1. **Create/Edit**: Use templates from `markdown_templates.mdc` +2. **Validate**: Run `npm run markdown:check` before committing +3. **Auto-fix**: Use `npm run markdown:fix` for bulk fixes +4. **Review**: Ensure content quality, not just formatting + +## Model Implementation Checklist + +### Before Starting Workflow + +- [ ] **Configuration Review**: Understand markdownlint rules and settings +- [ ] **Tool Availability**: Ensure markdownlint-cli2 is installed and working +- [ ] **File Scope**: Identify which files need validation or fixing +- [ ] **Backup Strategy**: Consider backing up files before bulk operations + +### During Workflow Execution + +- [ ] **Validation First**: Run `npm run markdown:check` to identify issues +- [ ] **Issue Analysis**: Review and understand each validation error +- [ ] **Auto-fix Application**: Use `npm run markdown:fix` for automatic fixes +- [ ] **Manual Review**: Check files that couldn't be auto-fixed + +### After Workflow Completion + +- [ ] **Final Validation**: Confirm all files pass `npm run markdown:check` +- [ ] **Quality Review**: Verify formatting meets project standards +- [ ] **Documentation Update**: Update any related documentation or guides +- [ ] **Team Communication**: Share workflow results and any manual fixes needed + +### Workflow-Specific Requirements + +- [ ] **Pre-commit Hooks**: Ensure lint-staged configuration is working +- [ ] **CI/CD Integration**: Verify build pipeline includes markdown validation +- [ ] **Team Guidelines**: Confirm all team members understand the workflow +- [ ] **Error Resolution**: Document common issues and their solutions + +--- + +**See also**: + +- `.cursor/rules/docs/markdown_core.mdc` for core formatting standards +- `.cursor/rules/docs/markdown_templates.mdc` for document templates + +**Status**: Active workflow and validation +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: markdown_core.mdc, markdown_templates.mdc +**Stakeholders**: Development team, Documentation team diff --git a/.cursor/rules/documentation.mdc b/.cursor/rules/documentation.mdc deleted file mode 100644 index 4b02917..0000000 --- a/.cursor/rules/documentation.mdc +++ /dev/null @@ -1,19 +0,0 @@ ---- -globs: *.md -alwaysApply: false ---- - -INITIAL_PLAN.md is unique to projects built inhouse and must never be deleted. -Maintain traditional files (README, CHANGELOG, BUILDING, etc.) -Any ad hoc files must always be put into docs folder -The docs folder must use sub-folders to classify documents by -There must never be more than seven folders at any sub-folder of the docs tree -Keep documents no more than seven in number for a folder. -If you need more documents than seven, make sub-folders to classify or re-classify documents. -Re-use documents by ammending or editing but always version them in git. -put documentation at the file, classs, and method heads - -Documents themselves must: - -Headings should be surrounded by blank lines -Lists should be surrounded by blank \ No newline at end of file diff --git a/.cursor/rules/features/camera-implementation.mdc b/.cursor/rules/features/camera-implementation.mdc new file mode 100644 index 0000000..78c90e5 --- /dev/null +++ b/.cursor/rules/features/camera-implementation.mdc @@ -0,0 +1,163 @@ +# Camera Implementation Documentation + +## Overview + +This document describes how camera functionality is implemented across the +TimeSafari application. The application uses cameras for two main purposes: + +1. QR Code scanning + +2. Photo capture + +## Components + +### QRScannerDialog.vue + +Primary component for QR code scanning in web browsers. + +**Key Features:** + +- Uses `qrcode-stream` for web-based QR scanning + +- Supports both front and back cameras + +- Provides real-time camera status feedback + +- Implements error handling with user-friendly messages + +- Includes camera switching functionality + +**Camera Access Flow:** + +1. Checks for camera API availability + +2. Enumerates available video devices + +3. Requests camera permissions + +4. Initializes camera stream with preferred settings + +5. Handles various error conditions with specific messages + +### PhotoDialog.vue + +Component for photo capture and selection. + +**Key Features:** + +- Cross-platform photo capture interface + +- Image cropping capabilities + +- File selection fallback + +- Unified interface for different platforms + +## Services + +### QRScanner Services + +#### WebDialogQRScanner + +Web-based implementation of QR scanning. + +**Key Methods:** + +- `checkPermissions()`: Verifies camera permission status + +- `requestPermissions()`: Requests camera access + +- `isSupported()`: Checks for camera API support + +- Handles various error conditions with specific messages + +#### CapacitorQRScanner + +Native implementation using Capacitor's MLKit. + +**Key Features:** + +- Uses `@capacitor-mlkit/barcode-scanning` + +- Supports both front and back cameras + +- Implements permission management + +- Provides continuous scanning capability + +### Platform Services + +#### WebPlatformService + +Web-specific implementation of platform features. + +**Camera Capabilities:** + +- Uses HTML5 file input with capture attribute + +- Falls back to file selection if camera unavailable + +- Processes captured images for consistent format + +#### CapacitorPlatformService + +Native implementation using Capacitor. + +**Camera Features:** + +- Uses `Camera.getPhoto()` for native camera access + +- Supports image editing + +- Configures high-quality image capture + +- Handles base64 image processing + +#### ElectronPlatformService + +Desktop implementation (currently unimplemented). + +--- + +**See also**: + +- `.cursor/rules/features/camera_technical.mdc` for + + detailed technical implementation + +- `.cursor/rules/features/camera_platforms.mdc` for platform-specific details + +**Status**: Active camera implementation overview +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: None +**Stakeholders**: Development team, Camera feature team + +- iOS and Android devices + +- Desktop platforms + +- Various network conditions + +## Model Implementation Checklist + +### Before Camera Implementation + +- [ ] **Platform Analysis**: Understand camera requirements across all platforms +- [ ] **Feature Planning**: Plan QR scanning and photo capture features +- [ ] **Service Planning**: Plan camera service architecture +- [ ] **Testing Strategy**: Plan testing across web, mobile, and desktop + +### During Camera Implementation + +- [ ] **Component Development**: Implement QRScannerDialog and PhotoDialog +- [ ] **Service Implementation**: Implement platform-specific camera services +- [ ] **Permission Handling**: Implement proper camera permission management +- [ ] **Error Handling**: Implement graceful error handling for camera failures + +### After Camera Implementation + +- [ ] **Cross-Platform Testing**: Test camera functionality across all platforms +- [ ] **Feature Validation**: Verify QR scanning and photo capture work correctly +- [ ] **Performance Testing**: Ensure camera performance meets requirements +- [ ] **Documentation Update**: Update camera implementation documentation diff --git a/.cursor/rules/features/camera_platforms.mdc b/.cursor/rules/features/camera_platforms.mdc new file mode 100644 index 0000000..a7a3566 --- /dev/null +++ b/.cursor/rules/features/camera_platforms.mdc @@ -0,0 +1,225 @@ +# Camera Platform-Specific Implementation + +> **Agent role**: + Reference this file for platform-specific camera implementation details. + +## Web Platform + +### Implementation Details + +- Uses `getUserMedia` API for camera access + +- Implements fallback to file input if camera unavailable + +- Handles browser compatibility issues + +- Requires HTTPS for camera access + +### Browser Support + +- Chrome: Full support + +- Firefox: Full support + +- Safari: Limited support + +- Edge: Full support + +### Fallback Mechanisms + +1. Camera access via getUserMedia + +2. File input for image upload + +3. Drag and drop support + +4. Clipboard paste support + +## Mobile Platform (Capacitor) + +### iOS Implementation + +- Uses `@capacitor-mlkit/barcode-scanning` + +- Implements proper permission handling + +- Supports both front and back cameras + +- Handles camera switching + +### Android Implementation + +- Uses `@capacitor-mlkit/barcode-scanning` + +- Implements proper permission handling + +- Supports both front and back cameras + +- Handles camera switching + +### Permission Handling + +- Camera permissions requested at runtime + +- Permission state tracked and cached + +- Graceful handling of denied permissions + +- Clear user guidance for enabling permissions + +## Desktop Platform (Electron) + +### Current Status + +- Camera implementation pending + +- Will use platform-specific APIs + +- Requires proper permission handling + +- Will support both built-in and external cameras + +### Planned Implementation + +- Native camera access via Electron + +- Platform-specific camera APIs + +- Proper permission handling + +- Camera switching support + +## Platform Detection + +### Implementation + +- Uses `PlatformServiceFactory` for platform detection + +- Implements platform-specific camera services + +- Handles platform-specific error conditions + +- Provides platform-specific user guidance + +### Service Selection + +- Web: `WebPlatformService` + +- Mobile: `CapacitorPlatformService` + +- Desktop: `ElectronPlatformService` + +## Cross-Platform Compatibility + +### Common Interface + +- Unified camera service interface + +- Platform-specific implementations + +- Consistent error handling + +- Unified user experience + +### Feature Parity + +- Core camera functionality across platforms + +- Platform-specific optimizations + +- Consistent user interface + +- Unified error messages + +## Platform-Specific Features + +### Web + +- Browser-based camera access + +- File upload fallback + +- Drag and drop support + +- Clipboard paste support + +### Mobile + +- Native camera access + +- Barcode scanning + +- Photo capture + +- Camera switching + +### Desktop + +- Native camera access (planned) + +- External camera support (planned) + +- Advanced camera controls (planned) + +## Testing Strategy + +### Platform Coverage + +- Web: Multiple browsers + +- Mobile: iOS and Android devices + +- Desktop: Windows, macOS, Linux + +### Test Scenarios + +- Permission handling + +- Camera access + +- Error conditions + +- Platform compatibility + +- Performance metrics + +--- + +**See also**: + +- `.cursor/rules/features/camera-implementation.mdc` for + + core implementation overview + +- `.cursor/rules/features/camera_technical.mdc` for + + technical implementation details + +**Status**: Active platform-specific implementation guide +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: camera-implementation.mdc +**Stakeholders**: Development team, Platform team + +## Model Implementation Checklist + +### Before Camera Platform Implementation + +- [ ] **Platform Analysis**: Identify target platforms and their camera capabilities +- [ ] **Feature Planning**: Plan platform-specific camera features +- [ ] **Integration Planning**: Plan integration with existing camera systems +- [ ] **Testing Strategy**: Plan testing across all target platforms + +### During Camera Platform Implementation + +- [ ] **Platform Services**: Implement platform-specific camera functionality +- [ ] **Feature Development**: Implement planned camera features for each platform +- [ ] **Integration**: Integrate with existing camera infrastructure +- [ ] **Performance Optimization**: Optimize camera performance for each platform + +### After Camera Platform Implementation + +- [ ] **Cross-Platform Testing**: Test camera functionality across all platforms +- [ ] **Feature Validation**: Verify all planned features work correctly +- [ ] **Performance Testing**: Ensure camera performance meets requirements +- [ ] **Documentation Update**: Update platform-specific camera documentation diff --git a/.cursor/rules/features/camera_technical.mdc b/.cursor/rules/features/camera_technical.mdc new file mode 100644 index 0000000..4f69a3d --- /dev/null +++ b/.cursor/rules/features/camera_technical.mdc @@ -0,0 +1,203 @@ +# Camera Technical Implementation — Details and Best Practices + +> **Agent role**: Reference this file for + detailed technical implementation when working with camera features. + +## Platform-Specific Considerations + +### iOS + +- Requires `NSCameraUsageDescription` in Info.plist + +- Supports both front and back cameras + +- Implements proper permission handling + +### Android + +- Requires camera permissions in manifest + +- Supports both front and back cameras + +- Handles permission requests through Capacitor + +### Web + +- Requires HTTPS for camera access + +- Implements fallback mechanisms + +- Handles browser compatibility issues + +## Error Handling + +### Common Error Scenarios + +1. No camera found + +2. Permission denied + +3. Camera in use by another application + +4. HTTPS required + +5. Browser compatibility issues + +### Error Response + +- User-friendly error messages + +- Troubleshooting tips + +- Clear instructions for resolution + +- Platform-specific guidance + +## Security Considerations + +### Permission Management + +- Explicit permission requests + +- Permission state tracking + +- Graceful handling of denied permissions + +### Data Handling + +- Secure image processing + +- Proper cleanup of camera resources + +- No persistent storage of camera data + +## Best Practices + +### Camera Access + +1. Always check for camera availability + +2. Request permissions explicitly + +3. Handle all error conditions + +4. Provide clear user feedback + +5. Implement proper cleanup + +### Performance + +1. Optimize camera resolution + +2. Implement proper resource cleanup + +3. Handle camera switching efficiently + +4. Manage memory usage + +### User Experience + +1. Clear status indicators + +2. Intuitive camera controls + +3. Helpful error messages + +4. Smooth camera switching + +5. Responsive UI feedback + +## Future Improvements + +### Planned Enhancements + +1. Implement Electron camera support + +2. Add advanced camera features + +3. Improve error handling + +4. Enhance user feedback + +5. Optimize performance + +### Known Issues + +1. Electron camera implementation pending + +2. Some browser compatibility limitations + +3. Platform-specific quirks to address + +## Dependencies + +### Key Packages + +- `@capacitor-mlkit/barcode-scanning` + +- `qrcode-stream` + +- `vue-picture-cropper` + +- Platform-specific camera APIs + +## Testing + +### Test Scenarios + +1. Permission handling + +2. Camera switching + +3. Error conditions + +4. Platform compatibility + +5. Performance metrics + +### Test Environment + +- Multiple browsers + +- iOS and Android devices + +- Desktop platforms + +--- + +**See also**: + +- `.cursor/rules/features/camera-implementation.mdc` for + + core implementation overview + +- `.cursor/rules/features/camera_platforms.mdc` for platform-specific details + +**Status**: Active technical implementation guide +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: camera-implementation.mdc +**Stakeholders**: Development team, Camera feature team + +## Model Implementation Checklist + +### Before Camera Implementation + +- [ ] **Platform Analysis**: Identify target platforms and camera capabilities +- [ ] **Permission Planning**: Plan permission handling for camera access +- [ ] **Dependency Review**: Review required camera packages and APIs +- [ ] **Testing Strategy**: Plan testing across multiple platforms + +### During Camera Implementation + +- [ ] **Platform Services**: Implement platform-specific camera services +- [ ] **Permission Handling**: Implement proper camera permission handling +- [ ] **Error Handling**: Implement graceful error handling for camera failures +- [ ] **Performance Optimization**: Optimize camera performance and responsiveness + +### After Camera Implementation + +- [ ] **Cross-Platform Testing**: Test camera functionality across all platforms +- [ ] **Permission Testing**: Test permission handling and user feedback +- [ ] **Performance Validation**: Verify camera performance meets requirements +- [ ] **Documentation Update**: Update camera technical documentation diff --git a/.cursor/rules/general_development.mdc b/.cursor/rules/general_development.mdc deleted file mode 100644 index 3dca909..0000000 --- a/.cursor/rules/general_development.mdc +++ /dev/null @@ -1,3 +0,0 @@ ---- -alwaysApply: true ---- diff --git a/.cursor/rules/logging.mdc b/.cursor/rules/logging.mdc deleted file mode 100644 index 777f159..0000000 --- a/.cursor/rules/logging.mdc +++ /dev/null @@ -1,6 +0,0 @@ ---- -alwaysApply: true ---- -Always use structlog with rich contextual annotation -All logs should go to rsyslog -Logs showing in console should be set to whatever is needed at that time. diff --git a/.cursor/rules/meta_bug_diagnosis.mdc b/.cursor/rules/meta_bug_diagnosis.mdc new file mode 100644 index 0000000..2231934 --- /dev/null +++ b/.cursor/rules/meta_bug_diagnosis.mdc @@ -0,0 +1,288 @@ +# Meta-Rule: Bug Diagnosis Workflow + +**Author**: Matthew Raymer +**Date**: August 24, 2025 +**Status**: 🎯 **ACTIVE** - Core workflow for all bug investigation + +## Purpose + +This meta-rule defines the systematic approach for investigating and diagnosing +bugs, defects, and unexpected behaviors in the TimeSafari application. It ensures +consistent, thorough, and efficient problem-solving workflows. + +## Workflow Constraints + +**This meta-rule enforces DIAGNOSIS MODE for all bundled sub-rules:** + +```json +{ + "workflowMode": "diagnosis", + "constraints": { + "mode": "read_only", + "forbidden": ["modify", "create", "build", "commit"], + "required": "complete_investigation_before_fixing" + } +} +``` + +**All bundled sub-rules automatically inherit these constraints.** + +## Workflow State Update + +**When this meta-rule is invoked, update the workflow state file:** + +```json +{ + "currentMode": "diagnosis", + "lastInvoked": "meta_bug_diagnosis.mdc", + "timestamp": "2025-01-27T15:30:00Z", + "constraints": { + "mode": "read_only", + "forbidden": ["modify", "create", "build", "commit"], + "allowed": ["read", "search", "analyze", "document"], + "required": "complete_investigation_before_fixing" + } +} +``` + +**State File Location**: `.cursor/rules/.workflow_state.json` + +**This enables the core always-on rule to enforce diagnosis mode constraints.** + +## When to Use + +**ALWAYS** - Apply this workflow to every bug investigation, regardless of +severity or complexity. This ensures systematic problem-solving and prevents +common investigation pitfalls. + +## Bundled Rules + +### **Investigation Foundation** + +- **`development/research_diagnostic.mdc`** - Research and investigation methodologies +- **`development/logging_standards.mdc`** - Logging and debugging best practices +- **`development/type_safety_guide.mdc`** - Type safety and error prevention + +### **Development Workflow** + +- **`workflow/version_control.mdc`** - Version control during investigation +- **`development/software_development.mdc`** - Development best practices + +## Critical Development Constraints + +### **🚫 NEVER Use Build Commands During Diagnosis** + +**Critical Rule**: Never use `npm run build:web` or similar build commands during bug diagnosis + +- **Reason**: These commands block the chat and prevent effective troubleshooting +- **Impact**: Blocks user interaction, prevents real-time problem solving +- **Alternative**: Use safe, fast commands for investigation +- **When to use build**: Only after diagnosis is complete and fixes are ready for testing + +### **Safe Diagnosis Commands** + +✅ **Safe to use during diagnosis:** +- `npm run lint-fix` - Syntax and style checking +- `npm run type-check` - TypeScript validation (if available) +- `git status` - Version control status +- `ls` / `dir` - File listing +- `cat` / `read_file` - File content inspection +- `grep_search` - Text pattern searching + +❌ **Never use during diagnosis:** +- `npm run build:web` - Blocks chat +- `npm run build:electron` - Blocks chat +- `npm run build:capacitor` - Blocks chat +- Any long-running build processes + +## Investigation Workflow + +### **Phase 1: Problem Definition** + +1. **Gather Evidence** + - Error messages and stack traces + - User-reported symptoms + - System logs and timestamps + - Reproduction steps + +2. **Context Analysis** + - When did the problem start? + - What changed recently? + - Which platform/environment? + - User actions leading to the issue + +### **Phase 2: Systematic Investigation** + +1. **Code Inspection** + - Relevant file examination + - Import and dependency analysis + - Syntax and type checking + - Logic flow analysis + +2. **Environment Analysis** + - Platform-specific considerations + - Configuration and settings + - Database and storage state + - Network and API connectivity + +### **Phase 3: Root Cause Identification** + +1. **Pattern Recognition** + - Similar issues in codebase + - Common failure modes + - Platform-specific behaviors + - Recent changes impact + +2. **Hypothesis Testing** + - Targeted code changes + - Configuration modifications + - Environment adjustments + - Systematic elimination + +## Investigation Techniques + +### **Safe Code Analysis** + +- **File Reading**: Use `read_file` tool for targeted inspection +- **Pattern Searching**: Use `grep_search` for code patterns +- **Semantic Search**: Use `codebase_search` for related functionality +- **Import Tracing**: Follow dependency chains systematically + +### **Error Analysis** + +- **Stack Trace Analysis**: Identify error origin and propagation +- **Log Correlation**: Match errors with system events +- **Timeline Reconstruction**: Build sequence of events +- **Context Preservation**: Maintain investigation state + +### **Platform Considerations** + +- **Web Platform**: Browser-specific behaviors and limitations +- **Electron Platform**: Desktop app considerations +- **Capacitor Platform**: Mobile app behaviors +- **Cross-Platform**: Shared vs. platform-specific code + +## Evidence Collection Standards + +### **Timestamps** + +- **UTC Format**: All timestamps in UTC for consistency +- **Precision**: Include milliseconds for precise correlation +- **Context**: Include relevant system state information +- **Correlation**: Link events across different components + +### **Error Context** + +- **Full Error Objects**: Capture complete error information +- **Stack Traces**: Preserve call stack for analysis +- **User Actions**: Document steps leading to error +- **System State**: Capture relevant configuration and state + +### **Reproduction Steps** + +- **Clear Sequence**: Step-by-step reproduction instructions +- **Environment Details**: Platform, version, configuration +- **Data Requirements**: Required data or state +- **Expected vs. Actual**: Clear behavior comparison + +## Investigation Documentation + +### **Problem Summary** + +- **Issue Description**: Clear, concise problem statement +- **Impact Assessment**: Severity and user impact +- **Scope Definition**: Affected components and users +- **Priority Level**: Based on impact and frequency + +### **Investigation Log** + +- **Timeline**: Chronological investigation steps +- **Evidence**: Collected information and findings +- **Hypotheses**: Tested theories and results +- **Conclusions**: Root cause identification + +### **Solution Requirements** + +- **Fix Description**: Required changes and approach +- **Testing Strategy**: Validation and verification steps +- **Rollback Plan**: Reversion strategy if needed +- **Prevention Measures**: Future issue prevention + +## Quality Standards + +### **Investigation Completeness** + +- **Evidence Sufficiency**: Adequate information for root cause +- **Alternative Theories**: Considered and eliminated +- **Platform Coverage**: All relevant platforms investigated +- **Edge Cases**: Unusual scenarios considered + +### **Documentation Quality** + +- **Clear Communication**: Understandable to all stakeholders +- **Technical Accuracy**: Precise technical details +- **Actionable Insights**: Clear next steps and recommendations +- **Knowledge Transfer**: Lessons learned for future reference + +## Common Pitfalls + +### **Investigation Mistakes** + +- **Jumping to Solutions**: Implementing fixes before understanding +- **Insufficient Evidence**: Making assumptions without data +- **Platform Blindness**: Ignoring platform-specific behaviors +- **Scope Creep**: Expanding investigation beyond original problem + +### **Communication Issues** + +- **Technical Jargon**: Using unclear terminology +- **Missing Context**: Insufficient background information +- **Unclear Recommendations**: Vague or ambiguous next steps +- **Poor Documentation**: Incomplete or unclear investigation records + +## Success Criteria + +- [ ] **Problem clearly defined** with sufficient evidence +- [ ] **Root cause identified** through systematic investigation +- [ ] **Solution approach determined** with clear requirements +- [ ] **Documentation complete** for knowledge transfer +- [ ] **No chat-blocking commands** used during investigation +- [ ] **Platform considerations** properly addressed +- [ ] **Timeline and context** properly documented + +## Integration with Other Meta-Rules + +### **Bug Fixing** + +- **Investigation Results**: Provide foundation for fix implementation +- **Solution Requirements**: Define what needs to be built +- **Testing Strategy**: Inform validation approach +- **Documentation**: Support implementation guidance + +### **Feature Planning** + +- **Root Cause Analysis**: Identify systemic issues +- **Prevention Measures**: Plan future issue avoidance +- **Architecture Improvements**: Identify structural enhancements +- **Process Refinements**: Improve development workflows + +### **Research and Documentation** + +- **Knowledge Base**: Contribute to troubleshooting guides +- **Pattern Recognition**: Identify common failure modes +- **Best Practices**: Develop investigation methodologies +- **Team Training**: Improve investigation capabilities + +--- + +**See also**: + +- `.cursor/rules/meta_bug_fixing.mdc` for implementing fixes +- `.cursor/rules/meta_feature_planning.mdc` for planning improvements +- `.cursor/rules/meta_documentation.mdc` for documentation standards + +**Status**: Active meta-rule for bug diagnosis +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: All bundled sub-rules +**Stakeholders**: Development team, QA team, DevOps team diff --git a/.cursor/rules/meta_bug_fixing.mdc b/.cursor/rules/meta_bug_fixing.mdc new file mode 100644 index 0000000..538b5ca --- /dev/null +++ b/.cursor/rules/meta_bug_fixing.mdc @@ -0,0 +1,214 @@ +# Meta-Rule: Bug Fixing + +**Author**: Matthew Raymer +**Date**: 2025-08-21 +**Status**: 🎯 **ACTIVE** - Bug fix implementation workflow bundling + +## Purpose + +This meta-rule bundles all the rules needed for implementing bug fixes +with proper testing and validation. Use this after diagnosis when +implementing the actual fix. + +## Workflow Constraints + +**This meta-rule enforces FIXING MODE for all bundled sub-rules:** + +```json +{ + "workflowMode": "fixing", + "constraints": { + "mode": "implementation", + "allowed": ["modify", "create", "build", "test", "commit"], + "required": "diagnosis_complete_before_fixing" + } +} +``` + +**All bundled sub-rules automatically inherit these constraints.** + +## Workflow State Update + +**When this meta-rule is invoked, update the workflow state file:** + +```json +{ + "currentMode": "fixing", + "lastInvoked": "meta_bug_fixing.mdc", + "timestamp": "2025-01-27T15:30:00Z", + "constraints": { + "mode": "implementation", + "allowed": ["modify", "create", "build", "test", "commit"], + "forbidden": [], + "required": "diagnosis_complete_before_fixing" + } +} +``` + +**State File Location**: `.cursor/rules/.workflow_state.json` + +**This enables the core always-on rule to enforce fixing mode constraints.** + +## When to Use + +- **Post-Diagnosis**: After root cause is identified and fix is planned +- **Fix Implementation**: When coding the actual bug fix +- **Testing & Validation**: When testing the fix works correctly +- **Code Review**: When reviewing the fix implementation +- **Deployment**: When preparing the fix for deployment +- **Documentation**: When documenting the fix and lessons learned + +## Bundled Rules + +### **Implementation Standards** + +- **`development/software_development.mdc`** - Core development + principles, evidence requirements, and testing strategy +- **`development/type_safety_guide.mdc`** - Type-safe implementation + with proper error handling and type guards +- **`development/logging_migration.mdc`** - Proper logging + implementation and migration from console.* calls + +### **Code Quality & Review** + +- **`development/historical_comment_management.mdc`** - Code quality + standards and comment transformation rules +- **`development/historical_comment_patterns.mdc`** - Specific + patterns for transforming historical comments +- **`development/complexity_assessment.mdc`** - Complexity evaluation + for fix implementation + +### **Platform & Testing** + +- **`app/timesafari_development.mdc`** - TimeSafari-specific + development workflow and testing requirements +- **`app/timesafari_platforms.mdc`** - Platform-specific testing + and validation requirements +- **`architecture/build_validation.mdc`** - Build system validation + and testing procedures + +## Workflow Sequence + +### **Phase 1: Fix Implementation (Start Here)** + +1. **Development Standards** - Apply `software_development.mdc` for + core implementation principles +2. **Type Safety** - Use `type_safety_guide.mdc` for type-safe + implementation +3. **Logging Implementation** - Apply `logging_migration.mdc` for + proper logging + +### **Phase 2: Quality & Review** + +1. **Code Quality** - Use `historical_comment_management.mdc` for + code quality standards +2. **Complexity Assessment** - Apply `complexity_assessment.mdc` to + evaluate fix complexity +3. **Code Review** - Follow review standards from bundled rules + +### **Phase 3: Testing & Validation** + +1. **Platform Testing** - Use `timesafari_platforms.mdc` for + platform-specific testing +2. **Build Validation** - Apply `build_validation.mdc` for build + system compliance +3. **Final Validation** - Verify fix works across all platforms + +## Success Criteria + +- [ ] **Fix implemented** following development standards +- [ ] **Type safety maintained** with proper error handling +- [ ] **Logging properly implemented** with component context +- [ ] **Code quality standards met** with clean, maintainable code +- [ ] **Testing completed** across all target platforms +- [ ] **Build validation passed** with no build system issues +- [ ] **Code review completed** with all feedback addressed +- [ ] **Documentation updated** with fix details and lessons learned + +## Common Pitfalls + +- **Don't skip type safety** - leads to runtime errors +- **Don't ignore logging** - makes future debugging harder +- **Don't skip platform testing** - misses platform-specific issues +- **Don't ignore code quality** - creates technical debt +- **Don't skip build validation** - can break build system +- **Don't forget documentation** - loses fix context for future + +## Integration Points + +### **With Other Meta-Rules** + +- **Bug Diagnosis**: Investigation results drive fix implementation +- **Feature Implementation**: Fix patterns inform future development +- **Feature Planning**: Fix complexity informs future planning + +### **With Development Workflow** + +- Fix implementation follows development standards +- Testing strategy ensures fix quality +- Code review maintains code quality + +## Feedback & Improvement + +### **Sub-Rule Ratings (1-5 scale)** + +- **Development Standards**: ___/5 - Comments: _______________ +- **Type Safety**: ___/5 - Comments: _______________ +- **Logging Migration**: ___/5 - Comments: _______________ +- **Code Quality**: ___/5 - Comments: _______________ +- **Platform Testing**: ___/5 - Comments: _______________ + +### **Workflow Feedback** + +- **Implementation Clarity**: How clear was the implementation guidance? +- **Testing Coverage**: Were testing requirements sufficient or excessive? +- **Process Effectiveness**: How well did the workflow work for you? + +### **Sub-Rule Improvements** + +- **Clarity Issues**: Which rules were unclear or confusing? +- **Missing Examples**: What examples would make rules more useful? +- **Integration Problems**: Do any rules conflict or overlap? + +### **Overall Experience** + +- **Time Saved**: How much time did this meta-rule save you? +- **Quality Improvement**: Did following these rules improve your fix? +- **Recommendation**: Would you recommend this meta-rule to others? + +## Model Implementation Checklist + +### Before Bug Fixing + +- [ ] **Root Cause Understood**: Confirm root cause is clearly identified +- [ ] **Fix Strategy Planned**: Plan implementation approach and testing +- [ ] **Platform Impact Assessed**: Understand impact across all platforms +- [ ] **Testing Strategy Planned**: Plan testing approach for the fix + +### During Bug Fixing + +- [ ] **Rule Application**: Apply bundled rules in recommended sequence +- [ ] **Implementation**: Implement fix following development standards +- [ ] **Testing**: Test fix across all target platforms +- [ ] **Documentation**: Document implementation details and decisions + +### After Bug Fixing + +- [ ] **Validation**: Verify fix meets all success criteria +- [ ] **Code Review**: Complete code review with team +- [ ] **Deployment**: Deploy fix following deployment procedures +- [ ] **Feedback Collection**: Collect feedback on meta-rule effectiveness + +--- + +**See also**: + +- `.cursor/rules/meta_bug_diagnosis.mdc` for investigation workflow +- `.cursor/rules/meta_feature_implementation.mdc` for implementation patterns +- `.cursor/rules/meta_feature_planning.mdc` for planning future work + +**Status**: Active meta-rule for bug fixing +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: All bundled sub-rules +**Stakeholders**: Development team, QA team, DevOps team diff --git a/.cursor/rules/meta_change_evaluation.mdc b/.cursor/rules/meta_change_evaluation.mdc new file mode 100644 index 0000000..dd4e1f7 --- /dev/null +++ b/.cursor/rules/meta_change_evaluation.mdc @@ -0,0 +1,383 @@ +# Meta-Rule: Change Evaluation and Breaking Change Detection + +**Author**: Matthew Raymer +**Date**: 2025-08-25 +**Status**: 🎯 **ACTIVE** - Manually activated change evaluation rule + +## Purpose + +This meta-rule provides a systematic approach to evaluate changes between +branches and detect potential breaking changes. It's designed to catch +problematic model behavior by analyzing the nature, scope, and impact of +code changes before they cause issues. + +## When to Use + +**Manual Activation Only** - This rule should be invoked when: + +- Reviewing changes before merging branches +- Investigating unexpected behavior after updates +- Validating that model-generated changes are safe +- Analyzing the impact of recent commits +- Debugging issues that may be caused by recent changes + +## Workflow State Enforcement + +**This meta-rule enforces current workflow mode constraints:** + +### **Current Workflow State** + +```json +{ + "workflowState": { + "currentMode": "diagnosis|fixing|planning|research|documentation", + "constraints": { + "mode": "read_only|implementation|design_only|investigation|writing_only", + "allowed": ["array", "of", "allowed", "actions"], + "forbidden": ["array", "of", "forbidden", "actions"] + } + } +} +``` + +### **Mode-Specific Enforcement** + +**Diagnosis Mode (read_only):** + +- ❌ **Forbidden**: File modification, code creation, build commands, git + commits +- ✅ **Allowed**: File reading, code analysis, investigation, documentation +- **Response**: Focus on analysis and documentation, not implementation + +**Fixing Mode (implementation):** + +- ✅ **Allowed**: File modification, code creation, build commands, testing, + git commits +- ❌ **Forbidden**: None (full implementation mode) +- **Response**: Proceed with implementation and testing + +**Planning Mode (design_only):** + +- ❌ **Forbidden**: Implementation, coding, building, deployment +- ✅ **Allowed**: Analysis, design, estimation, documentation, architecture +- **Response**: Focus on planning and design, not implementation + +**Research Mode (investigation):** + +- ❌ **Forbidden**: File modification, implementation, deployment +- ✅ **Allowed**: Investigation, analysis, research, documentation +- **Response**: Focus on investigation and analysis + +**Documentation Mode (writing_only):** + +- ❌ **Forbidden**: Implementation, coding, building, deployment +- ✅ **Allowed**: Writing, editing, formatting, structuring, reviewing +- **Response**: Focus on documentation creation and improvement + +## Change Evaluation Process + +### **Phase 1: Change Discovery and Analysis** + +1. **Branch Comparison Analysis** + + - Compare working branch with master/main branch + - Identify all changed files and their modification types + - Categorize changes by scope and impact + +2. **Change Pattern Recognition** + + - Identify common change patterns (refactoring, feature addition, bug + fixes) + - Detect unusual or suspicious change patterns + - Flag changes that deviate from established patterns + +3. **Dependency Impact Assessment** + + - Analyze changes to imports, exports, and interfaces + - Identify potential breaking changes to public APIs + - Assess impact on dependent components and services + +### **Phase 2: Breaking Change Detection** + +1. **API Contract Analysis** + + - Check for changes to function signatures, method names, class + interfaces + - Identify removed or renamed public methods/properties + - Detect changes to configuration options and constants + +2. **Data Structure Changes** + + - Analyze database schema modifications + - Check for changes to data models and interfaces + - Identify modifications to serialization/deserialization logic + +3. **Behavioral Changes** + + - Detect changes to business logic and algorithms + - Identify modifications to error handling and validation + - Check for changes to user experience and workflows + +### **Phase 3: Risk Assessment and Recommendations** + +1. **Risk Level Classification** + + - **LOW**: Cosmetic changes, documentation updates, minor refactoring + - **MEDIUM**: Internal API changes, configuration modifications, + performance improvements + - **HIGH**: Public API changes, breaking interface modifications, major + architectural changes + - **CRITICAL**: Database schema changes, authentication modifications, + security-related changes + +2. **Impact Analysis** + + - Identify affected user groups and use cases + - Assess potential for data loss or corruption + - Evaluate impact on system performance and reliability + +3. **Mitigation Strategies** + + - Recommend testing approaches for affected areas + - Suggest rollback strategies if needed + - Identify areas requiring additional validation + +## Implementation Guidelines + +### **Change Analysis Tools** + +1. **Git Diff Analysis** + + ```bash + # Compare working branch with master + git diff master..HEAD --name-only + git diff master..HEAD --stat + git log master..HEAD --oneline + ``` + +2. **File Change Categorization** + + - **Core Files**: Application entry points, main services, critical + utilities + - **Interface Files**: Public APIs, component interfaces, data models + - **Configuration Files**: Environment settings, build configurations, + deployment scripts + - **Test Files**: Unit tests, integration tests, test utilities + +3. **Change Impact Mapping** + + - Map changed files to affected functionality + - Identify cross-dependencies and ripple effects + - Document potential side effects and unintended consequences + +### **Breaking Change Detection Patterns** + +1. **Function Signature Changes** + + ```typescript + // BEFORE + function processData(data: string, options?: Options): Result + + // AFTER - BREAKING CHANGE + function processData(data: string, options: Required): Result + ``` + +2. **Interface Modifications** + + ```typescript + // BEFORE + interface UserProfile { + name: string; + email: string; + } + + // AFTER - BREAKING CHANGE + interface UserProfile { + name: string; + email: string; + phone: string; // Required new field + } + ``` + +3. **Configuration Changes** + + ```typescript + // BEFORE + const config = { + apiUrl: 'https://api.example.com', + timeout: 5000 + }; + + // AFTER - BREAKING CHANGE + const config = { + apiUrl: 'https://api.example.com', + timeout: 5000, + retries: 3 // New required configuration + }; + ``` + +## Output Format + +### **Change Evaluation Report** + +```markdown +# Change Evaluation Report + +## Executive Summary + +- **Risk Level**: [LOW|MEDIUM|HIGH|CRITICAL] +- **Overall Assessment**: [SAFE|CAUTION|DANGEROUS|CRITICAL] +- **Recommendation**: [PROCEED|REVIEW|HALT|IMMEDIATE_ROLLBACK] + +## Change Analysis + +### Files Modified + +- **Total Changes**: [X] files +- **Core Files**: [X] files +- **Interface Files**: [X] files +- **Configuration Files**: [X] files +- **Test Files**: [X] files + +### Change Categories + +- **Refactoring**: [X] changes +- **Feature Addition**: [X] changes +- **Bug Fixes**: [X] changes +- **Configuration**: [X] changes +- **Documentation**: [X] changes + +## Breaking Change Detection + +### API Contract Changes + +- **Function Signatures**: [X] modified +- **Interface Definitions**: [X] modified +- **Public Methods**: [X] added/removed/modified + +### Data Structure Changes + +- **Database Schema**: [X] modifications +- **Data Models**: [X] changes +- **Serialization**: [X] changes + +### Behavioral Changes + +- **Business Logic**: [X] modifications +- **Error Handling**: [X] changes +- **User Experience**: [X] changes + +## Risk Assessment + +### Impact Analysis + +- **User Groups Affected**: [Description] +- **Use Cases Impacted**: [Description] +- **Performance Impact**: [Description] +- **Reliability Impact**: [Description] + +### Dependencies + +- **Internal Dependencies**: [List] +- **External Dependencies**: [List] +- **Configuration Dependencies**: [List] + +## Recommendations + +### Testing Requirements + +- [ ] Unit tests for modified components +- [ ] Integration tests for affected workflows +- [ ] Performance tests for changed algorithms +- [ ] User acceptance tests for UI changes + +### Validation Steps + +- [ ] Code review by domain experts +- [ ] API compatibility testing +- [ ] Database migration testing +- [ ] End-to-end workflow testing + +### Rollback Strategy + +- **Rollback Complexity**: [LOW|MEDIUM|HIGH] +- **Rollback Time**: [Estimated time] +- **Data Preservation**: [Strategy description] + +## Conclusion + +[Summary of findings and final recommendation] +``` + +## Usage Examples + +### **Example 1: Safe Refactoring** + +```bash +@meta_change_evaluation.mdc analyze changes between feature-branch and master +``` + +### **Example 2: Breaking Change Investigation** + +```bash +@meta_change_evaluation.mdc evaluate potential breaking changes in recent commits +``` + +### **Example 3: Pre-Merge Validation** + +```bash +@meta_change_evaluation.mdc validate changes before merging feature-branch to master +``` + +## Success Criteria + +- [ ] **Change Discovery**: All modified files are identified and categorized +- [ ] **Pattern Recognition**: Unusual change patterns are detected and flagged +- [ ] **Breaking Change Detection**: All potential breaking changes are identified +- [ ] **Risk Assessment**: Accurate risk levels are assigned with justification +- [ ] **Recommendations**: Actionable recommendations are provided +- [ ] **Documentation**: Complete change evaluation report is generated + +## Common Pitfalls + +- **Missing Dependencies**: Failing to identify all affected components +- **Underestimating Impact**: Not considering ripple effects of changes +- **Incomplete Testing**: Missing critical test scenarios for changes +- **Configuration Blindness**: Overlooking configuration file changes +- **Interface Assumptions**: Assuming internal changes won't affect external + users + +## Integration with Other Meta-Rules + +### **With Bug Diagnosis** + +- Use change evaluation to identify recent changes that may have caused + bugs +- Correlate change patterns with reported issues + +### **With Feature Planning** + +- Evaluate the impact of planned changes before implementation +- Identify potential breaking changes early in the planning process + +### **With Bug Fixing** + +- Validate that fixes don't introduce new breaking changes +- Ensure fixes maintain backward compatibility + +--- + +**See also**: + +- `.cursor/rules/meta_core_always_on.mdc` for core always-on rules +- `.cursor/rules/meta_feature_planning.mdc` for feature development + workflows +- `.cursor/rules/meta_bug_diagnosis.mdc` for bug investigation workflows +- `.cursor/rules/meta_bug_fixing.mdc` for fix implementation workflows + +**Status**: Active change evaluation meta-rule +**Priority**: High (applies to all change evaluation tasks) +**Estimated Effort**: Ongoing reference +**Dependencies**: All bundled sub-rules +**Stakeholders**: Development team, Quality Assurance team, Release +Management team diff --git a/.cursor/rules/meta_core_always_on.mdc b/.cursor/rules/meta_core_always_on.mdc new file mode 100644 index 0000000..ac9ee1d --- /dev/null +++ b/.cursor/rules/meta_core_always_on.mdc @@ -0,0 +1,311 @@ +--- +alwaysApply: true +--- + +# Meta-Rule: Core Always-On Rules + +**Author**: Matthew Raymer +**Date**: 2025-08-21 +**Status**: 🎯 **ACTIVE** - Core rules for every prompt + +## Purpose + +This meta-rule bundles the core rules that should be applied to **every single +prompt** because they define fundamental behaviors, principles, and context +that are essential for all AI interactions. + +## Workflow Constraints + +**This meta-rule enforces ALWAYS-ON MODE for all bundled sub-rules:** + +```json +{ + "workflowMode": "always_on", + "constraints": { + "mode": "foundation", + "alwaysApplied": true, + "required": "applied_to_every_prompt" + } +} +``` + +**All bundled sub-rules automatically inherit these constraints.** + +## Workflow State Enforcement + +**This meta-rule enforces current workflow mode constraints for all interactions:** + +### **Current Workflow State** +```json +{ + "workflowState": { + "currentMode": "diagnosis|fixing|planning|research|documentation", + "constraints": { + "mode": "read_only|implementation|design_only|investigation|writing_only", + "allowed": ["array", "of", "allowed", "actions"], + "forbidden": ["array", "of", "forbidden", "actions"] + } + } +} +``` + +### **Constraint Enforcement Rules** + +**Before responding to any user request, enforce current mode constraints:** + +1. **Read current workflow state** from `.cursor/rules/.workflow_state.json` +2. **Identify current mode** and its constraints +3. **Validate user request** against current mode constraints +4. **Enforce constraints** before generating response +5. **Guide model behavior** based on current mode + +### **Mode-Specific Enforcement** + +**Diagnosis Mode (read_only):** +- ❌ **Forbidden**: File modification, code creation, build commands, git commits +- ✅ **Allowed**: File reading, code analysis, investigation, documentation +- **Response**: Guide user toward investigation and analysis, not implementation + +**Fixing Mode (implementation):** +- ✅ **Allowed**: File modification, code creation, build commands, testing, git commits +- ❌ **Forbidden**: None (full implementation mode) +- **Response**: Proceed with implementation and testing + +**Planning Mode (design_only):** +- ❌ **Forbidden**: Implementation, coding, building, deployment +- ✅ **Allowed**: Analysis, design, estimation, documentation, architecture +- **Response**: Focus on planning and design, not implementation + +**Research Mode (investigation):** +- ❌ **Forbidden**: File modification, implementation, deployment +- ✅ **Allowed**: Investigation, analysis, research, documentation +- **Response**: Focus on investigation and analysis + +**Documentation Mode (writing_only):** +- ❌ **Forbidden**: Implementation, coding, building, deployment +- ✅ **Allowed**: Writing, editing, formatting, structuring, reviewing +- **Response**: Focus on documentation creation and improvement + +### **Constraint Violation Response** + +**If user request violates current mode constraints:** + +``` +❌ **WORKFLOW CONSTRAINT VIOLATION** + +**Current Mode**: [MODE_NAME] +**Requested Action**: [ACTION] +**Constraint Violation**: [DESCRIPTION] + +**What You Can Do Instead**: +- [LIST OF ALLOWED ALTERNATIVES] + +**To Enable This Action**: Invoke @meta_[appropriate_mode].mdc +``` + +### **Mode Transition Guidance** + +**When user needs to change modes, provide clear guidance:** + +``` +🔄 **MODE TRANSITION REQUIRED** + +**Current Mode**: [CURRENT_MODE] +**Required Mode**: [REQUIRED_MODE] +**Action**: Invoke @meta_[required_mode].mdc + +**This will enable**: [DESCRIPTION OF NEW CAPABILITIES] +``` + +## When to Use + +**ALWAYS** - These rules apply to every single prompt, regardless of the task +or context. They form the foundation for all AI assistant behavior. + +## Bundled Rules + +### **Core Human Competence Principles** + +- **`core/base_context.mdc`** - Human competence first principles, interaction + guidelines, and output contract requirements +- **`core/less_complex.mdc`** - Minimalist solution principle and complexity + guidelines + +### **Time & Context Standards** + +- **`development/time.mdc`** - Time handling principles and UTC standards +- **`development/time_examples.mdc`** - Practical time implementation examples +- **`development/time_implementation.mdc`** - Detailed time implementation + guidelines + +### **Version Control & Process** + +- **`workflow/version_control.mdc`** - Version control principles and commit + guidelines +- **`workflow/commit_messages.mdc`** - Commit message format and conventions + +### **Application Context** + +- **`app/timesafari.mdc`** - Core TimeSafari application context and + development principles +- **`app/timesafari_development.mdc`** - TimeSafari-specific development + workflow and quality standards + +## Why These Rules Are Always-On + +### **Base Context** + +- **Human Competence First**: Every interaction must increase human competence +- **Output Contract**: All responses must follow the required structure +- **Competence Hooks**: Learning and collaboration must be built into every response + +### **Time Standards** + +- **UTC Consistency**: All timestamps must use UTC for system operations +- **Evidence Collection**: Time context is essential for debugging and investigation +- **Cross-Platform**: Time handling affects all platforms and features + +### **Version Control** + +- **Commit Standards**: Every code change must follow commit message conventions +- **Process Consistency**: Version control affects all development work +- **Team Collaboration**: Commit standards enable effective team communication + +### **Application Context** + +- **Platform Awareness**: Every task must consider web/mobile/desktop platforms +- **Architecture Principles**: All work must follow TimeSafari patterns +- **Development Standards**: Quality and testing requirements apply to all work + +## Application Priority + +### **Primary (Apply First)** + +1. **Base Context** - Human competence and output contract +2. **Time Standards** - UTC and timestamp requirements +3. **Application Context** - TimeSafari principles and platforms + +### **Secondary (Apply as Needed)** + +1. **Version Control** - When making code changes +2. **Complexity Guidelines** - When evaluating solution approaches + +## Integration with Other Meta-Rules + +### **Feature Planning** + +- Base context ensures human competence focus +- Time standards inform planning and estimation +- Application context drives platform considerations + +### **Bug Diagnosis** + +- Base context ensures systematic investigation +- Time standards enable proper evidence collection +- Application context provides system understanding + +### **Bug Fixing** + +- Base context ensures quality implementation +- Time standards maintain logging consistency +- Application context guides testing strategy + +### **Feature Implementation** + +- Base context ensures proper development approach +- Time standards maintain system consistency +- Application context drives architecture decisions + +## Success Criteria + +- [ ] **Base context applied** to every single prompt +- [ ] **Time standards followed** for all timestamps and logging +- [ ] **Version control standards** applied to all code changes +- [ ] **Application context considered** for all platform work +- [ ] **Human competence focus** maintained in all interactions +- [ ] **Output contract structure** followed in all responses + +## Common Pitfalls + +- **Don't skip base context** - loses human competence focus +- **Don't ignore time standards** - creates inconsistent timestamps +- **Don't forget application context** - misses platform considerations +- **Don't skip version control** - creates inconsistent commit history +- **Don't lose competence focus** - reduces learning value + +## Feedback & Improvement + +### **Rule Effectiveness Ratings (1-5 scale)** + +- **Base Context**: ___/5 - Comments: _______________ +- **Time Standards**: ___/5 - Comments: _______________ +- **Version Control**: ___/5 - Comments: _______________ +- **Application Context**: ___/5 - Comments: _______________ + +### **Always-On Effectiveness** + +- **Consistency**: Are these rules applied consistently across all prompts? +- **Value**: Do these rules add value to every interaction? +- **Overhead**: Are these rules too burdensome for simple tasks? + +### **Integration Feedback** + +- **With Other Meta-Rules**: How well do these integrate with workflow rules? +- **Context Switching**: Do these rules help or hinder context switching? +- **Learning Curve**: Are these rules easy for new users to understand? + +### **Overall Experience** + +- **Quality Improvement**: Do these rules improve response quality? +- **Efficiency**: Do these rules make interactions more efficient? +- **Recommendation**: Would you recommend keeping these always-on? + +## Model Implementation Checklist + +### Before Every Prompt + +- [ ] **Base Context**: Ensure human competence principles are active +- [ ] **Time Standards**: Verify UTC and timestamp requirements are clear +- [ ] **Application Context**: Confirm TimeSafari context is loaded +- [ ] **Version Control**: Prepare commit standards if code changes are needed +- [ ] **Workflow State**: Read current mode constraints from state file +- [ ] **Constraint Validation**: Validate user request against current mode + +### During Response Creation + +- [ ] **Output Contract**: Follow required response structure +- [ ] **Competence Hooks**: Include learning and collaboration elements +- [ ] **Time Consistency**: Apply UTC standards for all time references +- [ ] **Platform Awareness**: Consider all target platforms +- [ ] **Mode Enforcement**: Apply current mode constraints to response +- [ ] **Constraint Violations**: Block forbidden actions and guide alternatives + +### After Response Creation + +- [ ] **Validation**: Verify all always-on rules were applied +- [ ] **Quality Check**: Ensure response meets competence standards +- [ ] **Context Review**: Confirm application context was properly considered +- [ ] **Feedback Collection**: Note any issues with always-on application +- [ ] **Mode Compliance**: Verify response stayed within current mode constraints +- [ ] **Transition Guidance**: Provide clear guidance for mode changes if needed + +--- + +**See also**: + +- `.cursor/rules/meta_feature_planning.mdc` for workflow-specific rules +- `.cursor/rules/meta_bug_diagnosis.mdc` for investigation workflows +- `.cursor/rules/meta_bug_fixing.mdc` for fix implementation +- `.cursor/rules/meta_feature_implementation.mdc` for feature development + +**Status**: Active core always-on meta-rule +**Priority**: Critical (applies to every prompt) +**Estimated Effort**: Ongoing reference +**Dependencies**: All bundled sub-rules +**Stakeholders**: All AI interactions, Development team + +**Dependencies**: All bundled sub-rules +**Stakeholders**: All AI interactions, Development team + +**Dependencies**: All bundled sub-rules +**Stakeholders**: All AI interactions, Development team diff --git a/.cursor/rules/meta_documentation.mdc b/.cursor/rules/meta_documentation.mdc new file mode 100644 index 0000000..56c4400 --- /dev/null +++ b/.cursor/rules/meta_documentation.mdc @@ -0,0 +1,275 @@ +# Meta-Rule: Documentation Writing & Education + +**Author**: Matthew Raymer +**Date**: 2025-08-21 +**Status**: 🎯 **ACTIVE** - Documentation writing and education workflow + +## Purpose + +This meta-rule bundles documentation-related rules to create comprehensive, +educational documentation that increases human competence rather than just +providing technical descriptions. + +## Workflow Constraints + +**This meta-rule enforces DOCUMENTATION MODE for all bundled sub-rules:** + +```json +{ + "workflowMode": "documentation", + "constraints": { + "mode": "writing_only", + "allowed": ["write", "edit", "format", "structure", "review"], + "forbidden": ["implement", "code", "build", "deploy"] + } +} +``` + +**All bundled sub-rules automatically inherit these constraints.** + +## Workflow State Update + +**When this meta-rule is invoked, update the workflow state file:** + +```json +{ + "currentMode": "documentation", + "lastInvoked": "meta_documentation.mdc", + "timestamp": "2025-01-27T15:30:00Z", + "constraints": { + "mode": "writing_only", + "allowed": ["write", "edit", "format", "structure", "review"], + "forbidden": ["implement", "code", "build", "deploy"] + } +} +``` + +**State File Location**: `.cursor/rules/.workflow_state.json` + +**This enables the core always-on rule to enforce documentation mode constraints.** + +## When to Use + +**Use this meta-rule when**: +- Writing new documentation +- Updating existing documentation +- Creating technical guides +- Writing migration documentation +- Creating architectural documentation +- Writing user guides or tutorials + +## Bundled Rules + +### **Core Documentation Standards** + +- **`docs/markdown_core.mdc`** - Core markdown formatting and automation +- **`docs/markdown_templates.mdc`** - Document templates and structure +- **`docs/markdown_workflow.mdc`** - Documentation validation workflows + +### **Documentation Principles** + +- **`core/base_context.mdc`** - Human competence first principles +- **`core/less_complex.mdc`** - Minimalist solution guidelines +- **`development/software_development.mdc`** - Development documentation standards + +### **Context-Specific Rules** + +- **`app/timesafari.mdc`** - TimeSafari application context +- **`app/timesafari_development.mdc`** - Development documentation patterns +- **`architecture/architectural_patterns.mdc`** - Architecture documentation + +## Core Documentation Philosophy + +### **Education Over Technical Description** + +**Primary Goal**: Increase human competence and understanding +**Secondary Goal**: Provide accurate technical information +**Approach**: Explain the "why" before the "how" + +### **Human Competence Principles** + +1. **Context First**: Explain the problem before the solution +2. **Learning Path**: Structure content for progressive understanding +3. **Real Examples**: Use concrete, relatable examples +4. **Common Pitfalls**: Warn about typical mistakes and misconceptions +5. **Decision Context**: Explain why certain choices were made + +### **Documentation Hierarchy** + +1. **Conceptual Understanding** - What is this and why does it matter? +2. **Context and Motivation** - When and why would you use this? +3. **Technical Implementation** - How do you implement it? +4. **Examples and Patterns** - What does it look like in practice? +5. **Troubleshooting** - What can go wrong and how to fix it? + +## Implementation Guidelines + +### **Document Structure** + +**Mandatory Sections**: +- **Overview**: Clear purpose and scope with educational context +- **Why This Matters**: Business value and user benefit explanation +- **Core Concepts**: Fundamental understanding before implementation +- **Implementation**: Step-by-step technical guidance +- **Examples**: Real-world usage patterns +- **Common Issues**: Troubleshooting and prevention +- **Next Steps**: Where to go from here + +**Optional Sections**: +- **Background**: Historical context and evolution +- **Alternatives**: Other approaches and trade-offs +- **Advanced Topics**: Deep dive into complex scenarios +- **References**: Additional learning resources + +### **Writing Style** + +**Educational Approach**: +- **Conversational tone**: Write as if explaining to a colleague +- **Progressive disclosure**: Start simple, add complexity gradually +- **Active voice**: "You can do this" not "This can be done" +- **Question format**: "What happens when..." to engage thinking +- **Analogies**: Use familiar concepts to explain complex ideas + +**Technical Accuracy**: +- **Precise language**: Use exact technical terms consistently +- **Code examples**: Working, tested code snippets +- **Version information**: Specify applicable versions and platforms +- **Limitations**: Clearly state what the solution doesn't do + +### **Content Quality Standards** + +**Educational Value**: +- [ ] **Concept clarity**: Reader understands the fundamental idea +- [ ] **Context relevance**: Reader knows when to apply the knowledge +- [ ] **Practical application**: Reader can implement the solution +- [ ] **Problem prevention**: Reader avoids common mistakes +- [ ] **Next steps**: Reader knows where to continue learning + +**Technical Accuracy**: +- [ ] **Fact verification**: All technical details are correct +- [ ] **Code validation**: Examples compile and run correctly +- [ ] **Version compatibility**: Platform and version requirements clear +- [ ] **Security consideration**: Security implications addressed +- [ ] **Performance notes**: Performance characteristics documented + +## Document Types and Templates + +### **Technical Guides** + +**Focus**: Implementation and technical details +**Structure**: Problem → Solution → Implementation → Examples +**Education**: Explain the "why" behind technical choices + +### **Migration Documentation** + +**Focus**: Process and workflow guidance +**Structure**: Context → Preparation → Steps → Validation → Troubleshooting +**Education**: Help users understand migration benefits and risks + +### **Architecture Documentation** + +**Focus**: System design and decision rationale +**Structure**: Problem → Constraints → Alternatives → Decision → Implementation +**Education**: Explain design trade-offs and decision factors + +### **User Guides** + +**Focus**: Task completion and user empowerment +**Structure**: Goal → Prerequisites → Steps → Verification → Next Steps +**Education**: Help users understand the system's capabilities + +## Quality Assurance + +### **Review Checklist** + +**Educational Quality**: +- [ ] **Clear learning objective**: What will the reader learn? +- [ ] **Appropriate complexity**: Matches target audience knowledge +- [ ] **Progressive disclosure**: Information builds logically +- [ ] **Practical examples**: Real-world scenarios and use cases +- [ ] **Common questions**: Anticipates and answers reader questions + +**Technical Quality**: +- [ ] **Accuracy**: All technical details verified +- [ ] **Completeness**: Covers all necessary information +- [ ] **Consistency**: Terminology and formatting consistent +- [ ] **Currency**: Information is up-to-date +- [ ] **Accessibility**: Clear for target audience + +### **Validation Workflows** + +1. **Content Review**: Subject matter expert review +2. **Educational Review**: Learning effectiveness assessment +3. **Technical Review**: Accuracy and completeness validation +4. **User Testing**: Real user comprehension testing +5. **Continuous Improvement**: Regular updates based on feedback + +## Success Metrics + +### **Educational Effectiveness** + +- **Comprehension**: Users understand the concepts +- **Application**: Users can implement the solutions +- **Confidence**: Users feel capable and empowered +- **Efficiency**: Users complete tasks faster +- **Satisfaction**: Users find documentation helpful + +### **Technical Quality** + +- **Accuracy**: Zero technical errors +- **Completeness**: All necessary information included +- **Consistency**: Uniform style and format +- **Maintainability**: Easy to update and extend +- **Accessibility**: Clear for target audience + +## Common Pitfalls + +### **Educational Mistakes** + +- **Assumption overload**: Assuming too much prior knowledge +- **Information dump**: Overwhelming with details +- **Context missing**: Not explaining why something matters +- **Example poverty**: Insufficient practical examples +- **Feedback missing**: No way to verify understanding + +### **Technical Mistakes** + +- **Outdated information**: Not keeping content current +- **Incomplete coverage**: Missing important details +- **Inconsistent terminology**: Using different terms for same concepts +- **Poor examples**: Non-working or confusing code +- **Missing validation**: No way to verify correctness + +## Feedback and Improvement + +### **Continuous Learning** + +- **User feedback**: Collect and analyze user comments +- **Usage metrics**: Track document usage and effectiveness +- **Review cycles**: Regular content review and updates +- **Community input**: Engage users in documentation improvement +- **Best practices**: Stay current with documentation standards + +### **Quality Metrics** + +- **Readability scores**: Measure content clarity +- **User satisfaction**: Survey-based quality assessment +- **Task completion**: Success rate of documented procedures +- **Support reduction**: Decrease in help requests +- **Knowledge retention**: Long-term user understanding + +--- + +**See also**: + +- `.cursor/rules/docs/markdown_core.mdc` for core formatting standards +- `.cursor/rules/docs/markdown_templates.mdc` for document templates +- `.cursor/rules/docs/markdown_workflow.mdc` for validation workflows +- `.cursor/rules/docs/meta_rule_usage_guide.md` for how to use meta-rules +- `.cursor/rules/core/base_context.mdc` for human competence principles + +**Status**: Active documentation meta-rule +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: All bundled sub-rules +**Stakeholders**: Documentation team, Development team, Users diff --git a/.cursor/rules/meta_feature_implementation.mdc b/.cursor/rules/meta_feature_implementation.mdc new file mode 100644 index 0000000..ff16596 --- /dev/null +++ b/.cursor/rules/meta_feature_implementation.mdc @@ -0,0 +1,226 @@ +# Meta-Rule: Feature Implementation + +**Author**: Matthew Raymer +**Date**: 2025-08-21 +**Status**: 🎯 **ACTIVE** - Feature implementation workflow bundling + +## Purpose + +This meta-rule bundles all the rules needed for building features with +proper architecture and cross-platform support. Use this when implementing +planned features or refactoring existing code. + +## Workflow Constraints + +**This meta-rule enforces IMPLEMENTATION MODE for all bundled sub-rules:** + +```json +{ + "workflowMode": "implementation", + "constraints": { + "mode": "development", + "allowed": ["code", "build", "test", "refactor", "deploy"], + "required": "planning_complete_before_implementation" + } +} +``` + +**All bundled sub-rules automatically inherit these constraints.** + +## Workflow State Update + +**When this meta-rule is invoked, update the workflow state file:** + +```json +{ + "currentMode": "implementation", + "lastInvoked": "meta_feature_implementation.mdc", + "timestamp": "2025-01-27T15:30:00Z", + "constraints": { + "mode": "development", + "allowed": ["code", "build", "test", "refactor", "deploy"], + "forbidden": [], + "required": "planning_complete_before_implementation" + } +} +``` + +**State File Location**: `.cursor/rules/.workflow_state.json` + +**This enables the core always-on rule to enforce implementation mode constraints.** + +## When to Use + +- **Feature Development**: Building new features from planning +- **Code Refactoring**: Restructuring existing code for better architecture +- **Platform Expansion**: Adding features to new platforms +- **Service Implementation**: Building new services or components +- **Integration Work**: Connecting features with existing systems +- **Performance Optimization**: Improving feature performance + +## Bundled Rules + +### **Development Foundation** + +- **`app/timesafari_development.mdc`** - TimeSafari-specific + development workflow and quality standards +- **`development/software_development.mdc`** - Core development + principles and evidence requirements +- **`development/type_safety_guide.mdc`** - Type-safe implementation + with proper error handling + +### **Architecture & Patterns** + +- **`app/architectural_patterns.mdc`** - Design patterns and + architectural examples for features +- **`app/architectural_examples.mdc`** - Implementation examples + and testing strategies +- **`app/architectural_implementation.mdc`** - Implementation + guidelines and best practices + +### **Platform & Services** + +- **`app/timesafari_platforms.mdc`** - Platform abstraction + patterns and platform-specific requirements +- **`development/asset_configuration.mdc`** - Asset management + and build integration +- **`development/logging_standards.mdc`** - Proper logging + implementation standards + +### **Quality & Validation** + +- **`architecture/build_validation.mdc`** - Build system + validation and testing procedures +- **`architecture/build_testing.mdc`** - Testing requirements + and feedback collection +- **`development/complexity_assessment.mdc`** - Complexity + evaluation for implementation + +## Workflow Sequence + +### **Phase 1: Implementation Foundation (Start Here)** + +1. **Development Workflow** - Use `timesafari_development.mdc` for + development standards and workflow +2. **Type Safety** - Apply `type_safety_guide.mdc` for type-safe + implementation +3. **Architecture Patterns** - Use `architectural_patterns.mdc` for + design patterns + +### **Phase 2: Feature Development** + +1. **Platform Services** - Apply `timesafari_platforms.mdc` for + platform abstraction +2. **Implementation Examples** - Use `architectural_examples.mdc` + for implementation guidance +3. **Asset Configuration** - Apply `asset_configuration.mdc` for + asset management + +### **Phase 3: Quality & Testing** + +1. **Logging Implementation** - Use `logging_standards.mdc` for + proper logging +2. **Build Validation** - Apply `build_validation.mdc` for build + system compliance +3. **Testing & Feedback** - Use `build_testing.mdc` for testing + requirements + +## Success Criteria + +- [ ] **Feature implemented** following development standards +- [ ] **Type safety maintained** with proper error handling +- [ ] **Architecture patterns applied** consistently +- [ ] **Platform abstraction implemented** correctly +- [ ] **Logging properly implemented** with component context +- [ ] **Assets configured** and integrated with build system +- [ ] **Build validation passed** with no build system issues +- [ ] **Testing completed** across all target platforms +- [ ] **Code review completed** with all feedback addressed + +## Common Pitfalls + +- **Don't skip architecture patterns** - leads to inconsistent design +- **Don't ignore platform abstraction** - creates platform-specific code +- **Don't skip type safety** - leads to runtime errors +- **Don't ignore logging** - makes future debugging harder +- **Don't skip build validation** - can break build system +- **Don't forget asset configuration** - leads to missing assets + +## Integration Points + +### **With Other Meta-Rules** + +- **Feature Planning**: Planning outputs drive implementation approach +- **Bug Fixing**: Implementation patterns inform fix strategies +- **Bug Diagnosis**: Implementation insights help with investigation + +### **With Development Workflow** + +- Implementation follows development standards +- Architecture decisions drive implementation approach +- Platform requirements inform testing strategy + +## Feedback & Improvement + +### **Sub-Rule Ratings (1-5 scale)** + +- **Development Workflow**: ___/5 - Comments: _______________ +- **Type Safety**: ___/5 - Comments: _______________ +- **Architecture Patterns**: ___/5 - Comments: _______________ +- **Platform Services**: ___/5 - Comments: _______________ +- **Build Validation**: ___/5 - Comments: _______________ + +### **Workflow Feedback** + +- **Implementation Clarity**: How clear was the implementation guidance? +- **Pattern Effectiveness**: How well did architecture patterns work? +- **Platform Coverage**: How well did platform guidance cover your needs? + +### **Sub-Rule Improvements** + +- **Clarity Issues**: Which rules were unclear or confusing? +- **Missing Examples**: What examples would make rules more useful? +- **Integration Problems**: Do any rules conflict or overlap? + +### **Overall Experience** + +- **Time Saved**: How much time did this meta-rule save you? +- **Quality Improvement**: Did following these rules improve your implementation? +- **Recommendation**: Would you recommend this meta-rule to others? + +## Model Implementation Checklist + +### Before Feature Implementation + +- [ ] **Planning Review**: Review feature planning and requirements +- [ ] **Architecture Planning**: Plan architecture and design patterns +- [ ] **Platform Analysis**: Understand platform-specific requirements +- [ ] **Testing Strategy**: Plan testing approach for the feature + +### During Feature Implementation + +- [ ] **Rule Application**: Apply bundled rules in recommended sequence +- [ ] **Implementation**: Implement feature following development standards +- [ ] **Testing**: Test feature across all target platforms +- [ ] **Documentation**: Document implementation details and decisions + +### After Feature Implementation + +- [ ] **Validation**: Verify feature meets all success criteria +- [ ] **Code Review**: Complete code review with team +- [ ] **Testing**: Complete comprehensive testing across platforms +- [ ] **Feedback Collection**: Collect feedback on meta-rule effectiveness + +--- + +**See also**: + +- `.cursor/rules/meta_feature_planning.mdc` for planning workflow +- `.cursor/rules/meta_bug_fixing.mdc` for fix implementation patterns +- `.cursor/rules/meta_bug_diagnosis.mdc` for investigation insights + +**Status**: Active meta-rule for feature implementation +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: All bundled sub-rules +**Stakeholders**: Development team, Architecture team, QA team diff --git a/.cursor/rules/meta_feature_planning.mdc b/.cursor/rules/meta_feature_planning.mdc new file mode 100644 index 0000000..f76b09b --- /dev/null +++ b/.cursor/rules/meta_feature_planning.mdc @@ -0,0 +1,203 @@ +# Meta-Rule: Feature Planning + +**Author**: Matthew Raymer +**Date**: 2025-08-21 +**Status**: 🎯 **ACTIVE** - Feature planning workflow bundling + +## Purpose + +This meta-rule bundles all the rules needed for comprehensive feature planning +across all platforms. Use this when starting any new feature development, +planning sprints, or estimating work effort. + +## Workflow Constraints + +**This meta-rule enforces PLANNING MODE for all bundled sub-rules:** + +```json +{ + "workflowMode": "planning", + "constraints": { + "mode": "design_only", + "allowed": ["analyze", "plan", "design", "estimate", "document"], + "forbidden": ["implement", "code", "build", "test", "deploy"] + } +} +``` + +**All bundled sub-rules automatically inherit these constraints.** + +## Workflow State Update + +**When this meta-rule is invoked, update the workflow state file:** + +```json +{ + "currentMode": "planning", + "lastInvoked": "meta_feature_planning.mdc", + "timestamp": "2025-01-27T15:30:00Z", + "constraints": { + "mode": "design_only", + "allowed": ["analyze", "plan", "design", "estimate", "document"], + "forbidden": ["implement", "code", "build", "test", "deploy"] + } +} +``` + +**State File Location**: `.cursor/rules/.workflow_state.json` + +**This enables the core always-on rule to enforce planning mode constraints.** + +## When to Use + +- **New Feature Development**: Planning features from concept to implementation +- **Sprint Planning**: Estimating effort and breaking down work +- **Architecture Decisions**: Planning major architectural changes +- **Platform Expansion**: Adding features to new platforms +- **Refactoring Planning**: Planning significant code restructuring + +## Bundled Rules + +### **Core Planning Foundation** + +- **`development/planning_examples.mdc`** - Planning templates, examples, and + best practices for structured planning +- **`development/realistic_time_estimation.mdc`** - Time estimation framework + with complexity-based phases and milestones +- **`development/complexity_assessment.mdc`** - Technical and business + complexity evaluation with risk assessment + +### **Platform & Architecture** + +- **`app/timesafari_platforms.mdc`** - Platform-specific requirements, + constraints, and capabilities across web/mobile/desktop +- **`app/architectural_decision_record.mdc`** - ADR process for documenting + major architectural decisions and trade-offs + +### **Development Context** + +- **`app/timesafari.mdc`** - Core application context, principles, and + development focus areas +- **`app/timesafari_development.mdc`** - TimeSafari-specific development + workflow and quality standards + +## Workflow Sequence + +### **Phase 1: Foundation (Start Here)** + +1. **Complexity Assessment** - Use `complexity_assessment.mdc` to evaluate + technical and business complexity +2. **Time Estimation** - Apply `realistic_time_estimation.mdc` framework + based on complexity results +3. **Core Planning** - Use `planning_examples.mdc` for structured planning + approach + +### **Phase 2: Platform & Architecture** + +1. **Platform Analysis** - Review `timesafari_platforms.mdc` for + platform-specific requirements +2. **Architecture Planning** - Use `architectural_decision_record.mdc` if + major architectural changes are needed + +### **Phase 3: Implementation Planning** + +1. **Development Workflow** - Reference `timesafari_development.mdc` for + development standards and testing strategy +2. **Final Planning** - Consolidate all inputs into comprehensive plan + +## Success Criteria + +- [ ] **Complexity assessed** and documented with risk factors +- [ ] **Time estimate created** with clear phases and milestones +- [ ] **Platform requirements identified** for all target platforms +- [ ] **Architecture decisions documented** (if major changes needed) +- [ ] **Testing strategy planned** with platform-specific considerations +- [ ] **Dependencies mapped** between tasks and phases +- [ ] **Stakeholder input gathered** and incorporated + +## Common Pitfalls + +- **Don't skip complexity assessment** - leads to unrealistic estimates +- **Don't estimate without platform analysis** - misses platform-specific work +- **Don't plan without stakeholder input** - creates misaligned expectations +- **Don't ignore testing strategy** - leads to incomplete planning +- **Don't skip architecture decisions** - creates technical debt + +## Integration Points + +### **With Other Meta-Rules** + +- **Bug Diagnosis**: Use complexity assessment for bug investigation planning +- **Feature Implementation**: This planning feeds directly into implementation +- **Code Review**: Planning standards inform review requirements + +### **With Development Workflow** + +- Planning outputs become inputs for sprint planning +- Complexity assessment informs testing strategy +- Platform requirements drive architecture decisions + +## Feedback & Improvement + +### **Sub-Rule Ratings (1-5 scale)** + +- **Complexity Assessment**: ___/5 - Comments: _______________ +- **Time Estimation**: ___/5 - Comments: _______________ +- **Planning Examples**: ___/5 - Comments: _______________ +- **Platform Analysis**: ___/5 - Comments: _______________ +- **Architecture Decisions**: ___/5 - Comments: _______________ + +### **Workflow Feedback** + +- **Sequence Effectiveness**: Did the recommended order work for you? +- **Missing Guidance**: What additional information would have helped? +- **Process Gaps**: Where did the workflow break down? + +### **Sub-Rule Improvements** + +- **Clarity Issues**: Which rules were unclear or confusing? +- **Missing Examples**: What examples would make rules more useful? +- **Integration Problems**: Do any rules conflict or overlap? + +### **Overall Experience** + +- **Time Saved**: How much time did this meta-rule save you? +- **Quality Improvement**: Did following these rules improve your planning? +- **Recommendation**: Would you recommend this meta-rule to others? + +## Model Implementation Checklist + +### Before Feature Planning + +- [ ] **Scope Definition**: Clearly define the feature scope and boundaries +- [ ] **Stakeholder Identification**: Identify all stakeholders and decision makers +- [ ] **Platform Requirements**: Understand target platforms and constraints +- [ ] **Complexity Assessment**: Plan complexity evaluation approach + +### During Feature Planning + +- [ ] **Rule Application**: Apply bundled rules in recommended sequence +- [ ] **Documentation**: Document all planning decisions and rationale +- [ ] **Stakeholder Input**: Gather and incorporate stakeholder feedback +- [ ] **Validation**: Validate planning against success criteria + +### After Feature Planning + +- [ ] **Plan Review**: Review plan with stakeholders and team +- [ ] **Feedback Collection**: Collect feedback on meta-rule effectiveness +- [ ] **Documentation Update**: Update relevant documentation +- [ ] **Process Improvement**: Identify improvements for future planning + +--- + +**See also**: + +- `.cursor/rules/meta_bug_diagnosis.mdc` for investigation planning +- `.cursor/rules/meta_feature_implementation.mdc` for implementation workflow +- `.cursor/rules/meta_bug_fixing.mdc` for fix implementation + +**Status**: Active meta-rule for feature planning +**Priority**: High +**Estimated Effort**: Ongoing reference +**Dependencies**: All bundled sub-rules +**Stakeholders**: Development team, Product team, Architecture team diff --git a/.cursor/rules/meta_research.mdc b/.cursor/rules/meta_research.mdc new file mode 100644 index 0000000..0bbd0fb --- /dev/null +++ b/.cursor/rules/meta_research.mdc @@ -0,0 +1,285 @@ +# Meta-Rule: Enhanced Research Workflows + +**Author**: Matthew Raymer +**Date**: 2025-01-27 +**Status**: 🎯 **ACTIVE** - Research and investigation workflows + +## Purpose + +This meta-rule bundles research-specific rules that should be applied when conducting +systematic investigation, analysis, evidence collection, or research tasks. It provides +a comprehensive framework for thorough, methodical research workflows that produce +actionable insights and evidence-based conclusions. + +## Workflow Constraints + +**This meta-rule enforces RESEARCH MODE for all bundled sub-rules:** + +```json +{ + "workflowMode": "research", + "constraints": { + "mode": "investigation", + "allowed": ["read", "search", "analyze", "plan"], + "forbidden": ["modify", "create", "build", "commit"] + } +} +``` + +**All bundled sub-rules automatically inherit these constraints.** + +## Workflow State Update + +**When this meta-rule is invoked, update the workflow state file:** + +```json +{ + "currentMode": "research", + "lastInvoked": "meta_research.mdc", + "timestamp": "2025-01-27T15:30:00Z", + "constraints": { + "mode": "investigation", + "allowed": ["read", "search", "analyze", "plan"], + "forbidden": ["modify", "create", "build", "commit"] + } +} +``` + +**State File Location**: `.cursor/rules/.workflow_state.json` + +**This enables the core always-on rule to enforce research mode constraints.** + +## When to Use + +**RESEARCH TASKS** - Apply this meta-rule when: + +- Investigating bugs, defects, or system issues +- Conducting technical research or feasibility analysis +- Analyzing codebases, architectures, or dependencies +- Researching solutions, alternatives, or best practices +- Collecting evidence for decision-making or documentation +- Performing root cause analysis or impact assessment + +## Bundled Rules + +### **Core Research Principles** + +- **`development/research_diagnostic.mdc`** - Systematic investigation workflow + and evidence collection methodology +- **`development/type_safety_guide.mdc`** - Type analysis and safety research + for TypeScript/JavaScript codebases + +### **Investigation & Analysis** + +- **`workflow/version_control.mdc`** - Git history analysis and commit research +- **`workflow/commit_messages.mdc`** - Commit pattern analysis and history + investigation + +### **Platform & Context Research** + +- **`app/timesafari.mdc`** - Application context research and platform + understanding +- **`app/timesafari_platforms.mdc`** - Platform-specific research and + capability analysis + +## Why These Rules Are Research-Focused + +### **Research Diagnostic** + +- **Systematic Approach**: Provides structured investigation methodology +- **Evidence Collection**: Ensures thorough data gathering and documentation +- **Root Cause Analysis**: Guides systematic problem investigation +- **Impact Assessment**: Helps evaluate scope and consequences + +### **Type Safety Research** + +- **Code Analysis**: Enables systematic type system investigation +- **Safety Assessment**: Guides research into type-related issues +- **Migration Planning**: Supports research for architectural changes + +### **Version Control Research** + +- **History Analysis**: Enables investigation of code evolution +- **Pattern Recognition**: Helps identify commit and change patterns +- **Timeline Research**: Supports chronological investigation + +### **Platform Research** + +- **Capability Analysis**: Guides research into platform-specific features +- **Context Understanding**: Ensures research considers application context +- **Cross-Platform Research**: Supports multi-platform investigation + +## Application Priority + +### **Primary (Apply First)** + +1. **Research Diagnostic** - Systematic investigation methodology +2. **Type Safety Guide** - Code analysis and type research +3. **Application Context** - Platform and context understanding + +### **Secondary (Apply as Needed)** + +1. **Version Control** - When investigating code history +2. **Platform Details** - When researching platform-specific capabilities + +## Integration with Other Meta-Rules + +### **Bug Diagnosis** + +- Research meta-rule provides investigation methodology +- Core always-on ensures systematic approach +- Application context provides system understanding + +### **Feature Planning** + +- Research meta-rule guides feasibility research +- Core always-on ensures competence focus +- Application context drives platform considerations + +### **Architecture Analysis** + +- Research meta-rule provides systematic analysis framework +- Core always-on ensures quality standards +- Application context informs architectural decisions + +### **Performance Investigation** + +- Research meta-rule guides systematic performance research +- Core always-on ensures thorough investigation +- Application context provides performance context + +## Research Workflow Phases + +### **Phase 1: Investigation Setup** + +1. **Scope Definition** - Define research boundaries and objectives +2. **Context Gathering** - Collect relevant application and platform context +3. **Methodology Selection** - Choose appropriate research approaches + +### **Phase 2: Evidence Collection** + +1. **Systematic Data Gathering** - Collect evidence using structured methods +2. **Documentation** - Record all findings and observations +3. **Validation** - Verify evidence accuracy and relevance + +### **Phase 3: Analysis & Synthesis** + +1. **Pattern Recognition** - Identify trends and patterns in evidence +2. **Root Cause Analysis** - Determine underlying causes and factors +3. **Impact Assessment** - Evaluate scope and consequences + +### **Phase 4: Conclusion & Action** + +1. **Evidence-Based Conclusions** - Draw conclusions from collected evidence +2. **Actionable Recommendations** - Provide specific, implementable guidance +3. **Documentation** - Create comprehensive research documentation + +## Success Criteria + +- [ ] **Research diagnostic applied** to all investigation tasks +- [ ] **Type safety research** conducted for code analysis +- [ ] **Evidence collection** systematic and comprehensive +- [ ] **Root cause analysis** thorough and accurate +- [ ] **Conclusions actionable** and evidence-based +- [ ] **Documentation complete** and searchable + +## Common Research Pitfalls + +- **Don't skip systematic approach** - leads to incomplete investigation +- **Don't ignore evidence validation** - creates unreliable conclusions +- **Don't forget context** - misses important factors +- **Don't skip documentation** - loses research value +- **Don't rush conclusions** - produces poor recommendations + +## Research Quality Standards + +### **Evidence Quality** + +- **Completeness**: All relevant evidence collected +- **Accuracy**: Evidence verified and validated +- **Relevance**: Evidence directly addresses research questions +- **Timeliness**: Evidence current and up-to-date + +### **Analysis Quality** + +- **Systematic**: Analysis follows structured methodology +- **Objective**: Analysis free from bias and assumptions +- **Thorough**: All evidence considered and evaluated +- **Logical**: Conclusions follow from evidence + +### **Documentation Quality** + +- **Comprehensive**: All findings and methods documented +- **Searchable**: Documentation easily findable and navigable +- **Actionable**: Recommendations specific and implementable +- **Maintainable**: Documentation structure supports updates + +## Feedback & Improvement + +### **Rule Effectiveness Ratings (1-5 scale)** + +- **Research Diagnostic**: ___/5 - Comments: _______________ +- **Type Safety Guide**: ___/5 - Comments: _______________ +- **Version Control**: ___/5 - Comments: _______________ +- **Platform Context**: ___/5 - Comments: _______________ + +### **Research Workflow Effectiveness** + +- **Investigation Quality**: Are research tasks producing thorough results? +- **Evidence Collection**: Is evidence gathering systematic and complete? +- **Conclusion Quality**: Are conclusions actionable and evidence-based? +- **Documentation Value**: Is research documentation useful and maintainable? + +### **Integration Feedback** + +- **With Other Meta-Rules**: How well does this integrate with workflow rules? +- **Context Switching**: Do these rules help or hinder research context? +- **Learning Curve**: Are these rules easy for new researchers to understand? + +### **Overall Research Experience** + +- **Quality Improvement**: Do these rules improve research outcomes? +- **Efficiency**: Do these rules make research more efficient? +- **Recommendation**: Would you recommend keeping this research meta-rule? + +## Model Implementation Checklist + +### Before Research Tasks + +- [ ] **Research Diagnostic**: Ensure systematic investigation methodology +- [ ] **Type Safety Guide**: Prepare for code analysis if needed +- [ ] **Application Context**: Load relevant platform and context information +- [ ] **Version Control**: Prepare for history analysis if needed + +### During Research Execution + +- [ ] **Systematic Approach**: Follow structured investigation methodology +- [ ] **Evidence Collection**: Gather comprehensive and validated evidence +- [ ] **Documentation**: Record all findings and observations +- [ ] **Context Awareness**: Consider application and platform context + +### After Research Completion + +- [ ] **Validation**: Verify all research phases completed +- [ ] **Quality Check**: Ensure research meets quality standards +- [ ] **Documentation Review**: Confirm research properly documented +- [ ] **Feedback Collection**: Note any issues with research process + +--- + +**See also**: + +- `.cursor/rules/meta_core_always_on.mdc` for core always-on rules +- `.cursor/rules/meta_feature_planning.mdc` for feature development workflows +- `.cursor/rules/meta_bug_diagnosis.mdc` for bug investigation workflows +- `.cursor/rules/meta_bug_fixing.mdc` for fix implementation workflows + +**Status**: Active research meta-rule +**Priority**: High (applies to all research tasks) +**Estimated Effort**: Ongoing reference +**Dependencies**: All bundled sub-rules +**Stakeholders**: Development team, Research team, Quality Assurance team +description: +globs: +alwaysApply: false +--- diff --git a/.cursor/rules/meta_rule_architecture.md b/.cursor/rules/meta_rule_architecture.md new file mode 100644 index 0000000..9f0bfb0 --- /dev/null +++ b/.cursor/rules/meta_rule_architecture.md @@ -0,0 +1,103 @@ +# Meta-Rule Architecture Overview + +**Author**: Matthew Raymer +**Date**: 2025-01-27 +**Status**: 📋 **ACTIVE** - Meta-rule organization and relationships + +## Meta-Rule Structure + +### **Core Always-On Rules** (`meta_core_always_on.mdc`) +- **Purpose**: Applied to every single prompt +- **Scope**: Human competence, time standards, version control, application context +- **Priority**: Critical - foundation for all interactions + +### **Enhanced Research Workflows** (`meta_research.mdc`) ⭐ **NEW** +- **Purpose**: Applied to research, investigation, and analysis tasks +- **Scope**: Systematic investigation, evidence collection, root cause analysis +- **Priority**: High - applies to all research tasks +- **Bundles**: Research diagnostic, type safety, version control research, platform context + +### **Feature Development Workflows** (`meta_feature_planning.mdc`) +- **Purpose**: Applied to feature planning and development tasks +- **Scope**: Requirements analysis, architecture planning, implementation strategy +- **Priority**: High - applies to feature development + +### **Bug Investigation Workflows** (`meta_bug_diagnosis.mdc`) +- **Purpose**: Applied to bug investigation and diagnosis tasks +- **Scope**: Defect analysis, evidence collection, root cause identification +- **Priority**: High - applies to bug investigation + +### **Bug Fixing Workflows** (`meta_bug_fixing.mdc`) +- **Purpose**: Applied to bug fixing and resolution tasks +- **Scope**: Fix implementation, testing, validation +- **Priority**: High - applies to bug resolution + +## Research Meta-Rule Integration + +### **When to Use Research Meta-Rule** + +The research meta-rule should be applied when: +- **Investigating bugs** - systematic defect analysis +- **Researching solutions** - feasibility and alternative analysis +- **Analyzing codebases** - architecture and dependency research +- **Collecting evidence** - systematic data gathering +- **Root cause analysis** - systematic problem investigation +- **Impact assessment** - scope and consequence evaluation + +### **How It Complements Other Meta-Rules** + +- **Core Always-On**: Provides foundation (competence, time, context) +- **Research**: Adds systematic investigation methodology +- **Feature Planning**: Guides feasibility research and analysis +- **Bug Diagnosis**: Provides investigation framework +- **Bug Fixing**: Informs fix strategy through research + +### **Research Workflow Phases** + +1. **Investigation Setup** - Scope, context, methodology +2. **Evidence Collection** - Systematic data gathering +3. **Analysis & Synthesis** - Pattern recognition, root cause +4. **Conclusion & Action** - Evidence-based recommendations + +## Usage Examples + +### **Bug Investigation** +``` +Apply: meta_core_always_on + meta_research + meta_bug_diagnosis +Result: Systematic investigation with evidence collection and root cause analysis +``` + +### **Feature Research** +``` +Apply: meta_core_always_on + meta_research + meta_feature_planning +Result: Comprehensive feasibility research with platform context +``` + +### **Architecture Analysis** +``` +Apply: meta_core_always_on + meta_research +Result: Systematic architecture investigation with evidence-based conclusions +``` + +## Benefits of Enhanced Research Meta-Rule + +- **Systematic Approach**: Structured investigation methodology +- **Evidence-Based**: Comprehensive data collection and validation +- **Quality Standards**: Defined research quality criteria +- **Integration**: Seamless integration with existing workflows +- **Documentation**: Comprehensive research documentation standards + +## Next Steps + +1. **Test Research Meta-Rule** - Apply to next research task +2. **Validate Integration** - Ensure smooth workflow integration +3. **Collect Feedback** - Gather effectiveness ratings +4. **Iterate** - Refine based on usage experience + +--- + +**Status**: Active documentation +**Priority**: Medium +**Estimated Effort**: Ongoing reference +**Dependencies**: All meta-rules +**Stakeholders**: Development team, Research team diff --git a/.cursor/rules/progress_reports.mdc b/.cursor/rules/progress_reports.mdc deleted file mode 100644 index c1ee163..0000000 --- a/.cursor/rules/progress_reports.mdc +++ /dev/null @@ -1,6 +0,0 @@ ---- -alwaysApply: true ---- -progress reports are based on git commit messages and file differences for that day -reports are in conversational style -do not be a bean counter unless otherwise instructed \ No newline at end of file diff --git a/.cursor/rules/project.mdc b/.cursor/rules/project.mdc deleted file mode 100644 index eeed6ae..0000000 --- a/.cursor/rules/project.mdc +++ /dev/null @@ -1,242 +0,0 @@ -# TimeSafari Notifications — LLM Implementation Directive (v2.0) -_Last updated: August 12, 2025_ - -## 0) Role & Objective -**You are the implementation LLM.** Build an **offline-first daily notifications system** for Android (Kotlin) and iOS (Swift) that **prefetches -> caches -> schedules -> displays** content **without requiring network at display time**. Favor **reliability over richness**. - -## 1) Golden Rules -1. **Follow the pipeline:** **Prefetch → Cache → Schedule → Display.** -2. **Never depend on network at display time.** All assets must be local. -3. **Design for failure.** Always have a last-known-good and an emergency fallback. -4. **Keep content scannable (<3s), single message, actionable.** -5. **Measure everything** (fetch success, delivery, engagement, stale usage). -6. **Minimize battery impact** and respect platform limitations and user settings. -7. **Ask only when needed:** if a required input is missing, use the defaults below; otherwise proceed. - -## 2) Default Assumptions (use unless overridden) -- **Product mode:** Lightweight Daily Updates (text + emoji) with option to extend to media later. -- **Fetch size:** 1–2 KB JSON daily. -- **User schedule default:** 07:30 local time, daily. -- **Quiet hours:** None (app-level quiet hours supported but disabled by default). -- **Analytics:** Local log + pluggable uploader (no-op by default). - -## 3) Deliverables -Produce the following artifacts: - -### Android (Kotlin) -- `:core`: models, storage, metrics, fallback manager. -- `:data`: fetchers (WorkManager), mappers, cache policy. -- `:notify`: scheduler (AlarmManager), receiver, channels. -- App manifest entries & permissions. -- Unit tests for fallback, scheduling, metrics. -- README with battery optimization instructions (OEMs). - -### iOS (Swift) -- `NotificationKit`: models, storage, metrics, fallback manager. -- BGTaskScheduler registration + handler. -- UNUserNotificationCenter scheduling + categories + attachments. -- Unit tests for fallback, scheduling, metrics. -- README with Background App Refresh caveats + Focus/Summary notes. - -## 4) Permissions & Required Setup -### Android Manifest -```xml - - - - -``` -- Create a high-importance **NotificationChannel** `timesafari.daily`. -- If **SCHEDULE_EXACT_ALARM** denied on Android 12+, auto-fallback to inexact. - -### iOS App Setup (AppDelegate / SceneDelegate) -- Register `BGTaskScheduler` with ID `com.timesafari.daily-fetch`. -- Request alerts, sound, badge via `UNUserNotificationCenter`. -- Create category `DAILY_UPDATE` with a primary `View` action. -- Ensure Background Modes: **Background fetch**, **Remote notifications** (optional for future push). - -## 5) Data Model (keep minimal, versioned) -### Canonical Schema (language-agnostic) -``` -NotificationContent v1 -- id: string (uuid) -- title: string -- body: string (plain text; may include simple emoji) -- scheduledTime: epoch millis (client-local target) -- mediaUrl: string? (for future; must be mirrored to local path before use) -- fetchTime: epoch millis -``` -### Kotlin -```kotlin -@Entity -data class NotificationContent( - @PrimaryKey val id: String, - val title: String, - val body: String, - val scheduledTime: Long, - val mediaUrl: String?, - val fetchTime: Long -) -``` -### Swift -```swift -struct NotificationContent: Codable { - let id: String - let title: String - let body: String - let scheduledTime: TimeInterval - let mediaUrl: String? - let fetchTime: TimeInterval -} -``` - -## 6) Storage Layers -**Tier 1: Key-Value (quick)** — next payload, last fetch timestamp, user prefs. -**Tier 2: DB (structured)** — history, media metadata, analytics events. -**Tier 3: Files (large assets)** — images/audio; LRU cache & quotas. - -- Android: SharedPreferences/DataStore + Room + `context.cacheDir/notifications/` -- iOS: UserDefaults + Core Data/SQLite + `Library/Caches/notifications/` - -## 7) Background Execution -### Android — WorkManager -- Periodic daily work with constraints (CONNECTED network). -- Total time budget ~10m; use **timeouts** (e.g., fetch ≤30s, overall ≤8m). -- On exception/timeout: **schedule from cache**; then `Result.success()` or `Result.retry()` per policy. - -### iOS — BGTaskScheduler -- `BGAppRefreshTask` with aggressive time budgeting (10–30s typical). -- Submit next request immediately at start of handler. -- Set `expirationHandler` first; cancel tasks cleanly; **fallback to cache** on failure. - -## 8) Scheduling & Display -### Android -- Prefer `AlarmManager.setExactAndAllowWhileIdle()` if permitted; else inexact. -- Receiver builds notification using **BigTextStyle** for long bodies. -- Limit actions to ≤3; default: `View` (foreground intent). - -### iOS -- `UNCalendarNotificationTrigger` repeating at preferred time. -- Category `DAILY_UPDATE` with `View` action. -- Media attachments **only if local**; otherwise skip gracefully. - -## 9) Fallback Hierarchy (must implement) -1. **Foreground prefetch path** if app is open. -2. **Background fetch** with short network timeout. -3. **Last good cache** (annotate staleness: “as of X”). -4. **Emergency phrases** (rotate from static list). - -Provide helper: -- `withStaleMarker(content) -> content'` appends age label (e.g., “from 3h ago”). - -## 10) Failure Matrix & Responses -| Scenario | Detect | Action | -|---|---|---| -| No network / timeout | Exceptions / status | Use last-good; schedule | -| Invalid JSON | Parse error | Use emergency content; log | -| Storage full | Write error | Evict old; retry minimal payload | -| Notifications disabled | OS state | In-app education screen | -| Background killed | Gaps in execution | Catch-up next foreground open | - -## 11) Metrics (local first; uploader optional) -Track per attempt: -``` -NotificationMetrics v1 -- scheduledTime, actualDeliveryTime? -- contentAge (ms) -- engagement: {TAPPED, DISMISSED, IGNORED}? -- failureReason? -- platformInfo (oem, os version, app state) -``` -- Compute: **Fetch Success Rate**, **Delivery Rate**, **Engagement Rate**, **Stale Content Rate**. - -## 12) Testing Requirements -### Matrix (minimum) -- Android 12+ foreground/background/killed; with/without Battery Saver; Wi‑Fi/Mobile/Offline. -- iOS 16+ background/Low Power/Focus/Scheduled Summary on & off. -- Offline at trigger time (must still display). - -### Unit Tests (examples) -- Fallback when fetch fails (uses last-good and marks stale). -- Exact vs inexact scheduling path selected correctly. -- Metrics recorded for each stage. - -## 13) UX Standards -- One clear message; no clutter. -- ≤2 actions; primary takes user into app. -- Respect quiet hours if configured. -- Provide onboarding: value explanation → permission request → time picker → test notification → tips for OEM battery settings (Android) or Focus/Summary (iOS). - -## 14) Code Stubs (must generate & wire) -### Android — Worker (core pattern) -```kotlin -class DailyContentWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) { - override suspend fun doWork(): Result = try { - withTimeout(8.minutes) { - val content = fetchDailyContent(timeout = 30.seconds) - saveToCache(content) - scheduleNotification(content) - } - Result.success() - } catch (e: TimeoutCancellationException) { - scheduleFromCache(); Result.success() - } catch (e: Exception) { - scheduleFromCache(); Result.retry() - } -} -``` -### iOS — BG Refresh Handler (core pattern) -```swift -func handleBackgroundRefresh(_ task: BGAppRefreshTask) { - scheduleNextRefresh() - var finished = false - task.expirationHandler = { if !finished { cancelNetwork(); task.setTaskCompleted(success: false) } } - fetchDailyContent(timeout: 15) { result in - defer { finished = true; task.setTaskCompleted(success: result.isSuccess) } - switch result { - case .success(let content): quickSave(content); scheduleNotification(content) - case .failure: scheduleFromCache() - } - } -} -``` - -## 15) Security & Privacy -- Use HTTPS; pin if required. -- Strip PII from payloads; keep content generic by default. -- Store only what is necessary; apply cache quotas; purge on logout/uninstall. -- Respect OS privacy settings (Focus, Scheduled Summary, Quiet Hours). - -## 16) Troubleshooting Playbook (LLM should generate helpers) -- Android: verify permission, channel, OEM battery settings; `adb shell dumpsys notification`. -- iOS: check authorization, Background App Refresh, Low Power, Focus/Summary state. - -## 17) Roadmap Flags (implement behind switches) -- `FEATURE_MEDIA_ATTACHMENTS` (default off). -- `FEATURE_PERSONALIZATION_ENGINE` (time/frequency, content types). -- `FEATURE_PUSH_REALTIME` (server-driven for urgent alerts). - -## 18) Definition of Done -- Notifications deliver daily at user-selected time **without network**. -- Graceful fallback chain proven by tests. -- Metrics recorded locally; viewable log. -- Clear onboarding and self-diagnostic screen. -- Battery/OS constraints documented; user education available. - -## 19) Quick Start (LLM execution order) -1. Scaffold modules (Android + iOS). -2. Implement models + storage + fallback content. -3. Implement schedulers (AlarmManager / UNCalendarNotificationTrigger). -4. Implement background fetchers (WorkManager / BGTaskScheduler). -5. Wire onboarding + test notification. -6. Add metrics logging. -7. Ship minimal, then iterate. - ---- - -### Appendix A — Emergency Fallback Lines -- "🌅 Good morning! Ready to make today amazing?" -- "💪 Every small step forward counts. You've got this!" -- "🎯 Focus on what you can control today." -- "✨ Your potential is limitless. Keep growing!" -- "🌟 Progress over perfection, always." diff --git a/.cursor/rules/templates/adr_template.mdc b/.cursor/rules/templates/adr_template.mdc new file mode 100644 index 0000000..6114b28 --- /dev/null +++ b/.cursor/rules/templates/adr_template.mdc @@ -0,0 +1,98 @@ +--- +alwaysApply: false +--- + +# ADR Template + +## ADR-XXXX-YY-ZZ: [Short Title] + +**Date:** YYYY-MM-DD +**Status:** [PROPOSED | ACCEPTED | REJECTED | DEPRECATED | SUPERSEDED] +**Deciders:** [List of decision makers] +**Technical Story:** [Link to issue/PR if applicable] + +## Context + +[Describe the forces at play, including technological, political, social, and +project local. These forces are probably in tension, and should be called out as +such. The language in this section is value-neutral. It is simply describing + facts.] + +## Decision + +[Describe our response to these forces. We will use the past tense ( + "We will...").] + +## Consequences + +### Positive + +- [List positive consequences] + +### Negative + +- [List negative consequences or trade-offs] + +### Neutral + +- [List neutral consequences or notes] + +## Alternatives Considered + +- **Alternative 1:** [Description] - [Why rejected] + +- **Alternative 2:** [Description] - [Why rejected] + +- **Alternative 3:** [Description] - [Why rejected] + +## Implementation Notes + +[Any specific implementation details, migration steps, or + technical considerations] + +## References + +- [Link to relevant documentation] + +- [Link to related ADRs] + +- [Link to external resources] + +## Related Decisions + +- [List related ADRs or decisions] + +--- + +## Usage Guidelines + +1. **Copy this template** for new ADRs +2. **Number sequentially** (ADR-001, ADR-002, etc.) +3. **Use descriptive titles** that clearly indicate the decision +4. **Include all stakeholders** in the deciders list +5. **Link to related issues** and documentation +6. **Update status** as decisions evolve +7. **Store in** `doc/architecture-decisions/` directory + +## Model Implementation Checklist + +### Before ADR Creation + +- [ ] **Decision Context**: Understand the decision that needs to be made +- [ ] **Stakeholder Identification**: Identify all decision makers +- [ ] **Research**: Research alternatives and gather evidence +- [ ] **Template Selection**: Choose appropriate ADR template + +### During ADR Creation + +- [ ] **Context Documentation**: Document the context and forces at play +- [ ] **Decision Recording**: Record the decision and rationale +- [ ] **Consequences Analysis**: Analyze positive, negative, and neutral consequences +- [ ] **Alternatives Documentation**: Document alternatives considered + +### After ADR Creation + +- [ ] **Review**: Review ADR with stakeholders +- [ ] **Approval**: Get approval from decision makers +- [ ] **Communication**: Communicate decision to team +- [ ] **Implementation**: Plan implementation of the decision diff --git a/.cursor/rules/testing.mdc b/.cursor/rules/testing.mdc deleted file mode 100644 index 8a15f9b..0000000 --- a/.cursor/rules/testing.mdc +++ /dev/null @@ -1,12 +0,0 @@ ---- -alwaysApply: true ---- - -**always** - -use pydantic and marshallow -use mocking, unit tests, e2e -fragment tests into folders acccording to feature, sub-feature, sub-sub-feature, etc. -document each folder with a README.md -examples are tests using real data instead of mocks-units -examples have their own folder system structured the same diff --git a/.cursor/rules/time.mdc b/.cursor/rules/time.mdc deleted file mode 100644 index 3534990..0000000 --- a/.cursor/rules/time.mdc +++ /dev/null @@ -1,5 +0,0 @@ ---- -alwaysApply: true ---- -Eagerly query the local system for time in UTC -Use local system time for all time sense, queries, and calculations involving time. diff --git a/.cursor/rules/version_control.mdc b/.cursor/rules/version_control.mdc deleted file mode 100644 index 212e000..0000000 --- a/.cursor/rules/version_control.mdc +++ /dev/null @@ -1,7 +0,0 @@ ---- -alwaysApply: true ---- -use git -commit messages are based on unstaged files and the chnages made to them -present proposed messages for approval -get approval before staging or commmiting diff --git a/.cursor/rules/versioning.mdc b/.cursor/rules/versioning.mdc deleted file mode 100644 index 892855e..0000000 --- a/.cursor/rules/versioning.mdc +++ /dev/null @@ -1,7 +0,0 @@ ---- -alwaysApply: true ---- - -Semantic Versioning: Follows MAJOR.MINOR.PATCH format -Centralized Management: Single source of truth for all version information -Git Integration: Automatic commit hash detection -- 2.30.2 From 07a09a5a0dcacbe2920b46f82bf1e518b7391191 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 06:44:59 +0000 Subject: [PATCH 03/19] chore: remove Gradle build cache files and update .gitignore - Remove .gradle/ directory from git tracking (build cache files) - Add .gradle/ to .gitignore to prevent future tracking - Clean up repository by excluding unnecessary build artifacts Gradle build cache files (fileHashes, configuration-cache, etc.) are machine-specific and should not be committed to version control. This improves repository cleanliness and prevents build conflicts. --- .gitignore | 3 +++ .gradle/8.13/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/8.13/checksums/md5-checksums.bin | Bin 24497 -> 0 bytes .gradle/8.13/checksums/sha1-checksums.bin | Bin 34373 -> 0 bytes .../8.13/executionHistory/executionHistory.bin | Bin 46283 -> 0 bytes .../8.13/executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .gradle/8.13/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/8.13/fileHashes/fileHashes.bin | Bin 19797 -> 0 bytes .gradle/8.13/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .gradle/8.13/fileHashes/resourceHashesCache.bin | Bin 18599 -> 0 bytes .gradle/8.13/gc.properties | 0 .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 -- .gradle/buildOutputCleanup/outputFiles.bin | Bin 19127 -> 0 bytes .../.globals.work.bin | Bin 62 -> 0 bytes .../.strings.work.bin | Bin 12250 -> 0 bytes .../_.work.bin | Bin 1901 -> 0 bytes .../buildfingerprint.bin | Bin 1831 -> 0 bytes .../entry.bin | Bin 92 -> 0 bytes .../projectfingerprint.bin | Bin 566 -> 0 bytes .../work.bin | 1 - .../.globals.work.bin | Bin 62 -> 0 bytes .../.strings.work.bin | Bin 12237 -> 0 bytes .../_.work.bin | Bin 1900 -> 0 bytes .../buildfingerprint.bin | Bin 1831 -> 0 bytes .../entry.bin | Bin 92 -> 0 bytes .../projectfingerprint.bin | Bin 566 -> 0 bytes .../work.bin | Bin 357 -> 0 bytes .../4hvyddttlxo92r0wto9feha2i/candidates.bin | 1 - .../.globals.work.bin | 1 - .../.strings.work.bin | Bin 3106 -> 0 bytes .../_.work.bin | Bin 285 -> 0 bytes .../buildfingerprint.bin | Bin 2113 -> 0 bytes .../entry.bin | Bin 92 -> 0 bytes .../projectfingerprint.bin | Bin 823 -> 0 bytes .../work.bin | Bin 447 -> 0 bytes .../.globals.work.bin | 1 - .../.strings.work.bin | Bin 5632 -> 0 bytes .../_lib.work.bin | Bin 1020 -> 0 bytes .../buildfingerprint.bin | Bin 2113 -> 0 bytes .../entry.bin | Bin 92 -> 0 bytes .../projectfingerprint.bin | Bin 823 -> 0 bytes .../work.bin | Bin 456 -> 0 bytes .../685mgn6n09vojr2sffwrpu5ai/candidates.bin | 1 - .../6b2wdv4910jdk5r1pwy2wgbme/candidates.bin | 1 - .../.globals.work.bin | 1 - .../.strings.work.bin | Bin 13375 -> 0 bytes .../_lib.work.bin | Bin 4248 -> 0 bytes .../buildfingerprint.bin | Bin 3094 -> 0 bytes .../entry.bin | Bin 92 -> 0 bytes .../projectfingerprint.bin | Bin 823 -> 0 bytes .../work.bin | Bin 661 -> 0 bytes .../6czuitwtho9y27nvd4eawu40i/candidates.bin | 1 - .../7kdhbijltiwsjnddlavxu2zpa/candidates.bin | 1 - .../8x4ypt5nue0899in5q5whr6kb/candidates.bin | 1 - .../.globals.work.bin | 3 --- .../.strings.work.bin | Bin 14997 -> 0 bytes .../_lib.work.bin | Bin 5268 -> 0 bytes .../build.work.bin | 1 - .../buildfingerprint.bin | Bin 3094 -> 0 bytes .../entry.bin | Bin 92 -> 0 bytes .../projectfingerprint.bin | Bin 823 -> 0 bytes .../work.bin | Bin 796 -> 0 bytes .../amg1wvcaaabrt4jjzabw7fe5w/candidates.bin | 1 - .../configuration-cache.lock | Bin 17 -> 0 bytes .../csrr7nvdo4rldjtfl3c2jferq/candidates.bin | 1 - .../.globals.work.bin | 1 - .../.strings.work.bin | Bin 12246 -> 0 bytes .../_.work.bin | Bin 1901 -> 0 bytes .../buildfingerprint.bin | Bin 1831 -> 0 bytes .../entry.bin | Bin 92 -> 0 bytes .../projectfingerprint.bin | Bin 566 -> 0 bytes .../work.bin | 4 ---- .../erwtyj4abzfi70xys5njdh4cd/candidates.bin | 1 - .../.globals.work.bin | 1 - .../.strings.work.bin | Bin 14949 -> 0 bytes .../_lib.work.bin | Bin 5131 -> 0 bytes .../buildfingerprint.bin | Bin 3094 -> 0 bytes .../entry.bin | Bin 92 -> 0 bytes .../projectfingerprint.bin | Bin 823 -> 0 bytes .../work.bin | Bin 751 -> 0 bytes .../.globals.work.bin | 1 - .../.strings.work.bin | Bin 13356 -> 0 bytes .../_lib.work.bin | Bin 4159 -> 0 bytes .../buildfingerprint.bin | Bin 3094 -> 0 bytes .../entry.bin | Bin 92 -> 0 bytes .../projectfingerprint.bin | Bin 823 -> 0 bytes .../work.bin | Bin 632 -> 0 bytes .gradle/configuration-cache/gc.properties | 0 .gradle/file-system.probe | Bin 8 -> 0 bytes .gradle/vcs-1/gc.properties | 0 91 files changed, 3 insertions(+), 26 deletions(-) delete mode 100644 .gradle/8.13/checksums/checksums.lock delete mode 100644 .gradle/8.13/checksums/md5-checksums.bin delete mode 100644 .gradle/8.13/checksums/sha1-checksums.bin delete mode 100644 .gradle/8.13/executionHistory/executionHistory.bin delete mode 100644 .gradle/8.13/executionHistory/executionHistory.lock delete mode 100644 .gradle/8.13/fileChanges/last-build.bin delete mode 100644 .gradle/8.13/fileHashes/fileHashes.bin delete mode 100644 .gradle/8.13/fileHashes/fileHashes.lock delete mode 100644 .gradle/8.13/fileHashes/resourceHashesCache.bin delete mode 100644 .gradle/8.13/gc.properties delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/.globals.work.bin delete mode 100644 .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/.strings.work.bin delete mode 100644 .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/_.work.bin delete mode 100644 .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/buildfingerprint.bin delete mode 100644 .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/entry.bin delete mode 100644 .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/projectfingerprint.bin delete mode 100644 .gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/work.bin delete mode 100644 .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/.globals.work.bin delete mode 100644 .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/.strings.work.bin delete mode 100644 .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/_.work.bin delete mode 100644 .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/buildfingerprint.bin delete mode 100644 .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/entry.bin delete mode 100644 .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/projectfingerprint.bin delete mode 100644 .gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/work.bin delete mode 100644 .gradle/configuration-cache/4hvyddttlxo92r0wto9feha2i/candidates.bin delete mode 100644 .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.globals.work.bin delete mode 100644 .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.strings.work.bin delete mode 100644 .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/_.work.bin delete mode 100644 .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/buildfingerprint.bin delete mode 100644 .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/entry.bin delete mode 100644 .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/projectfingerprint.bin delete mode 100644 .gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/work.bin delete mode 100644 .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/.globals.work.bin delete mode 100644 .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/.strings.work.bin delete mode 100644 .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/_lib.work.bin delete mode 100644 .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/buildfingerprint.bin delete mode 100644 .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/entry.bin delete mode 100644 .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/projectfingerprint.bin delete mode 100644 .gradle/configuration-cache/6277d4cb-02d2-4a97-aa8b-c333720dfd7a/work.bin delete mode 100644 .gradle/configuration-cache/685mgn6n09vojr2sffwrpu5ai/candidates.bin delete mode 100644 .gradle/configuration-cache/6b2wdv4910jdk5r1pwy2wgbme/candidates.bin delete mode 100644 .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/.globals.work.bin delete mode 100644 .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/.strings.work.bin delete mode 100644 .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/_lib.work.bin delete mode 100644 .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/buildfingerprint.bin delete mode 100644 .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/entry.bin delete mode 100644 .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/projectfingerprint.bin delete mode 100644 .gradle/configuration-cache/6c6d7154-1c12-44da-bab9-788cea5132be/work.bin delete mode 100644 .gradle/configuration-cache/6czuitwtho9y27nvd4eawu40i/candidates.bin delete mode 100644 .gradle/configuration-cache/7kdhbijltiwsjnddlavxu2zpa/candidates.bin delete mode 100644 .gradle/configuration-cache/8x4ypt5nue0899in5q5whr6kb/candidates.bin delete mode 100644 .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/.globals.work.bin delete mode 100644 .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/.strings.work.bin delete mode 100644 .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/_lib.work.bin delete mode 100644 .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/build.work.bin delete mode 100644 .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/buildfingerprint.bin delete mode 100644 .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/entry.bin delete mode 100644 .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/projectfingerprint.bin delete mode 100644 .gradle/configuration-cache/96e7369f-9457-47f1-8304-05bf876b89ff/work.bin delete mode 100644 .gradle/configuration-cache/amg1wvcaaabrt4jjzabw7fe5w/candidates.bin delete mode 100644 .gradle/configuration-cache/configuration-cache.lock delete mode 100644 .gradle/configuration-cache/csrr7nvdo4rldjtfl3c2jferq/candidates.bin delete mode 100644 .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/.globals.work.bin delete mode 100644 .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/.strings.work.bin delete mode 100644 .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/_.work.bin delete mode 100644 .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/buildfingerprint.bin delete mode 100644 .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/entry.bin delete mode 100644 .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/projectfingerprint.bin delete mode 100644 .gradle/configuration-cache/da5353e4-2da1-4b2a-8d76-9f7a80dfac3d/work.bin delete mode 100644 .gradle/configuration-cache/erwtyj4abzfi70xys5njdh4cd/candidates.bin delete mode 100644 .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/.globals.work.bin delete mode 100644 .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/.strings.work.bin delete mode 100644 .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/_lib.work.bin delete mode 100644 .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/buildfingerprint.bin delete mode 100644 .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/entry.bin delete mode 100644 .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/projectfingerprint.bin delete mode 100644 .gradle/configuration-cache/f64db575-a480-4fdc-82c4-6fc81d961b4c/work.bin delete mode 100644 .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/.globals.work.bin delete mode 100644 .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/.strings.work.bin delete mode 100644 .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/_lib.work.bin delete mode 100644 .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/buildfingerprint.bin delete mode 100644 .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/entry.bin delete mode 100644 .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/projectfingerprint.bin delete mode 100644 .gradle/configuration-cache/f93c619e-5608-44c0-ae77-793c324d124e/work.bin delete mode 100644 .gradle/configuration-cache/gc.properties delete mode 100644 .gradle/file-system.probe delete mode 100644 .gradle/vcs-1/gc.properties diff --git a/.gitignore b/.gitignore index 142ff7c..cc94060 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,9 @@ build/ .DS_Store Thumbs.db +# Gradle build cache (root level) +.gradle/ + # Android android/app/build/ android/build/ diff --git a/.gradle/8.13/checksums/checksums.lock b/.gradle/8.13/checksums/checksums.lock deleted file mode 100644 index 9d4c6281249e73fb732803e408e66f644db0adcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZSX(RL9%bKPJ$0~jy~0st!W1EBx_ diff --git a/.gradle/8.13/checksums/md5-checksums.bin b/.gradle/8.13/checksums/md5-checksums.bin deleted file mode 100644 index b38e0b3d098199229b444fbbbc2a44da346d8004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24497 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 kZaongV67qsx1Pvta;w0>c;@qO5iBe>2ear~m)} diff --git a/.gradle/8.13/checksums/sha1-checksums.bin b/.gradle/8.13/checksums/sha1-checksums.bin deleted file mode 100644 index 864ee7aa38611f4d08a71257642a0acd0fe205d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34373 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 ANB{r; diff --git a/.gradle/8.13/executionHistory/executionHistory.bin b/.gradle/8.13/executionHistory/executionHistory.bin deleted file mode 100644 index 94410c50683dfaef9d61cf08f818b9b75ea65a6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46283 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 IXx%;k5A^hWp8x;= diff --git a/.gradle/8.13/executionHistory/executionHistory.lock b/.gradle/8.13/executionHistory/executionHistory.lock deleted file mode 100644 index 947e9de7b78eadab32fd6c38826efcb95f30e4bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZQxXeI2t!?Ur90RkidCt3qZ diff --git a/.gradle/8.13/fileChanges/last-build.bin b/.gradle/8.13/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/8.13/fileHashes/fileHashes.bin b/.gradle/8.13/fileHashes/fileHashes.bin deleted file mode 100644 index fc2d3e8fa6d039c82dda2f6815e054b9c3ac83bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19797 zcmeI3X-rgC6vy8%6gmP*AVjtbRsksrZi7&?LPDHjfQV2KYSRWRQfyE*S!F5MjxDh+ z$Y$9pn=C~(!2$(M6cAc4$mQ0|ya^06jG13|1-Ey^7vB!78dX}?R2fhFF@j^y*U!F}B$F-LHH z4#^kG-J|v-l+WOtM{?zfo>=iepMHjN$J-=Vf6Qy(r#T0pT*N22mW4R|oQ+>RuD2k$ z{=?yx^4hk~QSQ`Ca{e~H33q683(6gANG^;DNq4+>i~YHFQxf${@LG z=&alE%9=3Ysx{_54oyYGOFU)3@nI7+ zqNqv}$C*NFhf?M0@tA2u%;EV4)gCtC`+;CM|3;RqkMuz`RBA^loj2`0E{u<8&pnn3)N=bJ*Rg^ApC6R*0^;)~8vt%3RSzh^(ICZetVS zQJQ?CnT)kN#U0YTre{~sQ_V9crkBDU`Xblk!s+!tXiu7F&7If3d$myM1SXng0Hw}M zV8{`r!!~DwIz5vj^OM3a2$tzt73Np6IDrU?!zN~el5Ktw9*j1~*&4QZwzUNj3!a!@ z-sF1tChN5xdZxw+xgJq$Lha(tnr#x3kl@C>30gM;V-T^Vf_m^yvWae= z+9OFF;(8ePepV+oJuC^FxR+*93?oE*Nky{|JaroLTzxn&R&c&dW8mQ7gc zBzqN?I|c+5NvroeX3+B*vL5)Uv=6fhUZdG}`StxH&d2)Ka5HP^i5wY$dnm`ViS{z3 z=2yNBvE#NY)uwxg@OQpMh+AwT!K-hU`(W5M>?`S@RC|HgU7#!J#mS&Aawq>HLaJ$~ zTw*(LFg37a*E&VID&2mi;j#>%?Dg10_Idxq&&xxVo;=Mu>Tn}ifhJO&-|hWKMsPlH kViWbo?>(3*%nL237U);c{n^Fz$jXQ>We8PI^*o077yOO0-v9sr diff --git a/.gradle/8.13/fileHashes/fileHashes.lock b/.gradle/8.13/fileHashes/fileHashes.lock deleted file mode 100644 index 5e224e2cc8a7070c5b19c943a9a492f870de2df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZS9y7_(Uuhl(k86dz607W7N#{d8T diff --git a/.gradle/8.13/fileHashes/resourceHashesCache.bin b/.gradle/8.13/fileHashes/resourceHashesCache.bin deleted file mode 100644 index de858ac4548c115d34ba4fcf6c80261ed7fb3d59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18599 zcmeI%u`5MU90%~*Gd;b$YoM$2Oa?K~8%&Ba$f$Rf!Ss5QG705vB7XxGC96ypgA|k9 zB$M4pc--5)x0lQoeNLToetplcQ|Ggu`5=hGuY3gEG0-hl1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+z<&{llZW(XkBKHqX;Iw@g2_r!^n}OdjnmH4O?JG{EdCFs+M}iY_~0AAZmCxgsz2BwxwStON)UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+z+VW|lS_w^*`Lnv>?oS8PhXXTm-GAU@m4DdYd<^g m`j$E$%QI`QpM#B^=I+Jsj%uyZev2!s&kynD-vWl+;Kx6IljQC{}2tLI1=g zf>F^#B_|Ujb4G!L3W{lSnHc?7qF6H-kr8Wl-)|B=5n&IC&%td!-uJsNcdtEMyde1b zI_VH*4{>&h6$Bsv0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY>&i$JRDMV87h;}^1c zX0fb95JJ6Oi@>TcpPbVf#~bC#lA8ZNs5z@1H(im2e=y)<9s-kPc$NPF5}K=b!-f1nR(vg}^DkM<{V?|9vQ(4k82 zqW$l5BGI_J`;OCocbf~FMFSKR_9h(X^sc? zH-+NG>La!-)OT^WJ-6A7{aH@xtGQ2Zt5yYNZ=(594fpS{$40H=Wx2G!j=Lhjs<-4D zw#r@8%w3t1Rhm(MDOm1O5qA&qLaR9HJwf{ix%6yiD5UxQ+(qx9a$AHdih42k z^+glfy=6Z4sK4SKoOC-sdh?QTnjiP4pLp1IYF&Z9+$9C~$jeH5o}zAy=0tN(7IXAc`x8#Inn`IFo;J1TW|r&eXj zU2~XwUg(N*75lIKp#2-U7nI!5876NXlDl-8`%$l-nwEyRY3c^pyam<~MTZZ$VHTkgwqr0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P*RD1j1aSJzeJ_It8D<%1r*(itCZx^vnyJ Y?7q9^PF`4<`zz09&V25gyXSZL1pwRMRsaA1 diff --git a/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/.globals.work.bin b/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/.globals.work.bin deleted file mode 100644 index 56771ba7b42642eb9eb4077686fd10d1081cb4e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62 zcmV-E0KxxXk2CR0rjo+4e}HyDwI*4M`BsAZiQUdrrV)F=lHOr7$-KAVF;ZDcVZID!bCrkCtt^4UmvCs@ZLWx_Gik52y! zcB5_V+&L|O+f?L6J>rg}J)^MjjH;#IO*f4{r4qpX4|?lv`z>ulJO*GcB{NKGJgz@$ zM(i=h>c}vU`1(cxY7mJ6U5=m6i!*#VMk6tTjafqL{G)Asv~fj-FsHyel>~eD1=r&g ze3-6G!Vnwr!T9Rtr8P8FF?H{>&v4F0Gc!t%KF{Dmsu|*!uY+ow>}X zvfp2Ya3ZQa3gDP9T^s=G0yRPun(x`vmw0+`zqfUmsHnHJ$Vr^q zTJ5z%61mdHd5^9n{f@9hme26@OHM3NXg1j*VYuq?)!DeMm!T%gFmlGd?mmdTk%E^o z?)D&i9MRRV#PDMvcIw4Zy77tu4H|pOr@IK?pd6Yx&_@=p=fWWc66yH-j^IwN``yw7SNS?N$NN6hZ%wWPi=F%OQ7RsSdsU z3rJ=gK;@p%y}XZ|^5NzSC$!x)T$U#jC``zEdcV8q8+QeIjEqEi$qsjcxtgwGQCXIA zr4$;-E|<}*^0QA1_}f1dfK*}|9#=Y^Bw!K2i_5B)J@mqXvlNPcw1oJ@pxAx0G8t1& zqdFkh2yRPBqMO|ho(GE91A@->5??E~wx;A2*MTONJ$_?}Op|N+jPYltsT0SL+kX-!_V+hsi)M8e+I33SRA|ok?j0<5!w&r@PFI zjAdw{;a}v!axJnN;fxFC_P}--+)b$A+)67c(C-#?*=yV~yN7lAcVfnG8?y`HKS>sU zV$8*0XWf&V4aTP%uEpo?XTv%ymmUaT(#0-4Lzc=BT3$mBThWrC`20Zn(HJQ4@);hZ_zsIHE_;(lCbQzlBLRAmLK9xEyJ*1=lWGOeo(qoBRdFmW|-R=Bu~@SK5X^h z1`!YwdrtoGiq2<8d$;~Mby6TunrO3Ca?EK!vqI%zTwQ45*pG;gV9ntbFNsa#0gTFX zX2KP`_X4vbm~;x64)hM#qt4Xl!tSlWg}CC(+K^9Z|GA-U81_kCQ%B$PP2f59uyhwf zLlQnILDNiR?Z*X}vI5Nu?=4iKUCJW#|o~NdZ zC6R@&Cv+nXE!Zb=PamI_;KaANlrxetU;#i6p=(R!p>l-%8S}{6f zMD<>3k=L6@;8T;6VoyPqnkUxJfCAxN&tr2m!-K|_Y)1`?+57Qr$Q}!;->1w#7yhMJ6&5Gft zA8~qz6-_z{4nVFWgwY^)9N7$d)0z7VhrqX~egSxU_yP5n2V4^Fitq*W0^kDWZ)8nj zEX+jGakFoA4gS6T^0eC~v7lGGLbZJlxiR-RZG_N7SGu&l(J?^s25%1X@2GeFYHcn& z1k%r-APX?UQbvm|Dbo3BW9PUDtV*_<|L`y^#*sE~2T+$hu>cx8HhkHgE@Er%km4s+$c6Yhc&2RCHo+3(5c&WD}IQ z(=4v<2>hRhGOBzcOmG4W-xiDiU5Hb6lkB>j4=Qe0Ql5P2idUduQ;X116M<)=;_fJ4 zG{Buu47VSL3rY~{gZFC9LZNd;8kcfOQVAqqEyZ1vnUCfe@+2Sy(dxg|)lq}6 zo?1hticn*IozF}i7KaPydf;ISFKTOoWVA;EUxh$xN22M!)x=#eLNF28ANR?e;T$yn zgP`Df$iTIb6mVKBM04)rP3@T8b$g_qpW%Yqc5=4h_`1Njgsw}xjPoB za7cn|p#D&!B70;mKFLUnqodnLS&m{wqUe>l!-OXP;B&JnQg&zcaPZVo;Zp>XlZ$G= zSh>27QVogpx1zw~;IYA{MX?N!64g0c16&mka$OZ#M6Fa{8I6a;;&+aixlZO#$gjZrz- z3N~c#gF&|mcQXMeX~U=WcVhFfqHa`;O$AqMT}&M=am^DL_EIz8+O2^^ZoH;it$%}w z+2JCFt3ufEB7<=Q)i0vpkPvdf?!Q5N?Q&=5ZAaxV@FF}7#`pf|28Ct+NkI551wS}J zgWrep$g-Bnkv4Dtl9oOe9C#hU5a+rD*S>*XB#{mPR`vq^Hy;c^#pnvj9O-)7OiH4U zV~?x#g*&4zzm#=TzZEZfb5NEHNsC2^*{jTQ$4n~fm6-7$`!SoWf4|M) z-Ha3LC3t)j14`_GvyW$ME5-Y%(^em>tSF_t)(5}a_W{iyJ1YgSNZlqJU$n|pFwGKc zUI^dJFn!GdXPj+l9S?iQ_*V;oa%-cYa00>wUDN}@1?WaOhz!Ur+xbcMwT=4^S|X^P z5oMTv=wS45lxVRa{wx%p$UBkyr(P*AujO1`jK*d1Uo{oX>mOoCzQ}=5E5|=Qe3$#s zaf+lJga(kBk9u)@{o$A^mPzXzJxTN5$sFMp(ASCKFL|xTDE)zsqu%Y!9$vX6!*apQ ztVc1btI;F&?4p8))cfT+Ue_UPRuVeD_jR(b5c&4UM>sXLqss;)L*s#v%O1m|ROwWtun0*dL~G z?y5yZVu$ZgmG*09dRpeHsA+;~5`NYY(z$ZszF+|8ZUaRD$Q0Syd5^&wb^>2xKl(Gk zxMZ|;J4A4)W*2eGoR#N7yhMt{maVR!(@i@tC`oeCAOyaNK<+*4cgqD>85o8&pxc1bnwG;sx{M-v=K35dpDaE^xw z4gY#K!k*JrjRf$;1FL@IFbKwyCIC+f?DB7Uk8n5Wy{mbE)FsAx@(A)F7Iocqg35({ zO9^_mQy_GGOA(g-8{pq0jh?HNCd)D_08*hmvLr+IO@^}`P|zRqN7ZD>7YhOXFz%!k7^FQ1MKyxGFz3z8%qo# zQ&JECF|+VSIvtsn<1yzujO^WWSfREn zg2b!KcBFpQ8%&DzU!!3BIKKN;iLbKxs+LCO>PPFR$K2TBdq#$Lf$Bp@c`y`KPuoCD z^J0XlJ*=VvNIWBY5P#R|`K5))X465@b%L8o+ICLt!`nAF&Yo=i^QS`Bv3AICZ)8WP#AiFGg1|X+~6_%0-RUE=6!Sdz@G7 zf!Xhzs7*@99!J}1XtO4YudJjJkRH1>(Gtt`-C67XXSZOD?C?;(c86?1YE0*q#p;bn zXzI=51`<}eQNa!Jo0;6BP`qms^$f%F3A>7aS$=Wrri+fBapL@IHpIIC z@7lWJnj?q(M%T%^Jv$r!#%ofSYek|3pSbVbwU9?g^9!!)(~PG*a2mTPP4=`gn8UCX zPv=aKQ0iE<2j#VFFceS|#|A~PAfWU3F)gn{ez45m5_IhSErA3;4cRON{tguZx{{sU zT9VAA&E38aJhEXkU9%ROtZm+J}! zPdo@}vG&wtB_nG--7?U068>c1zGD1YFO!72-eH541T9R)2>P?hvZ6EC$2mmO|6@6@ z28v8IU{Rww2@B?tk&4=&Zg zmN`^AsLYZNEU4}xM=KfGD#0CPk}iB{c3#7J=4fy9&*P_1SM*#~Fv2;hdj=bM`lyeu zsUWr^l{eGyXb;su3f}=5!F92l`IRkMcL(pl+M|UXWf#k#*fsVe$NQG~LY{Cf4li4p zcurgYrq_818a4au-u0&@R_i0}V=c}5j5Y;~EJq0xSG8%K=d|7P@eF1BYOUFT+K2gN zaW!3vCR{k7n&VREx)6+!Ys_wOmM{HYjP@0g?uPVK-+yxh>P%5lgDp^T(Iq#GA`Af~ zTnaTBTVSV;FCMl#UcLZ&d-Ei+BTj0NbLZMEt32D!&-y2HQO*<_Tw>xv!ao<$90{xW z;vk4cYfAY#mWyZAjQ|$T>Fsyi8bdo@_}sjOGS;^^WtGSGBWl()5UUXzThfF5R+ct- z`13JQj?+9pryn}tU|+#KRStT*JjBf)t$5|Rse6stRmA8s=5JsUThVFoXnD*pNLl`d z6jqevDuEWJ7SH3KQ;sKl>`n}eu7DCUCYE&biyZyfkqVkZrHS6SXbtg9q86iUpM!Kr z1CQae40GLr?QUOL7!v!4Y_mPN`Sm=o0UY1W|1i0V_)ZHC)jDNF!nQ5ZW0gXY)7Mhs zgJu(&78a6Kk#%PTu>a<$omOf68beEi@xSAFYL$@rtyl1YlYy@6TX#NuKkoxFT<@S^ zD!Urys8rgSrwrZO%CdzRG;bt}kGl1+9BP}?v7*2S!`{H#ihcsyz*u#kU)ZN-f+p>y zurOAqZO54y!8lX@DG|-5vnOZ(Vph{8$ zndQIRZ4Ff+q6u_~vZF&mHA5&U?j^ktW&(JpaB`6t{K_J@uVk#vB0lV%kZ#{qxIsIA zx2Q2CKi(e*EBT!9kJNg-73y|U}}fQe-h+QUcAZ!`Ex6BX7y5Q?K?^h znSYJYQg~tt^~TE&5m_!)>x4!2M{N4)*e9@mWyyCd*aK<<0ga)Y*mPKm)y(CYl>3R) zOj7Rap4^zQjA3_>GFHsAEi*wskfU2;goLs?XzoD?rS#04H*W0Xzlx#_dE{(s)}Utg zCLretW@L-s^#&x`#txY1%|w7I$ofnn0j@@#YN#Eg(X>Y!qp~ z-l)-ASS6_AIEJd{6Q>&@ro--L^}Zl2@;v`|rFVvOOSRE#PTYbG*S$VGU@3HA~8 zrIQ@1&jw&y?z!0RerwNN?tA2vFZJ5@Lvp6=T+J6*q5Q&d@}2U8)<o>nlgH=2fjE<%Z4d6I`w#HpK8r_j65+t^tlmu51KO$)#MM^NdpQAsLn z@17!&t1sc$MDR;7itpIoM^iD_-K^>MmtuP?(V9ibFh~hgrxq4U!yi5Ho^IhU^HfJ` z+OJKF*GRV4w4PaJuUg*w-bXIR`k=b2+mzmksm+{3Cz?&$4He?iCOt0z#EMpM1<7VK z2!j2iw~hUptZxHxDd~VLugY>{>QgbbI{Q*H77Hx-v*tb27 za_x7^xl0EDlz&B|j0L1ksR>whSjHw9cTYi5Udy5fqG{{mAVr!VKSlQ*LV+$wGzFlv zq-=Vbn5z=h|3An{!O9wypZS%hs{sm&>AUR<0N9+oH=O?7UV-`V_N$rL07QvXWZ>&$ zYg%RBE7T3lhE>7fdubB0epgr*fN_TXJM`JG-y6kY>8~LrnGcU1&C=4D#RI&sHgdWO>^7+a*i(WOTm`p&2 zqPps2`DNg-Q|X-^TwJ-)(?=^}fYS-NRM(Bu#$XNxI%zAnMWo!~WulhM>4cWR-w+16 zG8I0lm~Zp^vWtO78Vv$MFYHKf&h5@#lRV>{d~+g91y7=MEvnQ(TP^$7(Vg(0oz`;%Y0D- zp~N@nY}M%8K8v^faFVA=#{MMJF~q(27*y5k&2WT3IY}!L-IJ2 zuRA=W?}ARBVBf)K8Nda~KHxulq@$GpkIdUQWIiKzG5y~HN6E!g*yCzz@JZbZ4x)W& zGLv=~gm-jQ6OmpShM0dTVNeLxMHv`LCfgKq zAX~O?g?Vk%wGLescb?wMB=Me7V4{Aly^d@DR%Ws2?YU9pJ6H^#V6MV3s){@XiXWZq z%fT-2q}a9GhGI1N{i3&mUA)Rd09kqzK~tF)XjPC-#I+nl)c4%-@2^^|npod(b_%?; zGzvnv`bV|95O)G6(c2x9VwI9=2y(m4+_5xy%^S<2L>nskg%Bor;b9>v*5OEc)S zgu9$G7M}-P45#*eXX;leXKbeeL@od#VEl4kou2f6K+PFh8yXnRygdX3AW|of=y?}e6&^5!w?#spfI1%nL$@0I(`H5md|6-O%5*6)H za0SUMSlu$qHSjc@g8$UZViASyqgsGQj6LZ0_Ya5m2_-m#rqw-=o=@}kzJ6Q7m1+V! zmfEYIN(Zy%I3?2cIw=2y!?R9+v~ML}i;&S$!j^u!^Xz%Ie^&SM=u&emE=O3l{~W%n zc0NeLcSq8hIq@3Lxz%KyC-kB`w(0{FSDu5znf?^hiF2fNxsKZ9u2;%8WOqYujCMW! zDJhR>{H02CnM0sRG#m`0iLsQzb}?QELTl9%i@jH-7II2&g%|-5f5%;Qm6^yy9y`cJ zkIR_QlIqp+72U64QNE+=f!75+*h|D{n&!<5ANtU|ZTdnZ__>>$PN()=D@)a8{#e zt`_{e*Q@`6LFUM9?MY36SgYR^XPC(s{-mgSHI%jpjE|AoMIfZ|5lsQLQMOM2I|Ikbu#PWD3T3qdFosgyGaDl zR9uaZyg72!(iFl8Gqx4Cos&rsn@Z@ikrRY>p4)YXiNS42f)NKLlx6ImBiDJ&@F~N zWazY=6^q~gK+-&)?~y>e7tSo?F;-UK1Uhi8i{<4+6roTYw8?*%a4zl)y>y7Bk_r4$ z!e70NH9q9~Ur`vZ3!iMzr#nA_^=w7a;Z@=`V>W8ed!D*unEN_(7d4#vVIZ0QpVIx1 zXL5kz%p2ec}E3iSz(5?m8zP}15|=L5@iD{F;ErR zio+X>Efjs6^)e^5bD=uk9?0=Cfh6ji?9(q%TO#B@rlkrFMGVLCRbHfFWfP! zWzgM$qLYN^8=N}O{&gSuR|QA}eHv&-yBJX;kv>d66zolc;g~PXE>=M|9reD^S@vRZ zJTe%6Md?7KcGHXI>b*8W1$S^O8huSlrb#pLS)=)-xssA0J2SB$ubRQRB3Jxt6y0@o@cpi`}kEFdKWi zg+uh>yl~7(xMXg-01 zv$lY%d-vEBjrm8vf{(Z-08brrO(d~!(K$TrjdrfV<&)ajgk;7p)36Nt6647jhQ5Yo z98FFDpa<~I%c=67B}H8CZ@V?Gp-|w@=P7}y5Fda_j|&qaSApg@K!Rzu3KKY91l_SVT&K|t*F0{&&GiDnxyuv!RZN*_b;3wnJ1-W@F% zrfEpiw^e$)esa`}3GRw;JIRkcK^mdH(=5!jNX+OtTFh&J@rJKsSDOK#+*G1;ZCZ;y zytmbs!tlgk>VF3f)`$|;${>4;$Qi8k}n#+_?3q*t}j0LSKn zBcka4wjAc`wbqMx*>2eb;LjeKhvu;BBm;)sZz+jynF~^aa_LSlj1}L=Nu?pKI)~rT z2f2_Yxw4rZHkJzXi6>fjGPTw&RC{;2Lg$%fQk;Qkudw7jV1GU`sIuOi4U>G#Nez^I zd4izdB?1_y@~Ge}F#T4G9Gx-UrxeT-ciN-c4q3ScwzVk}>bs@=Byr)XI? z{MGgZxMx>$T?p%xZ(S^77<_SOJ*4+L?+~?vLu}6%a$v+=EH)nv&H||@rbLr4irGJO zN1q(E`)OUD*BT zOIKj!!Njpi=N&e;oI+IGv^o#i%{b$6PR>pdPghz2k?^SA0E3=tEfE=0GBC=pAB1>C z2sNgLqd%V3O$SpL8v7kf$p0XBgB1z@4r&e%G78=^za%wUF6D4K^iX}dyBrW3bD$tx z{$bb}TLE?(JQDPmjKc#vaFmF~eWdfWky=52!r$8|&UIo(qmN3dHHYz44T}E97UWtR zc0x@ZlXQd3cqbfc!d#pcG=4obd#G%~v6$UuUJ*oFxi{CdbY3>w81Bt9qY(7Rv+Wo{9Ha%zQ}vz}=GKcwI|x$c5dO-xiL6&$=7KSF7S9s%$YMYG zkQO5u4j0*4ryN;o;K+a53i^%E5(Kv6$mO%o{z4E9pg|EVslRP^RuJ*2_B~p*K*mTs zfc1%G!vU8=eAvR!ScNhz6YlM-)xn5#4H6cyw$z(va%iVW4fP_yUby?ZxocOb1i3S+0Cwxu(Tb3r6L4(4rWnbI(v65|T+2KjU{> z!l$lE#%fPN_4I|7QB{nZwyI7c{5%{7`aJc)6@tTFM1Qf9=5G#Zq_S+>2yj5?QWCGW zQ-)5Jh9m}9QUYD08xKypDtx`KS!V&BqJ>X=G0x`+u(YGXReS-XR7?8BB;3U&OttMS z*$vW0&-hKaUiGS!CwWetNz-tP#Kl0x+3RF=Ubxgw+dqxmt}b+2Yq1B zxiOy-f@LUsPp5X{${p1Xfq(yzKs(Dc(K;dbu&%D26`b2JLq8D=99LN|BwWluI~3<= zEUZXljY6TXJjk;x`}&17#KdIXin`Knx%3Gjt$ao+00g`>VsB%RaybMa32UWL6O|+N zd@~o}6qx7t6zuRGL1Koh#^IuPab7mBzthq{rqxNJrH0Ql`d#OS(B_5$Uhkq^)T;lT zf%q_4oiD*^r>QZcI6R}Htpz17Ij@?Fy$fwsnuRZoV+gO?g$;@yrmMvt^+WSo6Y>44 z9dmRP=XK4}+EievL`0P9MW|9wIKo^-H+my@=RqV3a@VR6OEPY8=TSkzCsv&?a2s?O zG8%<{eF}0Ju;bN+_mH33sy@2QMh< z%SR)Z-tF`MXz}?_a%;F&_<6)Cd&|1)`tkNhjTk;fWlUW z#{PU?VGUg`G`~#)Ng--N-PLqBk59y#cS=X+db^|$xdk-G9|22s)#Up2X6qMcjd9K2 z_DX%oSk3xEEowB#%w5-286`UVrS#-dG1+8Znpl&7lcc>GrX_yS4f&PaAccd^xKqn5 z;_-*d`A3_vOr)IOiA7H6oQZOvtBrXBb~od^-F&-|!=kl-t+#EZ6VSK%*@{|2cx_vB zuwsw>`@CdNV1I+_U7VnvNBrxDi2?;G-oA(@x==h2fcd2H1XKh7xP@|Sf$bHqA%AQ- z_sJ}sbEMvstjFy~7s>k=@ez%CpA!v6BM@I-AfRd*q;NY3P!s@SxYQll8So}jvkYLn zNamkiTlBE^G_#_q3(Q_RsOq1NA1Gr77n+~@OS>6*Tyh>;vMeFd11&X&RyQ-3Fi7mRXN(w1;69%?!mW_-oS{fa@lBpu$uaP8Xzw{7 z49#r~t`R)AMZ2n`&M%9sEcJb2`Q6-3z{JC&{xtc?4<|=6>W*eGJi$LB1^YXJ{R6s`MgS5 zvOSjft0e?-3VW&_j83v(vtN=~@RW)OuUkn^057Y8ya=vNE1GKazJZtW1i_Dw_q?oM zQh%|2(c99RRYKRwm61V}jKgOh@mSyPE;_Hyyw@EjU|E*`C3o?_N1v5{lt-HC@XR|) zEZ}0L1(~RA+e=D(V`AUkgIf-iB$V5x2M@D9S*o9Z5X9#Ny*l2 z1N?kc)IQa*r+pp4Qi5!(sAu766Nrc zLme}C>QeFk*1yo5_?2LaCgiZ%gvPOp@YMzp7Jxc!W~4(6)6{zBk9W0s+Rwd!uX*X71}g2z~4#Q3{knIMjC#~)8i;p z6lR=pz6BF1in=7xH9Yag%CKKruP9R7{hVJcLKX)4?5!!+l*u>La_em)t>y2n%eRV4 z>iOEuxXv1G0eGMd-&WQD>R_!K;Uyqj=YDc-)+l!OsxD&%lCzyySI0K`Ne5kzKQCO` z2AN{-IBl#1^VnnbI{8PWS3g$iBHA0B%9RO48pVX-f`vfj2{UBqwb86S zFFL8#c=4KTt3+Fh-wmpni0fSl6ywJ>V+{vmpuuLXA^i&Js*qFgY6zfpt^c`;)o3Lc zMhD;kF4A9x(~6elRHN6Z?DdaebT-JaJ+eJh9dm<$9^y*XmG2Y*${ZaK;a0*q*{_P>ZwI)_*4g{Q#=hHg5TksxYTb^;^N~Z`!Z>dS z{a((aw_v(Z;2C0d`aER^DT+({EnWuf(2$Yji!4vMwP#x)mejVtlN@i`v~Ju0RUkw2 zP<->-(_qd5w(Sa#2!4UXfG_*op|aJXjsvH@{h2nUzc^P;wu>_=))*J6o#)Co$AKpl z%!=-TT}TyL0n09EeD{byk2KEP{&p8kXO`esj8oD*?s?B?YeE<>cD)6^eBuD^A?$Ix z*FgWUM4Gwi;yLi#WyqYckxgL$LmIgCE-6TPGe^5;*?x|;mh18Ayq9UpkViC$@7=eP@0^NJ6K8ml#-&N~qT+CJU#j#ECNf*xQ{Fbh-0)cKbD( z0eGg$>X^afsA{*%e?!Hd5mD4gdfE diff --git a/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/_.work.bin b/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/_.work.bin deleted file mode 100644 index a91fa75d5e00fdaf847c697bb7d34cac83c4e09c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1901 zcmV-z2a@;`t@<=ZRGU=!u_x#Izr4g}Ms0IqtJJrMEMJ>z4Jmb)P4AZ>+}OMzDHCMWIW)UT{^_Zx%Bfm7DN18;+}DBD~&97H$Mk%t?lku83}J zLc3EXd82efrmJ|3czi0zKm)AL5oj$>VOU}1C(BpO;G^!_N8tX3YJ4yX4|vlFfHc1H z@^p%ST7=RY{InGL{6S-;vDgb5&#_T2JbIBEBB~neWLRIW>fbR_&gWu0nWH6%H+EQH zVa1{<8z;pwK&q>q9j;b3#rI^Y24CS7*)`W-U$$&CnHhnRfURRKxn`fmdbVO0$)N=N z{-E|oYM1+*hFURnoW7)%8D^j>WEN3C_hy<>Z4CNT%&3z%^?eGlcwb?RJ%mIuQ^*by zOcww0FI9P-5_U%R6p{jA++=TEr-_JS%o_C@8q3}6O84H1cTjHUsli%i+DyujA+M}l zAL6QLJ;Ux$eB06(Ldzljv3xj5LVRhO8@{D8Fi84A(Q4?Ef6y~J>@aiXJ?h*Ep{bK> ze5O?017D_&?Eh7+%x;x8P?+y;Ym>*Ad3aO~rbY82XsIQ;#6_f?I8eoQQ<2J8pD{^! z*=a$6*&gcv=RD!~jVg5^E=aF|LGtUtMTiDorNUevsF8ZG6=IytdRfmegJhV8`V-7{ zA$6|@+b(G&7#?hsOU>1s*d0_TvZM_+1@jKpG5(K zEy(Zd9>fKq!bS3G4d5Q;_Y)X@a+b&EW40VymAF92tM$|mRsE05tlhiDwftyV%|++} z6U^$PejI{7Oudq%z_cT_H$W=;=caw4k$9)(v|LMevLGirdwZ)T@1t2bCZBU~oPZg* zIi;xHHwSr#bV6<@FYogfE664%ab-ljj+y%}d=-HKrh=-LApIToB3JHyHgdVMPBM4I zl6!*#=hFxB3k^8FIi7%)RHnth1r{}Z3bEfZH|FMn;M@3oLlKM=1B;RdC1iJb0yB;! zGd4x(z`et&Cx7S6EJPpda6U$sk*Lr}9+|WVR8NM6f3@nvzQMv?0;lPw>Y;2~cpDiI z^)NI~tpshBhf%{Qj2D6|Z)_bfU*>|ZSN4*3Z?^d>Ss6H0ft(y$f{$t&jUA<0741C2 zkgygK&uJ$xf+TO>SnBZ(NF*mL7tSN5J{P11q8Dx+eB;)r#i|MQRmIFDzfpg>kZ5^G zu6-zeI+*Tr6R&bqncp%6t0~7){W=EbbWcAs)Q{L#uyZu7xWl+o;S8$bg%>H;{O6gc5&=Fpngi z_>UiHrI|u+aPGXRIN{!W3$uc4YbD09^+ZMTR${H&0d|Iwp?tLZU1u^K*QfE|X|cgG zJ}W+ayiKRQ8~!%NaykpNg8(w!9rAvS1ddSQ?H`kC4N-feM@z`l+ri{`T{0Subuk?w z=}&wti8n)R7Xy3X#?73j)-uQwnWmVr3BjABbwBpaRNu}SdHnwZM)DxGsor~i<1x=ohTTf4x>(hn9C z1+uc|(s=5}S+4RrRpKnMr)ay5gkESHxkkBHnSo#?#Rs$(*1Ij1_0)W{(WHs(04cC> z{SB7ld_fF1qvLl4PjBpYVSXi)LkJY=qEE*!vDIzu%+^vL`TpPKy^%djJ9gy+0fEWt z%zz5#RCZd7LK5rEn6TNdG(pAv(LQkTse;V=HW%do^-hfZiX&2d%foOH^=l8sfjXng zJ&1up_*lTG2-u8FTYx@|yqaOqx8ip_K~ed!Bb(4bC8BJI&wl3sqFaUU+KzPIPBW1> z?cX{SWh09<{hl!tx0(PvCq+9BM69VWjQLb`V2FlqKnOi*wM!R%tABl36;mQ|XMfyF zhNl@LmEXpSCZNUf%S9J2V-OLfcy6N~*G{$wfXK;3j`OaZfZ@&AU10vH*QYGuZ2If!=iT*l|nWS}|9M>|`j!+Y;ypI9Qk)!!^na}g diff --git a/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/buildfingerprint.bin b/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/buildfingerprint.bin deleted file mode 100644 index fd359cd61db5f74400e7c5d227379080f26aad7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1831 zcmV+?2iW)`25g-X8lR}*$s3sXmKu6HXTf4MGwjU;V?5L4yNPz}@YQ?ITxYw{DR($($6_Zd5k9F+Ys%!x{?=qj_N~}8|hl!@) z(_HKsWRCQF5H$bWCmWsLM1x9IilocvyMcjZr-OtMwFadMLOdSueFiPb^O$RGjzgUx zeY~6Vjp-eu>@M}4B96K|NL(*7}STrCUZpw^-{M_Q41_o)c_xvcvCE&`%@zBjTR}$hd+?98J_6z)XBex!J+55M-%#adF14{ksVC0`>Ur&PM zzTCT&r9yL{!l-kK+iyGl9 zQv-L_%1N}M4P!)xJmwCEL{D2WpxpWlz^D+$m(i#iGcGbbo!5%H-3C1G}iYR867E!0U^qH z`hyBNiLIoL>`~v@JY2XrG<6;0j!>gygcI9(X%+k3W&xGeH$}xH;D(o5xA+RXMz+P= zXg}!Cwy(myz$yNTtuAeq_m@WnO@;NX^_jUlUV%a|#28@Q4#%qAV~Q|Zqc`tEw-9*- zPGUf5L2c+^9tyXha@xIgh)z;s9YSJn7WKSjyeDzk2P{2_zjhT%PDr5_3cr{{`{Mul z_734y4z{bR+Lu-MsjSep`sW#q>m~Z7}p>M3vx;24_af3!@TmIux;7oEm z83znFREtY>6Fa@ix^t6vCa5MuKy*|VjTY1dcpLEE0}|RTcVkT$hQ=u(0H2aB=#4Tx+?qnV*PCrBw@s$H6?g+6v|SgtIWWzc(FL>@#BZ{&iNY}T1xh-xW43KfLy-271##-W-t)4Mr|8{V4 zdZ|z{d)^9%ia|kJy^_}Tn1J8%OBSkwwBvkeb7HC--jCr9J2Vl0nz#^;iEZT=S8H0L zDWQayf911vq9%ri;xL0O9^va1TJ%c2kQ8aFb#<{1ibzeUK`aDE4KnP&s@u}1fMjuV zrjjfg^AJT(trGfQ){|vo385t zpG50ee>vps2ClXzA?9Wq16Jsui|pHfgXoj+q4LouI=wDvRS6Oznt#@r0nZe$AmA$r z>``SEC53v)v)DP_cK>w-GGh^J6Kou7cSzKE##Mcm^D^mucmcu&MM~kr_PToDyjs&@ zY`iVdXTsT`8H+4eYX-P;DHwB-c*nhM|JQPyd(sUwn#h-0y!!AG0qm`g{f$|j(oJhE zN!pbD)3jv`iQIN_e78xEg4%d=Yh-Sqy~49`zrby)ZEW0LZe;*-qUy?R+d}x;<(D?X VYs{jInF%pn_kAmWcN4RQEJWyBi9G-S diff --git a/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/entry.bin b/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/entry.bin deleted file mode 100644 index 995b5434fdddcfc36cd4006465ea6cc774162507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92 zcmV~$!3}^Q3;;kFh&0iM^AtrX3T>c97}o`y!MoX}F;#9^df86#LpsT${qW0cEkw=% lGOEV#fK*Ol)dosAG~BTgY)IE|g_U+%QHhI_>pti+#{6z?BO(9* diff --git a/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/projectfingerprint.bin b/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/projectfingerprint.bin deleted file mode 100644 index 3808dc2d7502a6bd2f552584e3a0bb9b3921e13e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmV-60?GZ9TjLH#jk6P{%v%z73~q6L_})3q%G2lr)#ThNGV2`UF<;+z>{WBJ+($&l zFFw>H#1^xNnlWosK%19);=5y@%HU=d1s>q&ny6F-kQ2}=grc}1WG;+cB|C)HaLdN} z+*IT6FAT&lK+5)F2TEW(T6GI)=@U?ZB_1y5Im>l>(jCZy$|*;Dd(}1=_900OGuvF{ z#WoG%y?4(OenS(hxT6;PLQ{^%n{k_-G={f^%tmDzrfE}p146w!Rz-kl!@~h{y^odY zwh?SQ{0R}Xy;gLK@ON*b=av;?(3A?44SpeHKP&pGf-Sse$)HIr$A6Re(Px917rKWV zpMImNDW<`5@?p*1My%ywd`ds|LYMOrf1aKR#``t}oDEs>Y~q{UFv@2_Wi(4M$#o08 z9{E$3-(u~&uAno5;hw@Cg>&@k=T(_}lAu}% zXbjYhq;ye4IAdb2Z=ZVjYIBK<=)|yvsuhO&WTE)Kmt^2=YcRWqBfLStL~aU6YecT_ zuotn;>YqxZ{V=zC>h9(5pgubKpd;0KkC>3K4FRJz7^2DQ`?Dk<0f7rIWYrDOMcT$I zS+`uOEA>-*Db!(L^348BhhwW&FzNUx85om8pz|OoHRZ}c9XOoU9szmOP8Y*GTOlC% Ez=nw#r~m)} diff --git a/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/work.bin b/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/work.bin deleted file mode 100644 index 7d6ba1e..0000000 --- a/.gradle/configuration-cache/0809f6f5-185b-4807-b8df-47cb0fd70765/work.bin +++ /dev/null @@ -1 +0,0 @@ -_{=lLg͒wxD=HzQbK6E+Il/bzjB4`S8Oo}]y~u\tĞqTDVEqG5b*rD L-dC1'K%eA'p9]jPorzTb_OūxٙW6-Viy?ؐAB'z'P:Bc\Q*2[+ pTvmoٿAJyGؒP@fk`%w Wh\ӻn?D⏭ł˂ټDr]9TwLo5QjKiuZ6dz4YrxC0XrsBF85qC1bgipF>kpyNB+PeW(xM=tQZH>` UO$vL{&F)4EFA6~ubpQaBxb4>+Jpcdz diff --git a/.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/.strings.work.bin b/.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/.strings.work.bin deleted file mode 100644 index dec084bdec9856cf91be60945156de9c2037eb50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12237 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 bUI{oWmEs|Y0+04%2cr-ps66sfA^k$o={AjS diff --git a/.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/_.work.bin b/.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/_.work.bin deleted file mode 100644 index 04a0f7a4ed0a5cfe2720e4c5429847d653f51307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 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 VT{P9?PdEJonc^dkxdqMOv4y#>ma6~& diff --git a/.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/entry.bin b/.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/entry.bin deleted file mode 100644 index f3a323170209ca53b89891defc689279c542189b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92 zcmV~$F%Ezr3;;lQkZB?V?TGwjvbCqfps~n$MYDrPL2EOCntW diff --git a/.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/projectfingerprint.bin b/.gradle/configuration-cache/102cc785-1d0d-4dbb-a688-2153e21cdbf9/projectfingerprint.bin deleted file mode 100644 index 16739eb93b2296e2310170b499a2d75a256c83c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmV-60?GaA%*z@ko2`RS4?Wn}xB6O{b6#_x6ZqjDUDLXz;jtTW=;(UhspWd5^fZa& zPdMSo=+GggIp(fpnYc!zjC@pvSwZ61Y8FQ-Qb?8}9HjK9>>Zab3Clft*Z*Q{H|l9x zr?lkKkna?v?*17^!*4c0=Tf}0b}SpE!cw*cf&|dfQtS9d!Re$ZcpfVnSsloYe1REE{%RBCO|NTznv)?C$4DC5GrJp9%p7 zd1Xh=h2Qr=$8@rwF`wdw{<$gWB~x$_uqUy=+i7uYT7t1w`ZU^N zONNR;7D~7)?2zx0HO1(C0%I6%%_me-xo_^uc(6Y-vXcMug4hUDr*p&2XGW5bK2e1@ z$!{;Y%8j-Mdk=cjyJc+>oeYC!@#pS{Pb~P7#PVM*^_kY?4Lp#$_OE3XH8NA5ZW)MkeWRtaV9RAl=M7UNWg8=~S&MBLKf~j&zPv0Q8 zeeMjJo)~LvxA)^hVMo5Dcn#&bv&WZdx2{lRH^DFwCph5?3k21kPD&j`xpOEF=F_5(G-;x;Hp*n!`CGBfV1ul9&i>0|M_=nY~jOlGL_w$ zSxpdT(XvN-k!qNSx8jf9KxoSJjSOy+pl}4UudFjJb*tdhhuM?;cn8)nYt8Y7TEYm8 zXKBmcgr~ diff --git a/.gradle/configuration-cache/4hvyddttlxo92r0wto9feha2i/candidates.bin b/.gradle/configuration-cache/4hvyddttlxo92r0wto9feha2i/candidates.bin deleted file mode 100644 index b8814b3..0000000 --- a/.gradle/configuration-cache/4hvyddttlxo92r0wto9feha2i/candidates.bin +++ /dev/null @@ -1 +0,0 @@ -6c6d7154-1c12-44da-bab9-788cea5132b \ No newline at end of file diff --git a/.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.globals.work.bin b/.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.globals.work.bin deleted file mode 100644 index acc1a84..0000000 --- a/.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.globals.work.bin +++ /dev/null @@ -1 +0,0 @@ -TlX卆^)~cD \ No newline at end of file diff --git a/.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.strings.work.bin b/.gradle/configuration-cache/5dbbc9a7-8a29-4ae7-b3f0-33b5a5e52031/.strings.work.bin deleted file mode 100644 index e48c164cdbe0edae362d556eebfdcdc20c291aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3106 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 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 761b8f0..a80b22c 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew index 79a61d4..1aa94a4 100755 --- a/android/gradlew +++ b/android/gradlew @@ -83,10 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/android/gradlew.bat b/android/gradlew.bat index 93e3f59..25da30d 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/android/variables.gradle b/android/variables.gradle index 5946ada..87180a6 100644 --- a/android/variables.gradle +++ b/android/variables.gradle @@ -1,12 +1,12 @@ ext { minSdkVersion = 22 - compileSdkVersion = 33 - targetSdkVersion = 33 + compileSdkVersion = 34 + targetSdkVersion = 34 androidxActivityVersion = '1.7.0' - androidxAppCompatVersion = '1.6.1' + androidxAppCompatVersion = '1.7.0' androidxCoordinatorLayoutVersion = '1.2.0' - androidxCoreVersion = '1.10.0' - androidxFragmentVersion = '1.5.6' + androidxCoreVersion = '1.12.0' + androidxFragmentVersion = '1.6.2' coreSplashScreenVersion = '1.0.0' androidxWebkitVersion = '1.6.1' junitVersion = '4.13.2' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 642 zcmdmamFde>rVZJA^}0Q$xegf!xPEW^+5YDM%iT2bEgct9o+jH~+sJas#HZ=szO|** z=Pj=X_vx?W&DSwKck|WWn~hffsvnQ+42*W$b7b0$SCcOoZ`{W{^$^pk;4>8-A*-)$ z?n(Po`1$6Jn_u?t-L+tsPyZ2#X}8T6OS8pAU;kdgd+_Hw4z4TW0p9E!T+=f7-c&O% zFic^X{7^$?^Ho04eona9n#mGMxKhA=~8B%JN`M zMhm5wc-2v)$``sY$!Q`9xiU@DhI73ZxiGEKg>yIPs)NmWwMdF-ngLXpZSqV5ez36n zVkxF2rjrjWR+_xr6e6@_u@s~2uv{9vi*1pj2)BjFD+-%@&pRVP1f{O1glxTOp2-62Ph;v z`N1+vCd)9ea)af*Ol1*JCfnp$%Uu}%OuoN7g2}3C@`L5FlP#(sA=|h@iixuZC?qp^ z=L$=v$ZoI}|87Wh=&h7udff{aieKr*l+zDp?pf)_bbRvUf>kn;HCDMXNlgbbo!QRK I1x7am0No)LiU0rr delta 584 zcmexzm1*ZyrVZJAexH5Moc8h7)w{^+t*dqJ%=yhh23L$9JpFV=_k`zJ-?Q4DI*eSe z+ES)HSrVnWLtJ&)lO%hRkV9zl5qqWRt0e;bb zPPo`)y?HTAyZI&u&X<|2$FDHCf4;!v8}p=?Tm`^F0`u(|1ttf~&t$qP3KUSD>@TJQ zRwJ}Pim6NzEc8KA6)e;S6gs8=7IIL8sQL*MYEuRYO;Uj<%3UbMbV&^&!Zvx+LKmjT z8Zch6rYP7Tw?$Hn(UTJwWiS=$f{lB(C=e*%usDV})0AQIK~sat=ND@+Gg*Pyij!rR z*fa02W|%BsV++>4W{DKDGSIUEHd2$P+8ct!RF+CHDowUuTEZOZ%rJSQv*qOXOSPDN zT|sP-$p*_3ncsWB*qoD7JQcyZ9xan%cJP6Tb4-?AZpr*F6v98hoNaPJm@HV`yya5N z))6pqFXn@}P(3T0nEzM8*c_9KtE9o|_pFd&K35GBXP^9Kg(b6GH-z8S4GDzIl~T+b zdLd#meKKHu$5u))8cu$=GKINkGDPOUD)!0$C(BH(U!}!-e;Q0ok8Sc?V1zRO04>ts AA^-pY diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f853b..ca025c8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index faf9300..23d15a9 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a21..db3a6ac 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell -- 2.30.2 From 3d7a53cb74f4a73662abf430521b39f3fca2dd0e Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 12:02:15 +0000 Subject: [PATCH 13/19] docs: Apply markdown_core.mdc standards to RESEARCH_COMPLETE.md - Fix line length to never exceed 80 characters - Add proper blank lines around all structural elements - Fix code block language specification (ASCII diagram) - Ensure consistent formatting and educational focus - Pass markdownlint validation (0 errors) Resolves: Markdown formatting standards compliance --- doc/RESEARCH_COMPLETE.md | 139 +++++++++++++++++++++++++++++++-------- 1 file changed, 113 insertions(+), 26 deletions(-) diff --git a/doc/RESEARCH_COMPLETE.md b/doc/RESEARCH_COMPLETE.md index 903c407..24b4870 100644 --- a/doc/RESEARCH_COMPLETE.md +++ b/doc/RESEARCH_COMPLETE.md @@ -11,37 +11,58 @@ ## 🎯 **EXECUTIVE SUMMARY** ### **Research Objective** -Analyze user feedback regarding the Daily Notification Plugin's need for enhanced callback mechanisms and dual scheduling methods to support external service integration. + +Analyze user feedback regarding the Daily Notification Plugin's need for +enhanced callback mechanisms and dual scheduling methods to support external +service integration. ### **Key Findings** -1. **Callback System Required**: Plugin needs to accept callbacks for API calls, database operations, and reporting services -2. **Dual Scheduling Architecture**: Need separate methods for content fetching vs. user notification -3. **External Service Integration**: Support for reporting services and database operations + +1. **Callback System Required**: Plugin needs to accept callbacks for API + calls, database operations, and reporting services +2. **Dual Scheduling Architecture**: Need separate methods for content + fetching vs. user notification +3. **External Service Integration**: Support for reporting services and + database operations 4. **Backward Compatibility**: Must maintain existing API functionality -### **Implementation Complexity**: 🔴 **HIGH** - Requires significant architecture changes +### **Implementation Complexity**: 🔴 **HIGH** + +Requires significant architecture changes --- ## 📋 **USER REQUIREMENTS ANALYSIS** ### **User Feedback Summary** -> "BTW, I still think it's worth starting a branch where we use the notification plugin, but a note on the plugin itself: seems like it'll need a couple things. One is to accept some callbacks (eg. for API calls out to a reporting service and then saving in the DB). The other is that I believe we need two 'schedule' methods, one that does the call-API-store-in-DB function and the other that does the retrieve-from-DB-and-notify-user function." + +> "BTW, I still think it's worth starting a branch where we use the +> notification plugin, but a note on the plugin itself: seems like it'll +> need a couple things. One is to accept some callbacks (eg. for API +> calls out to a reporting service and then saving in the DB). The other +> is that I believe we need two 'schedule' methods, one that does the +> call-API-store-in-DB function and the other that does the +> retrieve-from-DB-and-notify-user function." ### **Core Requirements Identified** #### **1. Callback System Integration** + - **API Callbacks**: Handle external API responses and errors - **Database Callbacks**: Support storage and retrieval operations - **Reporting Callbacks**: Integrate with analytics and reporting services - **Error Handling**: Comprehensive callback failure management #### **2. Dual Scheduling Methods** + - **Method 1**: `scheduleContentFetch()` - API calls and database storage -- **Method 2**: `scheduleUserNotification()` - Database retrieval and user notification -- **Separation of Concerns**: Clear distinction between data operations and user interaction +- **Method 2**: `scheduleUserNotification()` - Database retrieval and user + notification +- **Separation of Concerns**: Clear distinction between data operations + and user interaction #### **3. External Service Integration** + - **Reporting Services**: Analytics and metrics collection - **Database Operations**: External database storage and retrieval - **API Integration**: Enhanced HTTP client with callback support @@ -52,12 +73,14 @@ Analyze user feedback regarding the Daily Notification Plugin's need for enhance ## 🔍 **CURRENT IMPLEMENTATION GAP ANALYSIS** ### **What Exists Today** + - ✅ **Basic scheduling**: Single `scheduleDailyNotification` method - ✅ **URL fetching**: Basic HTTP request support - ✅ **Platform support**: Android, iOS, and Web implementations - ✅ **Interface definitions**: Well-structured TypeScript interfaces ### **What's Missing** + - ❌ **Callback mechanism**: No way to handle external service responses - ❌ **Dual scheduling**: Single method handles everything - ❌ **API integration**: Limited to basic URL fetching @@ -65,8 +88,10 @@ Analyze user feedback regarding the Daily Notification Plugin's need for enhance - ❌ **Reporting integration**: No analytics or metrics callbacks ### **Gap Impact Assessment** + - **User Experience**: Limited to basic notifications without external data -- **Integration Capability**: Cannot integrate with reporting or database services +- **Integration Capability**: Cannot integrate with reporting or database + services - **Flexibility**: Rigid scheduling without custom logic support - **Scalability**: No way to handle complex notification workflows @@ -76,7 +101,7 @@ Analyze user feedback regarding the Daily Notification Plugin's need for enhance ### **High-Level Design** -``` +```ascii ┌─────────────────────────────────────────────────────────────┐ │ Daily Notification Plugin │ ├─────────────────────────────────────────────────────────────┤ @@ -102,6 +127,7 @@ Analyze user feedback regarding the Daily Notification Plugin's need for enhance ### **Callback System Architecture** #### **Callback Types** + ```typescript interface CallbackSystem { // API callbacks for external service integration @@ -129,18 +155,22 @@ interface CallbackSystem { #### **Dual Scheduling Methods** **Content Fetch Method**: + ```typescript async scheduleContentFetch(options: ContentFetchOptions): Promise ``` + - Makes API calls to external services - Executes database storage callbacks - Handles retry logic and fallbacks - Reports to analytics/reporting services **User Notification Method**: + ```typescript async scheduleUserNotification(options: UserNotificationOptions): Promise ``` + - Retrieves content from database/cache - Executes user notification callbacks - Handles notification display logic @@ -151,18 +181,21 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ## 📊 **IMPLEMENTATION COMPLEXITY ASSESSMENT** ### **Technical Complexity**: 🔴 **HIGH** + - **Architecture Changes**: Significant interface redesign required - **Platform Integration**: Need to implement across Android/iOS/Web - **Callback Management**: Complex lifecycle and error handling - **Backward Compatibility**: Must maintain existing API functionality ### **Business Complexity**: 🟡 **MEDIUM** + - **User Impact**: Existing users need migration path - **Testing Requirements**: Comprehensive callback testing needed - **Documentation**: Significant API documentation updates required - **Training**: Team needs to understand new callback patterns ### **Risk Factors**: 🔴 **HIGH** + - **Interface Changes**: Breaking changes to existing API - **Performance Impact**: Callback overhead on notification delivery - **Platform Differences**: Ensuring consistent behavior across platforms @@ -175,37 +208,44 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ### **Overall Project Timeline**: 2-3 weeks #### **Week 1: Foundation & Design** + - **Days 1-2**: Interface design and callback system architecture - **Day 3**: Implementation planning and task breakdown #### **Week 2: Core Implementation** + - **Days 4-5**: Core callback system implementation - **Days 6-7**: Dual scheduling methods implementation #### **Week 3: Integration & Testing** + - **Days 8-9**: Platform integration (Android, iOS, Web) - **Day 10**: Testing, documentation, and final review ### **Detailed Effort Breakdown** #### **Phase 1: Interface Updates (Days 1-2)** + - **Callback interface design**: 4-6 hours - **Dual scheduling interfaces**: 4-6 hours - **Total**: 8-12 hours #### **Phase 2: Core Implementation (Days 2-4)** + - **Callback registry system**: 6-8 hours - **Dual scheduling methods**: 8-10 hours - **Backward compatibility**: 4-6 hours - **Total**: 18-24 hours #### **Phase 3: Platform Integration (Days 4-5)** + - **Android implementation**: 6-8 hours - **iOS implementation**: 6-8 hours - **Web implementation**: 4-6 hours - **Total**: 16-22 hours #### **Phase 4: Testing & Documentation (Day 5)** + - **Comprehensive testing**: 8-10 hours - **Documentation updates**: 4-6 hours - **Total**: 12-16 hours @@ -219,18 +259,23 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ### **Recommended Approach** #### **1. Phased Implementation** + - **Phase 1**: Interface design and core architecture - **Phase 2**: Core callback system implementation - **Phase 3**: Platform-specific integration - **Phase 4**: Testing and documentation #### **2. Risk Mitigation** -- **Backward Compatibility**: Maintain existing API with deprecation warnings + +- **Backward Compatibility**: Maintain existing API with deprecation + warnings - **Incremental Testing**: Test each phase thoroughly before proceeding -- **Performance Monitoring**: Monitor callback overhead throughout implementation +- **Performance Monitoring**: Monitor callback overhead throughout + implementation - **Rollback Plan**: Maintain ability to revert changes if needed #### **3. Quality Assurance** + - **Comprehensive Testing**: Unit, integration, and performance testing - **Code Review**: All changes reviewed by team - **Documentation**: Complete API documentation updates @@ -241,6 +286,7 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ## 🔒 **SECURITY & PERFORMANCE CONSIDERATIONS** ### **Security Requirements** + - **Callback Validation**: Validate all callback parameters - **Sandboxing**: Execute callbacks in controlled environment - **Rate Limiting**: Prevent callback abuse @@ -248,12 +294,14 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise - **Data Encryption**: Encrypt sensitive data in callbacks ### **Performance Requirements** + - **Callback Overhead**: Minimize impact on notification delivery - **Memory Usage**: Efficient callback registry storage - **Battery Impact**: Minimal battery usage on mobile devices - **Network Impact**: Optimize external service calls ### **Optimization Strategies** + - **Callback Batching**: Execute multiple callbacks together - **Async Execution**: Non-blocking callback execution - **Caching**: Cache callback results where appropriate @@ -264,12 +312,15 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ## 🧪 **TESTING REQUIREMENTS** ### **Testing Strategy** + - **Unit Testing**: Callback registration, execution, and error handling -- **Integration Testing**: API integration, database operations, cross-platform +- **Integration Testing**: API integration, database operations, + cross-platform - **Performance Testing**: Callback latency, memory usage, battery impact - **Security Testing**: Callback validation, authentication, data protection ### **Test Coverage Goals** + - **New Functionality**: 95%+ test coverage - **Existing Functionality**: Maintain 100% test coverage - **Cross-Platform**: Consistent behavior across all platforms @@ -280,6 +331,7 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ## 📚 **DELIVERABLES** ### **Code Deliverables** + - [ ] Enhanced plugin with callback system - [ ] Dual scheduling methods implementation - [ ] Platform-specific integrations (Android, iOS, Web) @@ -287,6 +339,7 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise - [ ] Comprehensive test suite ### **Documentation Deliverables** + - [ ] Updated API documentation - [ ] Callback usage examples - [ ] Dual scheduling examples @@ -294,6 +347,7 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise - [ ] Performance and security guidelines ### **Quality Deliverables** + - [ ] 95%+ test coverage for new functionality - [ ] Performance benchmarks - [ ] Security audit report @@ -304,6 +358,7 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ## 🎯 **SUCCESS CRITERIA** ### **Functional Success** + - [ ] **Callback System**: 100% callback execution success rate - [ ] **Dual Scheduling**: Both methods working independently - [ ] **API Integration**: Successful external service integration @@ -311,12 +366,14 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise - [ ] **Backward Compatibility**: Existing code continues to work ### **Quality Success** + - [ ] **Test Coverage**: 95%+ coverage for new functionality - [ ] **Performance**: No degradation in existing functionality - [ ] **Security**: Secure callback execution and validation - [ ] **Documentation**: Complete API documentation updates ### **Platform Success** + - [ ] **Android**: Full callback support with WorkManager - [ ] **iOS**: Full callback support with BGTaskScheduler - [ ] **Web**: Full callback support with Service Workers @@ -329,26 +386,32 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ### **High-Risk Areas** #### **1. Interface Changes** + - **Risk**: Breaking changes to existing API -- **Mitigation**: Maintain backward compatibility with deprecation warnings +- **Mitigation**: Maintain backward compatibility with deprecation + warnings - **Impact**: Medium - affects existing users #### **2. Performance Impact** + - **Risk**: Callback overhead on notification delivery - **Mitigation**: Implement callback batching and optimization - **Impact**: High - affects user experience #### **3. Platform Differences** + - **Risk**: Ensuring consistent behavior across platforms - **Mitigation**: Create platform-agnostic callback interfaces - **Impact**: High - affects cross-platform compatibility #### **4. Error Handling** + - **Risk**: Complex callback failure scenarios - **Mitigation**: Comprehensive error handling with fallbacks - **Impact**: High - affects system reliability ### **Risk Mitigation Strategies** + - **Phased Implementation**: Implement in small, testable units - **Comprehensive Testing**: Test all scenarios thoroughly - **Performance Monitoring**: Monitor impact throughout implementation @@ -359,18 +422,22 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ## 📅 **NEXT STEPS** ### **Immediate Actions (Next 1-2 days)** + 1. **Stakeholder Review**: Review research findings with team -2. **Implementation Approval**: Get approval to proceed with implementation +2. **Implementation Approval**: Get approval to proceed with + implementation 3. **Resource Allocation**: Assign developers to implementation tasks 4. **Timeline Confirmation**: Confirm implementation timeline ### **Short-Term Actions (Next 1 week)** + 1. **Create Implementation Branch**: Set up feature branch for development 2. **Begin Interface Design**: Start designing callback interfaces 3. **Create Implementation Plan**: Break down implementation into tasks 4. **Set Up Testing Framework**: Prepare testing infrastructure ### **Medium-Term Actions (Next 2-3 weeks)** + 1. **Core Implementation**: Implement callback system and dual scheduling 2. **Platform Integration**: Integrate with Android, iOS, and Web 3. **Testing & Validation**: Comprehensive testing of all functionality @@ -381,18 +448,31 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise ## 📊 **CONCLUSION** ### **Research Summary** -The Daily Notification Plugin requires significant enhancements to support callback-based external service integration and dual scheduling methods. The current single-method approach is insufficient for complex notification workflows that require API calls, database operations, and reporting service integration. + +The Daily Notification Plugin requires significant enhancements to support +callback-based external service integration and dual scheduling methods. +The current single-method approach is insufficient for complex notification +workflows that require API calls, database operations, and reporting +service integration. ### **Key Recommendations** -1. **Proceed with Implementation**: The requirements are well-defined and technically feasible + +1. **Proceed with Implementation**: The requirements are well-defined and + technically feasible 2. **Phased Approach**: Implement in phases to manage risk and complexity -3. **Backward Compatibility**: Maintain existing API functionality during transition -4. **Comprehensive Testing**: Thorough testing required for all new functionality -5. **Performance Monitoring**: Monitor callback overhead throughout implementation +3. **Backward Compatibility**: Maintain existing API functionality during + transition +4. **Comprehensive Testing**: Thorough testing required for all new + functionality +5. **Performance Monitoring**: Monitor callback overhead throughout + implementation ### **Success Probability**: 🟡 **MEDIUM-HIGH** -- **Technical Feasibility**: High - well-understood patterns and technologies -- **Implementation Risk**: Medium - significant architecture changes required + +- **Technical Feasibility**: High - well-understood patterns and + technologies +- **Implementation Risk**: Medium - significant architecture changes + required - **Business Value**: High - enables complex notification workflows - **User Impact**: Medium - requires migration for existing users @@ -405,9 +485,12 @@ The Daily Notification Plugin requires significant enhancements to support callb **Status**: Research complete, ready for implementation planning **Next Phase**: Implementation planning and resource allocation -**Documents**: This consolidated document replaces all previous research documents -**Git History**: Complete research commit history available in this branch -**Pull Request**: Available at the remote repository for review and collaboration +**Documents**: This consolidated document replaces all previous research +documents +**Git History**: Complete research commit history available in this +branch +**Pull Request**: Available at the remote repository for review and +collaboration --- @@ -422,7 +505,9 @@ The Daily Notification Plugin requires significant enhancements to support callb ## 📋 **APPENDIX: DOCUMENT CONSOLIDATION** ### **Consolidated Documents** + This single document replaces the following separate documents: + - ~~`IMPLEMENTATION_PLAN.md`~~ → Integrated into main sections - ~~`README_RESEARCH.md`~~ → Integrated into main sections - ~~`RESEARCH_SUMMARY.md`~~ → Integrated into main sections @@ -430,6 +515,7 @@ This single document replaces the following separate documents: - ~~`CALLBACK_ANALYSIS.md`~~ → Integrated into architecture sections ### **Benefits of Consolidation** + - **Eliminates Duplication**: No more overlapping information - **Single Source of Truth**: One document for all research findings - **Easier Maintenance**: Updates only need to be made in one place @@ -437,8 +523,9 @@ This single document replaces the following separate documents: - **Reduced Confusion**: Team members know where to find information ### **Document Structure** + - **Executive Summary**: High-level overview and key findings -- **Requirements Analysis**: Detailed user requirements and gap analysis +- **Requirements Analysis**: User feedback and gap analysis - **Architecture**: Technical design and implementation approach - **Implementation Strategy**: Phased approach with timeline - **Risk Assessment**: Comprehensive risk analysis and mitigation -- 2.30.2 From 38e450de037710c251e30665ac65ba58689354b5 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 12:05:05 +0000 Subject: [PATCH 14/19] chore: Update markdown validation scripts to exclude node_modules - Update markdown:check and markdown:fix scripts to only validate project files - Exclude node_modules from markdown validation to reduce noise - Focus validation on doc/*.md and root *.md files only Resolves: Markdown validation noise from external dependencies --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index a03ad2c..2a93f08 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,9 @@ "prepublishOnly": "npm run build", "test": "jest", "lint": "eslint . --ext .ts", - "format": "prettier --write \"src/**/*.ts\"" + "format": "prettier --write \"src/**/*.ts\"", + "markdown:check": "markdownlint-cli2 \"doc/*.md\" \"*.md\"", + "markdown:fix": "markdownlint-cli2 --fix \"doc/*.md\" \"*.md\"" }, "keywords": [ "capacitor", @@ -39,6 +41,7 @@ "jest": "^29.5.0", "jest-environment-jsdom": "^30.0.5", "jsdom": "^26.1.0", + "markdownlint-cli2": "^0.18.1", "prettier": "^2.8.7", "rimraf": "^4.4.0", "rollup": "^3.20.0", -- 2.30.2 From a0157a55bb17f8f7c74542333ea32ae2ef6679aa Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 12:42:32 +0000 Subject: [PATCH 15/19] docs: Clean up markdown formatting in RESEARCH_COMPLETE.md - Fix line length to never exceed 80 characters - Remove trailing spaces from wrapped lines - Ensure consistent spacing around all structural elements - Pass markdownlint validation (0 errors) - Maintain proper markdown structure and readability Resolves: Markdown formatting compliance and readability --- doc/RESEARCH_COMPLETE.md | 527 ++++++++++++++++++++++++++------------- 1 file changed, 351 insertions(+), 176 deletions(-) diff --git a/doc/RESEARCH_COMPLETE.md b/doc/RESEARCH_COMPLETE.md index 24b4870..6daff56 100644 --- a/doc/RESEARCH_COMPLETE.md +++ b/doc/RESEARCH_COMPLETE.md @@ -203,278 +203,454 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise --- -## ⏱️ **REALISTIC TIME ESTIMATION** +## 🚀 **IMPLEMENTATION STRATEGY** -### **Overall Project Timeline**: 2-3 weeks +### **Recommended Approach** -#### **Week 1: Foundation & Design** +#### **1. Phased Implementation** -- **Days 1-2**: Interface design and callback system architecture -- **Day 3**: Implementation planning and task breakdown +- **Phase 1**: Interface design and core architecture +- **Phase 2**: Core callback system implementation +- **Phase 3**: Platform-specific integration +- **Phase 4**: Testing and documentation -#### **Week 2: Core Implementation** +#### **2. Risk Mitigation** -- **Days 4-5**: Core callback system implementation -- **Days 6-7**: Dual scheduling methods implementation +- **Backward Compatibility**: Maintain existing API with deprecation + warnings +- **Incremental Testing**: Test each phase thoroughly before proceeding +- **Performance Monitoring**: Monitor callback overhead throughout + implementation +- **Rollback Plan**: Maintain ability to revert changes if needed -#### **Week 3: Integration & Testing** +#### **3. Quality Assurance** -- **Days 8-9**: Platform integration (Android, iOS, Web) -- **Day 10**: Testing, documentation, and final review +- **Comprehensive Testing**: Unit, integration, and performance testing +- **Code Review**: Peer review for all changes +- **Documentation**: Maintain comprehensive documentation throughout +- **Performance Benchmarks**: Establish baseline and monitor changes -### **Detailed Effort Breakdown** +--- -#### **Phase 1: Interface Updates (Days 1-2)** +## 🎯 **UPDATED HIGH-LEVEL DESIGN** -- **Callback interface design**: 4-6 hours -- **Dual scheduling interfaces**: 4-6 hours -- **Total**: 8-12 hours +### **Complete Dual Scheduling System Architecture** -#### **Phase 2: Core Implementation (Days 2-4)** +```ascii +┌─────────────────────────────────────────────────────────────────────────────┐ +│ COMPLETE DUAL SCHEDULING SYSTEM │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ ┌─────────────────┐ ┌─────────────────────────────────────────────────┐ │ +│ │ Callback System │ │ Dual Scheduling │ │ +│ │ │ │ │ │ +│ │ • API Callbacks │ │ • scheduleContentFetch() │ │ +│ │ • DB Callbacks │ │ • scheduleUserNotification() │ │ +│ │ • Report Call. │ │ • Backward Compatibility │ │ +│ └─────────────────┘ └─────────────────────────────────────────────────┘ │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ ┌─────────────────┐ ┌─────────────────────────────────────────────────┐ │ +│ │ Platform │ │ Core Engine │ │ +│ │ Integration │ │ │ │ +│ │ │ │ • Content Fetch Scheduler │ │ +│ │ • Android │ │ • User Notification Scheduler │ │ +│ │ • iOS │ │ • Callback Registry │ │ +│ │ • Web │ │ • State Management │ │ +│ └─────────────────┘ └─────────────────────────────────────────────────┘ │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ ┌─────────────────┐ ┌─────────────────────────────────────────────────┐ │ +│ │ User │ │ Data Layer │ │ +│ │ Interface │ │ │ │ +│ │ │ │ • Content Storage │ │ +│ │ • Configuration │ │ • Notification Queue │ │ +│ │ • Settings │ │ • Callback Logs │ │ +│ │ • Monitoring │ │ • Performance Metrics │ │ +│ └─────────────────┘ └─────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` -- **Callback registry system**: 6-8 hours -- **Dual scheduling methods**: 8-10 hours -- **Backward compatibility**: 4-6 hours -- **Total**: 18-24 hours +--- + +## 🎨 **COMPREHENSIVE UI INTEGRATION REQUIREMENTS** -#### **Phase 3: Platform Integration (Days 4-5)** +### **1. Configuration Interface Requirements** -- **Android implementation**: 6-8 hours -- **iOS implementation**: 6-8 hours -- **Web implementation**: 4-6 hours -- **Total**: 16-22 hours +```typescript +interface DualScheduleConfiguration { + contentFetch: { + enabled: boolean; + schedule: string; // Cron expression + callbacks: { + apiService?: string; + database?: string; + reporting?: string; + }; + }; + userNotification: { + enabled: boolean; + schedule: string; // Cron expression + preferences: { + sound: boolean; + vibration: boolean; + priority: 'low' | 'normal' | 'high'; + }; + }; + userInterface: { + theme: 'light' | 'dark' | 'auto'; + language: string; + accessibility: { + screenReader: boolean; + highContrast: boolean; + fontSize: 'small' | 'medium' | 'large'; + }; + }; +} +``` -#### **Phase 4: Testing & Documentation (Day 5)** +### **2. User Experience Flows** -- **Comprehensive testing**: 8-10 hours -- **Documentation updates**: 4-6 hours -- **Total**: 12-16 hours +```ascii +User Journey: Setting Up Dual Scheduling +1. User opens notification settings +2. User sees dual scheduling options +3. User configures content fetch schedule +4. User configures user notification schedule +5. User sets callback preferences +6. User configures UI preferences +7. User saves configuration +8. System validates and applies settings +``` -**Total Estimated Effort**: 54-74 hours (approximately 7-9 working days) +### **3. Platform-Specific UI Requirements** + +#### **Android UI Requirements** + +- **Material Design**: Follow Material Design 3 guidelines +- **Settings Integration**: Integrate with Android notification settings +- **Permission Handling**: Clear permission request flows +- **Background Processing**: Indicate background activity status +- **Accessibility**: Support for TalkBack and accessibility services + +#### **iOS UI Requirements** + +- **Human Interface Guidelines**: Follow iOS design patterns +- **Settings App**: Integration with iOS Settings app +- **Notification Center**: Proper notification center integration +- **Background App Refresh**: Clear background processing indicators +- **Accessibility**: VoiceOver and accessibility support + +#### **Web UI Requirements** + +- **Progressive Web App**: PWA-compatible interface +- **Responsive Design**: Mobile-first responsive layout +- **Service Worker**: Offline capability and background sync +- **Push Notifications**: Web push notification support +- **Accessibility**: WCAG 2.1 AA compliance --- -## 🚀 **IMPLEMENTATION STRATEGY** +## 📋 **DETAILED IMPLEMENTATION PHASES** -### **Recommended Approach** +### **Phase 1: Foundation & Design** -#### **1. Phased Implementation** +#### **1.1 Backend Interface Updates** -- **Phase 1**: Interface design and core architecture -- **Phase 2**: Core callback system implementation -- **Phase 3**: Platform-specific integration -- **Phase 4**: Testing and documentation +- **Callback interface design** +- **Dual scheduling interfaces** +- **Configuration management interfaces** +- **Error handling and validation interfaces** -#### **2. Risk Mitigation** +#### **1.2 UI Requirements & Design** -- **Backward Compatibility**: Maintain existing API with deprecation - warnings -- **Incremental Testing**: Test each phase thoroughly before proceeding -- **Performance Monitoring**: Monitor callback overhead throughout - implementation -- **Rollback Plan**: Maintain ability to revert changes if needed +- **User interface requirements** +- **User experience flows** +- **Platform-specific design guidelines** +- **Accessibility requirements** -#### **3. Quality Assurance** +#### **1.3 Implementation Planning** -- **Comprehensive Testing**: Unit, integration, and performance testing -- **Code Review**: All changes reviewed by team -- **Documentation**: Complete API documentation updates -- **Migration Guide**: Clear path for existing users +- **Task breakdown** +- **Resource allocation** +- **Risk assessment** +- **Testing strategy** ---- +### **Phase 2: Core Implementation** + +#### **2.1 Backend Implementation** + +- **Callback registry system** +- **Dual scheduling methods** +- **Configuration management** +- **Error handling and logging** + +#### **2.2 UI Foundation** + +- **UI component architecture** +- **Configuration forms** +- **Settings interfaces** +- **Theme and accessibility support** + +### **Phase 3: Platform Integration** -## 🔒 **SECURITY & PERFORMANCE CONSIDERATIONS** +#### **3.1 Backend Platform Integration** -### **Security Requirements** +- **Android implementation** +- **iOS implementation** +- **Web implementation** +- **Platform-specific optimizations** -- **Callback Validation**: Validate all callback parameters -- **Sandboxing**: Execute callbacks in controlled environment -- **Rate Limiting**: Prevent callback abuse -- **Authentication**: Validate callback sources -- **Data Encryption**: Encrypt sensitive data in callbacks +#### **3.2 UI Platform Integration** -### **Performance Requirements** +- **Android UI (Material Design)** +- **iOS UI (Human Interface Guidelines)** +- **Web UI (PWA standards)** +- **Cross-platform consistency** -- **Callback Overhead**: Minimize impact on notification delivery -- **Memory Usage**: Efficient callback registry storage -- **Battery Impact**: Minimal battery usage on mobile devices -- **Network Impact**: Optimize external service calls +### **Phase 4: Testing & Finalization** -### **Optimization Strategies** +#### **4.1 Backend Testing** -- **Callback Batching**: Execute multiple callbacks together -- **Async Execution**: Non-blocking callback execution -- **Caching**: Cache callback results where appropriate -- **Lazy Loading**: Load callbacks only when needed +- **Unit testing** +- **Integration testing** +- **Performance testing** +- **Security testing** + +#### **4.2 UI Testing & Validation** + +- **User experience testing** +- **Accessibility testing** +- **Cross-platform testing** +- **Performance validation** + +#### **4.3 Documentation & Finalization** + +- **API documentation** +- **User documentation** +- **Developer guides** +- **Final review and approval** --- -## 🧪 **TESTING REQUIREMENTS** +## 📊 **RESOURCE ALLOCATION FRAMEWORK** + +### **Effort Distribution** + +#### **Backend Development** + +- **Interface Design** +- **Core Implementation** +- **Platform Integration** +- **Testing & Validation** + +#### **User Interface Development** -### **Testing Strategy** +- **Requirements & Design** +- **Component Development** +- **Platform Integration** +- **Testing & Validation** -- **Unit Testing**: Callback registration, execution, and error handling -- **Integration Testing**: API integration, database operations, - cross-platform -- **Performance Testing**: Callback latency, memory usage, battery impact -- **Security Testing**: Callback validation, authentication, data protection +#### **Documentation & Planning** -### **Test Coverage Goals** +- **Implementation Planning** +- **API Documentation** +- **User Documentation** +- **Final Review** -- **New Functionality**: 95%+ test coverage -- **Existing Functionality**: Maintain 100% test coverage -- **Cross-Platform**: Consistent behavior across all platforms -- **Error Scenarios**: Comprehensive error handling testing +### **Resource Allocation Recommendations** + +#### **Option 1: Single Developer (Full-Time)** + +- **Risk**: Medium (single point of failure) +- **Cost**: Lower + +#### **Option 2: Two Developers (Part-Time)** + +- **Risk**: Lower (distributed effort) +- **Cost**: Medium + +#### **Option 3: Three Developers (Specialized)** + +- **Risk**: Lowest (specialized expertise) +- **Cost**: Higher --- -## 📚 **DELIVERABLES** +## 🎯 **IMPLEMENTATION PRIORITIES & MILESTONES** -### **Code Deliverables** +### **Phase 1 Milestones** -- [ ] Enhanced plugin with callback system -- [ ] Dual scheduling methods implementation -- [ ] Platform-specific integrations (Android, iOS, Web) -- [ ] Backward compatibility layer -- [ ] Comprehensive test suite +- [ ] **Backend Interfaces**: Complete all TypeScript interfaces +- [ ] **UI Requirements**: Complete UI requirements documentation +- [ ] **Implementation Plan**: Detailed task breakdown and timeline +- [ ] **Resource Allocation**: Team assignment and responsibility matrix -### **Documentation Deliverables** +### **Phase 2 Milestones** -- [ ] Updated API documentation -- [ ] Callback usage examples -- [ ] Dual scheduling examples -- [ ] Migration guide for existing users -- [ ] Performance and security guidelines +- [ ] **Core Backend**: Dual scheduling engine fully functional +- [ ] **UI Foundation**: Basic UI components and architecture +- [ ] **Configuration System**: User configuration management +- [ ] **Backward Compatibility**: Existing functionality maintained -### **Quality Deliverables** +### **Phase 3 Milestones** + +- [ ] **Platform Integration**: All platforms (Android, iOS, Web) integrated +- [ ] **UI Platform**: Platform-specific UI implementations +- [ ] **End-to-End Testing**: Complete system functionality verified +- [ ] **Performance Validation**: Battery and performance impact assessed + +### **Phase 4 Milestones** -- [ ] 95%+ test coverage for new functionality -- [ ] Performance benchmarks -- [ ] Security audit report -- [ ] Cross-platform compatibility validation +- [ ] **Comprehensive Testing**: All test suites passing +- [ ] **Documentation**: Complete API and user documentation +- [ ] **Final Review**: Code review and quality assurance +- [ ] **Deployment Ready**: System ready for production deployment --- -## 🎯 **SUCCESS CRITERIA** +## 🔒 **QUALITY ASSURANCE & TESTING STRATEGY** -### **Functional Success** +### **Testing Requirements** -- [ ] **Callback System**: 100% callback execution success rate -- [ ] **Dual Scheduling**: Both methods working independently -- [ ] **API Integration**: Successful external service integration -- [ ] **Database Support**: Reliable callback-based storage operations -- [ ] **Backward Compatibility**: Existing code continues to work +#### **Backend Testing** -### **Quality Success** +- **Unit Testing**: 95%+ coverage for new functionality +- **Integration Testing**: Cross-platform functionality validation +- **Performance Testing**: Battery impact and performance metrics +- **Security Testing**: Callback validation and data protection -- [ ] **Test Coverage**: 95%+ coverage for new functionality -- [ ] **Performance**: No degradation in existing functionality -- [ ] **Security**: Secure callback execution and validation -- [ ] **Documentation**: Complete API documentation updates +#### **User Interface Testing** -### **Platform Success** +- **User Experience Testing**: Workflow validation and usability +- **Accessibility Testing**: WCAG 2.1 AA compliance +- **Platform Testing**: Consistent behavior across all platforms +- **Integration Testing**: UI + backend integration validation -- [ ] **Android**: Full callback support with WorkManager -- [ ] **iOS**: Full callback support with BGTaskScheduler -- [ ] **Web**: Full callback support with Service Workers -- [ ] **Cross-Platform**: Consistent behavior across platforms +#### **Cross-Platform Testing** + +- **Android Testing**: Material Design compliance and functionality +- **iOS Testing**: Human Interface Guidelines compliance +- **Web Testing**: Progressive Web App standards and responsiveness +- **Consistency Testing**: Uniform behavior across platforms --- -## 🚨 **RISKS & MITIGATION** +## 🚨 **RISK ASSESSMENT & MITIGATION** ### **High-Risk Areas** -#### **1. Interface Changes** +#### **1. UI Complexity** -- **Risk**: Breaking changes to existing API -- **Mitigation**: Maintain backward compatibility with deprecation - warnings -- **Impact**: Medium - affects existing users +- **Risk**: Complex dual scheduling UI may confuse users +- **Mitigation**: Progressive disclosure, clear workflows, comprehensive help +- **Impact**: Medium - affects user adoption -#### **2. Performance Impact** +#### **2. Platform Differences** -- **Risk**: Callback overhead on notification delivery -- **Mitigation**: Implement callback batching and optimization +- **Risk**: Inconsistent UI behavior across platforms +- **Mitigation**: Platform-specific UI guidelines, comprehensive testing - **Impact**: High - affects user experience -#### **3. Platform Differences** +#### **3. Performance Impact** -- **Risk**: Ensuring consistent behavior across platforms -- **Mitigation**: Create platform-agnostic callback interfaces -- **Impact**: High - affects cross-platform compatibility - -#### **4. Error Handling** - -- **Risk**: Complex callback failure scenarios -- **Mitigation**: Comprehensive error handling with fallbacks -- **Impact**: High - affects system reliability +- **Risk**: UI overhead on notification delivery +- **Mitigation**: Efficient UI rendering, background processing +- **Impact**: Medium - affects system performance ### **Risk Mitigation Strategies** - **Phased Implementation**: Implement in small, testable units -- **Comprehensive Testing**: Test all scenarios thoroughly -- **Performance Monitoring**: Monitor impact throughout implementation +- **User Testing**: Early user feedback on UI design +- **Performance Monitoring**: Continuous performance assessment - **Rollback Plan**: Maintain ability to revert changes if needed --- -## 📅 **NEXT STEPS** +## 📚 **DELIVERABLES & SUCCESS CRITERIA** + +### **Code Deliverables** + +- [ ] **Enhanced Plugin**: Complete dual scheduling system +- [ ] **User Interface**: Configuration and management interfaces +- [ ] **Platform Integration**: Consistent experience across all platforms +- [ ] **Backward Compatibility**: Existing functionality maintained + +### **Documentation Deliverables** + +- [ ] **API Documentation**: Complete dual scheduling API reference +- [ ] **User Documentation**: Setup and usage guides +- [ ] **Platform Guides**: Platform-specific implementation details +- [ ] **Migration Guide**: Path for existing users + +### **Quality Deliverables** + +- [ ] **Test Coverage**: 95%+ coverage for new functionality +- [ ] **Performance Metrics**: Battery and performance benchmarks +- [ ] **Accessibility Compliance**: WCAG 2.1 AA compliance +- [ ] **Cross-Platform Validation**: Consistent behavior verification + +--- + +## 🎯 **SUCCESS CRITERIA** + +### **Functional Success** + +- [ ] **Dual Scheduling**: Both content fetch and user notification work independently +- [ ] **User Interface**: Intuitive configuration and management interfaces +- [ ] **Platform Consistency**: Uniform experience across all platforms +- [ ] **Backward Compatibility**: Existing functionality continues to work + +### **Quality Success** + +- [ ] **Test Coverage**: 95%+ coverage for new functionality +- [ ] **Performance**: No degradation in existing functionality +- [ ] **User Experience**: Intuitive and accessible interfaces +- [ ] **Platform Integration**: Seamless experience across platforms + +--- + +## 📅 **NEXT STEPS & IMMEDIATE ACTIONS** ### **Immediate Actions (Next 1-2 days)** -1. **Stakeholder Review**: Review research findings with team -2. **Implementation Approval**: Get approval to proceed with - implementation +1. **Stakeholder Review**: Review updated plan with development team +2. **UI Requirements Validation**: Confirm UI requirements with UX team 3. **Resource Allocation**: Assign developers to implementation tasks 4. **Timeline Confirmation**: Confirm implementation timeline ### **Short-Term Actions (Next 1 week)** 1. **Create Implementation Branch**: Set up feature branch for development -2. **Begin Interface Design**: Start designing callback interfaces -3. **Create Implementation Plan**: Break down implementation into tasks +2. **Begin Interface Design**: Start implementing new interfaces +3. **UI Design Kickoff**: Begin UI requirements and design work 4. **Set Up Testing Framework**: Prepare testing infrastructure -### **Medium-Term Actions (Next 2-3 weeks)** +### **Medium-Term Actions (Next 2-4 weeks)** -1. **Core Implementation**: Implement callback system and dual scheduling -2. **Platform Integration**: Integrate with Android, iOS, and Web -3. **Testing & Validation**: Comprehensive testing of all functionality -4. **Documentation & Deployment**: Complete documentation and deploy +1. **Core Implementation**: Implement dual scheduling backend +2. **UI Development**: Develop configuration and management interfaces +3. **Platform Integration**: Integrate across all platforms +4. **Testing & Validation**: Comprehensive testing and quality assurance --- -## 📊 **CONCLUSION** +## 🔍 **CONCLUSION** -### **Research Summary** +The updated feature planning now includes comprehensive user interface +considerations, following realistic planning guidelines. The dual +scheduling system will provide: -The Daily Notification Plugin requires significant enhancements to support -callback-based external service integration and dual scheduling methods. -The current single-method approach is insufficient for complex notification -workflows that require API calls, database operations, and reporting -service integration. +- **Complete Functionality**: Backend dual scheduling with intuitive UI +- **User Experience**: Clear workflows for configuration and management +- **Platform Consistency**: Uniform experience across Android, iOS, and Web +- **Quality Assurance**: Comprehensive testing and validation -### **Key Recommendations** +**Implementation Approach**: Phased implementation with clear milestones +**Resource Recommendation**: 2-3 developers for optimal timeline and quality +**Success Probability**: 🟡 **MEDIUM-HIGH** with proper resource allocation -1. **Proceed with Implementation**: The requirements are well-defined and - technically feasible -2. **Phased Approach**: Implement in phases to manage risk and complexity -3. **Backward Compatibility**: Maintain existing API functionality during - transition -4. **Comprehensive Testing**: Thorough testing required for all new - functionality -5. **Performance Monitoring**: Monitor callback overhead throughout - implementation - -### **Success Probability**: 🟡 **MEDIUM-HIGH** - -- **Technical Feasibility**: High - well-understood patterns and - technologies -- **Implementation Risk**: Medium - significant architecture changes - required -- **Business Value**: High - enables complex notification workflows -- **User Impact**: Medium - requires migration for existing users +This comprehensive plan ensures both technical functionality and user +experience excellence, delivering a production-ready dual scheduling +system that meets enterprise requirements while maintaining user +accessibility and platform consistency. --- @@ -483,7 +659,7 @@ service integration. **Author**: Matthew Raymer **Branch**: `research/notification-plugin-enhancement` **Status**: Research complete, ready for implementation planning -**Next Phase**: Implementation planning and resource allocation +**Next Phase**: Implementation planning and resource allocation **Documents**: This consolidated document replaces all previous research documents @@ -496,7 +672,6 @@ collaboration **Status**: ✅ **RESEARCH COMPLETE** - Ready for implementation planning **Next Phase**: Implementation planning and resource allocation -**Estimated Timeline**: 2-3 weeks for full implementation **Priority**: 🔴 **HIGH** - Core functionality enhancement required **Recommendation**: Proceed with phased implementation approach @@ -510,7 +685,7 @@ This single document replaces the following separate documents: - ~~`IMPLEMENTATION_PLAN.md`~~ → Integrated into main sections - ~~`README_RESEARCH.md`~~ → Integrated into main sections -- ~~`RESEARCH_SUMMARY.md`~~ → Integrated into main sections +- ~~`RESEARCH_SUMMARY.md`~~ → Integrated into architecture sections - ~~`TODO.md`~~ → Integrated into implementation strategy - ~~`CALLBACK_ANALYSIS.md`~~ → Integrated into architecture sections -- 2.30.2 From 4a6ccca4d75f303446a0bb8e86052bb1f9dd22b2 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 12:45:05 +0000 Subject: [PATCH 16/19] docs: Remove all remaining time estimates from RESEARCH_COMPLETE.md - Remove 'Next 1-2 days' from Immediate Actions - Remove 'Next 1 week' from Short-Term Actions - Remove 'Next 2-4 weeks' from Medium-Term Actions - Remove 'timeline' references from action items - Clean up all time-based language while maintaining structure - Document now focuses on phases and priorities without misleading estimates Resolves: Complete removal of unrealistic time estimates --- doc/RESEARCH_COMPLETE.md | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/doc/RESEARCH_COMPLETE.md b/doc/RESEARCH_COMPLETE.md index 6daff56..e095a63 100644 --- a/doc/RESEARCH_COMPLETE.md +++ b/doc/RESEARCH_COMPLETE.md @@ -455,23 +455,6 @@ User Journey: Setting Up Dual Scheduling - **User Documentation** - **Final Review** -### **Resource Allocation Recommendations** - -#### **Option 1: Single Developer (Full-Time)** - -- **Risk**: Medium (single point of failure) -- **Cost**: Lower - -#### **Option 2: Two Developers (Part-Time)** - -- **Risk**: Lower (distributed effort) -- **Cost**: Medium - -#### **Option 3: Three Developers (Specialized)** - -- **Risk**: Lowest (specialized expertise) -- **Cost**: Higher - --- ## 🎯 **IMPLEMENTATION PRIORITIES & MILESTONES** @@ -480,7 +463,7 @@ User Journey: Setting Up Dual Scheduling - [ ] **Backend Interfaces**: Complete all TypeScript interfaces - [ ] **UI Requirements**: Complete UI requirements documentation -- [ ] **Implementation Plan**: Detailed task breakdown and timeline +- [ ] **Implementation Plan**: Detailed task breakdown - [ ] **Resource Allocation**: Team assignment and responsibility matrix ### **Phase 2 Milestones** @@ -609,21 +592,21 @@ User Journey: Setting Up Dual Scheduling ## 📅 **NEXT STEPS & IMMEDIATE ACTIONS** -### **Immediate Actions (Next 1-2 days)** +### **Immediate Actions** 1. **Stakeholder Review**: Review updated plan with development team 2. **UI Requirements Validation**: Confirm UI requirements with UX team 3. **Resource Allocation**: Assign developers to implementation tasks -4. **Timeline Confirmation**: Confirm implementation timeline +4. **Implementation Confirmation**: Confirm implementation approach -### **Short-Term Actions (Next 1 week)** +### **Short-Term Actions** 1. **Create Implementation Branch**: Set up feature branch for development 2. **Begin Interface Design**: Start implementing new interfaces 3. **UI Design Kickoff**: Begin UI requirements and design work 4. **Set Up Testing Framework**: Prepare testing infrastructure -### **Medium-Term Actions (Next 2-4 weeks)** +### **Medium-Term Actions** 1. **Core Implementation**: Implement dual scheduling backend 2. **UI Development**: Develop configuration and management interfaces @@ -644,7 +627,6 @@ scheduling system will provide: - **Quality Assurance**: Comprehensive testing and validation **Implementation Approach**: Phased implementation with clear milestones -**Resource Recommendation**: 2-3 developers for optimal timeline and quality **Success Probability**: 🟡 **MEDIUM-HIGH** with proper resource allocation This comprehensive plan ensures both technical functionality and user @@ -702,6 +684,6 @@ This single document replaces the following separate documents: - **Executive Summary**: High-level overview and key findings - **Requirements Analysis**: User feedback and gap analysis - **Architecture**: Technical design and implementation approach -- **Implementation Strategy**: Phased approach with timeline +- **Implementation Strategy**: Phased approach - **Risk Assessment**: Comprehensive risk analysis and mitigation -- **Next Steps**: Clear action items and timeline +- **Next Steps**: Clear action items -- 2.30.2 From d50319a832f088fea7ea396b1ce1e9e0089d00ca Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 12:50:23 +0000 Subject: [PATCH 17/19] docs(feature-planning)!: focus on implementation plan - Focus plan on implementation phases and priorities - Update package-lock.json with markdownlint-cli2 dependency Resolves: Streamline feature planning to focus on implementation approach --- doc/RESEARCH_COMPLETE.md | 10 +- package-lock.json | 950 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 953 insertions(+), 7 deletions(-) diff --git a/doc/RESEARCH_COMPLETE.md b/doc/RESEARCH_COMPLETE.md index e095a63..58e134d 100644 --- a/doc/RESEARCH_COMPLETE.md +++ b/doc/RESEARCH_COMPLETE.md @@ -369,7 +369,6 @@ User Journey: Setting Up Dual Scheduling #### **1.3 Implementation Planning** - **Task breakdown** -- **Resource allocation** - **Risk assessment** - **Testing strategy** @@ -464,7 +463,6 @@ User Journey: Setting Up Dual Scheduling - [ ] **Backend Interfaces**: Complete all TypeScript interfaces - [ ] **UI Requirements**: Complete UI requirements documentation - [ ] **Implementation Plan**: Detailed task breakdown -- [ ] **Resource Allocation**: Team assignment and responsibility matrix ### **Phase 2 Milestones** @@ -596,8 +594,7 @@ User Journey: Setting Up Dual Scheduling 1. **Stakeholder Review**: Review updated plan with development team 2. **UI Requirements Validation**: Confirm UI requirements with UX team -3. **Resource Allocation**: Assign developers to implementation tasks -4. **Implementation Confirmation**: Confirm implementation approach +3. **Implementation Confirmation**: Confirm implementation approach ### **Short-Term Actions** @@ -627,7 +624,6 @@ scheduling system will provide: - **Quality Assurance**: Comprehensive testing and validation **Implementation Approach**: Phased implementation with clear milestones -**Success Probability**: 🟡 **MEDIUM-HIGH** with proper resource allocation This comprehensive plan ensures both technical functionality and user experience excellence, delivering a production-ready dual scheduling @@ -641,7 +637,7 @@ accessibility and platform consistency. **Author**: Matthew Raymer **Branch**: `research/notification-plugin-enhancement` **Status**: Research complete, ready for implementation planning -**Next Phase**: Implementation planning and resource allocation +**Next Phase**: Implementation planning **Documents**: This consolidated document replaces all previous research documents @@ -653,7 +649,7 @@ collaboration --- **Status**: ✅ **RESEARCH COMPLETE** - Ready for implementation planning -**Next Phase**: Implementation planning and resource allocation +**Next Phase**: Implementation planning **Priority**: 🔴 **HIGH** - Core functionality enhancement required **Recommendation**: Proceed with phased implementation approach diff --git a/package-lock.json b/package-lock.json index 5245c95..7c75c4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "jest": "^29.5.0", "jest-environment-jsdom": "^30.0.5", "jsdom": "^26.1.0", + "markdownlint-cli2": "^0.18.1", "prettier": "^2.8.7", "rimraf": "^4.4.0", "rollup": "^3.20.0", @@ -1834,6 +1835,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -1899,6 +1913,16 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/fs-extra": { "version": "8.1.5", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", @@ -1976,6 +2000,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "18.19.84", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.84.tgz", @@ -2014,6 +2052,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -2774,6 +2819,39 @@ "node": ">=10" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -2981,6 +3059,20 @@ "dev": true, "license": "MIT" }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -3023,6 +3115,16 @@ "node": ">=8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3033,6 +3135,20 @@ "node": ">=8" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -4115,6 +4231,32 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4138,6 +4280,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -4197,6 +4350,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5307,6 +5471,13 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -5320,6 +5491,33 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/katex": { + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5371,6 +5569,16 @@ "dev": true, "license": "MIT" }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5441,6 +5649,162 @@ "tmpl": "1.0.5" } }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdownlint": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.38.0.tgz", + "integrity": "sha512-xaSxkaU7wY/0852zGApM8LdlIfGCW8ETZ0Rr62IQtAnUMlMuifsg09vWJcNYeL4f0anvr8Vo4ZQar8jGpV0btQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "4.0.2", + "micromark-core-commonmark": "2.0.3", + "micromark-extension-directive": "4.0.0", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.1", + "micromark-extension-math": "3.1.0", + "micromark-util-types": "2.0.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli2": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.18.1.tgz", + "integrity": "sha512-/4Osri9QFGCZOCTkfA8qJF+XGjKYERSHkXzxSyS1hd3ZERJGjvsUao2h4wdnvpHp6Tu2Jh/bPHM0FE9JJza6ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "14.1.0", + "js-yaml": "4.1.0", + "jsonc-parser": "3.3.1", + "markdown-it": "14.1.0", + "markdownlint": "0.38.0", + "markdownlint-cli2-formatter-default": "0.0.5", + "micromatch": "4.0.8" + }, + "bin": { + "markdownlint-cli2": "markdownlint-cli2-bin.mjs" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli2-formatter-default": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.5.tgz", + "integrity": "sha512-4XKTwQ5m1+Txo2kuQ3Jgpo/KmnG+X90dWt4acufg6HVGadTUG5hzHF/wssp9b5MBYOMCnZ9RMPaU//uHsszF8Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + }, + "peerDependencies": { + "markdownlint-cli2": ">=0.0.4" + } + }, + "node_modules/markdownlint-cli2/node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdownlint-cli2/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/markdownlint-cli2/node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdownlint-cli2/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5458,6 +5822,542 @@ "node": ">= 8" } }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -5753,6 +6653,26 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -6088,6 +7008,16 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -6939,6 +7869,13 @@ "node": ">=14.17" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -6946,6 +7883,19 @@ "dev": true, "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", -- 2.30.2 From 5ac0340bed74de1d871757b94b4e01236398bbde Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 12:58:37 +0000 Subject: [PATCH 18/19] docs: Correct feature planning to focus on plugin architecture, not UI - Remove UI framework considerations (Tailwind, etc.) as irrelevant for Capacitor plugins - Focus on plugin API design, data models, and platform integration - Update implementation phases to reflect actual plugin development needs - Correct conclusion to emphasize plugin architecture over UI components - Clarify that plugins provide backend functionality, not visual presentation Resolves: Misunderstanding of Capacitor plugin architecture and UI responsibilities --- doc/RESEARCH_COMPLETE.md | 161 ++++++++++++++++++++------------------- 1 file changed, 82 insertions(+), 79 deletions(-) diff --git a/doc/RESEARCH_COMPLETE.md b/doc/RESEARCH_COMPLETE.md index 58e134d..93920e7 100644 --- a/doc/RESEARCH_COMPLETE.md +++ b/doc/RESEARCH_COMPLETE.md @@ -270,9 +270,9 @@ async scheduleUserNotification(options: UserNotificationOptions): Promise --- -## 🎨 **COMPREHENSIVE UI INTEGRATION REQUIREMENTS** +## 🏗️ **PLUGIN ARCHITECTURE & API DESIGN REQUIREMENTS** -### **1. Configuration Interface Requirements** +### **1. Dual Scheduling Configuration Interface** ```typescript interface DualScheduleConfiguration { @@ -294,57 +294,60 @@ interface DualScheduleConfiguration { priority: 'low' | 'normal' | 'high'; }; }; - userInterface: { - theme: 'light' | 'dark' | 'auto'; - language: string; - accessibility: { - screenReader: boolean; - highContrast: boolean; - fontSize: 'small' | 'medium' | 'large'; - }; - }; } ``` -### **2. User Experience Flows** +### **2. Plugin API Methods** -```ascii -User Journey: Setting Up Dual Scheduling -1. User opens notification settings -2. User sees dual scheduling options -3. User configures content fetch schedule -4. User configures user notification schedule -5. User sets callback preferences -6. User configures UI preferences -7. User saves configuration -8. System validates and applies settings +```typescript +interface DailyNotificationPlugin { + // Existing methods + scheduleDailyNotification(options: NotificationOptions): Promise; + getLastNotification(): Promise; + cancelAllNotifications(): Promise; + getNotificationStatus(): Promise; + + // New dual scheduling methods + scheduleContentFetch(config: ContentFetchConfig): Promise; + scheduleUserNotification(config: UserNotificationConfig): Promise; + getDualScheduleStatus(): Promise; + updateDualScheduleConfig(config: DualScheduleConfiguration): Promise; +} ``` -### **3. Platform-Specific UI Requirements** +### **3. Data Models & Structures** -#### **Android UI Requirements** +#### **Content Fetch Configuration** +- **Schedule Management**: Cron-based scheduling for content retrieval +- **Callback Registry**: External service integration points +- **Error Handling**: Robust error management and retry logic +- **Performance Monitoring**: Metrics for fetch operations -- **Material Design**: Follow Material Design 3 guidelines -- **Settings Integration**: Integrate with Android notification settings -- **Permission Handling**: Clear permission request flows -- **Background Processing**: Indicate background activity status -- **Accessibility**: Support for TalkBack and accessibility services +#### **User Notification Configuration** +- **Schedule Management**: Independent notification timing +- **Platform Preferences**: Native notification customization +- **User Settings**: Personalized notification behavior +- **Status Tracking**: Real-time notification state -#### **iOS UI Requirements** +### **4. Platform Integration Points** -- **Human Interface Guidelines**: Follow iOS design patterns -- **Settings App**: Integration with iOS Settings app -- **Notification Center**: Proper notification center integration -- **Background App Refresh**: Clear background processing indicators -- **Accessibility**: VoiceOver and accessibility support +#### **Android Integration** +- **WorkManager**: Background content fetching +- **AlarmManager**: Precise notification scheduling +- **NotificationManager**: Rich notification presentation +- **PowerManager**: Battery optimization handling -#### **Web UI Requirements** +#### **iOS Integration** +- **Background App Refresh**: Content fetching in background +- **UNUserNotificationCenter**: Notification scheduling +- **UNNotificationServiceExtension**: Rich notification content +- **Background Processing**: Efficient background operations -- **Progressive Web App**: PWA-compatible interface -- **Responsive Design**: Mobile-first responsive layout -- **Service Worker**: Offline capability and background sync -- **Push Notifications**: Web push notification support -- **Accessibility**: WCAG 2.1 AA compliance +#### **Web Integration** +- **Service Worker**: Background content fetching +- **Push API**: Web push notifications +- **IndexedDB**: Local content storage +- **Background Sync**: Offline content synchronization --- @@ -359,12 +362,12 @@ User Journey: Setting Up Dual Scheduling - **Configuration management interfaces** - **Error handling and validation interfaces** -#### **1.2 UI Requirements & Design** +#### **1.2 Plugin Architecture Design** -- **User interface requirements** -- **User experience flows** -- **Platform-specific design guidelines** -- **Accessibility requirements** +- **API method definitions** +- **Data model structures** +- **Platform integration points** +- **Callback system architecture** #### **1.3 Implementation Planning** @@ -381,12 +384,12 @@ User Journey: Setting Up Dual Scheduling - **Configuration management** - **Error handling and logging** -#### **2.2 UI Foundation** +#### **2.2 Plugin Core Implementation** -- **UI component architecture** -- **Configuration forms** -- **Settings interfaces** -- **Theme and accessibility support** +- **Callback registry system** +- **Configuration management** +- **Error handling and logging** +- **Performance monitoring** ### **Phase 3: Platform Integration** @@ -397,12 +400,12 @@ User Journey: Setting Up Dual Scheduling - **Web implementation** - **Platform-specific optimizations** -#### **3.2 UI Platform Integration** +#### **3.2 Platform-Specific Features** -- **Android UI (Material Design)** -- **iOS UI (Human Interface Guidelines)** -- **Web UI (PWA standards)** -- **Cross-platform consistency** +- **Android WorkManager integration** +- **iOS Background App Refresh** +- **Web Service Worker implementation** +- **Cross-platform API consistency** ### **Phase 4: Testing & Finalization** @@ -413,12 +416,12 @@ User Journey: Setting Up Dual Scheduling - **Performance testing** - **Security testing** -#### **4.2 UI Testing & Validation** +#### **4.2 Plugin Testing & Validation** -- **User experience testing** -- **Accessibility testing** -- **Cross-platform testing** -- **Performance validation** +- **API functionality testing** +- **Platform integration testing** +- **Performance and reliability testing** +- **Error handling validation** #### **4.3 Documentation & Finalization** @@ -440,10 +443,10 @@ User Journey: Setting Up Dual Scheduling - **Platform Integration** - **Testing & Validation** -#### **User Interface Development** +#### **Plugin Architecture Development** -- **Requirements & Design** -- **Component Development** +- **API Design & Implementation** +- **Data Model Development** - **Platform Integration** - **Testing & Validation** @@ -593,20 +596,20 @@ User Journey: Setting Up Dual Scheduling ### **Immediate Actions** 1. **Stakeholder Review**: Review updated plan with development team -2. **UI Requirements Validation**: Confirm UI requirements with UX team +2. **Plugin Architecture Validation**: Confirm API design and data models 3. **Implementation Confirmation**: Confirm implementation approach ### **Short-Term Actions** 1. **Create Implementation Branch**: Set up feature branch for development -2. **Begin Interface Design**: Start implementing new interfaces -3. **UI Design Kickoff**: Begin UI requirements and design work +2. **Begin API Design**: Start implementing new plugin interfaces +3. **Plugin Architecture Kickoff**: Begin data model and callback design 4. **Set Up Testing Framework**: Prepare testing infrastructure ### **Medium-Term Actions** 1. **Core Implementation**: Implement dual scheduling backend -2. **UI Development**: Develop configuration and management interfaces +2. **Plugin Development**: Develop configuration and callback systems 3. **Platform Integration**: Integrate across all platforms 4. **Testing & Validation**: Comprehensive testing and quality assurance @@ -614,21 +617,21 @@ User Journey: Setting Up Dual Scheduling ## 🔍 **CONCLUSION** -The updated feature planning now includes comprehensive user interface -considerations, following realistic planning guidelines. The dual -scheduling system will provide: +The updated feature planning now focuses on plugin architecture and API +design, following realistic planning guidelines. The dual scheduling +system will provide: -- **Complete Functionality**: Backend dual scheduling with intuitive UI -- **User Experience**: Clear workflows for configuration and management -- **Platform Consistency**: Uniform experience across Android, iOS, and Web +- **Complete Functionality**: Backend dual scheduling with robust APIs +- **Plugin Architecture**: Clean, efficient plugin methods and data models +- **Platform Integration**: Native integration across Android, iOS, and Web - **Quality Assurance**: Comprehensive testing and validation -**Implementation Approach**: Phased implementation with clear milestones +**Implementation Approach**: Phased implementation with clear milestones -This comprehensive plan ensures both technical functionality and user -experience excellence, delivering a production-ready dual scheduling -system that meets enterprise requirements while maintaining user -accessibility and platform consistency. +This comprehensive plan ensures both technical functionality and plugin +architecture excellence, delivering a production-ready dual scheduling +system that meets enterprise requirements while maintaining robust +platform integration and performance. --- -- 2.30.2 From 9f8a8e60a92c92f18cbe5ac8cd0b85c3ba7fc2f3 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 26 Aug 2025 13:04:33 +0000 Subject: [PATCH 19/19] feat: Implement dual scheduling API design and interfaces - Add comprehensive dual scheduling interfaces to definitions.ts - Implement ContentFetchConfig, UserNotificationConfig, and DualScheduleConfiguration - Add new plugin methods for dual scheduling, content management, and callbacks - Update web implementations with mock functionality for all new methods - Fix all test files to include new dual scheduling method mocks - Ensure TypeScript compilation and all tests pass successfully Resolves: Plugin API design for dual scheduling system implementation --- src/definitions.ts | 143 +++++++++++++++++++++--- src/web.ts | 79 ++++++++++++++ src/web/index.ts | 167 ++++++++++++++++++++++++----- tests/advanced-scenarios.test.ts | 20 ++++ tests/daily-notification.test.ts | 20 ++++ tests/edge-cases.test.ts | 20 ++++ tests/enterprise-scenarios.test.ts | 20 ++++ 7 files changed, 427 insertions(+), 42 deletions(-) diff --git a/src/definitions.ts b/src/definitions.ts index fbedde9..8a14de3 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -35,19 +35,7 @@ export interface ContentHandler { (response?: any): Promise<{ title: string; body: string; data?: any }>; } -export interface DailyNotificationPlugin { - scheduleDailyNotification(options: NotificationOptions | ScheduleOptions): Promise; - getLastNotification(): Promise; - cancelAllNotifications(): Promise; - getNotificationStatus(): Promise; - updateSettings(settings: NotificationSettings): Promise; - getBatteryStatus(): Promise; - requestBatteryOptimizationExemption(): Promise; - setAdaptiveScheduling(options: { enabled: boolean }): Promise; - getPowerState(): Promise; - checkPermissions(): Promise; - requestPermissions(): Promise; -} + export interface ScheduleOptions { url?: string; @@ -163,4 +151,133 @@ export interface SchedulingConfig { enabled: boolean; }; timezone: string; +} + +// Dual Scheduling System Interfaces +export interface ContentFetchConfig { + enabled: boolean; + schedule: string; // Cron expression + url?: string; + headers?: Record; + timeout?: number; + retryAttempts?: number; + retryDelay?: number; + callbacks: { + apiService?: string; + database?: string; + reporting?: string; + onSuccess?: (data: any) => Promise; + onError?: (error: Error) => Promise; + onComplete?: (result: ContentFetchResult) => Promise; + }; + contentHandler?: ContentHandler; + cachePolicy?: CachePolicy; + networkConfig?: NetworkConfig; +} + +export interface UserNotificationConfig { + enabled: boolean; + schedule: string; // Cron expression + title?: string; + body?: string; + sound?: boolean; + vibration?: boolean; + priority?: 'low' | 'normal' | 'high'; + badge?: boolean; + actions?: NotificationAction[]; + category?: string; + userInfo?: Record; +} + +export interface NotificationAction { + id: string; + title: string; + icon?: string; + destructive?: boolean; + authenticationRequired?: boolean; +} + +export interface DualScheduleConfiguration { + contentFetch: ContentFetchConfig; + userNotification: UserNotificationConfig; + relationship?: { + autoLink: boolean; // Automatically link content to notification + contentTimeout: number; // How long to wait for content before notification + fallbackBehavior: 'skip' | 'show_default' | 'retry'; + }; +} + +export interface ContentFetchResult { + success: boolean; + data?: any; + timestamp: number; + contentAge: number; + error?: string; + retryCount: number; + metadata?: Record; +} + +export interface DualScheduleStatus { + contentFetch: { + isEnabled: boolean; + isScheduled: boolean; + lastFetchTime?: number; + nextFetchTime?: number; + lastFetchResult?: ContentFetchResult; + pendingFetches: number; + }; + userNotification: { + isEnabled: boolean; + isScheduled: boolean; + lastNotificationTime?: number; + nextNotificationTime?: number; + pendingNotifications: number; + }; + relationship: { + isLinked: boolean; + contentAvailable: boolean; + lastLinkTime?: number; + }; + overall: { + isActive: boolean; + lastActivity: number; + errorCount: number; + successRate: number; + }; +} + +// Enhanced DailyNotificationPlugin interface with dual scheduling +export interface DailyNotificationPlugin { + // Existing methods + scheduleDailyNotification(options: NotificationOptions | ScheduleOptions): Promise; + getLastNotification(): Promise; + cancelAllNotifications(): Promise; + getNotificationStatus(): Promise; + updateSettings(settings: NotificationSettings): Promise; + getBatteryStatus(): Promise; + requestBatteryOptimizationExemption(): Promise; + setAdaptiveScheduling(options: { enabled: boolean }): Promise; + getPowerState(): Promise; + checkPermissions(): Promise; + requestPermissions(): Promise; + + // New dual scheduling methods + scheduleContentFetch(config: ContentFetchConfig): Promise; + scheduleUserNotification(config: UserNotificationConfig): Promise; + scheduleDualNotification(config: DualScheduleConfiguration): Promise; + getDualScheduleStatus(): Promise; + updateDualScheduleConfig(config: DualScheduleConfiguration): Promise; + cancelDualSchedule(): Promise; + pauseDualSchedule(): Promise; + resumeDualSchedule(): Promise; + + // Content management methods + getContentCache(): Promise>; + clearContentCache(): Promise; + getContentHistory(): Promise; + + // Callback management methods + registerCallback(name: string, callback: Function): Promise; + unregisterCallback(name: string): Promise; + getRegisteredCallbacks(): Promise; } \ No newline at end of file diff --git a/src/web.ts b/src/web.ts index 494202d..da78591 100644 --- a/src/web.ts +++ b/src/web.ts @@ -88,4 +88,83 @@ export class DailyNotificationWeb extends WebPlugin implements DailyNotification carPlay: false }; } + + // Dual Scheduling Methods Implementation + + async scheduleContentFetch(_config: any): Promise { + console.log('Schedule content fetch called on web platform'); + } + + async scheduleUserNotification(_config: any): Promise { + console.log('Schedule user notification called on web platform'); + } + + async scheduleDualNotification(_config: any): Promise { + console.log('Schedule dual notification called on web platform'); + } + + async getDualScheduleStatus(): Promise { + return { + contentFetch: { + isEnabled: false, + isScheduled: false, + pendingFetches: 0 + }, + userNotification: { + isEnabled: false, + isScheduled: false, + pendingNotifications: 0 + }, + relationship: { + isLinked: false, + contentAvailable: false + }, + overall: { + isActive: false, + lastActivity: Date.now(), + errorCount: 0, + successRate: 1.0 + } + }; + } + + async updateDualScheduleConfig(_config: any): Promise { + console.log('Update dual schedule config called on web platform'); + } + + async cancelDualSchedule(): Promise { + console.log('Cancel dual schedule called on web platform'); + } + + async pauseDualSchedule(): Promise { + console.log('Pause dual schedule called on web platform'); + } + + async resumeDualSchedule(): Promise { + console.log('Resume dual schedule called on web platform'); + } + + async getContentCache(): Promise> { + return {}; + } + + async clearContentCache(): Promise { + console.log('Clear content cache called on web platform'); + } + + async getContentHistory(): Promise { + return []; + } + + async registerCallback(_name: string, _callback: Function): Promise { + console.log('Register callback called on web platform'); + } + + async unregisterCallback(_name: string): Promise { + console.log('Unregister callback called on web platform'); + } + + async getRegisteredCallbacks(): Promise { + return []; + } } \ No newline at end of file diff --git a/src/web/index.ts b/src/web/index.ts index d2de60e..43299d3 100644 --- a/src/web/index.ts +++ b/src/web/index.ts @@ -100,14 +100,14 @@ export class DailyNotificationWeb implements DailyNotificationPlugin { */ async updateSettings(settings: NotificationSettings): Promise { this.settings = { ...this.settings, ...settings }; - console.log('Web notification settings updated:', this.settings); + console.log('Settings updated:', this.settings); } /** - * Get battery status (mock implementation) + * Get battery status (mock implementation for web) */ async getBatteryStatus(): Promise { - // Mock battery status for web + // Mock implementation for web return { level: 100, isCharging: false, @@ -117,21 +117,21 @@ export class DailyNotificationWeb implements DailyNotificationPlugin { } /** - * Request battery optimization exemption (web not applicable) + * Request battery optimization exemption (mock for web) */ async requestBatteryOptimizationExemption(): Promise { - console.log('Battery optimization exemption not applicable on web'); + console.log('Battery optimization exemption requested (web mock)'); } /** - * Set adaptive scheduling (web not applicable) + * Set adaptive scheduling (mock for web) */ async setAdaptiveScheduling(options: { enabled: boolean }): Promise { - console.log('Adaptive scheduling not applicable on web:', options); + console.log('Adaptive scheduling set:', options.enabled); } /** - * Get power state (mock implementation) + * Get power state (mock for web) */ async getPowerState(): Promise { return { @@ -141,13 +141,11 @@ export class DailyNotificationWeb implements DailyNotificationPlugin { } /** - * Check permissions + * Check permissions (web implementation) */ async checkPermissions(): Promise { if (!('Notification' in window)) { return { - status: 'denied', - granted: false, notifications: 'denied', alert: false, badge: false, @@ -161,7 +159,8 @@ export class DailyNotificationWeb implements DailyNotificationPlugin { return { status: permission, granted: permission === 'granted', - notifications: permission as any, + notifications: permission === 'granted' ? 'granted' : + permission === 'denied' ? 'denied' : 'prompt', alert: permission === 'granted', badge: permission === 'granted', sound: permission === 'granted', @@ -171,29 +170,139 @@ export class DailyNotificationWeb implements DailyNotificationPlugin { } /** - * Request permissions + * Request permissions (web implementation) */ async requestPermissions(): Promise { if (!('Notification' in window)) { throw new Error('Notifications not supported in this browser'); } - try { - const permission = await Notification.requestPermission(); - return { - status: permission, - granted: permission === 'granted', - notifications: permission as any, - alert: permission === 'granted', - badge: permission === 'granted', - sound: permission === 'granted', - lockScreen: permission === 'granted', - carPlay: false - }; - } catch (error) { - console.error('Error requesting notification permissions:', error); - throw error; - } + await Notification.requestPermission(); + return this.checkPermissions(); + } + + // Dual Scheduling Methods Implementation + + /** + * Schedule content fetch (web implementation) + */ + async scheduleContentFetch(config: any): Promise { + console.log('Content fetch scheduled (web mock):', config); + // Mock implementation - in real app would use Service Worker + } + + /** + * Schedule user notification (web implementation) + */ + async scheduleUserNotification(config: any): Promise { + console.log('User notification scheduled (web mock):', config); + // Mock implementation - in real app would use browser notifications + } + + /** + * Schedule dual notification (web implementation) + */ + async scheduleDualNotification(config: any): Promise { + console.log('Dual notification scheduled (web mock):', config); + // Mock implementation combining content fetch and user notification + } + + /** + * Get dual schedule status (web implementation) + */ + async getDualScheduleStatus(): Promise { + return { + contentFetch: { + isEnabled: false, + isScheduled: false, + pendingFetches: 0 + }, + userNotification: { + isEnabled: false, + isScheduled: false, + pendingNotifications: 0 + }, + relationship: { + isLinked: false, + contentAvailable: false + }, + overall: { + isActive: false, + lastActivity: Date.now(), + errorCount: 0, + successRate: 1.0 + } + }; + } + + /** + * Update dual schedule configuration (web implementation) + */ + async updateDualScheduleConfig(config: any): Promise { + console.log('Dual schedule config updated (web mock):', config); + } + + /** + * Cancel dual schedule (web implementation) + */ + async cancelDualSchedule(): Promise { + console.log('Dual schedule cancelled (web mock)'); + } + + /** + * Pause dual schedule (web implementation) + */ + async pauseDualSchedule(): Promise { + console.log('Dual schedule paused (web mock)'); + } + + /** + * Resume dual schedule (web implementation) + */ + async resumeDualSchedule(): Promise { + console.log('Dual schedule resumed (web mock)'); + } + + /** + * Get content cache (web implementation) + */ + async getContentCache(): Promise> { + return {}; // Mock empty cache + } + + /** + * Clear content cache (web implementation) + */ + async clearContentCache(): Promise { + console.log('Content cache cleared (web mock)'); + } + + /** + * Get content history (web implementation) + */ + async getContentHistory(): Promise { + return []; // Mock empty history + } + + /** + * Register callback (web implementation) + */ + async registerCallback(name: string, _callback: Function): Promise { + console.log('Callback registered (web mock):', name); + } + + /** + * Unregister callback (web implementation) + */ + async unregisterCallback(name: string): Promise { + console.log('Callback unregistered (web mock):', name); + } + + /** + * Get registered callbacks (web implementation) + */ + async getRegisteredCallbacks(): Promise { + return []; // Mock empty callback list } /** diff --git a/tests/advanced-scenarios.test.ts b/tests/advanced-scenarios.test.ts index 1871763..c3ba72a 100644 --- a/tests/advanced-scenarios.test.ts +++ b/tests/advanced-scenarios.test.ts @@ -19,6 +19,26 @@ describe('DailyNotification Advanced Scenarios', () => { getPowerState: jest.fn(), checkPermissions: jest.fn(), requestPermissions: jest.fn(), + + // Dual scheduling methods + scheduleContentFetch: jest.fn(), + scheduleUserNotification: jest.fn(), + scheduleDualNotification: jest.fn(), + getDualScheduleStatus: jest.fn(), + updateDualScheduleConfig: jest.fn(), + cancelDualSchedule: jest.fn(), + pauseDualSchedule: jest.fn(), + resumeDualSchedule: jest.fn(), + + // Content management methods + getContentCache: jest.fn(), + clearContentCache: jest.fn(), + getContentHistory: jest.fn(), + + // Callback management methods + registerCallback: jest.fn(), + unregisterCallback: jest.fn(), + getRegisteredCallbacks: jest.fn(), }; plugin = new DailyNotification(mockPlugin); }); diff --git a/tests/daily-notification.test.ts b/tests/daily-notification.test.ts index 8c3a81b..8702d05 100644 --- a/tests/daily-notification.test.ts +++ b/tests/daily-notification.test.ts @@ -33,6 +33,26 @@ describe('DailyNotification Plugin', () => { getPowerState: jest.fn(), checkPermissions: jest.fn(), requestPermissions: jest.fn(), + + // Dual scheduling methods + scheduleContentFetch: jest.fn(), + scheduleUserNotification: jest.fn(), + scheduleDualNotification: jest.fn(), + getDualScheduleStatus: jest.fn(), + updateDualScheduleConfig: jest.fn(), + cancelDualSchedule: jest.fn(), + pauseDualSchedule: jest.fn(), + resumeDualSchedule: jest.fn(), + + // Content management methods + getContentCache: jest.fn(), + clearContentCache: jest.fn(), + getContentHistory: jest.fn(), + + // Callback management methods + registerCallback: jest.fn(), + unregisterCallback: jest.fn(), + getRegisteredCallbacks: jest.fn(), }; // Create plugin instance with mock diff --git a/tests/edge-cases.test.ts b/tests/edge-cases.test.ts index b2a1214..beb25fa 100644 --- a/tests/edge-cases.test.ts +++ b/tests/edge-cases.test.ts @@ -24,6 +24,26 @@ describe('DailyNotification Edge Cases', () => { getPowerState: jest.fn(), checkPermissions: jest.fn(), requestPermissions: jest.fn(), + + // Dual scheduling methods + scheduleContentFetch: jest.fn(), + scheduleUserNotification: jest.fn(), + scheduleDualNotification: jest.fn(), + getDualScheduleStatus: jest.fn(), + updateDualScheduleConfig: jest.fn(), + cancelDualSchedule: jest.fn(), + pauseDualSchedule: jest.fn(), + resumeDualSchedule: jest.fn(), + + // Content management methods + getContentCache: jest.fn(), + clearContentCache: jest.fn(), + getContentHistory: jest.fn(), + + // Callback management methods + registerCallback: jest.fn(), + unregisterCallback: jest.fn(), + getRegisteredCallbacks: jest.fn(), }; plugin = new DailyNotification(mockPlugin); }); diff --git a/tests/enterprise-scenarios.test.ts b/tests/enterprise-scenarios.test.ts index 7c5a985..0cc5e4c 100644 --- a/tests/enterprise-scenarios.test.ts +++ b/tests/enterprise-scenarios.test.ts @@ -23,6 +23,26 @@ describe('DailyNotification Enterprise Scenarios', () => { getPowerState: jest.fn(), checkPermissions: jest.fn(), requestPermissions: jest.fn(), + + // Dual scheduling methods + scheduleContentFetch: jest.fn(), + scheduleUserNotification: jest.fn(), + scheduleDualNotification: jest.fn(), + getDualScheduleStatus: jest.fn(), + updateDualScheduleConfig: jest.fn(), + cancelDualSchedule: jest.fn(), + pauseDualSchedule: jest.fn(), + resumeDualSchedule: jest.fn(), + + // Content management methods + getContentCache: jest.fn(), + clearContentCache: jest.fn(), + getContentHistory: jest.fn(), + + // Callback management methods + registerCallback: jest.fn(), + unregisterCallback: jest.fn(), + getRegisteredCallbacks: jest.fn(), }; plugin = new DailyNotification(mockPlugin); }); -- 2.30.2