Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
173 commits
Select commit Hold shift + click to select a range
3aac853
Initial commit
FPSZ Mar 6, 2026
5295d98
feat: bootstrap Memori-Vault core backend with Graph-RAG storage and …
FPSZ Mar 6, 2026
1e26e07
Merge branch 'main' of https://github.com/FPSZ/Memori-Vault
FPSZ Mar 6, 2026
0e49270
feat: integrate tauri desktop shell and react ui for phase 3
FPSZ Mar 6, 2026
fc455ca
chore: remove UI and plan docs from repository
FPSZ Mar 6, 2026
4bd8556
chore: remove AI.md from repository
FPSZ Mar 6, 2026
734fb2d
更新
FPSZ Mar 6, 2026
46a0d8a
ci: install linux tauri dependencies for ubuntu runner
FPSZ Mar 7, 2026
724f38c
fix(desktop): add linux icon asset for tauri generate_context
FPSZ Mar 7, 2026
1d7f44b
feat: polish desktop source cards and markdown preview
FPSZ Mar 7, 2026
ae32232
fix: reliably reveal source file in explorer
FPSZ Mar 7, 2026
98a5423
feat: show top-20 sources and hide result scrollbar
FPSZ Mar 7, 2026
8389624
feat: recursively backfill watch root and handle renamed events
FPSZ Mar 7, 2026
56ec8ad
style: run rustfmt on memori-core
FPSZ Mar 7, 2026
a085c12
feat: redesign settings drawer with i18n personalization and AI ranking
FPSZ Mar 8, 2026
476b68f
fix: satisfy clippy warnings in desktop lib
FPSZ Mar 8, 2026
963ecab
feat: add cross-platform installer pipeline and configurable retrieva…
FPSZ Mar 8, 2026
6b3fc0b
ci: auto-draft desktop release from tauri version
FPSZ Mar 8, 2026
ee7a107
ci: fix desktop release workflow yaml parse error
FPSZ Mar 8, 2026
d9d01b1
docs: set english CONTRIBUTING as default and untrack local scripts
FPSZ Mar 8, 2026
495ee28
ci: limit release assets to installers and signatures
FPSZ Mar 8, 2026
4bcccdd
ci: support both tauri bundle output paths in artifact upload
FPSZ Mar 8, 2026
232237f
fix(core): persist embeddings before graph extraction to avoid zero s…
FPSZ Mar 8, 2026
57ed710
feat: ship dark/light theme system and settings UX polish
FPSZ Mar 9, 2026
aa1068e
feat(ui): polish settings visuals and unify interaction motion
FPSZ Mar 9, 2026
557f7c7
fix(core): update daemon example for scoped search signature
FPSZ Mar 9, 2026
4597c1e
feat: async indexing controls, query timing UI, and docs sync
FPSZ Mar 9, 2026
1a46234
feat: refine search bar behavior, window state persistence, and icon …
FPSZ Mar 9, 2026
39cbedc
chore: apply rustfmt for CI
FPSZ Mar 9, 2026
f4d49c8
Delete RELEASE_NOTES_v0.1.0.md
FPSZ Mar 9, 2026
0ffd7ce
release: prepare v0.2.0 with enterprise APIs, docs, and UI polish
FPSZ Mar 9, 2026
6142c3a
chore: ignore local .claude settings
FPSZ Mar 9, 2026
0bece8f
chore: harden release checks and indexing cleanup flows
FPSZ Mar 9, 2026
90374d1
fix: stabilize indexing and improve source previews
FPSZ Mar 10, 2026
9024f5c
chore: apply rustfmt and fix collapsed search bar theme
FPSZ Mar 10, 2026
aa5d83c
fix: satisfy clippy collapsible-if in watcher
FPSZ Mar 10, 2026
ea3616b
chore: add rustfmt auto workflow
FPSZ Mar 10, 2026
0685b2e
feat: land retrieval validation and local-first policy updates
FPSZ Mar 11, 2026
cff0757
fix storage schema upgrade and refresh regression tooling
FPSZ Mar 11, 2026
65a3f3b
refactor: split core and storage internal modules
FPSZ Mar 11, 2026
77e5cf2
fix: robust schema migration for legacy databases and CJK search
FPSZ Mar 11, 2026
0dd19a8
refactor: split storage modules and update desktop/ui/scripts
FPSZ Mar 11, 2026
d581f3f
fix: improve mixed-script retrieval and citation UX
FPSZ Mar 11, 2026
deab040
feat: refine desktop answer panel presentation
FPSZ Mar 12, 2026
29add17
style: format rust sources
FPSZ Mar 12, 2026
9bd3844
docs: sync current runtime and usability status
FPSZ Mar 12, 2026
9ccf890
feat: polish citation and evidence labels
FPSZ Mar 12, 2026
4519a95
修复了检索功能中的一个错误,确保在处理查询时正确地匹配和返回相关结果。
FPSZ Mar 12, 2026
533f29d
更新
FPSZ Mar 12, 2026
1f480d0
refactor(desktop,ui): split desktop lib and App into domain modules
FPSZ Mar 12, 2026
dc9cbaf
refactor(server): extract shared state and dto types from main
FPSZ Mar 12, 2026
dfa4a5e
refactor(server): extract settings and model runtime helpers
FPSZ Mar 12, 2026
b2853a8
refactor(server): split auth and audit helpers from main
FPSZ Mar 12, 2026
6a0c12b
refactor(server): move handlers into route modules and router builder
FPSZ Mar 12, 2026
d86d8d5
1
FPSZ Mar 12, 2026
96c88d0
release: bump version to 0.3.0 and sync docs
FPSZ Mar 12, 2026
9f879de
refactor(ui): split app shell and settings modal into modular layout
FPSZ Mar 13, 2026
72004f0
refactor(ui): extract app side-effects into dedicated hooks
FPSZ Mar 13, 2026
5bd4f6a
chore: migrate ui workflows and docs to pnpm
FPSZ Mar 13, 2026
d746bd5
ci: install pnpm explicitly in GitHub Actions
FPSZ Mar 13, 2026
d93ba53
修复
FPSZ Mar 13, 2026
082861a
修复
FPSZ Mar 13, 2026
a68702f
修复
FPSZ Mar 13, 2026
ce05d82
修复
FPSZ Mar 13, 2026
8d9de1e
修复
FPSZ Mar 13, 2026
a9b3fba
feat: 后端优化 - 阶段一基础设施
MonkeyCode-AI Mar 20, 2026
69d5241
feat: 后端优化 - 阶段二、三
MonkeyCode-AI Mar 20, 2026
235ddc0
feat: 后端优化 - 阶段四熔断机制
MonkeyCode-AI Mar 20, 2026
e63a4c7
feat: 后端优化 - 阶段五配置迁移
MonkeyCode-AI Mar 20, 2026
3fcc240
feat: 后端优化 - 阶段六核心文件拆分(预备)
MonkeyCode-AI Mar 20, 2026
730a940
docs: 更新后端优化任务列表进度
MonkeyCode-AI Mar 20, 2026
a8d3350
chore: ignore .monkeycode directory
MonkeyCode-AI Mar 20, 2026
3befece
new
FPSZ Apr 1, 2026
1859313
docs: rewrite README with local-first verifiable positioning
FPSZ Apr 24, 2026
7f4d7fc
docs(README): rewrite with customer-facing value proposition
FPSZ Apr 24, 2026
eecd285
fix(fmt): apply rustfmt corrections; switch README/CONTRIBUTING defau…
FPSZ Apr 24, 2026
6f02a0a
feat: 侧边栏文件树、文件预览、图谱面板与后端修复
FPSZ Apr 25, 2026
b262788
chore: prepare v0.4.0 release
FPSZ Apr 26, 2026
9456600
fix: satisfy latest clippy lints
FPSZ Apr 26, 2026
377c0fe
fix: satisfy ci clippy on core
FPSZ Apr 26, 2026
c200fd0
ci: skip tauri frontend rebuild in release
FPSZ Apr 27, 2026
68ad862
feat: add advanced model runtime controls
FPSZ Apr 27, 2026
3430fdb
feat: 模型设置页重构 + 索引进度条 + 日志精简
FPSZ Apr 28, 2026
1f51004
fix: 日志精确筛选 + 分段式索引进度条 + 阶段ETA
FPSZ Apr 28, 2026
24683b9
Improve document indexing and model configuration
FPSZ Apr 28, 2026
51ee61a
Update project application document
FPSZ Apr 29, 2026
049fcc0
Add memory test corpora
FPSZ Apr 29, 2026
a94bb41
Improve local model indexing and settings workflow
FPSZ Apr 29, 2026
c021785
Fix CI formatting and clippy warnings
FPSZ Apr 29, 2026
bef5100
Fix indexing status and unify settings save action
FPSZ Apr 29, 2026
1659cc1
Align settings save action with tab title
FPSZ Apr 29, 2026
1a9887a
文件修改
FPSZ Apr 29, 2026
9d05110
Release Memori-Vault 1.0.0
FPSZ Apr 29, 2026
b99f47b
Improve retrieval and settings diagnostics
FPSZ Apr 30, 2026
d47d0c0
refactor: split core modules and improve compound retrieval
FPSZ Apr 30, 2026
79a803e
Merge remote-tracking branch 'origin/dev' into dev
FPSZ Apr 30, 2026
5e3c6d8
release: bump version to 1.0.2
FPSZ May 5, 2026
efbe2ec
release: fix v1.0.2 release metadata
FPSZ May 6, 2026
cd8fe47
chore: sync logo, sidebar, and eval workspace state
FPSZ May 7, 2026
ccf8354
refactor: split App.tsx into useApp* hooks; fix TrustPanel collapsibl…
FPSZ May 9, 2026
797c5f3
feat(desktop): 支持在软件内停止外部运行的本地模型
FPSZ Jun 2, 2026
a4cdd2e
docs: 新增改进清单与一键启动脚本
FPSZ Jun 2, 2026
6cd74c8
fix: harden server auth and model settings
FPSZ Jun 2, 2026
7ef34a4
feat: support remote model presets
FPSZ Jun 2, 2026
1f2a52f
feat: improve remote model configuration
FPSZ Jun 2, 2026
006d3f5
fix: align remote key field layout
FPSZ Jun 2, 2026
d5131e8
修正远程模型协议配置逻辑
FPSZ Jun 2, 2026
f043a07
修复远程协议提交中误带入的重排字段
FPSZ Jun 2, 2026
adba06a
修复配置文件 BOM 导致 MCP 无法启用
FPSZ Jun 2, 2026
caaaea1
完善远程模型协议配置
FPSZ Jun 3, 2026
8eae201
修复 OIDC 验签并拆分 MCP 大文件
FPSZ Jun 3, 2026
918fea9
拆分模型配置大文件
FPSZ Jun 3, 2026
89fe6ee
重做远程模型配置协议与地址规则
FPSZ Jun 3, 2026
adf1a55
检索核心接入重排与精度评估
FPSZ Jun 4, 2026
91cc727
完善检索回归测试与语义用例
FPSZ Jun 4, 2026
d26eff1
接入桌面端重排运行时与回归命令
FPSZ Jun 4, 2026
4dc88f3
新增检索回归可视化面板
FPSZ Jun 4, 2026
d0ae530
新增检索回归指标台账
FPSZ Jun 4, 2026
915ed87
清理临时测试产物和本地诊断文件
FPSZ Jun 4, 2026
0de518b
完善远程模型配置与检索回归修复
FPSZ Jun 4, 2026
6e3a103
修正检索回归评测的共享事实卡口径
FPSZ Jun 5, 2026
06f891e
检索精度修复与 v1.5.0:拒答正确率 0.56→0.91
FPSZ Jun 5, 2026
b307937
新增检索能力跨版本对比图(大厂 benchmark 风,自包含 HTML)
FPSZ Jun 5, 2026
5c14d04
同步进度:能力对比图改名 + 检索文档更新
FPSZ Jun 5, 2026
6ad4efa
release: 发布 Memori-Vault 1.5.0
FPSZ Jun 5, 2026
6127c6b
ci: 修复 1.5.0 发布文档校验
FPSZ Jun 5, 2026
04481ab
ci: 修复 Rust 1.96 clippy 循环告警
FPSZ Jun 5, 2026
9bd301b
ci: 修复回归报告排序 clippy 告警
FPSZ Jun 5, 2026
25654ec
解析器扩展到 9 种格式:新增 pptx/xlsx + 老格式 doc/ppt/xls
FPSZ Jun 7, 2026
b7186af
索引护栏:文件大小上限 + 每文档 chunk 数上限
FPSZ Jun 7, 2026
22064fc
评测语料 v2 困难基准 + harness 耗时指标 + 图谱构建速度 bench
FPSZ Jun 7, 2026
1407efd
退役 v1 测试语料:untrack doc_001~100 + 旧生成器 + 问答卡(本地保留)
FPSZ Jun 7, 2026
f3dd6c9
图谱构建提速:精简 schema + 约束解码 + 并发 2→4(实测 4-5×)
FPSZ Jun 7, 2026
f837894
版本号 1.5.0 → 1.5.2 + 能力对比图新增「图谱构建」面板
FPSZ Jun 7, 2026
53cdc24
fix(rerank): default to bge-reranker-v2-m3 across code/UI/docs
FPSZ Jun 8, 2026
9c5f77f
fix(retrieval): harden refuse gating for PII/injection + fix harness …
FPSZ Jun 8, 2026
154372f
feat(retrieval-eval): add English + cross-lingual coverage to v2 hard…
FPSZ Jun 9, 2026
112f5f7
docs(planning): 对齐现实重写 IMPROVEMENTS + plan 转入 Phase 9 工程硬化
FPSZ Jun 10, 2026
5a45a14
docs(audit): 全项目体检 PROJECT_AUDIT_2026-06-10 + backlog 补 E12-14
FPSZ Jun 10, 2026
46ae244
chore(gitignore): 忽略 email-memory-source 计划文档(保留本地不入库)
FPSZ Jun 10, 2026
c152872
refactor(ui): 合并重复 model-helper,删 models-helpers.ts (审计D1/E1)
FPSZ Jun 10, 2026
75ce914
feat(ui): 顶层 React ErrorBoundary 防整页白屏 (审计F1/E12)
FPSZ Jun 10, 2026
f2e298a
fix(server): CORS methods/headers 从 Any 收成白名单 (审计S4/E3)
FPSZ Jun 10, 2026
c32aa6d
feat(server): 会话登出端点 + 活跃会话上限 (审计S3/E2)
FPSZ Jun 10, 2026
4f72429
docs(audit): 标记本轮已修(D1/F1/S4/S3)+对应 commit
FPSZ Jun 10, 2026
c6aa666
ci(matrix): 跨平台矩阵 + 依赖漏洞扫描 (审计C1/C2/E13)
FPSZ Jun 10, 2026
4b6bc35
docs(audit): 标记 C1/C2 已修 + 对应 commit c6aa666
FPSZ Jun 10, 2026
17e5987
docs(readme): 成熟度对齐 ✅/🚧/📐 (审计H1/E8)
FPSZ Jun 10, 2026
c7a7d73
feat(keychain): API key 接 OS keychain + 审计写失败升级 error (审计S1/S5/E14)
FPSZ Jun 10, 2026
254d749
feat(server): 接口限流 + request-id/trace + OpenAPI 端点 (审计S2/G2/G1/E5/E6)
FPSZ Jun 13, 2026
7b2ea84
perf(core): 50k 规模检索压测 harness + 基线 (审计P2/P1/E7)
FPSZ Jun 13, 2026
74b2a85
test(ci): 检索指标离线确定性质量门 (审计D2/E4)
FPSZ Jun 13, 2026
9380c02
docs(audit): 标记本批已修 (S2/G2/G1/E5/E6 + P2/P1/E7 + D2/E4)
FPSZ Jun 13, 2026
83ec3ff
chore(lint): CI clippy/test 升级 --all-targets + 修测试代码既有 lint
FPSZ Jun 13, 2026
c8becd6
perf(storage): P1 单连接锁改造 — WAL + 只读连接池(读写分离)
FPSZ Jun 13, 2026
53cae1c
test(server): HTTP 层端到端集成测试(限流/request-id/openapi)
FPSZ Jun 13, 2026
29ec8be
fix(desktop): open/preview 文件加 watch_root 越权校验 (审计S6)
FPSZ Jun 13, 2026
b937fab
feat(core): Q3 作答层 LLM-judge 评测闭环
FPSZ Jun 13, 2026
14116b6
docs(audit): 标记 P1/S6/Q3/工程硬化已修 + 修复台账表结构错位
FPSZ Jun 13, 2026
7b978f5
perf(storage): dense 检索预存向量模,消除内层重复开方(精确无损)
FPSZ Jun 13, 2026
ea83deb
docs: 限流器进程内限制 + 只读连接池 env + 单 GPU 多模型显存提示
FPSZ Jun 13, 2026
c5259a3
refactor(ui): markdown 插件去 any/unknown[],收敛为 MarkdownPlugins 类型 (审计F2)
FPSZ Jun 13, 2026
45a4ad6
docs(planning): 按提交核实重写 plan 现状 — E1–E8 全勾 + 未做项标卡点
FPSZ Jun 13, 2026
936ed16
docs(handoff): 新增交接说明 + AI 分支护栏(AGENTS/CLAUDE)
FPSZ Aug 7, 2026
cac8442
feat(server): ask 链路补默认级别 trace 事件并关联审计 request-id
FPSZ Aug 14, 2026
8d7eaa2
fix: 修复 workspace clippy 警告(parser match 折叠、core format 冗余引用)
FPSZ Aug 14, 2026
f764abe
fix(server): 服务器模式应用 index_filter 索引筛选(对齐桌面端行为)
FPSZ Aug 14, 2026
3ccae63
fix(core): 修复 /v1 端点重复拼接与回归探活冷启动假失败
FPSZ Aug 24, 2026
3fcbbbd
docs(qa): 新增作答层 LLM-judge 首个基线(126 题实跑)
FPSZ Aug 24, 2026
083c16e
feat(server): 新增 Swagger UI 交互式 API 文档页
FPSZ Aug 24, 2026
69304d8
feat(parser): OCR 图片/扫描件可检索(tesseract 集成 + settings 持久化)
FPSZ Aug 25, 2026
af6ba4f
perf(scale): 压测 harness 支持续跑与断言,新增 50k CI 复跑 workflow
FPSZ Sep 8, 2026
c2f2be8
合并 main 的 Initial commit 以建立共同祖先,打通 collab→main 的 PR
FPSZ Sep 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# 二进制语料 / 测试 fixture:禁止任何行尾转换,避免 checkout 时损坏
*.pdf binary
*.docx binary
*.xlsx binary
*.pptx binary
*.doc binary
*.ppt binary
*.xls binary
*.png binary
*.jpg binary
*.gguf binary
235 changes: 235 additions & 0 deletions .github/workflows/desktop-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
name: Desktop Release

