# Phase 0：确认站点域名（最小预检）

> **关键规则**：Phase 0 在 Phase 1 开始前执行，**只做一件事**：
> 钉死 `siteDomain`（硬前置，拿到之前不得调任何 CLI 命令，不得默认填充）。
>
> Phase 0 **不写盘**——`siteDomain` 只在对话上下文里持有，连同后续的 `pluginId` / `projectDir` / `projectRoot` / `originalRequirement` 一起延后到 Phase 1.2（cwd 已切到 plugin-dir 之后）首次写入 `<plugin-dir>/.lpm-cache/state.json`。这样 state.json 永远只有一个落点（plugin-dir），不会出现 parent / plugin-dir 两份分裂。
>
> 功能需求的意图识别、术语消歧、点位匹配全部留给 Phase 2 的 feature phase，Phase 0 不做任何解析。

> `siteDomain` 是所有 CLI 操作的定位根（Token 按域名分 key）：动 CLI 前钉死、不得默认填 project.feishu.cn、不得从训练数据推断。

## 0.1 确认站点域名

**先跑 `lpm whoami`**，**一切以它列出的真实登录站点为准**，按 stdout 行事：

- **列出了已登录站点（≥1 个）** → 把 whoami 列出的**全部真实站点原样呈现给用户挑选**：
  - 忽略 whoami 输出里的 `← 建议` 标记，**不预选、不带"上次登录的是 X，确认用它？"这类推荐口吻**；顺序沿用 whoami 的输出（有时间戳则最近在前，纯排序、不含推荐含义）。
  - 单站点时也只列那一个，让用户确认。
  - **不**附"自定义域名"项——有真实站点时只列真实的。
  - 用户选定后即为 `siteDomain`，跳过下方"未登录"询问。
- **输出「未登录」**（whoami 一个站点都没列出）→ 走下方询问（唯一允许手动贴 URL 的入口）。

> 入口守卫已拦住"当前目录有 `plugin.config.json`"的场景；plugin.config.json 不存在 ⇒ plugin-dir 还没创建 ⇒ 不可能有任何上一次的 state.json 可读。

**询问（仅 whoami 报「未登录」时）**：

```
在开始之前，先确认一下你要把插件部署到哪个 Meegle 站点：

  1) 飞书项目（project.feishu.cn）
  2) Meegle（meegle.com）
  3) 自定义域名（请直接贴站点 URL，如 https://meego.your-company.com）

请告诉我 1 / 2 / 3，或直接贴 URL。
```

**AI 硬约束**：
- ❌ **禁止**假设用户是 project.feishu.cn（即使概率最高）
- ❌ **禁止**从对话历史/训练数据"推断"用户的站点
- ❌ **禁止**填 `https://meego.example.com` 或任何占位符（CLI 会拒绝,但在 skill 层就该先拦住）
- ✅ **必须**等到用户明确回复后再继续

## 0.2 产出

- 对话上下文持有 `siteDomain`（完整 URL，含 scheme）
- ❌ **不写** `.lpm-cache/state.json`：plugin-dir 还未创建，此时写盘会落到 parent 形成孤儿。首次落盘统一发生在 Phase 1.2（见 `phase-1-scaffold.md` 1.2）。

→ 进入 Phase 1 搭建工程。

---

**恢复语义**：入口守卫保证当前目录无 `plugin.config.json` ⇒ 也无 `.lpm-cache/state.json` 可读，任何重入都从 0.1 询问 siteDomain 开始。
