---
phase: 10-restructure
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
  - src/record.rs
  - src/sqllog.rs
  - src/filter/mod.rs
  - src/filter/adapter.rs
  - src/async_api/mod.rs
  - src/parser/mod.rs
  - src/parser/builder.rs
  - src/parser/iterator.rs
  - src/parser/encoding.rs
autonomous: true
requirements:
  - REFACTOR-03
  - REFACTOR-04

must_haves:
  truths:
    - "src/record.rs 存在且包含 Sqllog 结构体定义（原 src/sqllog.rs 内容，未做语义修改）"
    - "src/filter/mod.rs 与 src/filter/adapter.rs 文件已创建，filter/adapter.rs 含两个 pub(crate) 泛型函数 filter_by_exec_time 和 filter_by_sql_contains 的占位实现"
    - "src/async_api/mod.rs 文件存在（空占位，仅注释）"
    - "src/parser/ 子目录创建，含 mod.rs / builder.rs / iterator.rs / encoding.rs 四个占位文件（仅文件存在即可，本计划不迁移代码）"
    - "src/sqllog.rs 已通过 git mv 改名为 src/record.rs，git 历史保留"
    - "本计划不修改 src/lib.rs、src/parser.rs、tests/、examples/ —— 这些由后续计划处理"
  artifacts:
    - path: "src/record.rs"
      provides: "Sqllog 结构体与 pub(crate) 字节解析辅助函数"
      contains: "pub struct Sqllog"
    - path: "src/filter/mod.rs"
      provides: "filter 模块入口"
      contains: "pub(crate) mod adapter"
    - path: "src/filter/adapter.rs"
      provides: "泛型过滤函数 pub(crate) 实现"
      contains: "pub(crate) fn filter_by_exec_time"
    - path: "src/async_api/mod.rs"
      provides: "Phase 12 异步 API 占位模块"
      min_lines: 1
    - path: "src/parser/mod.rs"
      provides: "parser 子模块入口骨架（仅占位）"
      min_lines: 1
    - path: "src/parser/builder.rs"
      provides: "LogParserBuilder 容纳文件骨架（仅占位）"
      min_lines: 1
    - path: "src/parser/iterator.rs"
      provides: "LogIterator 容纳文件骨架（仅占位）"
      min_lines: 1
    - path: "src/parser/encoding.rs"
      provides: "FileEncodingHint 容纳文件骨架（仅占位）"
      min_lines: 1
  key_links:
    - from: "src/filter/mod.rs"
      to: "src/filter/adapter.rs"
      via: "pub(crate) mod adapter"
      pattern: "pub\\(crate\\) mod adapter"
    - from: "git history"
      to: "src/record.rs"
      via: "git mv src/sqllog.rs"
      pattern: "renamed: src/sqllog.rs -> src/record.rs"
---

<objective>
建立 Phase 10 重构所需的全部新模块骨架文件。本计划只创建/重命名物理文件，不迁移任何 src/parser.rs 内的代码、不修改 src/lib.rs、不动 tests/ 和 examples/。

Purpose: 把"建骨架"从"搬代码"中分离出来，让后续计划在 cargo check 仍可通过的中间态下逐步搬迁代码。骨架先就位是为了让 Wave 2 的代码迁移、可见性降级、测试迁移可以基于真实的目录结构进行。

Output: 新模块目录与文件物理存在（filter/、async_api/、parser/ 子目录），record.rs 由 sqllog.rs 改名而来；编译可继续通过（lib.rs 仍引用旧的 src/parser.rs 和 src/sqllog.rs - 但 sqllog.rs 已不存在，需在 lib.rs 临时调整以让构建通过）。
</objective>

<execution_context>
@$HOME/.claude/get-shit-done/workflows/execute-plan.md
@$HOME/.claude/get-shit-done/templates/summary.md
</execution_context>

<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/REQUIREMENTS.md
@.planning/phases/10-restructure/10-CONTEXT.md
@.planning/phases/10-restructure/10-RESEARCH.md
@.planning/phases/10-restructure/10-PATTERNS.md
@src/lib.rs
@src/sqllog.rs
@src/parser.rs

<interfaces>
本计划开始时，src/ 状态：
- src/lib.rs 含 `pub(crate) mod sqllog;` 和 `pub use sqllog::Sqllog;`
- src/sqllog.rs 含 `pub struct Sqllog` 和 pub(crate) 辅助函数