on:
workflow_dispatch:
inputs:
publish:
description: "Publish release instead of keeping it as draft"
required: false
default: "false"
type: choice
options:
- "false"
- "true"
push:
tags:
- "v*"

concurrency:
group: desktop-release-${{ github.ref }}
cancel-in-progress: false

permissions:
contents: write

jobs:
build:
name: Build ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: Windows
os: windows-latest
artifact: windows
- name: Linux
os: ubuntu-22.04
artifact: linux
- name: macOS
os: macos-latest
artifact: macos

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
run_install: false

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "pnpm"
cache-dependency-path: ui/pnpm-lock.yaml

- name: Install Linux system dependencies (Tauri/WebKit/GTK)
if: runner.os == 'Linux'
run: |
sudo apt-get update
if apt-cache show libwebkit2gtk-4.1-dev >/dev/null 2>&1; then
WEBKIT_DEV_PKG=libwebkit2gtk-4.1-dev
else
WEBKIT_DEV_PKG=libwebkit2gtk-4.0-dev
fi

sudo apt-get install -y \
pkg-config \
patchelf \
libglib2.0-dev \
libgirepository1.0-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libsoup-3.0-dev \
"$WEBKIT_DEV_PKG"

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Restore Rust cache
uses: Swatinem/rust-cache@v2

