feat: add reminders page, BMad skills upgrade, MCP server refactor

- Add reminders page with navigation support
- Upgrade BMad builder module to skills-based architecture
- Refactor MCP server: extract tools and auth into separate modules
- Add connections cache, custom AI provider support
- Update prisma schema and generated client
- Various UI/UX improvements and i18n updates
- Add service worker for PWA support

Made-with: Cursor
This commit is contained in:
Sepehr Ramezani
2026-04-13 21:02:53 +02:00
parent 18ed116e0d
commit fa7e166f3e
3099 changed files with 397228 additions and 14584 deletions

View File

@@ -76,7 +76,7 @@ export function AutoLabelSuggestionDialog({
}
} catch (error) {
console.error('Failed to fetch label suggestions:', error)
toast.error('Failed to fetch label suggestions')
toast.error(t('ai.autoLabels.error'))
onOpenChange(false)
} finally {
setLoading(false)
@@ -95,7 +95,7 @@ export function AutoLabelSuggestionDialog({
const handleCreateLabels = async () => {
if (!suggestions || selectedLabels.size === 0) {
toast.error('No labels selected')
toast.error(t('ai.autoLabels.noLabelsSelected'))
return
}
@@ -114,18 +114,15 @@ export function AutoLabelSuggestionDialog({
const data = await response.json()
if (data.success) {
toast.success(
t('ai.autoLabels.created', { count: data.data.createdCount }) ||
`${data.data.createdCount} labels created successfully`
)
toast.success(t('ai.autoLabels.created', { count: data.data.createdCount }))
onLabelsCreated()
onOpenChange(false)
} else {
toast.error(data.error || 'Failed to create labels')
toast.error(data.error || t('ai.autoLabels.error'))
}
} catch (error) {
console.error('Failed to create labels:', error)
toast.error('Failed to create labels')
toast.error(t('ai.autoLabels.error'))
} finally {
setCreating(false)
}
@@ -188,7 +185,7 @@ export function AutoLabelSuggestionDialog({
{t('ai.autoLabels.notesCount', { count: label.count })}
</span>
<span className="text-xs px-2 py-0.5 rounded-full bg-primary/10 text-primary">
{Math.round(label.confidence * 100)}% confidence
{Math.round(label.confidence * 100)}% {t('notebook.confidence')}
</span>
</div>
</div>