本计划结束时，src/ 状态：
- src/sqllog.rs 已经过 git mv 改名为 src/record.rs（内容不变）
- src/lib.rs 临时改为 `pub(crate) mod record;` + `pub use record::Sqllog;`（最小可编译变更）
- src/parser.rs 不变（仍引用 `crate::sqllog`，编译会失败 - 见下方任务 2 的临时垫片处理）

为了让本计划结束时 `cargo check` 能通过（避免 Wave 2 起点已是红色），src/parser.rs 内部的 `use crate::sqllog;` / `use crate::sqllog::Sqllog;` / `sqllog::parse_meta_from_bytes` 等引用需在本计划顺手改为 `use crate::record;` / `use crate::record::Sqllog;` / `record::parse_meta_from_bytes`。这属于路径替换，不属于代码迁移。
</interfaces>
</context>

<tasks>

<task type="auto">
  <name>Task 1: git mv 重命名 sqllog.rs → record.rs，创建 filter/、async_api/、parser/ 骨架目录与占位文件</name>
  <files>src/record.rs, src/sqllog.rs, src/filter/mod.rs, src/filter/adapter.rs, src/async_api/mod.rs, src/parser/mod.rs, src/parser/builder.rs, src/parser/iterator.rs, src/parser/encoding.rs</files>
  <read_first>
    - src/sqllog.rs（即将被重命名，确认内容）
    - src/parser.rs（确认当前 use 路径，下一任务要批量替换）
    - .planning/phases/10-restructure/10-CONTEXT.md（D-01、D-05、D-09、D-11 决策）
    - .planning/phases/10-restructure/10-PATTERNS.md（filter/adapter.rs 泛型函数完整代码骨架；async_api/mod.rs 注释样式）
  </read_first>
  <action>
    执行以下顺序操作（必须用 `git mv` 保留历史，不要用 cp/rm）：

    1. 在仓库根目录运行 `git mv src/sqllog.rs src/record.rs`，确认 git status 显示为 renamed。record.rs 内容不变（保留 `pub struct Sqllog`、`parse_meta_from_bytes`、`parse_indicators_from_bytes`、`find_indicators_split` 等所有 pub(crate) 辅助函数和现有测试模块）。

    2. 创建 src/filter/mod.rs，文件内容仅一行：`pub(crate) mod adapter;`（实现 D-05）。

    3. 创建 src/filter/adapter.rs，包含两个 pub(crate) 泛型函数 filter_by_exec_time 与 filter_by_sql_contains 的完整实现（D-06）。两函数都接受泛型 `I: Iterator<Item = Result<Sqllog, ParseError>>`，返回 `impl Iterator<Item = Result<Sqllog, ParseError>>`。imports 仅 `use crate::error::ParseError;` 和 `use crate::record::Sqllog;`。逻辑与 src/parser.rs::LogIterator::filter_by_exec_time（lines 116-125）和 filter_by_sql_contains（lines 128-137）完全等价（threshold = min_ms as f32；Ok arm 检查谓词，Err arm 返回 false）。具体代码骨架见 10-PATTERNS.md「`src/filter/adapter.rs` (utility, transform)」节。禁止引用任何 parser:: 模块类型（Pitfall 3 循环依赖）。

    4. 创建 src/async_api/mod.rs，文件内容仅一行注释：`// Phase 12 will populate this module with async API implementation.`（实现 D-11；本阶段不在 lib.rs 中声明此模块，D-12）。

    5. 创建 src/parser/mod.rs、src/parser/builder.rs、src/parser/iterator.rs、src/parser/encoding.rs 四个占位文件。每个文件仅包含一行模块顶部文档注释（例如 `//! Placeholder — populated in 10-02-PLAN.md`），不含任何 use 或 pub item。这样 cargo 不会编译它们（因为 src/lib.rs 尚未声明 `mod parser;` 拆分版本，仍然指向 src/parser.rs 单文件 - 见任务 2）。

    禁止：本任务不修改 src/lib.rs、src/parser.rs、src/error.rs、tests/、examples/。不向骨架文件填充实际代码（除 filter/adapter.rs 是完整可用实现外）。
  </action>
  <verify>
    <automated>test -f src/record.rs && test -f src/filter/mod.rs && test -f src/filter/adapter.rs && test -f src/async_api/mod.rs && test -f src/parser/mod.rs && test -f src/parser/builder.rs && test -f src/parser/iterator.rs && test -f src/parser/encoding.rs && ! test -e src/sqllog.rs && git status --porcelain | grep -q 'R.*src/sqllog.rs -> src/record.rs\|renamed:.*sqllog.rs.*record.rs' || git diff --cached --name-status | grep -q 'R.*sqllog.rs.*record.rs'</automated>
  </verify>
  <acceptance_criteria>
    - `src/sqllog.rs` 不再存在；`src/record.rs` 存在
    - `git status` 或 `git diff --cached --name-status` 显示 `R*  src/sqllog.rs -> src/record.rs`（rename 检测）
    - `src/filter/mod.rs` 存在，且 `grep -c 'pub(crate) mod adapter' src/filter/mod.rs` 返回 1
    - `src/filter/adapter.rs` 存在，且 `grep -c 'pub(crate) fn filter_by_exec_time' src/filter/adapter.rs` 返回 1，`grep -c 'pub(crate) fn filter_by_sql_contains' src/filter/adapter.rs` 返回 1
    - `src/filter/adapter.rs` 不引用任何 parser 模块：`grep -c 'crate::parser' src/filter/adapter.rs` 返回 0
    - `src/async_api/mod.rs` 存在，文件大小 > 0
    - `src/parser/mod.rs`、`src/parser/builder.rs`、`src/parser/iterator.rs`、`src/parser/encoding.rs` 四个文件都存在
    - 本任务结束时未触碰 src/lib.rs、src/parser.rs、src/error.rs：`git diff --name-only` 不包含这三个文件
  </acceptance_criteria>
  <done>
    所有骨架文件物理就位，git mv 保留历史。本任务结束时 cargo check 会失败（lib.rs 还在引用 `mod sqllog`），任务 2 负责修复编译。
  </done>
