<p align="center"><img src="assets/banner.png" alt="MoonSpoof" width="960" /></p>

<p align="center"><a href="https://mooncakes.io/modules/Sidney-sunny/moonspoof"><img alt="Mooncakes" src="https://img.shields.io/badge/mooncakes.io-Sidney--sunny%2Fmoonspoof-ff813f?style=flat-square" /></a>
  <a href="https://github.com/Sidney-sunny/MoonSpoof"><img alt="GitHub" src="https://img.shields.io/badge/GitHub-Sidney--sunny%2FMoonSpoof-181717?style=flat-square&logo=github" /></a>
  <img alt="Version 0.2.0" src="https://img.shields.io/badge/Version-0.2.0-334155?style=flat-square" />
  <img alt="Unicode 16.0" src="https://img.shields.io/badge/Unicode-16.0.0-334155?style=flat-square" /> <img alt="Apache 2.0" src="https://img.shields.io/badge/License-Apache_2.0-334155?style=flat-square" /></p>

<p align="center">为 MoonBit 提供 Unicode 混淆键、字符证据与批量冲突检测。</p>

<p align="center"><a href="../README.md">English</a> · <a href="API_SPECIFICATION_zh.md">API 规范</a> · <a href="ARCHITECTURE_zh.md">架构</a> · <a href="SPECIFICATION_zh.md">实现范围</a> · <a href="CHANGELOG_zh.md">更新日志</a> · <a href="ROADMAP_zh.md">路线图</a></p>

## 引擎能力

[验收检查](ACCEPTANCE_zh.md)记录九项证据及剩余分发动作；开发与 CI 使用 `moonc 0.10.18+6c83a7f62`，注册表当前为 0.1.0。新增源码/声明需要发布新版本。参见[第三方声明](THIRD_PARTY_NOTICES_zh.md)。

| 混淆键 | 字符证据 | 批量分组 |
| --- | --- | --- |
| Unicode 16.0 NFD 与完整默认大小写折叠 | 码点、字系、原始映射目标、风险规则 | 与双字符串比较使用同一键的哈希桶 |
| 默认忽略字符与应用全角折叠 | 双向/控制字符检测与自定义标识符策略 | 保持首次出现顺序，保留重复输入 |
| 纯 MoonBit，支持 JS、WASM、native | 有限字系分类，明确标准缺口 | 无须逐对比较每个名称 |

本项目实现部分 UTS #39 机制，不声明完整合规。风险信号不证明恶意。[实现范围](SPECIFICATION_zh.md)记录具体边界。

## 开发方向

根据负责人反馈，项目已通过初审。可运行的账号注册参考接入已经通过 MoonBit 公开 API 展示注册决策、版本化快照和索引迁移；完整字系属性、解析字系集合及可选 Identifier_Status 过滤已提供；可选[十进制混用检查](NUMBER_SYSTEMS_zh.md)已实现，[固定 ICU 对照](REFERENCE_COMPARISON_zh.md)已记录精确差异及机制覆盖。[路线图](ROADMAP_zh.md)记录里程碑证据与拟议 v0.2.0 发布门槛，仓库示例不代表已有外部应用采用。

## 运行注册接入

```powershell
moon run cmd/registration
```

加载已有账号，区分重复和混淆注册，查看不可见字符拒绝原因，并在更换策略后重建索引。[双语接入指南](../examples/registration/README_zh.md)记录调用位置、预期结果、快照校验与生产存储职责。无须前端依赖。

## 启动双语演示

[打开在线演示](https://sidney-sunny.github.io/MoonSpoof/)。GitHub Actions 在引擎与前端检查通过后，将 `main` 分支构建并发布到 Pages。

```powershell
pnpm --dir playground install --frozen-lockfile
pnpm --dir playground dev
```

打开 Vite 输出的地址。默认中文，EN / 中文切换完整界面。浏览器使用工作线程中的新编译 MoonBit JavaScript，输入保留在本机。演示包含双字符串比较、字符证据、批量冲突与双向文本。竞品矩阵引用 ICU 与 confusable_homoglyphs 官方 API，不虚构性能排名。

```powershell
moon run cmd/main
```

## 库接入

执行 `moon add Sidney-sunny/moonspoof`，在包的 `moon.pkg` 中导入：

```moonbit
import {
  "Sidney-sunny/moonspoof" @moonspoof,
}
```

```moonbit
let authentic = "paypal"
let candidate = "p\u0430ypal"
@moonspoof.are_confusable(authentic, candidate) // true
@moonspoof.skeleton(candidate) // "paypal"
@moonspoof.analyze_identifier(candidate)
@moonspoof.find_confusable_groups([authentic, candidate, "stripe"])
@moonspoof.are_confusable_ignore_case("PAYPAL", "P\u0430yPal") // true
@moonspoof.get_restriction_level(candidate) // MinimallyRestrictive
@moonspoof.validate_identifier(candidate) // Err("Identifier contains disallowed mixed scripts")
```

## 安全边界与兼容性

旧诊断接口公开十一类字系及 Unknown。新增[完整 Script 和 Script_Extensions API](UNICODE_PROPERTIES_zh.md)提供属性查询与解析集合；新增可选原始码点 Identifier_Status 过滤，默认策略保持不变；独立[十进制系统检查](NUMBER_SYSTEMS_zh.md)处理原始 Nd 数字；状态过滤规范等价闭包和双向骨架重排仍未实现。标识符策略是可配置应用检查，不是完整 Unicode 标识符语法验证。全角折叠与重复归一化至稳定键属于应用扩展。

敏感键与折叠键是独立策略：`I` / `l` 在敏感模式下可能匹配，而在折叠模式下不同。持久化键应记录库与数据版本，升级后重新计算。[API 规范](API_SPECIFICATION_zh.md)说明修正后的行为。

## 开发者与代理导航

| 主题 | 文档 |
| --- | --- |
| 架构 | [ARCHITECTURE_zh.md](ARCHITECTURE_zh.md) |
| API | [API_SPECIFICATION_zh.md](API_SPECIFICATION_zh.md) |
| 十进制数字系统 | [NUMBER_SYSTEMS_zh.md](NUMBER_SYSTEMS_zh.md) |
| ICU 参考对照与覆盖 | [REFERENCE_COMPARISON_zh.md](REFERENCE_COMPARISON_zh.md) |
| Unicode 字系属性 | [UNICODE_PROPERTIES_zh.md](UNICODE_PROPERTIES_zh.md) |
| 标准范围 | [SPECIFICATION_zh.md](SPECIFICATION_zh.md) |
| 性能 | [BENCHMARKS_zh.md](BENCHMARKS_zh.md) |
| 路线图 | [ROADMAP_zh.md](ROADMAP_zh.md) |
| 账号注册接入 | [示例指南](../examples/registration/README_zh.md) |
| 品牌 | [BRANDING_zh.md](BRANDING_zh.md) |

<details><summary><strong>从源码构建与验证</strong></summary>

CI、Pages 和 Copilot 环境统一安装 [`.moon-version`](../.moon-version) 中记录的编译器版本，当前为 `0.10.18+6c83a7f62`。本地再生成和格式化应使用同一版本；升级工具链时需同时审核生成源码与接口的变化。

```powershell
moon check
moon test
moon test --target js
moon test --target native
pnpm --dir playground run check
python tools/data-generator/generate.py
moon info
moon fmt
pnpm --dir playground run verify:unicode
```

Unicode 表来自九个记录哈希的官方数据文件。Node 检查会先重建引擎。纯库没有第三方运行时依赖。

</details>

## 许可

[Apache-2.0](../LICENSE)。
