@fxri/toolkit 1.12.5 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # 方弦工具集
2
2
 
3
+ ## 1.13.0
4
+
5
+ > 2026-10-24 发布
6
+
7
+ ### ✨ 新增功能
8
+
9
+ - `fxri-text-encoding` 技能按「乱码三问」定归属(谁的字节 / 还能救吗 / 错在第几跳),附读取方默认解码对照与按 mojibake 特征串选 `iconv` 方向的反向转码命令
10
+ - 技能给出 `.ps1` / `.psm1` / `.psd1` / `.bat` / `.sh` / `.xml` / `.properties` / C 系与 Java 源文件及 Excel CSV 的 UTF-8、BOM 与行尾基线
11
+ - 技能对照 AI 写入工具与 `powershell.exe` / `pwsh` / .NET / Node / Python / `.editorconfig` / `.gitattributes` 的写盘 BOM 与默认编码行为,含 `-Encoding UTF8` 在两种 shell 下同名不同义、`Export-Csv` 省略 `-Encoding` 写 ASCII、Node 读侧残留 `\uFEFF`
12
+ - 技能提供落盘后首三字节自查与 `git ls-files` 全仓巡检,改完即可验
13
+ - 技能覆盖运行期管线断点——控制台代码页、`$OutputEncoding` 与 `>` 重定向、`Get-Content` 解码、Python locale、容器 CI `LANG=C`、Java `file.encoding`
14
+ - 技能记录 `core.autocrlf` 检出转换与 `eol=lf` 不回溯已提交内容、Windows「Beta: 使用 Unicode UTF-8 提供全球语言支持」造成的同文件异机差异、Excel 另存 CSV 的编码走向、不可见字符、全角标点、`�` 不可逆、二次转码等场景
15
+
16
+ ### 🔧 功能调整
17
+
18
+ - `docs/ai-rules.md` 代码规范补脚本字节形态铁律(`.ps1` UTF-8 with BOM、`.sh` 无 BOM + LF、`.bat` / `.cmd` 不带 BOM + CRLF),以系统内置的 `powershell.exe` 指代该 shell,指向该技能
19
+
20
+ ## 1.12.6
21
+
22
+ > 2026-10-19 发布
23
+
24
+ ### ⚡ 优化改进
25
+
26
+ - `conventions-spec.md` 声明 `.tasks/` 外层骨架以 `task-spec.md` 为真源,避免两份目录树各自演进漂移
27
+
28
+ ### 🐛 问题修复
29
+
30
+ - `fxri-session-recap` 恢复模式二引用兄弟技能 `conventions-migration.md` 时补包内真源兜底,单独加载该篇也能定位升级链路
31
+ - `fxri-plan-to-task` 的 v2 → v3 升级步骤直接写出 `retired.md` 固定表头,迁移不再需要反向查 `conventions-spec.md`
32
+ - `fxri-session-recap` 恢复模式二的规范核对步骤按相对路径引用兄弟技能 `conventions-migration.md`,与同文件其他引用及技能编写核对项一致
33
+ - 同一处补全载体形态判定「v1 / v2」与按需读清单 `retired.md`,与主文件 R3 及 `docs/guide.md` 口径一致
34
+
3
35
  ## 1.12.5
4
36
 