- name: Install Tauri CLI
run: cargo install tauri-cli --version "^2.0" --locked

- name: Install frontend dependencies
run: pnpm --dir ui install --frozen-lockfile

- name: Validate version metadata
shell: bash
run: |
WORKSPACE_VERSION=$(python - <<'PY'
import pathlib, re
text = pathlib.Path('Cargo.toml').read_text(encoding='utf-8')
match = re.search(r'(?ms)^\[workspace\.package\]\s+.*?^version\s*=\s*"([^"]+)"', text)
if not match:
raise SystemExit('Failed to read workspace version from Cargo.toml')
print(match.group(1))
PY
)
UI_VERSION=$(python - <<'PY'
import json, pathlib
print(json.loads(pathlib.Path('ui/package.json').read_text(encoding='utf-8'))['version'])
PY
)
TAURI_VERSION=$(python - <<'PY'
import json, pathlib
print(json.loads(pathlib.Path('memori-desktop/tauri.conf.json').read_text(encoding='utf-8'))['version'])
PY
)
RELEASE_NOTES_PATH="docs/release/RELEASE_NOTES_v${WORKSPACE_VERSION}.md"

if [ "$WORKSPACE_VERSION" != "$UI_VERSION" ] || [ "$WORKSPACE_VERSION" != "$TAURI_VERSION" ]; then
echo "Version mismatch detected among Cargo workspace, ui/package.json, and memori-desktop/tauri.conf.json"
exit 1
fi

