From e7703f34e78e524d6e7b8b848c8a8598220e2372 Mon Sep 17 00:00:00 2001 From: Gabriel Menezes Date: Thu, 5 Nov 2026 15:11:53 -0400 Subject: [PATCH] feat(extension): adicionar lembrete inteligente para iniciar tarefa ao codar sem task ativa --- vscode-extension/README.md | 3 + ...e-1.1.0.vsix => beetask-vscode-1.2.0.vsix} | Bin 55844 -> 56694 bytes vscode-extension/package.json | 12 ++- vscode-extension/src/idleDetector.ts | 100 ++++++++++++++++-- 4 files changed, 106 insertions(+), 9 deletions(-) rename vscode-extension/{beetask-vscode-1.1.0.vsix => beetask-vscode-1.2.0.vsix} (83%) diff --git a/vscode-extension/README.md b/vscode-extension/README.md index 4ce2879..151ba3c 100644 --- a/vscode-extension/README.md +++ b/vscode-extension/README.md @@ -8,6 +8,7 @@ Extensão oficial do **BeeTask** para o Visual Studio Code. Gerencie suas demand - **⏱️ Cronômetro em Tempo Real:** Acompanhe o tempo trabalhado na tarefa ativa direto na Barra de Status (rodapé do VS Code). - **🛑 Pausa Automática por Inatividade (10min):** Se você se ausentar do VS Code por mais de 10 minutos com uma tarefa rodando, a extensão pausa o cronômetro automaticamente e pergunta se você ainda está trabalhando nela ao retornar. +- **💡 Lembrete de Início de Tarefa:** Se você começar a editar código sem nenhuma tarefa ativa, a extensão lembra de forma sutil e pergunta qual tarefa você vai trabalhar. - **📋 Painel de Tarefas na Barra Lateral:** Visualize rapidamente suas tarefas pendentes, em execução e concluídas na aba BeeTask. - **▶️ Play / ⏸️ Pause com 1 Clique:** Inicie e pause o cronômetro das suas tarefas direto do VS Code. - **➕ Criação Rápida de Tarefas:** Crie novas tarefas associadas a projetos e categorias sem sair do editor. @@ -81,3 +82,5 @@ Acesse `Configurações` (`Ctrl+,`) e busque por `BeeTask`: - `beetask.refreshIntervalSeconds`: Intervalo de sincronização automática em segundos (Padrão: `30`). - `beetask.enableIdleDetection`: Ativar pausa automática da tarefa por inatividade (Padrão: `true`). - `beetask.idleTimeoutMinutes`: Tempo limite de inatividade em minutos (Padrão: `10`). +- `beetask.enableNoActiveTaskPrompt`: Lembrar de iniciar tarefa ao começar a codar (Padrão: `true`). +- `beetask.noActiveTaskCooldownMinutes`: Intervalo mínimo entre lembretes em minutos (Padrão: `15`). diff --git a/vscode-extension/beetask-vscode-1.1.0.vsix b/vscode-extension/beetask-vscode-1.2.0.vsix similarity index 83% rename from vscode-extension/beetask-vscode-1.1.0.vsix rename to vscode-extension/beetask-vscode-1.2.0.vsix index 04eb3346755b6fd4abdca4b31d7ebf7950412286..aef598e41d7e11ac007bf743dba3ee87cb4205c5 100644 GIT binary patch delta 6902 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 this.recordActivity()) + vscode.workspace.onDidChangeTextDocument((e) => { + // Ignora alterações em esquemas que não sejam arquivos reais (ex: output, git, etc) + if (e.document.uri.scheme === 'file') { + this.recordActivity(true); + } else { + this.recordActivity(false); + } + }) ); // 2. Movimentação de cursor ou seleção de texto this.disposables.push( - vscode.window.onDidChangeTextEditorSelection(() => this.recordActivity()) + vscode.window.onDidChangeTextEditorSelection(() => this.recordActivity(false)) ); // 3. Troca de arquivo / aba ativa this.disposables.push( - vscode.window.onDidChangeActiveTextEditor(() => this.recordActivity()) + vscode.window.onDidChangeActiveTextEditor(() => this.recordActivity(false)) ); // 4. Rolagem da página (scroll) this.disposables.push( - vscode.window.onDidChangeTextEditorVisibleRanges(() => this.recordActivity()) + vscode.window.onDidChangeTextEditorVisibleRanges(() => this.recordActivity(false)) ); // 5. Salvamento de arquivo this.disposables.push( - vscode.workspace.onDidSaveTextDocument(() => this.recordActivity()) + vscode.workspace.onDidSaveTextDocument((doc) => { + if (doc.uri.scheme === 'file') { + this.recordActivity(true); + } else { + this.recordActivity(false); + } + }) ); // 6. Janela do VS Code ganhou foco this.disposables.push( vscode.window.onDidChangeWindowState((state) => { if (state.focused) { - this.recordActivity(); + this.recordActivity(false); } }) ); } + private scheduleNoActiveTaskCheck(): void { + if (this.pendingActivityTimer) return; + + // Aguarda 3 segundos de digitação contínua para exibir o lembrete de forma suave + this.pendingActivityTimer = setTimeout(async () => { + this.pendingActivityTimer = null; + await this.checkNoActiveTask(); + }, 3000); + } + + private async checkNoActiveTask(): Promise { + const config = vscode.workspace.getConfiguration('beetask'); + const enabled = config.get('enableNoActiveTaskPrompt', true); + const cooldownMinutes = config.get('noActiveTaskCooldownMinutes', 15); + + if (!enabled || this.isPromptingNoActive || this.isPrompting) { + return; + } + + const isAuth = await this.authManager.isAuthenticated(); + if (!isAuth) { + return; + } + + const activeTask = this.statusBar.getActiveTask(); + if (activeTask) { + // Já está com uma tarefa rodando, nada a fazer + return; + } + + const now = Date.now(); + if (now - this.lastNoActivePromptTime < cooldownMinutes * 60000) { + return; // Ainda dentro do período de cooldown + } + + this.isPromptingNoActive = true; + this.lastNoActivePromptTime = now; + + try { + const choice = await vscode.window.showInformationMessage( + '🐝 BeeTask: Você começou a mexer no código sem nenhuma tarefa ativa. Qual demanda você está trabalhando?', + 'Selecionar Tarefa', + 'Criar Nova Tarefa', + 'Lembrar mais tarde' + ); + + if (choice === 'Selecionar Tarefa') { + await vscode.commands.executeCommand('beetask.startTask'); + } else if (choice === 'Criar Nova Tarefa') { + await vscode.commands.executeCommand('beetask.createTask'); + } + } catch (err: any) { + console.error('[BeeTask] Erro ao exibir lembrete de tarefa ativa:', err); + } finally { + this.isPromptingNoActive = false; + } + } + private startPeriodicCheck(): void { // Checa a cada 15 segundos this.checkInterval = setInterval(async () => { @@ -158,6 +238,10 @@ export class IdleDetector implements vscode.Disposable { } public dispose(): void { + if (this.pendingActivityTimer) { + clearTimeout(this.pendingActivityTimer); + this.pendingActivityTimer = null; + } if (this.checkInterval) { clearInterval(this.checkInterval); this.checkInterval = null;