From efec8d49caf2a43a9ecd001c4912520e0b670b78 Mon Sep 17 00:00:00 2001 From: Elliot Chen Date: Sat, 6 Jun 2026 19:03:13 +0800 Subject: [PATCH 1/4] docs: simplify README launch highlights --- README.md | 59 ++++++++++++++----------------------------------- README.zh-CN.md | 46 ++++++++++---------------------------- 2 files changed, 28 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index bbbd1f0d..33c06a41 100644 --- a/README.md +++ b/README.md @@ -53,54 +53,27 @@ - - - - - - - - - - -
-Markdown-First Memory
-Memory is persisted as plain Markdown: visible, auditable, hand-editable, -Git-friendly, and owned by the user. -
-Lightweight Local Stack
-Install with Python. SQLite tracks runtime state; LanceDB powers vector, -BM25, and scalar-filter retrieval locally. -
-Layered Memory Model
-User memory and agent memory are first-class today. Wiki-style knowledge -is the next layer in the roadmap. -
-Self-Evolving Agents
-Agent memory can extract reusable cases and skills from repeated -experience, so workflows become smarter over time. -
-Multimodal Ingestion
-Text, image, audio, documents, PDF, HTML, and email can be parsed into -memory through the optional multimodal pipeline. +
+Self-Evolving Long-Term Memory
+Agents can reuse past cases and skills, improve from repeated workflows, +and become more proactive over time.
-Online And Offline Strategy Control
-Online extraction and offline evolution stay separate, with configurable -prompts and models at each step. Dreaming is coming next. +
+Cross-Agent + Cross-Platform
+One portable memory layer follows Claude Code, Codex, OpenClaw, Hermes, +and the next agents makers build with.
-Orthogonal Memory Scope
-Owner, memory type, and scope are independent: search by user, agent, -app, project, session, and structured filters. -
-Progressive Disclosure
-Readable memory surfaces stay simple while deeper facts, cases, and -skills remain available. +
+Markdown-First, User-Owned
+Memory is stored as readable Markdown: visible, auditable, hand-editable, +Git-friendly, and easy to bring into your own workflow.
-Modular By Design
-EverAlgo owns algorithms; EverOS owns runtime, persistence, online flows, -and offline evolution. +
+Local Runtime, Modular Algorithms
+SQLite and LanceDB keep retrieval local while EverAlgo supplies reusable +memory algorithms for online and offline evolution.
diff --git a/README.zh-CN.md b/README.zh-CN.md index 1c3d1756..c9cf5c6a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -53,45 +53,23 @@ - - - - - - - - - - -
-Markdown-First Memory
-记忆以普通 Markdown 持久化:可见、可审计、可手动编辑、Git 友好,并由用户自己拥有。 -
-Lightweight Local Stack
-用 Python 即可安装。SQLite 负责运行时状态;LanceDB 在本地提供向量、BM25 和结构化过滤检索。 -
-Layered Memory Model
-用户记忆和 Agent 记忆现在是一等公民。Wiki 式知识层是路线图中的下一层。 -
-Self-Evolving Agents
-Agent 记忆可以从重复经验中提取可复用的 cases 和 skills,让工作流随着时间变得更聪明。 -
-Multimodal Ingestion
-文本、图片、音频、文档、PDF、HTML 和邮件都可以通过可选的多模态管线解析进记忆。 +
+Self-Evolving Long-Term Memory
+Agent 可以复用过去的 cases 和 skills,从重复工作流中自我改进,并逐渐变得更加主动。
-Online And Offline Strategy Control
-在线提取和离线进化保持分离,并且每一步都可以配置 prompts 和 models。Dreaming 即将到来。 +
+Cross-Agent + Cross-Platform
+一层可携带的记忆跟随 Claude Code、Codex、OpenClaw、Hermes,以及 maker 接下来构建的 Agent。
-Orthogonal Memory Scope
-Owner、memory type 和 scope 相互独立:可以按 user、agent、app、project、session 和结构化 filters 搜索。 -
-Progressive Disclosure
-可读记忆界面保持简单,同时更深层的 facts、cases 和 skills 仍然可以被系统使用。 +
+Markdown-First, User-Owned
+记忆以可读 Markdown 存储:可见、可审计、可手动编辑、Git 友好,也方便接入自己的工作流。
-Modular By Design
-EverAlgo 负责算法;EverOS 负责运行时、持久化、在线流程和离线进化。 +
+Local Runtime, Modular Algorithms
+SQLite 和 LanceDB 让检索保持本地化;EverAlgo 提供可复用的记忆算法,支撑在线与离线进化。
From d818d6fb5f376b6200d22c3c5949bd2cb5d77d2f Mon Sep 17 00:00:00 2001 From: Elliot Chen Date: Sat, 6 Jun 2026 19:21:43 +0800 Subject: [PATCH 2/4] docs(readme): use six launch highlights --- README.md | 42 ++++++++++++++++++++++++++---------------- README.zh-CN.md | 32 ++++++++++++++++++++------------ 2 files changed, 46 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 33c06a41..caf0b463 100644 --- a/README.md +++ b/README.md @@ -53,27 +53,37 @@ - - + - - +
-Self-Evolving Long-Term Memory
-Agents can reuse past cases and skills, improve from repeated workflows, -and become more proactive over time. +
+Markdown As Source Of Truth
+All memory is persisted as .md files: readable, editable, +grep-able, Git-versioned, and openable directly in Obsidian.
-Cross-Agent + Cross-Platform
-One portable memory layer follows Claude Code, Codex, OpenClaw, Hermes, -and the next agents makers build with. +
+Local Three-Part Stack
+Markdown + SQLite + LanceDB keep vectors, BM25, and scalar filters +local. No MongoDB, Elasticsearch, or Redis required. +
+Dual-Track Memory
+Agent memory (cases / skills) and user memory +(episodes / profile) are extracted independently.
-Markdown-First, User-Owned
-Memory is stored as readable Markdown: visible, auditable, hand-editable, -Git-friendly, and easy to bring into your own workflow. +
+Multimodal Ingestion
+Text, images, audio, documents, PDFs, HTML, and email are unified into +searchable memory.
-Local Runtime, Modular Algorithms
-SQLite and LanceDB keep retrieval local while EverAlgo supplies reusable -memory algorithms for online and offline evolution. +
+Self-Evolution
+Common skills are extracted from real usage; repeated patterns become +reusable workflows, no retraining required. +
+Orthogonal Retrieval
+Search independently by user_id, agent_id, +app_id, project_id, and session_id.
diff --git a/README.zh-CN.md b/README.zh-CN.md index c9cf5c6a..042697b2 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -53,23 +53,31 @@ - - + - - +
-Self-Evolving Long-Term Memory
-Agent 可以复用过去的 cases 和 skills,从重复工作流中自我改进,并逐渐变得更加主动。 +
+Markdown As Source Of Truth
+所有记忆持久化为 .md 文件:可读、可改、可 grep、可 Git 版本化,也可直接用 Obsidian 打开。
-Cross-Agent + Cross-Platform
-一层可携带的记忆跟随 Claude Code、Codex、OpenClaw、Hermes,以及 maker 接下来构建的 Agent。 +
+Local Three-Part Stack
+Markdown + SQLite + LanceDB 在本地完成向量、BM25 和标量过滤检索,无需 MongoDB、Elasticsearch 或 Redis。 +
+Dual-Track Memory
+Agent 记忆(cases / skills)与用户记忆(episodes / profile)独立提取,互不污染。
-Markdown-First, User-Owned
-记忆以可读 Markdown 存储:可见、可审计、可手动编辑、Git 友好,也方便接入自己的工作流。 +
+Multimodal Ingestion
+文本、图像、音频、文档、PDF、HTML 和邮件统一抽取为可检索的记忆形态。
-Local Runtime, Modular Algorithms
-SQLite 和 LanceDB 让检索保持本地化;EverAlgo 提供可复用的记忆算法,支撑在线与离线进化。 +
+Self-Evolution
+从真实使用经验中自动抽取共性 skills,重复模式沉淀为可复用流程,无需重训。 +
+Orthogonal Retrieval
+按 user_idagent_idapp_idproject_idsession_id 五维独立检索。
From b67d4590bbb768c2c2f6df35741be39815ee42e4 Mon Sep 17 00:00:00 2001 From: Elliot Chen Date: Sat, 6 Jun 2026 19:36:30 +0800 Subject: [PATCH 3/4] docs(readme): use optimized banner asset --- README.md | 2 +- README.zh-CN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index caf0b463..0146fb48 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-![EverOS banner](https://github.com/EverMind-AI/EverOS/releases/download/v1.0.0/everos-readme-banner.jpg) +![EverOS banner](https://github.com/EverMind-AI/EverOS/releases/download/v1.0.0/everos-readme-banner-optimized.jpg)

X diff --git a/README.zh-CN.md b/README.zh-CN.md index 042697b2..e1540a63 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,6 +1,6 @@

-![EverOS banner](https://github.com/EverMind-AI/EverOS/releases/download/v1.0.0/everos-readme-banner.jpg) +![EverOS banner](https://github.com/EverMind-AI/EverOS/releases/download/v1.0.0/everos-readme-banner-optimized.jpg)

X From 82e93882a461e6f3fc5e7b15b514667089503c48 Mon Sep 17 00:00:00 2001 From: Elliot Chen Date: Sat, 6 Jun 2026 19:47:19 +0800 Subject: [PATCH 4/4] ci: lint pull request titles --- .github/workflows/commits.yml | 12 ++++ Makefile | 6 +- scripts/check_pr_title.py | 70 +++++++++++++++++++ .../unit/test_scripts/test_check_pr_title.py | 56 +++++++++++++++ 4 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 scripts/check_pr_title.py create mode 100644 tests/unit/test_scripts/test_check_pr_title.py diff --git a/.github/workflows/commits.yml b/.github/workflows/commits.yml index 12862334..936ce8f9 100644 --- a/.github/workflows/commits.yml +++ b/.github/workflows/commits.yml @@ -13,6 +13,18 @@ concurrency: cancel-in-progress: true jobs: + title: + name: pull request title + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Validate Conventional Commit PR title + env: + PR_TITLE: ${{ github.event.pull_request.title }} + run: make check-pr-title + messages: name: commit messages runs-on: ubuntu-latest diff --git a/Makefile b/Makefile index f862e05a..905641b5 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: help install install-deps lint docs-check check-commits check-assets check-deprecated-names check-cjk check-datetime openapi check-openapi format test integration package cov ci clean +.PHONY: help install install-deps lint docs-check check-commits check-pr-title check-assets check-deprecated-names check-cjk check-datetime openapi check-openapi format test integration package cov ci clean help: @echo "Targets:" @@ -7,6 +7,7 @@ help: @echo " lint ruff + import-linter + repo hygiene + datetime discipline + openapi drift" @echo " docs-check Validate Markdown links, use-case banners, and issue template YAML" @echo " check-commits Validate Conventional Commit subjects for a git range" + @echo " check-pr-title Validate PR title uses Conventional Commit format" @echo " check-assets Block committed images, videos, and asset/media directories" @echo " check-deprecated-names Block deprecated product names" @echo " check-cjk Scan for CJK outside the language-policy allowlist (advisory)" @@ -48,6 +49,9 @@ docs-check: check-commits: python3 scripts/check_commit_messages.py $(RANGE) +check-pr-title: + python3 scripts/check_pr_title.py + # Repository media hygiene gate. Images/videos belong in external hosting, # release artifacts, or other approved storage, then linked from docs. check-assets: diff --git a/scripts/check_pr_title.py b/scripts/check_pr_title.py new file mode 100644 index 00000000..5935b75c --- /dev/null +++ b/scripts/check_pr_title.py @@ -0,0 +1,70 @@ +"""Validate pull request titles against the EverOS Conventional Commits policy.""" + +from __future__ import annotations + +import importlib.util +import os +import sys +from pathlib import Path +from types import ModuleType + +_SCRIPT_DIR = Path(__file__).resolve().parent + + +def _load_commit_policy() -> ModuleType: + policy_path = _SCRIPT_DIR / "check_commit_messages.py" + spec = importlib.util.spec_from_file_location("_commit_message_policy", policy_path) + if spec is None or spec.loader is None: + raise RuntimeError(f"Unable to load commit policy from {policy_path}") + + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module + + +_POLICY = _load_commit_policy() +ALLOWED_TYPES = _POLICY.ALLOWED_TYPES +MAX_TITLE_LENGTH = _POLICY.MAX_TITLE_LENGTH +TITLE_RE = _POLICY.TITLE_RE + + +def validate_title(title: str) -> list[str]: + title = title.strip() + if not title: + return ["missing PR title"] + + if len(title) > MAX_TITLE_LENGTH: + return [f"PR title is {len(title)} chars; max is {MAX_TITLE_LENGTH}: {title}"] + + if not TITLE_RE.match(title): + allowed = ", ".join(ALLOWED_TYPES) + return [ + f"invalid PR title: {title}\n" + " expected: [(scope)][!]: \n" + f" allowed types: {allowed}" + ] + + return [] + + +def _title_from_args_or_env(argv: list[str]) -> str: + if argv: + return " ".join(argv) + return os.getenv("PR_TITLE", "") + + +def main(argv: list[str] | None = None) -> int: + title = _title_from_args_or_env(sys.argv[1:] if argv is None else argv) + failures = validate_title(title) + if failures: + print("Pull request title check failed:") + print("\n".join(failures)) + return 1 + + print("Pull request title follows Conventional Commits.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/unit/test_scripts/test_check_pr_title.py b/tests/unit/test_scripts/test_check_pr_title.py new file mode 100644 index 00000000..852f2a59 --- /dev/null +++ b/tests/unit/test_scripts/test_check_pr_title.py @@ -0,0 +1,56 @@ +"""Self-tests for ``scripts/check_pr_title.py``.""" + +from __future__ import annotations + +import importlib.util +import sys +from pathlib import Path + +_REPO_ROOT = Path(__file__).resolve().parents[3] +_CHECKER_PATH = _REPO_ROOT / "scripts" / "check_pr_title.py" + + +def _load_checker(): + assert _CHECKER_PATH.exists(), "PR title checker should exist" + spec = importlib.util.spec_from_file_location("_pr_title_checker", _CHECKER_PATH) + assert spec and spec.loader + mod = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = mod + spec.loader.exec_module(mod) + return mod + + +def test_conventional_pr_title_is_allowed() -> None: + checker = _load_checker() + + assert checker.validate_title("docs(readme): polish launch highlights") == [] + + +def test_bracketed_codex_pr_title_is_blocked() -> None: + checker = _load_checker() + + failures = checker.validate_title("[codex] simplify README launch highlights") + + assert len(failures) == 1 + assert "invalid PR title" in failures[0] + assert "expected: [(scope)][!]: " in failures[0] + + +def test_long_pr_title_is_blocked() -> None: + checker = _load_checker() + title = ( + "docs(readme): polish launch highlights and banner with a title that is " + "too long" + ) + + failures = checker.validate_title(title) + + assert len(failures) == 1 + assert "max is 72" in failures[0] + + +def test_main_reads_pr_title_environment(monkeypatch) -> None: + checker = _load_checker() + monkeypatch.setenv("PR_TITLE", "docs(readme): polish launch highlights") + + assert checker.main([]) == 0