</task>

<task type="auto">
  <name>Task 2: 修改 src/lib.rs 模块声明从 sqllog → record，并同步修正 src/parser.rs 的 crate::sqllog → crate::record 引用（最小可编译变更）</name>
  <files>src/lib.rs, src/parser.rs</files>
  <read_first>
    - src/lib.rs（当前 lines 82-90 模块声明与 pub use）
    - src/parser.rs（lines 1-13 use 语句、lines 278-300 sqllog::parse_meta_from_bytes 调用、line 358 sqllog::find_indicators_split、line 392 sqllog::parse_indicators_from_bytes）
    - .planning/phases/10-restructure/10-PATTERNS.md（「src/lib.rs」与「Pitfall 6」节）
    - .planning/phases/10-restructure/10-RESEARCH.md（Pitfall 6：sqllog 路径残留）
  </read_first>
  <action>
    目标：本计划结束时仓库必须能通过 `cargo check` 与 `cargo test --no-run`（即编译通过），同时 src/lib.rs 与 src/parser.rs 已切到 `record` 路径。这是 Wave 2 的起点。

    本任务只做"路径替换"，不做"代码迁移"。具体变更：

    1. 修改 src/lib.rs（lines 82-90 区域，rustdoc 部分 lines 1-80 完全保留不动）：
       - 将 `pub(crate) mod sqllog;` 改为 `pub(crate) mod record;`
       - 将 `pub use sqllog::Sqllog;` 改为 `pub use record::Sqllog;`
       - 保持 `pub(crate) mod error;`、`pub(crate) mod parser;` 不变（暂不添加 `mod filter;`，因为它在本计划结束时不被任何代码引用 - 添加会触发 dead_code 警告，clippy -D warnings 会失败；filter 模块声明在 10-03 的 lib.rs 重组时一起加入）
       - 保持 `pub use parser::{ FileEncodingHint, LogIterator, LogParser, LogParserBuilder, parse_record };` 不变（parse_record 重导出在 10-03 才移除）
       - 不要添加 `mod async_api;`（D-12 已明确）

    2. 修改 src/parser.rs，全局替换 `crate::sqllog` 路径为 `crate::record`：
       - line 10：`use crate::sqllog;` → `use crate::record;`
       - line 11：`use crate::sqllog::Sqllog;` → `use crate::record::Sqllog;`
       - lines 278、283、285、288、295、298、358、392 中所有 `sqllog::` 调用 → `record::`（具体调用点：sqllog::parse_meta_from_bytes、sqllog::find_indicators_split、sqllog::parse_indicators_from_bytes）

    3. 不修改 src/parser.rs 的任何其他代码（结构体定义、impl 块、test 模块、私有函数全部保留原状）。不修改 src/error.rs、tests/、examples/、src/filter/、src/async_api/、src/parser/ 子目录。

    4. 由于 src/filter 在 lib.rs 中尚未声明，src/filter/mod.rs 与 src/filter/adapter.rs 会被 Rust 视为「未被任何模块树引用」，但因为它们没有 mod 声明指向它们，编译器不会扫描它们 - 所以不会产生编译错误或警告。src/async_api/ 与 src/parser/ 子目录文件同理。

    完成后运行 `cargo check` 和 `cargo build --tests --no-run` 必须通过（允许 warnings；clippy -D warnings 不在本任务验证范围 - 10-03 计划处理）。
  </action>
  <verify>
    <automated>cd /Users/guang/Projects/dm-database-parser-sqllog && cargo check 2>&1 | tail -5 && cargo build --tests 2>&1 | tail -5 && ! grep -n 'crate::sqllog\|mod sqllog' src/parser.rs src/lib.rs</automated>
  </verify>
  <acceptance_criteria>
    - `cargo check` 退出码为 0
    - `cargo build --tests` 退出码为 0（编译所有测试目标）
    - `grep -c 'crate::sqllog' src/parser.rs` 返回 0
    - `grep -c 'sqllog::' src/parser.rs` 返回 0
    - `grep -c 'mod sqllog' src/lib.rs` 返回 0
    - `grep -c 'pub(crate) mod record' src/lib.rs` 返回 1
    - `grep -c 'pub use record::Sqllog' src/lib.rs` 返回 1
    - src/lib.rs 前 80 行 rustdoc 完全未变（与上一个提交相比）：`git diff src/lib.rs` 不显示 lines 1-80 的改动
    - src/parser.rs 的 LogParser/LogIterator/parse_record/parse_record_with_hint 函数体未被改动（仅 use 语句和 sqllog:: 前缀替换）
    - src/error.rs 未被修改
    - 本计划结束时 src/filter/mod.rs 不在 lib.rs 的 mod 声明列表中（这是有意的 - 防止 dead_code 警告，10-03 才声明）
  </acceptance_criteria>
  <done>
    cargo check / cargo build --tests 全部通过；所有 `crate::sqllog` 引用已切到 `crate::record`；lib.rs 重导出仍然提供完整公开 API（parse_record 仍重导出，由 10-03 移除）；filter/、async_api/、parser/ 子目录文件物理存在但暂未被模块树引用 - 等 10-02 / 10-03 处理。
  </done>
