Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 34 additions & 6 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: monthly
interval: "cron"
cronjob: "0 4 1 * *"
timezone: "Asia/Shanghai"
cooldown:
default-days: 7
open-pull-requests-limit: 5
groups:
actions:
Expand All @@ -12,7 +16,14 @@ updates:
- package-ecosystem: npm
directory: /frontend
schedule:
interval: monthly
interval: "cron"
cronjob: "0 4 1 * *"
timezone: "Asia/Shanghai"
cooldown:
default-days: 7
semver-major-days: 14
semver-minor-days: 7
semver-patch-days: 3
open-pull-requests-limit: 5
ignore:
# TypeScript 7 drops the `typescript/lib/tsc` subpath export; vue-tsc and the
Expand All @@ -30,20 +41,37 @@ updates:
- package-ecosystem: pip
directory: /
schedule:
interval: monthly
interval: "cron"
cronjob: "0 4 1 * *"
timezone: "Asia/Shanghai"
cooldown:
default-days: 7
semver-major-days: 14
semver-minor-days: 7
semver-patch-days: 3
open-pull-requests-limit: 5
groups:
pip-minor-patch:
patterns: ["*"]
update-types: ["minor", "patch"]

# --- 以下为补充配置 ---
# Docker 基础镜像
- package-ecosystem: docker
directory: /
schedule:
interval: monthly
interval: "cron"
cronjob: "0 4 1 * *"
timezone: "Asia/Shanghai"
cooldown:
default-days: 7
ignore:
- dependency-name: python
update-types: ["version-update:semver-major", "version-update:semver-minor"]
- package-ecosystem: docker-compose
directory: /
schedule:
interval: monthly
interval: "cron"
cronjob: "0 4 1 * *"
timezone: "Asia/Shanghai"
cooldown:
default-days: 7
3 changes: 2 additions & 1 deletion frontend/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ onBeforeUnmount(() => {
:aria-label="locale === 'zh' ? 'Switch to English' : '切换到中文'"
@click="toggleLocale"
>
{{ locale === 'zh' ? '🌐 EN' : '🌐 中文' }}
<svg class="icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>
<span class="lang-label">{{ locale === 'zh' ? 'EN' : '中文' }}</span>
</button>
<NBadge :value="unreadCount" :show="unreadCount > 0">
<button type="button" class="icon-button" :aria-label="tr('收件箱', 'Inbox')" @click="router.push('/inbox')">
Expand Down
7 changes: 4 additions & 3 deletions frontend/src/components/AgendaDetail.vue
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ const extractStatus = computed(() => {
if (!extractCounts.value) return ''
const { decisions, actions, questions } = extractCounts.value
return locale.value === 'en'
? `✨ Extracted ${decisions} decisions · ${actions} actions · ${questions} open questions`
: `✨ 已智能提炼 ${decisions} 项决策 · ${actions} 项行动 · ${questions} 项开放问题`
? `Extracted ${decisions} decisions · ${actions} actions · ${questions} open questions`
: `已智能提炼 ${decisions} 项决策 · ${actions} 项行动 · ${questions} 项开放问题`
})
const error = ref('')
const conflict = ref<{ version: number; server: string } | null>(null)
Expand Down Expand Up @@ -524,7 +524,8 @@ const noteActionTags = computed(() => {
:disabled="saving || disabled || extractingNotes"
@click="smartExtractNotes"
>
✨ {{ extractingNotes ? tr('正在提炼…', 'Extracting…') : tr('AI 智能提炼', 'AI Extract') }}
<svg class="icon" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"/></svg>
<span>{{ extractingNotes ? tr('正在提炼…', 'Extracting…') : tr('AI 智能提炼', 'AI Extract') }}</span>
</button>
</template>
<template #editor="{ disabled, registerEditor }">
Expand Down
29 changes: 11 additions & 18 deletions frontend/src/components/FocusMode.vue
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,6 @@ const noteActionTags = computed(() => {
<span class="live-time-text">{{ liveElapsed || tr('进行中', 'Live') }}</span>
</div>
<div class="focus-meeting-title">
<span class="project-pill">{{ translateSeededText(meeting.project.name) }}</span>
<strong>{{ translateSeededText(meeting.title) }}</strong>
</div>
</div>
Expand Down Expand Up @@ -416,7 +415,8 @@ const noteActionTags = computed(() => {
:aria-label="tr('切换语言', 'Switch Language')"
@click="toggleLocale"
>
🌐 {{ locale === 'zh' ? 'EN' : '中文' }}
<svg class="icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>
<span class="lang-label">{{ locale === 'zh' ? 'EN' : '中文' }}</span>
</button>

<button type="button" class="focus-exit-btn" @click="exitFocus" :title="tr('退出专注模式 (Esc)', 'Exit Focus Mode (Esc)')">
Expand All @@ -437,10 +437,10 @@ const noteActionTags = computed(() => {
</span>
</div>
<p v-if="locale === 'zh'" class="syntax-guide-pill">
💡 支持在手记中直接输入 <code>@决策: 结论</code>、<code>@行动:[待办][@成员][日期] 事项</code>、<code>@开放问题: 待确认</code> 自动双向流转产出。
支持在手记中直接输入 <code>@决策: 结论</code>、<code>@行动:[待办][@成员][日期] 事项</code>、<code>@开放问题: 待确认</code> 自动双向流转产出。
</p>
<p v-else class="syntax-guide-pill">
💡 Type <code>@Decision: conclusion</code>, <code>@Action:[open][@owner][date] task</code>, or <code>@Question: item</code> to auto-sync outcomes.
Type <code>@Decision: conclusion</code>, <code>@Action:[open][@owner][date] task</code>, or <code>@Question: item</code> to auto-sync outcomes.
</p>
<div class="quick-tag-toolbar" v-if="canContribute">
<span class="quick-tag-label">{{ tr('快捷标签:', 'Quick Tags:') }}</span>
Expand All @@ -454,7 +454,8 @@ const noteActionTags = computed(() => {
:disabled="saving || extracting"
@click="smartExtractFocusNotes"
>
✨ {{ extracting ? tr('正在提炼…', 'Extracting…') : tr('AI 智能提炼', 'AI Extract') }}
<svg class="icon" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"/></svg>
<span>{{ extracting ? tr('正在提炼…', 'Extracting…') : tr('AI 智能提炼', 'AI Extract') }}</span>
</button>
</div>
</div>
Expand Down Expand Up @@ -680,25 +681,14 @@ const noteActionTags = computed(() => {
text-overflow: ellipsis;
}

.project-pill {
padding: 2px 8px;
border-radius: 6px;
background: #f1f5f9;
color: #475569;
font-size: 0.75rem;
font-weight: 700;
white-space: nowrap;
flex-shrink: 0;
}

.focus-bar-center {
display: flex;
flex-direction: column;
align-items: center;
gap: 3px;
flex: 0 1 auto;
min-width: 0;
max-width: 320px;
max-width: 360px;
}

.focus-topic-pill {
Expand All @@ -725,7 +715,7 @@ const noteActionTags = computed(() => {
.topic-title {
font-weight: 700;
color: #0f172a;
max-width: 170px;
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
Expand Down Expand Up @@ -972,6 +962,9 @@ const noteActionTags = computed(() => {
}

.tag-btn-ai {
display: inline-flex;
align-items: center;
gap: 5px;
margin-left: auto;
background: #edf7f1;
color: #075044;
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/i18n/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export const messages: Record<Locale, Record<string, string>> = {
'app.accountMenu': '账户菜单',
'app.accountSettings': '账号设置',
'app.logout': '退出登录',
'app.langToggle': '🌐 EN',
'app.langToggle': 'EN',
'sidebar.brandSub': '团队会议工作区',
'sidebar.workspaceNav': '工作区导航',
'sidebar.adminNav': '管理员导航',
Expand Down Expand Up @@ -113,7 +113,7 @@ export const messages: Record<Locale, Record<string, string>> = {
'app.accountMenu': 'Account menu',
'app.accountSettings': 'Account Settings',
'app.logout': 'Sign Out',
'app.langToggle': '🌐 中文',
'app.langToggle': '中文',
'sidebar.brandSub': 'Team Workspace',
'sidebar.workspaceNav': 'Workspace navigation',
'sidebar.adminNav': 'Admin navigation',
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/tests/focus-and-integrations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ describe('P0 Features: Bidirectional Actions, Focus Mode, Calendar & Webhooks',
},
})

expect(screen.getByText('✨ AI Extract')).toBeInTheDocument()
expect(screen.getByText('AI Extract')).toBeInTheDocument()
expect(screen.getByText('Outcomes')).toBeInTheDocument()

const notesTextarea = screen.getByLabelText('Agenda Notes')
Expand Down
5 changes: 4 additions & 1 deletion frontend/src/views/LoginView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,10 @@ async function submit() {
<section class="auth-card" aria-labelledby="login-title">
<div class="auth-card-top">
<div class="brand-mark">M</div>
<button type="button" class="lang-toggle-btn" data-action="toggle-locale" @click="toggleLocale">{{ t('app.langToggle') }}</button>
<button type="button" class="lang-toggle-btn" data-action="toggle-locale" @click="toggleLocale">
<svg class="icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>
<span class="lang-label">{{ t('app.langToggle') }}</span>
</button>
</div>
<p class="eyebrow">{{ tr('欢迎回来', 'Welcome back') }}</p>
<h2 id="login-title">{{ tr('登录 MeetFlow', 'Sign in to MeetFlow') }}</h2>
Expand Down
5 changes: 4 additions & 1 deletion frontend/src/views/RegisterView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ async function submit() {
<section class="auth-card" aria-labelledby="register-title">
<div class="auth-card-top">
<div class="brand-mark">M</div>
<button type="button" class="lang-toggle-btn" data-action="toggle-locale" @click="toggleLocale">{{ t('app.langToggle') }}</button>
<button type="button" class="lang-toggle-btn" data-action="toggle-locale" @click="toggleLocale">
<svg class="icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>
<span class="lang-label">{{ t('app.langToggle') }}</span>
</button>
</div>
<p class="eyebrow">{{ tr('加入共享工作区', 'Join shared workspace') }}</p>
<h1 id="register-title">{{ tr('申请 MeetFlow 账号', 'Request MeetFlow Account') }}</h1>
Expand Down
Loading