diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68f9185..1ce767c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -114,4 +114,4 @@ jobs: shell: pwsh run: | git fetch origin main - tools/invariant-checks/run-checks.ps1 + scripts/invariant-checks/run-checks.ps1 diff --git a/.gitignore b/.gitignore index 370c20f..f1a7061 100644 --- a/.gitignore +++ b/.gitignore @@ -28,14 +28,9 @@ backup-*.db # OS metadata .DS_Store Thumbs.db -tools/embedding-provider/__pycache__/ - -tools/embedding-provider/__pycache__/ - +examples/embedding-provider/__pycache__/ .agents/ .venv/ -spike/**/target/ coverage_report.txt /releases/ -.kimi/ diff --git a/CHANGELOG.md b/CHANGELOG.md index e16a230..70d6761 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Tantivy 一致性修复 — `repair_tantivy_consistency_at()` 启动时自动检测 orphan/missing 文档 - 性能回归基线 — `test_keyword_search_latency_regression_1k` / `_10k`(profile-aware 阈值) - `TempStorageBackend` — 测试隔离后端,消除 `DEVBASE_DATA_DIR` 竞态 -- **Architecture Invariants CI 自动化** — `tools/invariant-checks/run-checks.ps1` +- **Architecture Invariants CI 自动化** — `scripts/invariant-checks/run-checks.ps1` - G5 (RF-6):diff-only 检测新增生产代码 `unwrap`/`expect`/`panic`(排除 `#[cfg(test)]`) - T11:`mcp/tools` 禁止直接调用 `rusqlite::Connection` - T12:`tui/render` 纯消费检查(禁止写入操作) @@ -172,7 +172,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - 新增: `python`, `bun`, `zig`, `java` - `get_tool_version` 支持 stderr fallback (Java 输出到 stderr) - `fmt_version` 改进: Java 引号提取、Docker/Python 格式处理 -- **P5: 架构不变量自动化 CI** — `tools/invariant-checks/run-checks.ps1` +- **P5: 架构不变量自动化 CI** — `scripts/invariant-checks/run-checks.ps1` - G5: diff-only 检测新增生产代码 unwrap/expect/panic(排除 `#[cfg(test)]`) - T11: 检测 `mcp/tools/*` 直接调用 `rusqlite::Connection` - T12: 检测 `tui/render/*` 写入操作 @@ -485,7 +485,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Schema v13: `code_symbol_links` table (source_repo, source_symbol, target_repo, target_symbol, link_type, strength) - `src/symbol_links.rs`: `compute_similar_signature_links()` (Jaccard token overlap), `compute_co_located_links()` (same-file clustering) - `generate_and_save_links()`: persists links with ON CONFLICT IGNORE upsert -- **External Embedding Provider** — Reference Python implementation in `tools/embedding-provider/` +- **External Embedding Provider** — Reference Python implementation in `examples/embedding-provider/` - `index.py`: Ollama `/api/embeddings` client, batch generation, cross-platform registry DB path - Byte-compatible f32 little-endian serialization via `struct.pack` - CLI: `--repo-id`, `--model`, `--ollama-url`, `--batch-size`, `--force` diff --git a/docs/AGENTS-full.md b/docs/AGENTS-full.md index e72fc34..de2ea85 100644 --- a/docs/AGENTS-full.md +++ b/docs/AGENTS-full.md @@ -292,7 +292,7 @@ done | 10 | OpLog 结构化 | Schema v12, OplogEventType 枚举, JSON metadata, duration_ms | `7aa2a65` | | 11 | 性能基准 | criterion benches: index_repo_full, cosine_similarity, extract_symbols, CMake | `8e0f236` | | 12 | 混合检索核心 | `search::hybrid.rs`: RRF 归并, keyword_search, hybrid_search_symbols | `7fca714` | -| 13 | 外部 Embedding Provider | Python CLI `tools/embedding-provider/`, Ollama 批量生成, 字节兼容序列化 | `574fb96` | +| 13 | 外部 Embedding Provider | Python CLI `examples/embedding-provider/`, Ollama 批量生成, 字节兼容序列化 | `574fb96` | | 14a | 跨 repo 语义聚合 | `cross_repo_search_symbols()` INTERSECT tag 过滤, `devkit_cross_repo_search` | `8e762c7` | | 14b | 知识覆盖报告 | `oplog_analytics.rs`: 表存在性容错, 覆盖度/健康度/活动流, `devkit_knowledge_report` | `869bcbf` | | 15a | 显式知识链接 | Schema v13 `code_symbol_links`, Jaccard 签名相似度, 同文件聚类, `devkit_related_symbols` | `d462209` | @@ -453,7 +453,7 @@ v0.11.3 已交付(tagged)。v0.12.0-alpha 全部功能已完成,进入发 **Embedding 状态**: - `code_embeddings`: **56,722** 行(37.0% 覆盖率),覆盖 10 个仓库 - `skills.embedding`: 3 个 builtin skill 已有 384-dim 向量 -- 生成工具:`tools/embedding-provider/skills.py`(sentence-transformers `all-MiniLM-L6-v2`) +- 生成工具:`examples/embedding-provider/skills.py`(sentence-transformers `all-MiniLM-L6-v2`) - 激活路径:启动 Ollama + `devbase index ` 生成 embedding,或配置远程 provider 于 `config.toml [embedding]` 段 ### 2026-05-04 索引性能实验记录 diff --git a/docs/theory/three-repositories.md b/docs/theory/three-repositories.md index 96bc20f..e73db20 100644 --- a/docs/theory/three-repositories.md +++ b/docs/theory/three-repositories.md @@ -140,7 +140,7 @@ devbase 的当前架构已经**天然横跨三层**,只是没有明确形式 | `search/hybrid` + `semantic_index` | Layer 1→2 桥梁 | ✅ 成熟:keyword + vector + RRF | | `mcp/` (31 tools) | Layer 3 (MCP 仓库) | ✅ 成熟:Stable/Beta/Experimental 三级 | | `vault/` + `skill-sync-prototype` | Layer 2 (Skill 仓库) | 🔄 原型:Vault→Skill 同步设计完成,待实现 | -| `tools/embedding-provider/` | Layer 2→3 桥梁 | ✅ 可用:local.py 引擎无关 | +| `examples/embedding-provider/` | Layer 2→3 桥梁 | ✅ 可用:local.py 引擎无关 | | **Skill Runtime** (`devbase skill` CLI) | Layer 2 (Skill 仓库) | ❌ 未开始:registry + executor + sandbox | | **Protocol Adapter** (MCP + OpenAPI 统一) | Layer 3 (MCP 仓库) | ❌ 未开始:ToolRegistry 模式移植 | diff --git a/tools/embedding-provider-rs/Cargo.toml b/examples/embedding-provider-rs/Cargo.toml similarity index 100% rename from tools/embedding-provider-rs/Cargo.toml rename to examples/embedding-provider-rs/Cargo.toml diff --git a/tools/embedding-provider-rs/README.md b/examples/embedding-provider-rs/README.md similarity index 97% rename from tools/embedding-provider-rs/README.md rename to examples/embedding-provider-rs/README.md index b055dff..0be5999 100644 --- a/tools/embedding-provider-rs/README.md +++ b/examples/embedding-provider-rs/README.md @@ -98,7 +98,7 @@ pip install cmake ## Differences from Python Provider -| 维度 | Python (`tools/embedding-provider/`) | Rust (`tools/embedding-provider-rs/`) | +| 维度 | Python (`examples/embedding-provider/`) | Rust (`examples/embedding-provider-rs/`) | |------|--------------------------------------|---------------------------------------| | 依赖 | `requests` (HTTP) → Ollama | `embellama` (本地 GGUF 直接加载) | | 运行时 | 需要 Ollama 服务 | 零外部服务,纯本地推理 | diff --git a/tools/embedding-provider-rs/src/main.rs b/examples/embedding-provider-rs/src/main.rs similarity index 100% rename from tools/embedding-provider-rs/src/main.rs rename to examples/embedding-provider-rs/src/main.rs diff --git a/tools/embedding-provider/README.md b/examples/embedding-provider/README.md similarity index 99% rename from tools/embedding-provider/README.md rename to examples/embedding-provider/README.md index 85b92ba..c2b6686 100644 --- a/tools/embedding-provider/README.md +++ b/examples/embedding-provider/README.md @@ -26,7 +26,7 @@ devbase follows an **"outboard brain"** design: the Rust core handles storage, i ```bash # 1. Clone or navigate into this directory -cd tools/embedding-provider +cd examples/embedding-provider # 2. Install dependencies pip install -r requirements.txt diff --git a/tools/embedding-provider/config.example.toml b/examples/embedding-provider/config.example.toml similarity index 100% rename from tools/embedding-provider/config.example.toml rename to examples/embedding-provider/config.example.toml diff --git a/tools/embedding-provider/index.py b/examples/embedding-provider/index.py similarity index 100% rename from tools/embedding-provider/index.py rename to examples/embedding-provider/index.py diff --git a/tools/embedding-provider/local.py b/examples/embedding-provider/local.py similarity index 100% rename from tools/embedding-provider/local.py rename to examples/embedding-provider/local.py diff --git a/tools/embedding-provider/requirements.txt b/examples/embedding-provider/requirements.txt similarity index 100% rename from tools/embedding-provider/requirements.txt rename to examples/embedding-provider/requirements.txt diff --git a/tools/embedding-provider/skills.py b/examples/embedding-provider/skills.py similarity index 100% rename from tools/embedding-provider/skills.py rename to examples/embedding-provider/skills.py diff --git a/tools/invariant-checks/run-checks.ps1 b/scripts/invariant-checks/run-checks.ps1 similarity index 99% rename from tools/invariant-checks/run-checks.ps1 rename to scripts/invariant-checks/run-checks.ps1 index ecfc135..954d140 100644 --- a/tools/invariant-checks/run-checks.ps1 +++ b/scripts/invariant-checks/run-checks.ps1 @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT # Copyright (c) 2026 juice094 # devbase Architecture Invariant CI Checks -# Run from repo root: tools/invariant-checks/run-checks.ps1 +# Run from repo root: scripts/invariant-checks/run-checks.ps1 $ErrorActionPreference = "Stop" $script:Failed = 0 diff --git a/tools/migrate-third-party.ps1 b/scripts/migrate-third-party.ps1 similarity index 100% rename from tools/migrate-third-party.ps1 rename to scripts/migrate-third-party.ps1 diff --git a/tools/register_papers.py b/scripts/register_papers.py similarity index 100% rename from tools/register_papers.py rename to scripts/register_papers.py diff --git a/skills/embed-repo/SKILL.md b/skills/embed-repo/SKILL.md index 401eabd..c5d3bb0 100644 --- a/skills/embed-repo/SKILL.md +++ b/skills/embed-repo/SKILL.md @@ -21,7 +21,7 @@ outputs: --- # Embed Repository -This skill invokes the local embedding provider (`tools/embedding-provider/local.py`) +This skill invokes the local embedding provider (`examples/embedding-provider/local.py`) to generate 384-dimensional vectors for all code symbols in the specified repository. ## Usage diff --git a/tools/clean_db.rs b/tools/clean_db.rs deleted file mode 100644 index 33f68e3..0000000 --- a/tools/clean_db.rs +++ /dev/null @@ -1,21 +0,0 @@ -fn main() -> Result<(), Box> { - let data_dir = dirs::data_local_dir().ok_or("no local data dir")?; - let db_path = data_dir.join("devbase").join("registry.db"); - let conn = rusqlite::Connection::open(&db_path)?; - let deleted = conn.execute( - "DELETE FROM repos WHERE id LIKE 'Clarity_%' OR id LIKE 'clarity_backup%'", - [], - )?; - println!("Deleted {} backup entries from devbase registry.", deleted); - - println!("\nRemaining registered repos:"); - let mut stmt = conn.prepare("SELECT id, local_path FROM repos")?; - let rows = stmt.query_map([], |row| { - Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?)) - })?; - for row in rows { - let (id, path) = row?; - println!(" [{}] {}", id, path); - } - Ok(()) -}