if [ ! -f "$RELEASE_NOTES_PATH" ]; then
echo "Missing release notes file: $RELEASE_NOTES_PATH"
exit 1
fi

- name: Build frontend
run: pnpm --dir ui run build

- name: Build desktop bundle
working-directory: memori-desktop
run: cargo tauri build --ci --config tauri.ci.conf.json

- name: Upload bundle artifacts
uses: actions/upload-artifact@v4
with:
name: bundles-${{ matrix.artifact }}
if-no-files-found: error
path: |
target/release/bundle/**/*
memori-desktop/target/release/bundle/**/*

release:
name: Draft GitHub Release
needs: build
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/')
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Resolve release version and tag
id: release_meta
shell: bash
run: |
VERSION="$(python -c "import json;print(json.load(open('memori-desktop/tauri.conf.json', encoding='utf-8'))['version'])")"
if [[ "${GITHUB_REF:-}" == refs/tags/* ]]; then
TAG="${GITHUB_REF#refs/tags/}"
else
TAG="v${VERSION}"
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"

- name: Validate release metadata
shell: bash
run: |
WORKSPACE_VERSION=$(python - <<'PY'
import pathlib, re
text = pathlib.Path('Cargo.toml').read_text(encoding='utf-8')
match = re.search(r'(?ms)^\[workspace\.package\]\s+.*?^version\s*=\s*"([^"]+)"', text)
if not match:
raise SystemExit('Failed to read workspace version from Cargo.toml')
print(match.group(1))
PY
)
UI_VERSION=$(python - <<'PY'
import json, pathlib
print(json.loads(pathlib.Path('ui/package.json').read_text(encoding='utf-8'))['version'])
PY
)
TAURI_VERSION=$(python - <<'PY'
import json, pathlib
print(json.loads(pathlib.Path('memori-desktop/tauri.conf.json').read_text(encoding='utf-8'))['version'])
PY
)
EXPECTED_VERSION="${{ steps.release_meta.outputs.version }}"
EXPECTED_TAG="v${EXPECTED_VERSION}"
RELEASE_NOTES_PATH="docs/release/RELEASE_NOTES_v${EXPECTED_VERSION}.md"

echo "workspace version: $WORKSPACE_VERSION"
echo "ui version: $UI_VERSION"
echo "tauri version: $TAURI_VERSION"
echo "release version: $EXPECTED_VERSION"
echo "release tag: ${{ steps.release_meta.outputs.tag }}"

if [ "$WORKSPACE_VERSION" != "$UI_VERSION" ] || [ "$WORKSPACE_VERSION" != "$TAURI_VERSION" ] || [ "$WORKSPACE_VERSION" != "$EXPECTED_VERSION" ]; then
echo "Version mismatch detected among Cargo workspace, ui/package.json, memori-desktop/tauri.conf.json, and resolved release version"
exit 1
fi

if [ "${{ github.event_name }}" = "push" ] && [ "${{ steps.release_meta.outputs.tag }}" != "$EXPECTED_TAG" ]; then
echo "Tag/version mismatch: expected $EXPECTED_TAG but got ${{ steps.release_meta.outputs.tag }}"
exit 1
fi

if [ ! -f "$RELEASE_NOTES_PATH" ]; then
echo "Missing release notes file: $RELEASE_NOTES_PATH"
exit 1
fi

grep -q "Memory OS Lite" "$RELEASE_NOTES_PATH"

- name: Download all build artifacts
uses: actions/download-artifact@v4
with:
path: release-artifacts
merge-multiple: true

- name: Publish draft release assets
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.release_meta.outputs.tag }}
name: Memori-Vault ${{ steps.release_meta.outputs.version }}
draft: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.publish != 'true' }}
target_commitish: ${{ github.sha }}
body_path: docs/release/RELEASE_NOTES_v${{ steps.release_meta.outputs.version }}.md
files: |
release-artifacts/**/*.msi
release-artifacts/**/*-setup.exe
release-artifacts/**/*.dmg
release-artifacts/**/*.AppImage
release-artifacts/**/*.deb
release-artifacts/**/*.rpm
release-artifacts/**/*.sig
71 changes: 71 additions & 0 deletions .github/workflows/perf-scale.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Perf Scale

# 50k 规模压测 CI 复跑:手动触发(可调参)+ 每周日定时全量 50k。
# 结论阈值:并发 P50 / 顺序 P50(争用系数)不得超过 2.0,超标即本 run 失败。
# 报告 JSON 作为 artifact 上传:perf-scale-report-<docs>/perf_scale_ci_report.json
# 本地复跑命令见 docs/qa/PERF_SCALE_50K.md。

on:
workflow_dispatch:
inputs:
docs:
description: '文档数(默认 50000 全量;排查时可跑 10000/1000 快档)'
required: false
default: '50000'
queries:
description: '查询数'
required: false
default: '300'
max_contention_factor:
description: '争用系数门槛(默认 2.0)'
required: false
default: '2.0'
schedule:
- cron: '34 2 * * 0' # 每周日 02:34 UTC(避开整点洪峰)

concurrency:
group: perf-scale
# false:手动触发与周日定时 50k 并行时排队等待,而不是取消进行中的 2.5h 运行
# (与 desktop-release.yml 的发布型 job 先例一致)。
cancel-in-progress: false

permissions:
contents: read

jobs:
perf-scale:
name: perf-scale (docs=${{ github.event.inputs.docs || '50000' }})
runs-on: ubuntu-latest
# 50k 实测 ~2.5h(含建索引),留足编译与调度余量
timeout-minutes: 360

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Disk space check (50k DB 约 11GB,注意 runner 14GB 上限)
run: df -h .

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Restore Rust cache
uses: Swatinem/rust-cache@v2

- name: Run perf scale (offline deterministic, no rerank)
shell: bash
run: |
cargo run --release -p memori-core --example perf_scale -- \
--docs "${{ github.event.inputs.docs || '50000' }}" \
--sections 50 \
--queries "${{ github.event.inputs.queries || '300' }}" \
--concurrency 8 \
--report target/perf_scale_ci_report.json \
--max-contention-factor "${{ github.event.inputs.max_contention_factor || '2.0' }}"

- name: Upload report artifact
uses: actions/upload-artifact@v4
with:
name: perf-scale-report-${{ github.event.inputs.docs || '50000' }}
path: target/perf_scale_ci_report.json
if-no-files-found: error
Loading
Loading