diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..69d0574 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,337 @@ +#Launchr Rules + +Every time you choose to apply a rule(s), explicitly state the rule(s) in the output. You can abbreviate the rule description to a single word or phrase. + +# Definição da Stack Tecnológica +tech_stack: + framework: "React" + language: "TypeScript" + styling: + framework: "Bootstrap 5" + preprocessor: "SCSS" + additional: "custom CSS modules" + bundler: "Vite" + testing: "Jest" + state: "Redux Toolkit" + api: "Chrome Extension API" + storage: "Chrome Storage API" + ai: "OpenAI API" + ui_libraries: + - "Bootstrap 5.3.3" + - "Bootstrap Icons" + +## Code Style and Structure +- Write concise, technical TypeScript code with accurate examples +- Use functional and declarative programming patterns; avoid classes +- Prefer iteration and modularization over code duplication +- Use descriptive variable names with auxiliary verbs (e.g., isLoading, hasError) +- Structure repository files as follows: + +# Estrutura de Pastas do Projeto +directory_structure: + src: + background: + desc: "Scripts de background da extensão" + files: ["index.ts", "services/*.ts"] + + content: + desc: "Scripts que são injetados nas páginas" + files: + - "index.ts" + - "components/*.tsx" + - "style.css" + + popup: + desc: "Interface do popup da extensão" + files: + - "index.tsx" + - "Router.tsx" + - "components/*.tsx" + + services: + desc: "Serviços compartilhados" + files: ["ai/*.ts", "api/*.ts", "storage/*.ts"] + + store: + desc: "Gerenciamento de estado Redux" + files: + - "index.ts" + - "slices/*.ts" + + utils: + desc: "Utilitários e helpers" + files: ["*.ts"] + + assets: + desc: "Recursos estáticos" + files: ["icons/*", "images/*"] + + styles: + desc: "Estilos globais e Bootstrap customização" + files: + - "custom.scss" + - "variables.scss" + - "*.css" + + types: + desc: "Definições de tipos TypeScript" + files: ["*.d.ts"] + + lib: + desc: "Bibliotecas externas" + files: + - "bootstrap.min.css" + - "bootstrap.bundle.min.js" + +# Regras de Segurança +security: + content_security_policy: true + permissions: + required: ["activeTab", "storage", "scripting"] + optional: ["contextMenus"] + cors: + allowed_origins: + - "https://launchr.com.br" + - "https://api.openai.com" + - "*://www.linkedin.com/*" + storage: + encryption: true + sensitive_data: ["authToken", "userCredentials"] + +# Configurações de Teste +testing: + unit: + framework: "Jest" + coverage: 80 + directories: ["__tests__", "**/*.test.ts"] + e2e: + framework: "Playwright" + browsers: ["chrome"] + patterns: + test_files: "*.test.ts" + mock_files: "*.mock.ts" + snapshot_files: "*.snap" + +# Documentação +documentation: + required_files: + - "README.md" + - "CHANGELOG.md" + - "LICENSE" + components: + props_documentation: true + examples: true + stories: true + api: + swagger: true + endpoints_documentation: true + chrome: + permissions_explanation: true + installation_guide: true + +# Performance +performance: + bundle_size_limits: + background: "100KB" + content: "150KB" + popup: "200KB" + lazy_loading: true + code_splitting: true + caching: + strategies: ["network-first", "cache-first"] + optimization: + minify: true + tree_shaking: true + +# Gestão de Estado +state_management: + redux: + slices_pattern: "^[a-z]+Slice$" + selectors_pattern: "^select[A-Z][a-zA-Z]+$" + actions_pattern: "^[a-z]+[A-Z][a-zA-Z]+$" + storage: + persistence: true + sync_strategy: "periodic" + +rules: + background: + pattern: "^[a-z][a-zA-Z0-9]*$" + directory: "src/background" + + content: + pattern: "^[a-z][a-zA-Z0-9]*$" + directory: "src/content" + + components: + pattern: "^[A-Z][a-zA-Z0-9]*$" + directory: "src/content/components" + + styles: + pattern: "^[a-z][a-zA-Z0-9-]*\.(css|scss)$" + directory: "src/styles" + + assets: + pattern: "^[a-z0-9-]*\.(png|svg)$" + directory: "src/assets" + +formatting: + indentation: 2 + max_line_length: 100 + quotes: "single" + semicolons: true + + typescript: + interface_pattern: "^[A-Z][a-zA-Z0-9]*Props$" + type_pattern: "^[A-Z][a-zA-Z0-9]*Type$" + + css: + class_naming: "bootstrap-convention" + bootstrap_classes: + prefix: ["btn-", "form-", "card-", "nav-", "bg-", "text-"] + custom_classes: + prefix: "launchr-" + +conventions: + imports: + order: ["react", "chrome-api", "bootstrap", "external", "components", "styles"] + grouping: true + bootstrap: + css: "import 'bootstrap/dist/css/bootstrap.min.css'" + js: "import 'bootstrap/dist/js/bootstrap.bundle.min.js'" + + messages: + pattern: "^[A-Z][A-Z_]*$" + + storage: + keys: "camelCase" + +linting: + chrome: + manifest_version: 3 + permissions_check: true + + typescript: + strict: true + no_any: true + + react: + hooks_exhaustive_deps: true + prefer_functional: true + + bootstrap: + version: "5.3.3" + required_meta: true + responsive_meta: true + +scripts: + build: + command: "npm run build" + output: "dist" + + assets: + copy: + - "src/assets/icon*.png" + - "manifest.json" + - "*.css" + - "lib/bootstrap*" + + + +## Naming Conventions +- Use lowercase with dashes for directories (e.g., components/form-wizard) +- Favor named exports for components and utilities +- Use PascalCase for component files (e.g., VisaForm.tsx) +- Use camelCase for utility files (e.g., formValidator.ts) + +## TypeScript Usage +- Use TypeScript for all code; prefer interfaces over types +- Avoid enums; use const objects with 'as const' assertion +- Use functional components with TypeScript interfaces +- Define strict types for message passing between different parts of the extension +- Use absolute imports for all files @/... +- Avoid try/catch blocks unless there's good reason to translate or handle error in that abstraction +- Use explicit return types for all functions + +## Chrome Extension Specific +- Use Manifest V3 standards +- Implement proper message passing between components: + ```typescript + interface MessagePayload { + type: string; + data: unknown; + } + ``` +- Handle permissions properly in manifest.json +- Use chrome.storage.local for persistent data +- Implement proper error boundaries and fallbacks +- Use lib/storage for storage related logic +- For the async injected scripts in content/, + - they must not close over variables from the outer scope + - they must not use imported functions from the outer scope + - they must have wrapped error handling so the error message is returned to the caller + +## State Management +- Use React Context for global state when needed +- Implement proper state persistence using chrome.storage (for extension) +- Implement proper cleanup in useEffect hooks + +## Syntax and Formatting +- Use "function" keyword for pure functions +- Avoid unnecessary curly braces in conditionals +- Use declarative JSX +- Implement proper TypeScript discriminated unions for message types + +## UI and Styling +- Implement Bootstrap 5 for styling +- Consider extension-specific constraints (popup dimensions, permissions) +- Follow Material Design guidelines for Chrome extensions + +## Error Handling +- Implement proper error boundaries +- Log errors appropriately for debugging +- Provide user-friendly error messages +- Handle network failures gracefully + +## Testing +- Write unit tests for utilities and components +- Implement E2E tests for critical flows +- Test across different Chrome versions +- Test memory usage and performance + +## Security +- Implement Content Security Policy +- Sanitize user inputs +- Handle sensitive data properly +- Follow Chrome extension security best practices +- Implement proper CORS handling + +## Git Usage +Commit Message Prefixes: +- "fix:" for bug fixes +- "feat:" for new features +- "perf:" for performance improvements +- "docs:" for documentation changes +- "style:" for formatting changes +- "refactor:" for code refactoring +- "test:" for adding missing tests +- "chore:" for maintenance tasks + +Rules: +- Use lowercase for commit messages +- Keep the summary line concise +- Include description for non-obvious changes +- Reference issue numbers when applicable + +## Documentation +- Maintain clear README with setup instructions +- Document API interactions and data flows +- Keep manifest.json well-documented +- Don't include comments unless it's for complex logic +- Document permission requirements + +## Development Workflow +- Use proper version control +- Implement proper code review process +- Test in multiple environments +- Follow semantic versioning for releases +- Maintain changelog \ No newline at end of file diff --git a/.windsurfrules b/.windsurfrules new file mode 100644 index 0000000..e69de29 diff --git a/src/types/messages.ts b/src/types/messages.ts new file mode 100644 index 0000000..2cf5743 --- /dev/null +++ b/src/types/messages.ts @@ -0,0 +1,14 @@ +interface MessagePayload { + type: MessageTypes; + data: unknown; +} + +enum MessageTypes { + SAVE_POST = 'SAVE_POST', + SAVE_IDEA = 'SAVE_IDEA', + CHECK_AUTH = 'CHECK_AUTH', + LOGIN = 'LOGIN' +} + +export type { MessagePayload }; +export { MessageTypes }; \ No newline at end of file