5
37
  > 2026-10-19 发布
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright © 2026 唐启云
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright © 2026 唐启云
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/NOTICE CHANGED
@@ -1,9 +1,9 @@
1
- @fxri/toolkit
2
- Copyright © 2026 唐启云. All rights reserved.
3
-
4
- 出品方:方弦研究所(唐启云个人项目品牌,非独立法人实体)
5
-
6
- 商标声明:
7
- "方弦®"为第42类注册商标(注册号89648411),核定服务项目:计算机出租、计算机软件设计、为他人研究和开发新产品、计算机软件维护、把有形的数据或文件转换成电子媒体、为他人创建和维护网站、网络服务器出租、提供互联网搜索引擎、托管计算机站(网站)、云计算。
8
- 本开源许可(MIT License)不授予商标使用权。
9
- 详见 TRADEMARK.md 了解完整商标信息。
1
+ @fxri/toolkit
2
+ Copyright © 2026 唐启云. All rights reserved.
3
+
4
+ 出品方:方弦研究所(唐启云个人项目品牌,非独立法人实体)
5
+
6
+ 商标声明:
7
+ "方弦®"为第42类注册商标(注册号89648411),核定服务项目:计算机出租、计算机软件设计、为他人研究和开发新产品、计算机软件维护、把有形的数据或文件转换成电子媒体、为他人创建和维护网站、网络服务器出租、提供互联网搜索引擎、托管计算机站(网站)、云计算。
8
+ 本开源许可(MIT License)不授予商标使用权。
9
+ 详见 TRADEMARK.md 了解完整商标信息。
package/README.md CHANGED
@@ -1,112 +1,113 @@
1
- <p align="center">
2
- <img src="./docs/public/logo.png" width="128" alt="方弦工具集">
3
- </p>
4
-
5
- # 方弦工具集
6
-
7
- [![CI](https://github.com/fxri-net/toolkit/actions/workflows/ci.yml/badge.svg)](https://github.com/fxri-net/toolkit/actions/workflows/ci.yml)
8
- [![npm version](https://img.shields.io/npm/v/@fxri/toolkit)](https://www.npmjs.com/package/@fxri/toolkit)
9
- [![Node](https://img.shields.io/badge/node-%E2%89%A520-brightgreen)](./docs/getting-started.md#安装)
10
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](./LICENSE)
11
-
12
- > 国内网络建议优先 [Gitee 镜像](https://gitee.com/fxri/toolkit)(与 GitHub 同源同步,仓库/文档/issues/skills 全渠道可用);问题反馈走 [GitHub Issues](https://github.com/fxri-net/toolkit/issues) 或 [Gitee Issues](https://gitee.com/fxri/toolkit/issues)。
13
-
14
- 专为**多人 + AI 跨项目协作**打造:任务管理 + 多语言 CHANGELOG。
15
-
16
- AI 参与开发后,方案与决策散落在对话记录里,会话一关什么都不剩;任务记录零散,谁在做、做到哪,无从查起;发版 CHANGELOG 还要人肉维护多语言。本工具把这条链路沉淀为**仓库内可检索、可校验、可归档的文件**——人离开会话,记忆留在仓库里。
17
-
18
- - **零依赖 AI 技能包(skills)**:方案落盘、发版 CHANGELOG 两套工作流沉淀为 Agent Skills,不绑定任何 AI 工具;skills 可以独立工作,CLI 是可选加速——推荐都装,体验最完整([什么关系?](./docs/faq.md#工具和-skills-都得装吗))
19
- - **不懂 AI 也能用**:任务管理与 CHANGELOG 是纯 CLI 能力;术语都说了人话([先看术语表](./docs/getting-started.md#几个术语-先说人话))
20
-
21
- ## 🚀 30 秒上手
22
-
23
- ```bash
24
- # 1. 项目内安装(推荐,团队共享版本)
25
- pnpm add -D @fxri/toolkit
26
-
27
- # 2. 初始化任务区(生成 .tasks/ 骨架、conventions/ 规范载体与技能入口壳;含本地依赖时写入 prepare 刷新钩子)
28
- pnpm exec toolkit init
29
-
30
- # 3. 查看任务总览
31
- pnpm exec toolkit tasks
32
- ```
33
-
34
- 之后:方案确认后登记为 `.tasks/` 任务文件 → `pnpm exec toolkit tasks check` 校验 → 完成后 `pnpm exec toolkit tasks archive` 归档并做规范沉淀。多任务 / 多仓方案先出纯展示计划表,再逐仓逐任务建档、按序逐个交付提交。完整步骤见 [新手指南](./docs/getting-started.md)。
35
-
36
- ## ✨ 能力矩阵
37
-
38
- | 能力 | 适用场景 | 文档 |
39
- | --- | --- | --- |
40
- | 任务管理(tasks) | 方案落盘、总览过滤、校验归档、导入导出 CSV / XLSX / JSON | [CLI 参考](./docs/cli.md) · [任务文件规范](./docs/guide.md#任务文件规范) |
41
- | 多语言 CHANGELOG(changelog) | 封装 changesets 发版、分组标题本地化 | [CLI 参考](./docs/cli.md#changelog) |
42
- | 协作规范载体(conventions) | 把任务里提炼的规范收进 `.tasks/conventions/`,成为可检索、可校验的项目规范源;支持结构升级、表格形态归一与只读体检 | [CLI 参考](./docs/cli.md) · [完整攻略](./docs/guide.md#conventions-规范沉淀地) |
43
- | Node API | 把上述能力嵌进脚本或平台 | [API 参考](./docs/api.md) |
44
- | 隐私脱敏 | 落盘前自动掩码邮箱、手机号、密钥等 | [配置参考](./docs/config.md) |
45
- | AI 技能包(skills) | 不装本工具也能让 AI 按同一套规范干活;装了可一键分发技能(`--scope project` 随仓库入库、队友 clone 即用) | [完整攻略](./docs/guide.md#ai-技能包-skills) · [FAQ](./docs/faq.md#工具和-skills-都得装吗) |
46
- | 配置文件 | 三层(全局 / 项目 / 本地)定制脱敏、告警、导入列映射、语言表;`toolkit config status` 只读查看生效情况与来源 | [CLI 参考](./docs/cli.md#config-1-11-2-新增) · [配置参考](./docs/config.md) |
47
-
48
- ## 📚 文档
49
-
50
- | 文档 | 适合谁 |
51
- | --- | --- |
52
- | [新手指南](./docs/getting-started.md) | 第一次接触,想 30 秒跑起来(含零基础术语表) |
53
- | [操作手册](./docs/handbook.md) | 日常照着做:每个场景该说什么、做什么 |
54
- | [完整攻略](./docs/guide.md) | 日常使用:工作流、Git 纳管、项目级激活、多语言 CHANGELOG |
55
- | [CLI 参考](./docs/cli.md) | 查命令、参数、默认值、退出码 |
56
- | [API 参考](./docs/api.md) | 作为库引入 Node 项目 |
57
- | [配置参考](./docs/config.md) | 查配置文件字段(全局 / 项目 / 本地三层) |
58
- | [更新日志](./docs/changelog.md) | 查各版本变更内容 |
59
- | [FAQ](./docs/faq.md) | 遇到问题先来这里找 |
60
- | [推荐 AI 全局规则](./docs/ai-rules.md) | 想让 AI 助手按本工具的最佳实践协作 |
61
- | [推荐提交信息规则](./docs/commit-rules.md) | 想让 AI 按统一格式写 git 提交信息 |
62
- | [完整文档站](https://fxri-net.github.io/toolkit/) | 在线阅读体验 |
63
-
64
- ## 🧩 AI 技能包(skills)
65
-
66
- ```bash
67
- pnpm add -g @fxri/toolkit && toolkit skills install # 装了 CLI 一键分发(npm 用户:npm i -g @fxri/toolkit)
68
- toolkit skills install --scope project # 项目面分发:真源与入口薄壳随仓库入库、队友 clone 即用
69
- pnpm dlx skills add fxri-net/toolkit # 也可用上游安装器(npm 用户:npx skills add fxri-net/toolkit)
70
- ```
71
-
72
- 技能随包分发(真源为包内 `skills/`),与 CLI 同一发布批次(技能内容版本独立编号);`toolkit skills install` 默认软链,链接创建失败自动降级副本,`toolkit skills status` 查现场,`toolkit skills remove` 卸载。`--scope project` 换项目面——真源落 `<仓库根>/.agents/skills/`、其余候选目录落入口薄壳,随 git 入库后队友 clone 靠 `toolkit init` 写入的 `prepare` 钩子自动补齐。
73
-
74
- - [fxri-plan-to-task](./skills/fxri-plan-to-task/SKILL.md):方案确认后落盘为任务文件(任务分解与纯展示计划表、逐仓逐任务建档、check、归档 + 任务级规范沉淀为强制终点)
75
- - [fxri-release-changelog](./skills/fxri-release-changelog/SKILL.md):发版时创建变更集、格式化多语言 CHANGELOG
76
- - [fxri-session-recap](./skills/fxri-session-recap/SKILL.md):会话收尾全量沉淀、新会话三层恢复、历史任务时间批量修正(1.7.0 新增技能)
77
-
78
- skills 与工具的关系、只在公司项目激活等说明见 [FAQ](./docs/faq.md) 与 [完整攻略](./docs/guide.md#ai-技能包-skills)。
79
-
80
- ## 📦 安装
81
-
82
- ```bash
83
- pnpm add -D @fxri/toolkit # 项目 devDependency(团队项目推荐,版本随仓库锁定)
84
- pnpm i -g @fxri/toolkit # 全局(个人多项目推荐;pnpm 不受 nvm 切版本影响)
85
- pnpm dlx @fxri/toolkit tasks # 不安装临时执行
86
- ```
87
-
88
- npm / yarn / bun 用户与各方式对比见 [新手指南 · 安装](./docs/getting-started.md#安装)。
89
-
90
- ## 🔒 隐私脱敏
91
-
92
- 落盘记录默认脱敏敏感信息:内置邮箱、手机号、身份证、IPv4、内网 URL、JWT、AWS / GitHub / OpenAI / Slack 密钥等 13 类规则,支持自定义规则与禁用。开关三档(CLI 参数 > 环境变量 > 配置文件),详见 [配置参考](./docs/config.md)。
93
-
94
- ## ⚙️ 环境要求
95
-
96
- - Node.js >= 20.19.0(更低版本可安装,changesets 相关子命令不可用,见 [FAQ](./docs/faq.md#node-18-能用吗))
97
-
98
- ## 📄 版权信息
99
-
100
- 作者:唐启云 <tqy@fxri.net>
101
-
102
- 出品:方弦研究所
103
-
104
- 版权:Copyright © 2026 唐启云. All rights reserved.
105
-
106
- 网站:[方弦研究信息网](https://fxri.net:444/)
107
-
108
- 协议:[MIT License](./LICENSE)
109
-
110
- 商标:"方弦®"为第42类注册商标(注册号89648411),本开源许可不授予商标使用权,详见 [TRADEMARK.md](./TRADEMARK.md)
111
-
112
- > 方弦研究所为唐启云个人项目品牌与出品方,非独立法人实体;本软件著作权归唐启云所有。
1
+ <p align="center">
2
+ <img src="./docs/public/logo.png" width="128" alt="方弦工具集">
3
+ </p>
4
+
5
+ # 方弦工具集
6
+
7
+ [![CI](https://github.com/fxri-net/toolkit/actions/workflows/ci.yml/badge.svg)](https://github.com/fxri-net/toolkit/actions/workflows/ci.yml)
8
+ [![npm version](https://img.shields.io/npm/v/@fxri/toolkit)](https://www.npmjs.com/package/@fxri/toolkit)
9
+ [![Node](https://img.shields.io/badge/node-%E2%89%A520-brightgreen)](./docs/getting-started.md#安装)
10
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](./LICENSE)
11
+
12
+ > 国内网络建议优先 [Gitee 镜像](https://gitee.com/fxri/toolkit)(与 GitHub 同源同步,仓库/文档/issues/skills 全渠道可用);问题反馈走 [GitHub Issues](https://github.com/fxri-net/toolkit/issues) 或 [Gitee Issues](https://gitee.com/fxri/toolkit/issues)。
13
+
14
+ 专为**多人 + AI 跨项目协作**打造:任务管理 + 多语言 CHANGELOG。
15
+
16
+ AI 参与开发后,方案与决策散落在对话记录里,会话一关什么都不剩;任务记录零散,谁在做、做到哪,无从查起;发版 CHANGELOG 还要人肉维护多语言。本工具把这条链路沉淀为**仓库内可检索、可校验、可归档的文件**——人离开会话,记忆留在仓库里。
17
+
18
+ - **零依赖 AI 技能包(skills)**:方案落盘、发版 CHANGELOG 两套工作流沉淀为 Agent Skills,不绑定任何 AI 工具;skills 可以独立工作,CLI 是可选加速——推荐都装,体验最完整([什么关系?](./docs/faq.md#工具和-skills-都得装吗))
19
+ - **不懂 AI 也能用**:任务管理与 CHANGELOG 是纯 CLI 能力;术语都说了人话([先看术语表](./docs/getting-started.md#几个术语-先说人话))
20
+
21
+ ## 🚀 30 秒上手
22
+
23
+ ```bash
24
+ # 1. 项目内安装(推荐,团队共享版本)
25
+ pnpm add -D @fxri/toolkit
26
+
27
+ # 2. 初始化任务区(生成 .tasks/ 骨架、conventions/ 规范载体与技能入口壳;含本地依赖时写入 prepare 刷新钩子)
28
+ pnpm exec toolkit init
29
+
30
+ # 3. 查看任务总览
31
+ pnpm exec toolkit tasks
32
+ ```
33
+
34
+ 之后:方案确认后登记为 `.tasks/` 任务文件 → `pnpm exec toolkit tasks check` 校验 → 完成后 `pnpm exec toolkit tasks archive` 归档并做规范沉淀。多任务 / 多仓方案先出纯展示计划表,再逐仓逐任务建档、按序逐个交付提交。完整步骤见 [新手指南](./docs/getting-started.md)。
35
+
36
+ ## ✨ 能力矩阵
37
+
38
+ | 能力 | 适用场景 | 文档 |
39
+ | --- | --- | --- |
40
+ | 任务管理(tasks) | 方案落盘、总览过滤、校验归档、导入导出 CSV / XLSX / JSON | [CLI 参考](./docs/cli.md) · [任务文件规范](./docs/guide.md#任务文件规范) |
41
+ | 多语言 CHANGELOG(changelog) | 封装 changesets 发版、分组标题本地化 | [CLI 参考](./docs/cli.md#changelog) |
42
+ | 协作规范载体(conventions) | 把任务里提炼的规范收进 `.tasks/conventions/`,成为可检索、可校验的项目规范源;支持结构升级、表格形态归一与只读体检 | [CLI 参考](./docs/cli.md) · [完整攻略](./docs/guide.md#conventions-规范沉淀地) |
43
+ | Node API | 把上述能力嵌进脚本或平台 | [API 参考](./docs/api.md) |
44
+ | 隐私脱敏 | 落盘前自动掩码邮箱、手机号、密钥等 | [配置参考](./docs/config.md) |
45
+ | AI 技能包(skills) | 不装本工具也能让 AI 按同一套规范干活;装了可一键分发技能(`--scope project` 随仓库入库、队友 clone 即用) | [完整攻略](./docs/guide.md#ai-技能包-skills) · [FAQ](./docs/faq.md#工具和-skills-都得装吗) |
46
+ | 配置文件 | 三层(全局 / 项目 / 本地)定制脱敏、告警、导入列映射、语言表;`toolkit config status` 只读查看生效情况与来源 | [CLI 参考](./docs/cli.md#config-1-11-2-新增) · [配置参考](./docs/config.md) |
47
+
48
+ ## 📚 文档
49
+
50
+ | 文档 | 适合谁 |
51
+ | --- | --- |
52
+ | [新手指南](./docs/getting-started.md) | 第一次接触,想 30 秒跑起来(含零基础术语表) |
53
+ | [操作手册](./docs/handbook.md) | 日常照着做:每个场景该说什么、做什么 |
54
+ | [完整攻略](./docs/guide.md) | 日常使用:工作流、Git 纳管、项目级激活、多语言 CHANGELOG |
55
+ | [CLI 参考](./docs/cli.md) | 查命令、参数、默认值、退出码 |
56
+ | [API 参考](./docs/api.md) | 作为库引入 Node 项目 |
57
+ | [配置参考](./docs/config.md) | 查配置文件字段(全局 / 项目 / 本地三层) |
58
+ | [更新日志](./docs/changelog.md) | 查各版本变更内容 |
59
+ | [FAQ](./docs/faq.md) | 遇到问题先来这里找 |
60
+ | [推荐 AI 全局规则](./docs/ai-rules.md) | 想让 AI 助手按本工具的最佳实践协作 |
61
+ | [推荐提交信息规则](./docs/commit-rules.md) | 想让 AI 按统一格式写 git 提交信息 |
62
+ | [完整文档站](https://fxri-net.github.io/toolkit/) | 在线阅读体验 |
63
+
64
+ ## 🧩 AI 技能包(skills)
65
+
66
+ ```bash
67
+ pnpm add -g @fxri/toolkit && toolkit skills install # 装了 CLI 一键分发(npm 用户:npm i -g @fxri/toolkit)
68
+ toolkit skills install --scope project # 项目面分发:真源与入口薄壳随仓库入库、队友 clone 即用
69
+ pnpm dlx skills add fxri-net/toolkit # 也可用上游安装器(npm 用户:npx skills add fxri-net/toolkit)
70
+ ```
71
+
72
+ 技能随包分发(真源为包内 `skills/`),与 CLI 同一发布批次(技能内容版本独立编号);`toolkit skills install` 默认软链,链接创建失败自动降级副本,`toolkit skills status` 查现场,`toolkit skills remove` 卸载。`--scope project` 换项目面——真源落 `<仓库根>/.agents/skills/`、其余候选目录落入口薄壳,随 git 入库后队友 clone 靠 `toolkit init` 写入的 `prepare` 钩子自动补齐。
73
+
74
+ - [fxri-plan-to-task](./skills/fxri-plan-to-task/SKILL.md):方案确认后落盘为任务文件(任务分解与纯展示计划表、逐仓逐任务建档、check、归档 + 任务级规范沉淀为强制终点)
75
+ - [fxri-release-changelog](./skills/fxri-release-changelog/SKILL.md):发版时创建变更集、格式化多语言 CHANGELOG
76
+ - [fxri-session-recap](./skills/fxri-session-recap/SKILL.md):会话收尾全量沉淀、新会话三层恢复、历史任务时间批量修正(1.7.0 新增技能)
77
+ - [fxri-text-encoding](./skills/fxri-text-encoding/SKILL.md):文本文件的 UTF-8 / BOM / 行尾基线,脚本中文乱码、终端与重定向输出乱码、首行报错的定位与修复
78
+
79
+ skills 与工具的关系、只在公司项目激活等说明见 [FAQ](./docs/faq.md) 与 [完整攻略](./docs/guide.md#ai-技能包-skills)。
80
+
81
+ ## 📦 安装
82
+
83
+ ```bash
84
+ pnpm add -D @fxri/toolkit # 项目 devDependency(团队项目推荐,版本随仓库锁定)
85
+ pnpm i -g @fxri/toolkit # 全局(个人多项目推荐;pnpm 不受 nvm 切版本影响)
86
+ pnpm dlx @fxri/toolkit tasks # 不安装临时执行
87
+ ```
88
+
89
+ npm / yarn / bun 用户与各方式对比见 [新手指南 · 安装](./docs/getting-started.md#安装)。
90
+
91
+ ## 🔒 隐私脱敏
92
+
93
+ 落盘记录默认脱敏敏感信息:内置邮箱、手机号、身份证、IPv4、内网 URL、JWT、AWS / GitHub / OpenAI / Slack 密钥等 13 类规则,支持自定义规则与禁用。开关三档(CLI 参数 > 环境变量 > 配置文件),详见 [配置参考](./docs/config.md)。
94
+
95
+ ## ⚙️ 环境要求
96
+
97
+ - Node.js >= 20.19.0(更低版本可安装,changesets 相关子命令不可用,见 [FAQ](./docs/faq.md#node-18-能用吗))
98
+
99
+ ## 📄 版权信息
100
+
101
+ 作者:唐启云 <tqy@fxri.net>
102
+
103
+ 出品:方弦研究所
104
+
105
+ 版权:Copyright © 2026 唐启云. All rights reserved.
106
+
107
+ 网站:[方弦研究信息网](https://fxri.net:444/)
108
+
109
+ 协议:[MIT License](./LICENSE)
110
+
111
+ 商标:"方弦®"为第42类注册商标(注册号89648411),本开源许可不授予商标使用权,详见 [TRADEMARK.md](./TRADEMARK.md)
112
+
113
+ > 方弦研究所为唐启云个人项目品牌与出品方,非独立法人实体;本软件著作权归唐启云所有。
package/TRADEMARK.md CHANGED
@@ -1,41 +1,41 @@
1
- # 商标声明
2
-
3
- ## 基本信息
4
-
5
- | 项目 | 内容 |
6
- |---|---|
7
- | 商标名称 | 方弦® |
8
- | 商标类型 | 文字商标 |
9
- | 商标说明 | 商标由文字"方弦"组成 |
10
- | 商标类别 | 第42类(共10项) |
11
- | 注册号 | 89648411 |
12
- | 申请人 | 唐启云 |
13
- | 递交商标局 | 2026-01-12 |
14
- | 版本 | 基础版 |
15
-
16
- ## 第42类服务项目
17
-
18
- 计算机出租;计算机软件设计;为他人研究和开发新产品;计算机软件维护;把有形的数据或文件转换成电子媒体;为他人创建和维护网站;网络服务器出租;提供互联网搜索引擎;托管计算机站(网站);云计算。
19
-
20
- ## 权利状态
21
-
22
- "方弦®"商标(注册号89648411)已获中国国家知识产权局商标局核准注册,核定使用于第42类上述服务项目,现为注册商标。
23
-
24
- ## 授权范围
25
-
26
- 本仓库的开源许可证(MIT License)仅授予代码的使用、修改和分发权利,**不构成对任何商标、服务标记或品牌名称的授权许可**。
27
-
28
- 任何派生作品、修改版本、商业产品均不得使用"方弦"名称、Logo 或相关标识,除非获得书面授权。
29
-
30
- ## 使用规范
31
-
32
- - 在开源社区讨论、文档引用中提及本项目时,可使用"方弦®"指代本项目名称
33
- - 未经书面授权,不得在任何商业产品、服务或宣传材料中使用"方弦"标识
34
-
35
- ## 获取授权
36
-
37
- 如需将"方弦"商标用于商业用途,请联系:唐启云 <tqy@fxri.net>
38
-
39
- ## 侵权处理
40
-
41
- 如发现未经授权使用"方弦®"商标的行为,请通过上述联系方式举报。
1
+ # 商标声明
2
+
3
+ ## 基本信息
4
+
5
+ | 项目 | 内容 |
6
+ |---|---|
7
+ | 商标名称 | 方弦® |
8
+ | 商标类型 | 文字商标 |
9
+ | 商标说明 | 商标由文字"方弦"组成 |
10
+ | 商标类别 | 第42类(共10项) |
11
+ | 注册号 | 89648411 |
12
+ | 申请人 | 唐启云 |
13
+ | 递交商标局 | 2026-01-12 |
14
+ | 版本 | 基础版 |
15
+
16
+ ## 第42类服务项目
17
+
18
+ 计算机出租;计算机软件设计;为他人研究和开发新产品;计算机软件维护;把有形的数据或文件转换成电子媒体;为他人创建和维护网站;网络服务器出租;提供互联网搜索引擎;托管计算机站(网站);云计算。
19
+
20
+ ## 权利状态
21
+
22
+ "方弦®"商标(注册号89648411)已获中国国家知识产权局商标局核准注册,核定使用于第42类上述服务项目,现为注册商标。
23
+
24
+ ## 授权范围
25
+
26
+ 本仓库的开源许可证(MIT License)仅授予代码的使用、修改和分发权利,**不构成对任何商标、服务标记或品牌名称的授权许可**。
27
+
28
+ 任何派生作品、修改版本、商业产品均不得使用"方弦"名称、Logo 或相关标识,除非获得书面授权。
29
+
30
+ ## 使用规范
31
+
32
+ - 在开源社区讨论、文档引用中提及本项目时,可使用"方弦®"指代本项目名称
33
+ - 未经书面授权,不得在任何商业产品、服务或宣传材料中使用"方弦"标识
34
+
35
+ ## 获取授权
36
+
37
+ 如需将"方弦"商标用于商业用途,请联系:唐启云 <tqy@fxri.net>
38
+
39
+ ## 侵权处理
40
+
41
+ 如发现未经授权使用"方弦®"商标的行为,请通过上述联系方式举报。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fxri/toolkit",
3
- "version": "1.12.5",
3
+ "version": "1.13.0",
4
4
  "description": "专为多人 + AI 跨项目协作打造:任务管理 + 多语言 CHANGELOG。",
5
5
  "license": "MIT",
6
6
  "author": {
package/skills/README.md CHANGED
@@ -8,9 +8,10 @@
8
8
 
9
9
  | 技能 | 版本 | 用途 |
10
10
  | --- | --- | --- |
11
- | [fxri-plan-to-task](./fxri-plan-to-task/SKILL.md) | 1.9.3 | 方案落盘:任务分解与纯展示计划表 → 逐仓逐任务建档 → 校验 → 归档 → 任务级规范沉淀(能力终点);规范载体迁移与升级 |
11
+ | [fxri-plan-to-task](./fxri-plan-to-task/SKILL.md) | 1.9.4 | 方案落盘:任务分解与纯展示计划表 → 逐仓逐任务建档 → 校验 → 归档 → 任务级规范沉淀(能力终点);规范载体迁移与升级 |
12
12
  | [fxri-release-changelog](./fxri-release-changelog/SKILL.md) | 1.2.1 | changesets 发版与多语言 CHANGELOG 维护 |
13
- | [fxri-session-recap](./fxri-session-recap/SKILL.md) | 1.6.0 | 会话收尾全量沉淀 + 规范沉淀 / 新会话三层恢复 / 历史任务时间批量修正 |
13
+ | [fxri-session-recap](./fxri-session-recap/SKILL.md) | 1.6.2 | 会话收尾全量沉淀 + 规范沉淀 / 新会话三层恢复 / 历史任务时间批量修正 |
14
+ | [fxri-text-encoding](./fxri-text-encoding/SKILL.md) | 1.0.0 | 文本编码:按「生产者 × 消费者」定文件字节与进程管道编码,处置脚本乱码、终端与重定向输出乱码、乱码反查与不可见字符、首行报错 |
14
15
 
15
16
  版本号取自各 SKILL.md 的 frontmatter `metadata.version`(`toolkit skills status` / `skills install` 打印的真源版本),与正文首部版本声明双写一致。
16
17
 
@@ -3,14 +3,14 @@ name: fxri-plan-to-task
3
3
  description: 将已确认的实施方案分解为可独立交付的任务并给出计划表,再落盘为标准任务文件并跟踪至归档:建档评估(查 active/archive 判同主题)、按模板建档、状态机更新、四级时间源取证、自查、任务级规范沉淀与归档。方案确认后表达「开始落地/登记记录」的意图,或即将改仓库文件时使用——含任务分解、建档、任务登记、落盘、归档、任务校验、规范载体迁移与升级(conventions 单文件升目录、v1 / v2 升 v3)等说法及口语近义表达(如按这个做吧、记一下、建个任务跟踪)均触发。不用于方案未确认的对话、会话收尾整场沉淀(fxri-session-recap 模式一)、与任务记录无关的普通 TODO、issue 管理或日常提交信息撰写。
4
4
  license: MIT
5
5
  metadata:
6
- version: "1.9.3"
6
+ version: "1.9.4"
7
7
  author: fxri
8
8
  source: https://github.com/fxri-net/toolkit
9
9
  ---
10
10
 
11
11
  # 方案落盘:任务建档与归档
12
12
 
13
- > 本技能版本 1.9.3(随 @fxri/toolkit 同批分发)。被问版本时即报此值(不读磁盘、不跑 CLI);与 `toolkit skills status` 的磁盘值不一致即说明会话上下文已过期,开新会话即可。
13
+ > 本技能版本 1.9.4(随 @fxri/toolkit 同批分发)。被问版本时即报此值(不读磁盘、不跑 CLI);与 `toolkit skills status` 的磁盘值不一致即说明会话上下文已过期,开新会话即可。
14
14
 
15
15
  ## 何时使用
16
16
 
@@ -1,13 +1,13 @@
1
- ---
2
- owner: <负责人 git 用户名>
3
- status: 待办
4
- created: <创建日 YYYYMMDD>
5
- updated: <创建日 YYYYMMDD,随每次修改同步>
6
- completed: ''
7
- depends_on: []
8
- scope: <影响范围>
9
- ---
10
-
11
- # 任务标题
12
-
13
- (方案正文:背景、实施方案、影响范围、验证方式)
1
+ ---
2
+ owner: <负责人 git 用户名>
3
+ status: 待办
4
+ created: <创建日 YYYYMMDD>
5
+ updated: <创建日 YYYYMMDD,随每次修改同步>
6
+ completed: ''
7
+ depends_on: []
8
+ scope: <影响范围>
9
+ ---
10
+
11
+ # 任务标题
12
+
13
+ (方案正文:背景、实施方案、影响范围、验证方式)
@@ -45,7 +45,7 @@
45
45
 
46
46
  1. **索引表删两列**:删「状态」「确立来源任务」两列
47
47
  2. **`history.md` 表头归一**:v2 存量 `history.md` 沿用「规则 ID / 名称」旧表头,首格归一为稳定 ID `ID`(与索引表首列同归一)
48
- 3. **退休条目迁出**:把原状态为 `已废弃` 的行迁入 `retired.md`(首部补 `# 规范退休记录`、元规则与 7 列表头),并从 Z1 索引表删除;同步删除 Z2 分册内对应小节(三层清理的索引 + 分册两层)
48
+ 3. **退休条目迁出**:把原状态为 `已废弃` 的行迁入 `retired.md`(首部补 `# 规范退休记录`、元规则与固定表头 `ID | 规则 | 退休时语义(冻结) | 归属 | 后继 | 退休来源任务 | 条文去向`),并从 Z1 索引表删除;同步删除 Z2 分册内对应小节(三层清理的索引 + 分册两层)
49
49
  4. **`retired.md` 按需建**:无退休条目则不创建该文件
50
50
  5. **来源 / ID 补录报告**:`history.md` 中 ID 列仍用规则名者、来源列含多任务者,输出人工复核报告——**不做全自动改写**(历史行只追加不改旧的元规则下,改写须人工确认)
51
51
  6. **用法说明 / 写入纪律复核**:`index.md` 表外的自由文本(用法说明、写入纪律)若仍残留 v2 措辞(如「填『确立来源任务』」「把『状态』改为『已废弃』」),输出人工复核报告——升级只机械归一索引表列结构,不改写描述该表的自由文本
@@ -4,6 +4,8 @@
4
4
 
5
5
  ## 1. 载体结构
6
6
 
7
+ > `.tasks/` 外层骨架(`active/` / `archive/` / `conventions/` 三目录与命名)以 `task-spec.md` §1 为真源;本节只展开 `conventions/` 内部结构。
8
+
7
9
  ```
8
10
  .tasks/
9
11
  ├── active/ # 进行中的任务
@@ -3,14 +3,14 @@ name: fxri-session-recap
3
3
  description: 会话收尾的工作记忆沉淀 + 新会话开场恢复 + 历史任务时间修正:收尾时把整场会话的全部任务完整建档归档,按四级时间源还原真实完成时间,沉淀规范进 conventions 载体;新会话开场按三层恢复(全量索引 + active 精读 + 近窗归档)重建现场并核对规范;也可批量修正历史归档时间。用户表达会话收尾意图(今天先到这、收个尾、归档本次会话、把结论记下来)、接续意图(恢复上下文、继续上次、上次做到哪)或修正历史任务时间时使用。不用于会话中途的常规方案建档(那是 fxri-plan-to-task 的职责)、与工作交接无关的代码技术总结。
4
4
  license: MIT
5
5
  metadata:
6
- version: "1.6.0"
6
+ version: "1.6.2"
7
7
  author: fxri
8
8
  source: https://github.com/fxri-net/toolkit
9
9
  ---
10
10
 
11
11
  # 会话归档、上下文恢复与历史修正
12
12
 
13
- > 本技能版本 1.6.0(随 @fxri/toolkit 同批分发)。被问版本时即报此值(不读磁盘、不跑 CLI);与 `toolkit skills status` 的磁盘值不一致即说明会话上下文已过期,开新会话即可。
13
+ > 本技能版本 1.6.2(随 @fxri/toolkit 同批分发)。被问版本时即报此值(不读磁盘、不跑 CLI);与 `toolkit skills status` 的磁盘值不一致即说明会话上下文已过期,开新会话即可。
14
14
 
15
15
  ## 何时使用
16
16
 
@@ -8,6 +8,6 @@
8
8
  2. **L1 工作层精读**:逐文件读 `.tasks/active/` 全部任务(决策、进展、阻塞)。⚠️ **搁置识别**:active 任务 `updated` 距今 >1 年时标注「疑似搁置(距今 X 年)」,建议用户确认收尾或放弃,不当「进行中」呈现
9
9
  3. **L2 近窗精读**:读最近归档。**近窗按时间连续性判定,不按数量**:先定位最新归档块的完成时间,只精读从该时刻向前连续活跃的归档(归档月份 ≤ 6 个月或归档块 ≤ 200 条时精读全文);**被 ≥1 年空洞隔断的旧归档一律只入 L0 索引,不精读、不列为「最近完成」**;超阈值降级为统计(按月/负责人汇总 + 近期明细),防止历史膨胀撑爆上下文
10
10
  4. **按需拉取**:更早历史(含空洞隔断的旧归档)不主动展开,在 L0 索引可见;用户点名、或 AI 判断相关时用 `--owner`/`--date` 过滤检索;用户明确说「全部恢复」才全量列出
11
- 5. **规范核对与提炼**:读 conventions 载体(存在时)纳入现场——常驻只读 `index.md`(`history.md` 与各分册按需读),再按任务 `scope` 命中加载 `common.md` 与端分册;载体为 v1 或 `check` / `toolkit conventions status` 报形态告警时提示用户可升级(升级链路见 `../../fxri-plan-to-task/references/conventions-migration.md`);对照近期任务按主文件「规范提炼子流程」提议增改——⚠️ 恢复主体只读,写载体是用户确认后的独立动作
11
+ 5. **规范核对与提炼**:读 conventions 载体(存在时)纳入现场——常驻只读 `index.md`(`history.md` / `retired.md` 与各分册按需读),再按任务 `scope` 命中加载 `common.md` 与端分册;载体为 v1 / v2 或 `check` / `toolkit conventions status` 报形态告警时提示用户可升级(升级链路见 `../../fxri-plan-to-task/references/conventions-migration.md`;该兄弟路径不存在时改读包内真源——`toolkit skills status` 打印的「技能源」目录下同名文件);对照近期任务按主文件「规范提炼子流程」提议增改——⚠️ 恢复主体只读,写载体是用户确认后的独立动作
12
12
  6. **输出**:全部任务索引摘要 → 进行中/阻塞任务(含搁置标注)→ 最近完成(连续活跃期内,不含空洞旧档)→ 未完事项 → **多任务执行顺序**(会话留有展示型计划表则按表;无表时按各 active 任务正文的「批次 / 计划位置 / 前置」行重建)→ 规范现场 → **建议的下一步**
13
13
  7. 全程不写任务区文件;对存疑内容向用户确认后再动
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: fxri-text-encoding
3
+ description: 新建、改写、生成、转码 `.ps1`、`.bat`、`.cmd`、`.sh`、`.properties`、给 Excel 的 `.csv` 等文本文件之前,先按读取方定字符集、BOM 与行尾;AI 自己用文件写入 / 编辑工具落盘后立即自查首三字节(这类工具默认不写 BOM)。也用于乱码归属:终端或命令输出中文变问号、重定向出的文件后续解析失败、`Get-Content` 读 UTF-8 文件乱码、管道传给原生命令变 `?`、编译报看不见的非法字符——含编码、字符集、BOM、乱码、转码、换行、CRLF、LF、UTF-8 BOM、chcp、locale、stdout 编码等说法及口语近义表达(中文变问号、打开是乱码)。事后定位同样适用:PowerShell 报 Missing closing、脚本首行命令报错、JSON 带 BOM 解析失败、跨平台分发脚本打不开。不用于 Base64 / URL 编码、排序与字符计数、文件名规范化、CSV 语法、路径分隔符、时区,也不用于 git 提交信息、任务建档或代码风格。
4
+ license: MIT
5
+ metadata:
6
+ version: "1.0.0"
7
+ author: fxri
8
+ source: https://github.com/fxri-net/toolkit
9
+ ---
10
+
11
+ # 文本编码与字节形态
12
+
13
+ > 本技能版本 1.0.0(随 @fxri/toolkit 同批分发)。被问版本时即报此值(不读磁盘、不跑 CLI);与 `toolkit skills status` 的磁盘值不一致即说明会话上下文已过期,开新会话即可。
14
+
15
+ ## 何时使用
16
+
17
+ 写之前先定字符集、BOM、行尾三件套;AI 写入工具落盘后立刻判首三字节(见「写盘」);出错先走乱码三问,文件侧查速查表,运行期查「跑起来乱码」。
18
+
19
+ ## 先分归属(乱码三问)
20
+
21
+ 故障是「写入方字节」×「读取方默认解码」,与操作系统无关;看到乱码先走三问,别凭感觉改文件:
22
+
23
+ 1. **是谁的字节?** 重定向到文件看首字节:字节对但显示乱 → 终端或管线解码错;字节本身错 → 生产者编码错
24
+ 2. **还能救吗?** 出现 `�`(U+FFFD)说明解码已失败、原字节丢失,**不可逆**;无 `�` 的多为 mojibake,可反向转码
25
+ 3. **错在第几跳?** `涓枃` = UTF-8 被当 GBK 读;`䏿–‡` = UTF-8 被当 Latin-1 读;`ÖÐÎÄ` = GBK 被当 Latin-1 读。只修认出的那一跳,别整条链重来
26
+
27
+ 第 1 问的判据——读取方无 BOM 时按什么解码:
28
+
29
+ | 读取方 | 默认解码 |
30
+ | --- | --- |
31
+ | `powershell.exe`、Excel、`cmd` 与多数 Windows 老工具 | 系统 ANSI 或 OEM 代码页(简体中文均为 936) |
32
+ | 记事本 | Win10 1903 起先试 UTF-8、失败回落 ANSI,「打开正常」不能当编码证据 |
33
+ | `pwsh`、Node、Python 3、Go、Rust | UTF-8 |
34
+ | bash / sh / 各语言 `open()` | 按 locale,`LANG=C` 时为 ASCII |
35
+
36
+ 第 2、3 问的处置——按特征串选反向转码(先备份原件,转完核对本意):
37
+
38
+ - `涓枃` 类 `iconv -f GBK -t UTF-8`;`䏿–‡` 类 `-f ISO-8859-1`
39
+ - 无 iconv 时:`[Text.Encoding]::UTF8.GetString([Text.Encoding]::GetEncoding(936).GetBytes($s))`,Latin-1 把 936 换 28591
40
+
41
+ ## 基线决策(按文件类型)
42
+
43
+ | 文件类型 | 字符集 | BOM | 行尾 | 理由 |
44
+ | --- | --- | --- | --- | --- |
45
+ | `.ps1` / `.psm1` / `.psd1` | UTF-8 | 有 | 均可 | `powershell.exe` 无 BOM 即按 ANSI 解码,中文必炸 |
46
+ | `.bat` / `.cmd` | ASCII 优先;必须中文时用系统 ANSI | 无 | CRLF | BOM 会让首条命令报错 |
47
+ | `.sh` / `Makefile` / 带 shebang 的脚本 | UTF-8 | 无 | LF | BOM 会污染 shebang |
48
+ | `.md` / `.ts` / `.js` / `.json` / `.yml` / `.toml` / `.xml` | UTF-8 | 无 | LF | 工具链默认;JSON 带 BOM 多解析失败,XML 改字节而非只改声明 |
49
+ | `.properties` | Latin-1 + `\uXXXX`,或 `load(Reader)` 显式 UTF-8 | 无 | LF | `load(InputStream)` 固定按 ISO-8859-1 读 |
50
+ | C / C++ / Java 源文件 | UTF-8 | 有;或加 `/utf-8` / `-encoding UTF-8` | LF | MSVC 按系统代码页读源文件,无 BOM 中文报 C4819 |
51
+ | 交给 Excel 的 `.csv` | UTF-8 | 有 | 遵循目标平台 | 无 BOM 时 Excel 按 ANSI 解码 |
52
+
53
+ 即便只在 `pwsh` 下跑也统一带 BOM——脚本常在别人机器上跑;`.psm1` / `.psd1` 同理。
54
+
55
+ ## 写盘:谁在悄悄改字节
56
+
57
+ | 写法 | 实际行为 |
58
+ | --- | --- |
59
+ | AI 文件写入 / 编辑工具;编辑器「保存为 UTF-8」 | 不写 BOM,须写完补或写入时前置 `\uFEFF` |
60
+ | `powershell.exe` `Set-Content` / `Add-Content` | 省略 `-Encoding` 按系统 ANSI 写,UTF-8 中文落盘即坏;`-Encoding UTF8` 写 BOM |
61
+ | `powershell.exe` `Export-Csv` 省略 `-Encoding` | 写 ASCII,中文直接变 `?`;加 `-Append` 时编码又与新建不同 |
62
+ | `pwsh` `Set-Content` / `Out-File` / `>` | 默认 `utf8NoBOM`,要 BOM 显式 `utf8BOM` |
63
+ | .NET `[IO.File]::WriteAllText` / Node `fs.writeFileSync` | 均不写 BOM,须分别传 `[Text.UTF8Encoding]::new($true)`、前置 `"\uFEFF"` |
64
+ | Python `open(p, "w", encoding="utf-8-sig")` | 写 BOM;`"utf-8"` 不写;省略 `encoding` 走 locale |
65
+ | `.editorconfig` `charset` / git `.gitattributes` | 前者只在编辑器保存时生效;后者 `eol=` 管行尾、`working-tree-encoding=` 管编码,**都不补 BOM** |
66
+
67
+ ⚠️ 两者同名不同义:要在两种 shell 下都跑,用 `[Text.UTF8Encoding]::new($true)` 显式指定;`utf8BOM` 只有 `pwsh` 认。
68
+
69
+ 写完立刻自查(AI 写入工具默认无 BOM,是本类故障最常见来源):
70
+
71
+ 1. 新建或改写 `.ps1` 后判首三字节,不是 `EF BB BF` 当场补,别等运行时报错
72
+ 2. 批量生成、打包、格式化钩子跑完后抽查产物,并回跑一次生成脚本——只补产物不修产线,下次还会丢
73
+ 3. 纯内联 `-Command` 不落盘的没有文件侧问题,运行期另查下一节
74
+
75
+ 判工具:`powershell.exe` `[IO.File]::ReadAllBytes($p)[0..2] -join ','`(`239,187,191` 即有 BOM)、Node `fs.readFileSync(p).subarray(0,3).toString("hex")`(`efbbbf`)、bash `head -c 3 f | xxd -p`;行尾 `file f` 报 `with CRLF, LF line terminators` 即混用;末尾缺换行 `tail -c 1 f | xxd -p` 非 `0a` 即缺。
76
+
77
+ Node `readFileSync(p, "utf8")` 会保留 `\uFEFF`,解析前 `s.replace(/^\uFEFF/, "")`;补 BOM(内容已是 UTF-8)用 `[IO.File]::WriteAllText($p, [IO.File]::ReadAllText($p), [Text.UTF8Encoding]::new($true))`,Node 读回后前置 `"\uFEFF"`。
78
+
79
+ 全仓巡检:`git ls-files '*.ps1' '*.sh' '*.csv' '*.bat'` 列出目标后逐个判首三字节;行尾混用一次性捞全 `git ls-files -z | xargs -0 file | grep CRLF`。人眼抽查只用于验证产线,别当门禁。
80
+
81
+ ## 组合速查:文件字节类
82
+
83
+ | 现象 | 根因 | 处置 |
84
+ | --- | --- | --- |
85
+ | `powershell.exe` 报 `Missing closing '}'` / `Unexpected token`,文件看着没问题 | `.ps1` 无 BOM,中文被按 ANSI 解码 | 转 UTF-8 with BOM,逻辑不变 |
86
+ | `.bat` / `.cmd` 首行就报命令不存在 | 文件带 BOM | 去 BOM,中文改由 `.ps1` 承担 |
87
+ | Linux 侧 `.sh` 报 `$'\r': command not found` | CRLF | 转 LF,`.gitattributes` 用 `eol=lf` 固化 |
88
+ | 仓库里是 LF,检出后 `.sh` 变 CRLF;已配 `eol=lf` 但 CI 仍报 `$'\r'` | `core.autocrlf=true` 在检出时转换;属性只约束后续写入,不回溯已提交内容 | `.gitattributes` 写 `eol=lf` 覆盖本机设置;存量执行 `git add --renormalize .` 后提交 |
89
+ | Excel 打开 CSV 乱码,或另存出的 CSV 进程序后乱码 | 打开侧无 BOM 按 ANSI 解码;另存侧 Excel 按系统 ANSI 写 | 打开侧加 BOM(Python 写用 `utf-8-sig`);导出选「CSV UTF-8(逗号分隔)」或入库前转 UTF-8 |
90
+ | `JSON.parse` 报 `Unexpected token` 但内容正常 | 首字节 `EF BB BF` | 去 BOM |
91
+ | XML 报声明与实际编码不符 | `encoding=` 写 GBK 而实际 UTF-8 | 统一实际字节为 UTF-8,别只改声明 |
92
+ | 同一文件同事机器正常、本机乱码 | 那台机器开了「Beta: 使用 Unicode UTF-8 提供全球语言支持」,系统 ANSI 已变 UTF-8 | 别依赖该设置,仍按基线写 BOM |
93
+
94
+ ## 组合速查:内容类
95
+
96
+ | 现象 | 根因 | 处置 |
97
+ | --- | --- | --- |
98
+ | 编译报「非法字符 / unexpected character」但该行看不见异常 | 不可见字符:NBSP `U+00A0`、全角空格 `U+3000`、零宽空格 `U+200B`、中段 BOM `U+FEFF`、双向控制 `U+200E/200F` | 定位后替换,见下方命令 |
99
+ | 代码报语法错,字符看着像英文标点 | 全角标点 `“”():,;-` | 全文替换为半角,检查输入法全角态 |
100
+ | Python 输出 `\u4e2d\u6587`、git 把中文路径显示成 `\346\226\207` | `json.dump` 默认 `ensure_ascii=True`;`core.quotepath` 默认开启 | 分别传 `ensure_ascii=False`、`git -c core.quotepath=false`,都不是乱码 |
101
+
102
+ 定位不可见字符:GNU grep `grep -nP '[\x{00A0}\x{200B}\x{3000}\x{FEFF}\x{200E}\x{200F}]' f`;`powershell.exe` `Select-String -Path f -Pattern '[\u00A0\u200B\u3000\uFEFF\u200E\u200F]'`。
103
+
104
+ ## 跑起来乱码(不落盘)
105
+
106
+ 命令执行中乱码多为管线问题,源文件可能正常:先按第 1 问判归属,再查下表。
107
+
108
+ | 断点 | 现象 | 处置 |
109
+ | --- | --- | --- |
110
+ | 控制台代码页(简体默认 936) | 原生命令输出 UTF-8 中文显示乱码 | `chcp 65001` + `[Console]::OutputEncoding = [Text.UTF8Encoding]::new()` |
111
+ | `powershell.exe` `$OutputEncoding` 默认 ASCII | PS 管道把中文传给原生命令后变 `?` | 先设 `$OutputEncoding = [Text.UTF8Encoding]::new()` |
112
+ | `powershell.exe` `>` / `Out-File` 默认 UTF-16LE | 重定向出的 `.json` / `.csv` 后续解析失败 | 改 `-Encoding utf8` 或 `[IO.File]::WriteAllText`;`pwsh` 默认 UTF-8 无 BOM |
113
+ | `powershell.exe` `Get-Content` 对无 BOM 文件按 ANSI | 读 UTF-8 文件得乱码,误判文件损坏 | 显式 `-Encoding utf8`;`pwsh` 默认 UTF-8 |
114
+ | Node 输出被 `powershell.exe` 读 | 控制台 UTF-16 显示正常,落文件是 UTF-8,再读就乱 | 读侧显式编码,别改 Node 侧 |
115
+ | Python 用 locale 编码 | 非 ASCII 报 `UnicodeEncodeError` 或输出 `?` | `PYTHONUTF8=1` 或 `PYTHONIOENCODING=utf-8` |
116
+ | 容器 / CI `LANG=C`、`LC_ALL=C` | 本地正常,线上同上报错 | 设 `LANG=C.UTF-8`,或注入 `PYTHONIOENCODING=utf-8` |
117
+ | Java 运行期 `file.encoding` | JDK 18 前在 Windows 默认 GBK,读写出乱码 | `-Dfile.encoding=UTF-8` |
118
+
119
+ ⚠️ 别因 stdout 乱码就回头改源文件;`file -i` 与 chardet 对短文本误判率高,只作参考。
120
+
121
+ ## 修复纪律
122
+
123
+ 1. **消灭组合条件并固化**:能不带 BOM 的格式就别带;必须带的统一基线,写进 `.gitattributes`(`eol` / `working-tree-encoding`)、`.editorconfig`(`charset`)与项目文档
124
+ 2. **机器校验**:生成后或 CI 断言首三字节与行尾,不靠人眼
125
+ 3. **只转一次、不只补产物**:转码前确认原始编码(`�` 不可逆,回源重取);BOM 反复丢失一定有一处在重写文件,先定位那次写入再补