</task>

</tasks>

<verification>
端到端验证（必须全部通过）：

1. `cargo check` 退出码 0
2. `cargo build --tests` 退出码 0
3. `cargo test` 退出码 0（所有现有测试通过，没有任何测试因为本计划被破坏；本计划只是路径替换，行为不变）
4. `git log --oneline -5` 与 `git status` 显示骨架文件已创建、sqllog.rs → record.rs 已 rename
5. 目录结构：`ls src/` 显示 `error.rs lib.rs parser.rs record.rs filter/ async_api/ parser/`
</verification>

<success_criteria>
- src/record.rs 是 src/sqllog.rs 的重命名（git 历史保留）
- src/filter/、src/async_api/、src/parser/ 三个子目录及其骨架文件物理存在
- src/lib.rs 的 mod 声明与 pub use 已切到 `record`
- src/parser.rs 已无 `crate::sqllog` 引用
- 仓库可编译，所有现有测试通过
- 本计划不引入任何代码迁移（parser.rs 仍是 521 行单文件；filter 模块未被引用；async_api 模块未被引用）
</success_criteria>

<output>
完成后创建 .planning/phases/10-restructure/10-01-SUMMARY.md，记录：
- 重命名/创建的文件清单
- 实际修改的 src/lib.rs 与 src/parser.rs 行号
- cargo check / cargo test 输出摘要
- 下一计划（10-02）的衔接点：parser.rs 拆分起点、测试迁移列表参考 RESEARCH.md「Test Migration Map」
</output>
</content>
</invoke>