@fxri/toolkit 1.1.3 → 1.3.1
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 +35 -0
- package/README.md +54 -24
- package/SPEC.md +16 -3
- package/dist/cli.cjs +25 -12
- package/dist/cli.js +25 -12
- package/dist/index.cjs +25 -12
- package/dist/index.d.cts +40 -2
- package/dist/index.d.ts +40 -2
- package/dist/index.js +25 -12
- package/package.json +11 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
# @fxri/toolkit
|
|
2
2
|
|
|
3
|
+
## 1.3.1
|
|
4
|
+
> 2026-09-03 发布
|
|
5
|
+
|
|
6
|
+
### 🐛 补丁修复
|
|
7
|
+
|
|
8
|
+
- 修复 `tasks normalize --fix` 缺少排他锁,与归档并发时可能互相覆盖归档文件;收敛 README/SPEC/package.json 定位文案,融入「多人 + AI + 跨项目」。
|
|
9
|
+
|
|
10
|
+
## 1.3.0
|
|
11
|
+
|
|
12
|
+
> 2026-09-03 发布
|
|
13
|
+
|
|
14
|
+
### ✨ 新增功能
|
|
15
|
+
|
|
16
|
+
- 依赖升级:commander 14 → 15,changelog 自有选项改为置于子命令之前
|
|
17
|
+
- changelog 全语言化:.toolkitrc.json 的 changelog.languages 支持自定义语言与覆盖内置 zh/en
|
|
18
|
+
- 文档:SPEC/README 语言描述改为「全语言支持」
|
|
19
|
+
|
|
20
|
+
## 1.2.0
|
|
21
|
+
|
|
22
|
+
> 2026-09-03 发布
|
|
23
|
+
|
|
24
|
+
### ✨ 新增功能
|
|
25
|
+
|
|
26
|
+
- 新增任务校验与归档归一化能力:
|
|
27
|
+
|
|
28
|
+
- 新增 `tasks check` 校验 active(frontmatter 合法性、跨文件重名、depends_on 依赖闭环、未闭合待办)
|
|
29
|
+
- 新增 `tasks normalize --check/--fix` 检查与修复归档块(元数据四字段、日期漂移、降序)
|
|
30
|
+
- `tasks archive` 新增 `--dry-run` 预演与排他锁防并发覆盖
|
|
31
|
+
- 软告警双向三档开关(`--warn/--no-warn`、`FX_CHECK_WARN`、`.toolkitrc.json`),默认开启
|
|
32
|
+
- 隐私脱敏开关升级为双向(`--redact/--no-redact`、`FX_REDACT=0/1`)
|
|
33
|
+
- changelog 协同软告警:归档时无变更集提示、发版时未归档提示
|
|
34
|
+
- 统一配置读取(.toolkitrc.json)与开关解析,供各能力域复用
|
|
35
|
+
|
|
3
36
|
## 1.1.3
|
|
37
|
+
|
|
4
38
|
> 2026-09-03 发布
|
|
5
39
|
|
|
6
40
|
### 🐛 补丁修复
|
|
@@ -8,6 +42,7 @@
|
|
|
8
42
|
- README 与 .tasks/SPEC 文档补充「归档与提交约束」:任务完成后先归档再提交,保证任务记录与代码变更同批入库。
|
|
9
43
|
|
|
10
44
|
## 1.1.2
|
|
45
|
+
|
|
11
46
|
> 2026-09-03 发布
|
|
12
47
|
|
|
13
48
|
### 🐛 补丁修复
|
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# @fxri/toolkit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
专为多人 + AI 跨项目协作打造:任务管理 + 多语言 CHANGELOG。
|
|
4
4
|
|
|
5
5
|
## ✨ 特性
|
|
6
6
|
|
|
7
|
-
- 📋 **任务管理** - 扫描、总览、按完成时间归档 Markdown
|
|
8
|
-
- 🌍
|
|
7
|
+
- 📋 **任务管理** - 扫描、总览、按完成时间归档 Markdown 任务文件(全语言支持,见 [SPEC.md](./SPEC.md))
|
|
8
|
+
- 🌍 **全语言 CHANGELOG** - 封装 changesets,内置 zh/en,任意语言通过配置扩展或覆盖
|
|
9
9
|
- 🚀 **CLI + 库 API 双形态** - 可命令行使用,也可作为库引入
|
|
10
10
|
|
|
11
11
|
## 📦 安装
|
|
@@ -25,19 +25,23 @@ pnpm install -g @fxri/toolkit
|
|
|
25
25
|
### 任务管理(tasks)
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
npx toolkit tasks
|
|
29
|
-
npx toolkit tasks archive
|
|
30
|
-
npx toolkit tasks --
|
|
28
|
+
npx toolkit tasks # 任务总览
|
|
29
|
+
npx toolkit tasks archive # 归档已完成任务
|
|
30
|
+
npx toolkit tasks archive --dry-run # 归档预演(只预览,不落盘)
|
|
31
|
+
npx toolkit tasks check # 校验 active(frontmatter/重名/依赖闭环/未闭合待办)
|
|
32
|
+
npx toolkit tasks normalize # 检查归档块(元数据/日期漂移/排序)
|
|
33
|
+
npx toolkit tasks normalize --fix # 补齐元数据 + 降序重排
|
|
34
|
+
npx toolkit tasks --dir <path> # 指定任务目录(默认 .tasks)
|
|
31
35
|
```
|
|
32
36
|
|
|
33
37
|
### CHANGELOG(changelog)
|
|
34
38
|
|
|
35
39
|
```bash
|
|
36
|
-
npx toolkit changelog
|
|
37
|
-
npx toolkit changelog version
|
|
38
|
-
npx toolkit changelog
|
|
39
|
-
npx toolkit changelog format
|
|
40
|
-
npx toolkit changelog status / publish
|
|
40
|
+
npx toolkit changelog # 创建变更集(等价 changeset)
|
|
41
|
+
npx toolkit changelog version # 发版 + 格式化(默认中文)
|
|
42
|
+
npx toolkit changelog --lang en version # 指定语言
|
|
43
|
+
npx toolkit changelog format # 仅格式化已有 CHANGELOG
|
|
44
|
+
npx toolkit changelog status / publish # 其余 changeset 子命令透传
|
|
41
45
|
```
|
|
42
46
|
|
|
43
47
|
### 通用选项
|
|
@@ -45,9 +49,18 @@ npx toolkit changelog status / publish # 其余 changeset 子命令透传
|
|
|
45
49
|
```bash
|
|
46
50
|
-h, --help 显示帮助(全局或子命令)
|
|
47
51
|
-v, --version 显示版本号
|
|
48
|
-
--
|
|
52
|
+
--redact / --no-redact 开启/关闭隐私脱敏(默认开启)
|
|
53
|
+
--warn / --no-warn 开启/关闭软告警(默认开启)
|
|
49
54
|
```
|
|
50
55
|
|
|
56
|
+
开关为**双向三档**,优先级从高到低:CLI 参数 > 环境变量 > 配置文件 > 默认开启。例如关闭软告警可任选其一:
|
|
57
|
+
|
|
58
|
+
- 本次命令:`toolkit tasks archive --no-warn`
|
|
59
|
+
- 环境变量:`FX_CHECK_WARN=0`
|
|
60
|
+
- 配置文件:`.toolkitrc.json` 写 `{ "check": { "warnings": false } }`
|
|
61
|
+
|
|
62
|
+
隐私脱敏同理,环境变量 `FX_REDACT`(`0` 关 / `1` 开)、配置 `redact.enabled`。
|
|
63
|
+
|
|
51
64
|
### 接入 package.json
|
|
52
65
|
|
|
53
66
|
```json
|
|
@@ -68,7 +81,9 @@ npx toolkit changelog status / publish # 其余 changeset 子命令透传
|
|
|
68
81
|
|
|
69
82
|
- **调用优先级**:`npx toolkit`(项目本地依赖)→ `toolkit`(全局安装);两者均不可用时直接以 Markdown 输出方案,不阻塞执行
|
|
70
83
|
- **规范来源**:优先读取项目根 `SPEC.md`,缺失时读取包内 `SPEC.md`(目录结构、文件命名与 frontmatter 字段均以该规范为准)
|
|
71
|
-
-
|
|
84
|
+
- **多人协作(先查后写)**:`.tasks/` 是多写者共享区,新建/更新任务前先 `toolkit tasks` 查 active 总览并核对 archive,避免重复建档;同一需求共用一个任务文件
|
|
85
|
+
- **校验**:`toolkit tasks check` 校验 active(frontmatter 合法性、重名、depends_on 闭环、未闭合待办);`toolkit tasks normalize` 检查归档块(元数据/漂移/排序),`--fix` 补齐
|
|
86
|
+
- **归档**:任务完成后执行 `toolkit tasks archive`(可 `--dry-run` 预演);归档采用排他锁防并发覆盖
|
|
72
87
|
- **版本管理**:涉及发版时先 `toolkit changelog` 创建变更集,再 `toolkit changelog version` 发版并格式化 CHANGELOG
|
|
73
88
|
|
|
74
89
|
### 归档与提交约束
|
|
@@ -86,6 +101,8 @@ npx toolkit changelog status / publish # 其余 changeset 子命令透传
|
|
|
86
101
|
```typescript
|
|
87
102
|
import {
|
|
88
103
|
listTasks, printTasks, archiveTasks, parseFrontmatter,
|
|
104
|
+
validateTasks, checkArchive, fixArchive, normalizeCompleted,
|
|
105
|
+
resolveEnabled, parseBool, loadToolkitConfig,
|
|
89
106
|
languages, DEFAULT_LANG, localDate, formatChangelogs, redactText,
|
|
90
107
|
} from "@fxri/toolkit"
|
|
91
108
|
|
|
@@ -93,6 +110,9 @@ import {
|
|
|
93
110
|
const tasks = listTasks(".tasks")
|
|
94
111
|
printTasks(".tasks")
|
|
95
112
|
const result = archiveTasks(".tasks")
|
|
113
|
+
const check = validateTasks(".tasks") // 校验 active
|
|
114
|
+
const issues = checkArchive(".tasks") // 检查归档
|
|
115
|
+
const fixed = fixArchive(".tasks") // 归一化修复
|
|
96
116
|
|
|
97
117
|
// CHANGELOG 格式化(默认中文)
|
|
98
118
|
formatChangelogs(".", localDate(), languages[DEFAULT_LANG])
|
|
@@ -104,27 +124,37 @@ const masked = redactText("联系 tqy@fxri.net", true) // → "联系 t***@***.n
|
|
|
104
124
|
|
|
105
125
|
`printTasks` / `archiveTasks` / `formatChangelog` / `formatChangelogs` 均提供可选 `redact` 参数(默认 `true`),传 `false` 可关闭本次脱敏。
|
|
106
126
|
|
|
107
|
-
###
|
|
127
|
+
### 全语言支持
|
|
108
128
|
|
|
109
|
-
|
|
129
|
+
内置 `zh` / `en`,其余任意语言通过 `.toolkitrc.json` 的 `changelog.languages` 配置扩展,配置的同名 key 覆盖内置:
|
|
110
130
|
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"changelog": {
|
|
134
|
+
"languages": {
|
|
135
|
+
"ja": {
|
|
136
|
+
"replacements": { "### Major Changes": "### 🚨 重大変更" },
|
|
137
|
+
"deps": "- 依存関係を更新",
|
|
138
|
+
"released": "リリース"
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
116
142
|
}
|
|
117
143
|
```
|
|
118
144
|
|
|
145
|
+
使用 `--lang ja` 指定(选项前置):`toolkit changelog --lang ja format`。
|
|
146
|
+
|
|
147
|
+
每个语言的 `ChangelogLanguage` 结构:`replacements`(标题替换映射,源标题 → 目标标题)、`deps`(依赖更新条目文案)、`released`(发布日期后缀)。库 API 侧也可直接操作 `languages` 对象追加语言。
|
|
148
|
+
|
|
119
149
|
## 🔒 隐私脱敏
|
|
120
150
|
|
|
121
151
|
落盘记录自由文本(任务正文/标题、CHANGELOG 条目)时默认脱敏敏感信息,`owner` 等结构化 frontmatter 字段不脱敏。
|
|
122
152
|
|
|
123
153
|
- **内置规则**:邮箱、手机号、身份证、IPv4、AWS/GitHub/OpenAI/Slack 密钥、JWT、含端口内网 URL
|
|
124
|
-
-
|
|
125
|
-
- CLI 参数 `--no-redact`
|
|
126
|
-
- 环境变量 `FX_REDACT=0
|
|
127
|
-
- 配置文件 `redact.enabled: false`
|
|
154
|
+
- **开关**(双向三档,默认开启,优先级从高到低):
|
|
155
|
+
- CLI 参数 `--redact` / `--no-redact`
|
|
156
|
+
- 环境变量 `FX_REDACT=1`(开)/ `FX_REDACT=0`(关,也认 true/on、false/off)
|
|
157
|
+
- 配置文件 `redact.enabled: true` / `false`
|
|
128
158
|
- **自定义规则**:项目根 `.toolkitrc.json`,追加规则(优先于内置)或按 `name` 禁用内置规则:
|
|
129
159
|
|
|
130
160
|
```json
|
package/SPEC.md
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
# 任务文件规范(SPEC)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> 本规范**全语言支持**,面向**多人 + AI 跨项目协作**,定义任务文件的目录结构、文件格式与归档规则。任何编程语言均可按本规范实现读写;@fxri/toolkit 的 `tasks` 域仅为参考实现。
|
|
4
|
+
|
|
5
|
+
## 0. 协作模型
|
|
6
|
+
|
|
7
|
+
任务区是**多写者共享**的:同一 `.tasks/` 可能被多人或多个 AI 参与。为避免互相覆盖,归档、归一化修复等工具内部写操作以排他锁(`.archive.lock`)防并发覆盖;人 / AI 的直接编辑遵循「先查后写」约定。约定:
|
|
8
|
+
|
|
9
|
+
1. **先查后写**:新建、更新或归档任务前,先 `toolkit tasks` 查看 active 总览,并核对 archive 是否已有同主题任务;已有则更新原文件,禁止重复建档。
|
|
10
|
+
2. **任务唯一键**:`{年月日}-{用户名}-{任务简述}` 唯一标识一个任务;多人对同一需求不得各自建档,应共用同一文件。
|
|
11
|
+
3. **归档与提交同批**:任务完成后先归档、再提交,保证任务记录与代码变更落在同一 git 提交。
|
|
12
|
+
4. **可执行项必须落地为任务**:方案正文里的「待办 / 待实施 / 待核对」等子项,应拆分为独立 active 任务,不留游离待办;`toolkit tasks check` 会扫描此类未闭合标记。
|
|
4
13
|
|
|
5
14
|
## 1. 目录结构
|
|
6
15
|
|
|
@@ -60,7 +69,7 @@ scope: app
|
|
|
60
69
|
|
|
61
70
|
### 3.2 内容
|
|
62
71
|
|
|
63
|
-
同一天完成的任务整合进同一文件,**按完成时间降序排序**(最新在前),任务之间用 `---`
|
|
72
|
+
同一天完成的任务整合进同一文件,**按完成时间降序排序**(最新在前),任务之间用 `---` 分隔。每个任务块必须含**元数据行**(`> ` 开头,四字段:负责人 / 状态 / 范围 / 完成时间),缺失或不完整时可由 `toolkit tasks normalize --fix` 补齐:
|
|
64
73
|
|
|
65
74
|
```markdown
|
|
66
75
|
# 20260902 归档
|
|
@@ -76,7 +85,7 @@ scope: app
|
|
|
76
85
|
|
|
77
86
|
## 20260902-唐启云-其他任务
|
|
78
87
|
|
|
79
|
-
> 完成时间:2026-09-02 15:00
|
|
88
|
+
> 负责人:唐启云 状态:已完成 范围:- 完成时间:2026-09-02 15:00
|
|
80
89
|
|
|
81
90
|
(正文)
|
|
82
91
|
```
|
|
@@ -88,6 +97,8 @@ scope: app
|
|
|
88
97
|
3. `待办` / `进行中` / `阻塞` 均不归档。
|
|
89
98
|
4. 归档文件按 `completed` 的日期(`YYYYMMDD`)划分。
|
|
90
99
|
5. 归档文件内任务按 `completed` **降序**排序(最新在前,`YYYY-MM-DD HH:mm` 定宽字符串比较即时间序)。
|
|
100
|
+
6. **完成时间口径**:`completed` 只填真实收工时间,日期应与归档文件日期一致;不一致属「日期漂移」,`toolkit tasks archive` 会软告警提示核对。
|
|
101
|
+
7. **并发归档防护**:归档采用排他锁(`.archive.lock`),检测到并发归档时跳过并告警;`--dry-run` 可预演归档动作而不落盘。
|
|
91
102
|
|
|
92
103
|
## 5. 其他语言实现要点
|
|
93
104
|
|
|
@@ -99,3 +110,5 @@ scope: app
|
|
|
99
110
|
4. **归档合并**:读取已有归档文件的任务块,与新任务合并后按 `completed` 排序,重写归档文件。
|
|
100
111
|
5. **任务块分隔**:归档文件内任务以 `---` + `## ` 为边界,勿将正文内部的 `## ` 小节误判为任务边界。
|
|
101
112
|
6. **敏感信息脱敏(可选)**:如需保护隐私,可在写归档前对正文自由文本做掩码;`owner` 等结构化字段保留原值。
|
|
113
|
+
7. **校验(check)**:校验 active 任务 frontmatter 合法性(status 枚举、completed 必填与格式)、跨文件重名、`depends_on` 依赖存在性与成环。
|
|
114
|
+
8. **归一化(normalize)**:校验归档块元数据四字段完整性、完成时间与归档日期一致性、降序排序;`--fix` 可补齐缺失元数据并重排。
|
package/dist/cli.cjs
CHANGED
|
@@ -1,24 +1,37 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`);let
|
|
2
|
+
var $e=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,v=$e();var pe=require("commander"),ge=require("module"),he=require("child_process"),B=require("fs"),ke=require("path");var te=require("fs"),z=require("path");function A(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!t)return{};let n={};for(let r of t[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let s=r.slice(0,o).trim(),i=r.slice(o+1).trim();(i.startsWith("'")&&i.endsWith("'")||i.startsWith('"')&&i.endsWith('"'))&&(i=i.slice(1,-1)),s&&(n[s]=i)}return n}function E(e){let t=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return t?e.slice(t[0].length):e}var T=require("fs"),R=require("path");function w(e){if(!(0,T.existsSync)(e))return[];let t=[];for(let n of(0,T.readdirSync)(e)){let r=(0,R.join)(e,n);if((0,T.statSync)(r).isDirectory())for(let o of(0,T.readdirSync)(r))o.endsWith(".md")&&t.push((0,R.join)(r,o));else n.endsWith(".md")&&t.push(r)}return t}function O(e){let n=(0,R.basename)(e,(0,R.extname)(e)).match(/^(\d{8})/);return n?n[1]:""}var V=require("fs"),Q=require("path"),j;function ve(){if(j!==void 0)return j;j=null;try{let e=(0,V.readFileSync)((0,Q.join)(process.cwd(),".toolkitrc.json"),"utf8");j=JSON.parse(e)}catch{}return j}function I(e){let t=ve();if(!t)return;let n=t[e];return typeof n=="object"&&n!==null?n:void 0}function we(e,t){let n=e.trim().toLowerCase();return["1","true","on","yes"].includes(n)?!0:["0","false","off","no"].includes(n)?!1:t}function _(e,t,n,r){if(e!==void 0)return e;let o=process.env[t];return o!==void 0&&o!==""?we(o,r):n!==void 0?n:r}var xe=[{name:"\u5185\u7F51URL",pattern:/(https?:\/\/)[a-zA-Z0-9.-]+(:\d{2,5})(?=\/|[\s]|$)/g,replacement:"$1***$2"},{name:"\u90AE\u7BB1",pattern:/([a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]*@(?:[a-zA-Z0-9-]+\.)+([a-zA-Z]{2,})/g,replacement:"$1***@***.$2"},{name:"JWT",pattern:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"eyJ***.eyJ***.***"},{name:"AWS\u5BC6\u94A5",pattern:/\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,replacement:"$1****"},{name:"GitHub\u5BC6\u94A5",pattern:/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,replacement:"$1_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"\u624B\u673A\u53F7",pattern:/(?<!\d)(1[3-9]\d)\d{4}(\d{4})(?!\d)/g,replacement:"$1****$2"},{name:"\u8EAB\u4EFD\u8BC1",pattern:/(?<!\d)(\d{6})\d{8}(\d{3}[\dXx])(?!\d)/g,replacement:"$1********$2"},{name:"IPv4",pattern:/(?<![\d.])(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}(?![\d.])/g,replacement:"$1.***.***"}],M=null;function ee(){let e=I("redact");return e?{enabled:typeof e.enabled=="boolean"?e.enabled:void 0,disable:Array.isArray(e.disable)?e.disable.filter(t=>typeof t=="string"):void 0,rules:Array.isArray(e.rules)?e.rules:void 0}:null}function Se(){if(M)return M;let e=ee(),t=new Set(e?.disable??[]),n=[];for(let r of e?.rules??[])try{n.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return M=[...n,...xe.filter(r=>!t.has(r.name))],M}function N(e,t){if(!t||!e)return e;let n=e;for(let r of Se())n=n.replace(r.pattern,r.replacement);return n}function G(e){return _(e,"FX_REDACT",ee()?.enabled,!0)}function Ce(e=".tasks"){let t=(0,z.join)(e,"active");return w(t).map(n=>{let r=(0,te.readFileSync)(n,"utf8"),o=A(r),s=r.split(/\r?\n/).find(i=>i.startsWith("# ")&&!i.startsWith("#!"))?.replace(/^#\s*/,"")||(0,z.basename)(n,".md");return{file:n,name:(0,z.basename)(n,".md"),date:O(n),title:s,frontmatter:o,body:E(r).trim()}})}function ne(e=".tasks",t=!0){let n=Ce(e);if(n.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let r=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],o={};for(let i of n){let a=r.includes(i.frontmatter.status)?i.frontmatter.status:"\u672A\u6807\u6CE8";(o[a]||=[]).push(i)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
|
|
3
|
+
`);let s=0;for(let i of r){let a=o[i]||[];if(a.length!==0){s+=a.length,console.log(`\u3010${i}\u3011${a.length} \u9879`);for(let m of a)console.log(` ${m.date} ${(m.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${N(m.title,t)}`);console.log("")}}console.log(`\u5171 ${s} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}var k=require("fs"),b=require("path");var re=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function Ae(e,t){let n=(0,b.resolve)(e),r=(0,b.resolve)(t);for(;n!==r&&n.startsWith(r+b.sep);){try{if((0,k.readdirSync)(n).length>0)break;(0,k.rmdirSync)(n)}catch{break}n=(0,b.dirname)(n)}}function C(e){let t=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return t?`${t[1]}-${t[2].padStart(2,"0")}-${t[3].padStart(2,"0")} ${t[4].padStart(2,"0")}:${t[5]}`:e}function Te(e){let t=(0,k.readFileSync)(e,"utf8"),n=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(t);)n.push({block:o[0].trim(),completed:o[2].trim()});return n}function oe(e=".tasks",t=!0,n={}){let{dryRun:r=!1,warn:o=!0}=n,s=(0,b.join)(e,"active"),i=(0,b.join)(e,"archive"),a=[],m=w(s);if(m.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:a};let c=[],d=[];for(let l of m){let y=(0,k.readFileSync)(l,"utf8"),$=A(y);if(!re.includes($.status))continue;let u=C($.completed||"");if(!u){d.push((0,b.basename)(l,".md")),console.log(`\u8DF3\u8FC7 ${(0,b.basename)(l,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:l,name:(0,b.basename)(l,".md"),owner:$.owner||"\u672A\u6807\u6CE8",status:$.status||"\u672A\u6807\u6CE8",scope:$.scope||"-",completed:u,body:E(y).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:d,warnings:a};if(o)for(let l of c){let y=l.completed.replace(/-/g,"").slice(0,8),$=O(l.file);$&&y!==$&&a.push(`\u4EFB\u52A1\u300C${l.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${l.completed} \u4E0E\u521B\u5EFA\u65E5 ${$} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let p={};for(let l of c){let y=l.completed.replace(/-/g,"").slice(0,8);(p[y]||=[]).push(l)}let f=null,g=(0,b.join)(e,".archive.lock");if(!r)try{f=(0,k.openSync)(g,"wx")}catch{let l="\u68C0\u6D4B\u5230\u5F52\u6863\u9501 .archive.lock\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5F52\u6863\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7";return console.warn(`\u26A0\uFE0F ${l}`),{archived:0,skipped:d,warnings:[...a,l]}}try{for(let[l,y]of Object.entries(p)){let $=(0,b.join)(i,l.slice(0,6)),u=(0,b.join)($,`${l}.md`),S=(0,k.existsSync)(u)?Te(u):[];if(o){let h=new Set(S.map(D=>D.block.match(/^## (.+)/)?.[1]??""));for(let D of y)h.has(D.name)&&a.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${D.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}S.push(...y.map(h=>({block:`## ${h.name}
|
|
4
4
|
|
|
5
|
-
> \u8D1F\u8D23\u4EBA\uFF1A${
|
|
5
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${h.owner}\u3000\u72B6\u6001\uFF1A${h.status}\u3000\u8303\u56F4\uFF1A${h.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${h.completed}
|
|
6
6
|
|
|
7
|
-
${
|
|
7
|
+
${N(h.body,t)}`,completed:h.completed})));for(let h of S)h.completed=C(h.completed);if(S.sort((h,D)=>D.completed.localeCompare(h.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${y.length} \u4E2A\u4EFB\u52A1 \u2192 ${l}.md`);for(let h of y)console.log(`[\u9884\u6F14] - ${h.name}`);continue}(0,k.mkdirSync)($,{recursive:!0}),(0,k.writeFileSync)(u,`# ${l} \u5F52\u6863
|
|
8
8
|
|
|
9
9
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
10
10
|
|
|
11
|
-
${
|
|
11
|
+
${S.map(h=>h.block).join(`
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
`)}
|
|
16
|
-
`,"utf8");for(let
|
|
16
|
+
`,"utf8");for(let h of y)(0,k.unlinkSync)(h.file);Ae((0,b.dirname)(y[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${y.length} \u4E2A\u4EFB\u52A1 \u2192 ${l}.md`)}for(let l of a)console.warn(`\u26A0\uFE0F ${l}`);return console.log(r?`[\u9884\u6F14] \u5171 ${c.length} \u4E2A\u4EFB\u52A1\u53EF\u5F52\u6863\uFF08\u672A\u843D\u76D8\uFF09`:`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:d,warnings:a}}finally{if(f!==null){(0,k.closeSync)(f);try{(0,k.unlinkSync)(g)}catch{}}}}var Z=require("fs"),F=require("path");var se=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u5DF2\u5B8C\u6210","\u963B\u585E","\u5DF2\u653E\u5F03"],Re=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"],Fe=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,Le=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/;function De(e){let t=[],n=(0,F.basename)(e),r=(0,Z.readFileSync)(e,"utf8");if(!/^---\r?\n[\s\S]*?\r?\n---/.test(r))return t.push({level:"error",file:n,message:"\u7F3A\u5C11 frontmatter"}),t;let s=A(r);s.status?se.includes(s.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${s.status}\u300D\uFF0C\u5E94\u4E3A ${se.join(" / ")}`}):t.push({level:"error",file:n,message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),Re.includes(s.status)&&!s.completed&&t.push({level:"error",file:n,message:`status \u4E3A\u300C${s.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),s.completed&&!Le.test(s.completed.trim())&&t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`});let a=E(r).match(Fe);return a&&t.push({level:"warn",file:n,message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${a[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),t}function ie(e=".tasks"){let t=w((0,F.join)(e,"active")),n=[];for(let i of t)n.push(...De(i));let r=new Map;for(let i of t){let a=(0,F.basename)(i,".md"),m=r.get(a);m?m.push(i):r.set(a,[i])}for(let[i,a]of r)a.length>1&&n.push({level:"warn",file:i,message:`\u5B58\u5728 ${a.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});n.push(...Ne(t));let o=n.filter(i=>i.level==="error").length,s=n.length-o;return{issues:n,errorCount:o,warnCount:s}}function Ee(e){if(Array.isArray(e))return e.filter(t=>typeof t=="string");if(typeof e=="string"){let t=e.trim().match(/^\[(.*)\]$/);if(t)return t[1].split(",").map(n=>n.trim().replace(/^['"]|['"]$/g,"")).filter(Boolean)}return[]}function Ne(e){let t=[],n=new Set(e.map(c=>(0,F.basename)(c,".md"))),r=new Map;for(let c of e){let d=(0,F.basename)(c,".md"),p=(0,Z.readFileSync)(c,"utf8"),f=A(p),g=Ee(f.depends_on);r.set(d,g);for(let l of g)n.has(l)||t.push({level:"warn",file:d,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${l}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}let o=0,s=1,i=2,a=new Map,m=(c,d)=>{a.set(c,s);for(let p of r.get(c)??[]){if(!n.has(p))continue;let f=a.get(p)??o;if(f===s)return[...d,p];if(f===o){let g=m(p,[...d,p]);if(g)return g}}return a.set(c,i),null};for(let c of r.keys())if((a.get(c)??o)===o){let d=m(c,[c]);if(d){t.push({level:"warn",file:c,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${d.join(" \u2192 ")}`});break}}return t}var x=require("fs"),L=require("path");function je(e){let t=e.match(/^\d{8}-(.+?)-/);return t?t[1]:""}function ae(e){let t=e.search(/\n## /);if(t===-1)return{header:e,blocks:[]};let n=e.slice(0,t+1),r=e.slice(t+1),o=[];for(let s of r.split(/\n\n---\n\n/)){let i=s.trim();if(!i.startsWith("## "))continue;let a=i.split(`
|
|
17
|
+
`),m=a[0].replace(/^## /,""),c=null,d="",p=1;for(let f=1;f<a.length;f++){let g=a[f].trim();if(g.startsWith("> ")&&g.includes("\u5B8C\u6210\u65F6\u95F4")){c=a[f];let l=g.match(/完成时间:(.+)$/);l&&(d=l[1].trim()),p=f+1;break}}o.push({title:m,metaLine:c,completed:d,body:a.slice(p).join(`
|
|
18
|
+
`).trim()})}return{header:n,blocks:o}}function ce(e,t){return`> \u8D1F\u8D23\u4EBA\uFF1A${je(e)||"\u672A\u6807\u6CE8"}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A-\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${C(t)}`}var Ie=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function le(e){return Ie.every(t=>e.includes(t))}function _e(e){let t=e.metaLine??(e.completed?ce(e.title,e.completed):null);return t?`## ${e.title}
|
|
19
|
+
|
|
20
|
+
${t}
|
|
21
|
+
|
|
22
|
+
${e.body}`:`## ${e.title}
|
|
23
|
+
|
|
24
|
+
${e.body}`}function fe(e=".tasks"){let t=(0,L.join)(e,"archive"),n=w(t),r=[];for(let o of n){let s=(0,L.basename)(o),i=s.replace(/\.md$/,""),a=(0,x.readFileSync)(o,"utf8"),{blocks:m}=ae(a);for(let c=1;c<m.length;c++){let d=C(m[c-1].completed),p=C(m[c].completed);if(d&&p&&d<p){r.push({file:s,message:"\u4EFB\u52A1\u5757\u672A\u6309\u5B8C\u6210\u65F6\u95F4\u964D\u5E8F\u6392\u5217",fixable:!0});break}}for(let c of m){c.metaLine?le(c.metaLine)||r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u5143\u6570\u636E\u884C\u4E0D\u5B8C\u6574\uFF08\u7F3A\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4\u4E4B\u4E00\uFF09`,fixable:!!c.completed}):r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u7F3A\u5C11\u5143\u6570\u636E\u884C\uFF08\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4/\u5B8C\u6210\u65F6\u95F4\uFF09`,fixable:!!c.completed});let d=C(c.completed),p=d.replace(/-/g,"").slice(0,8);p&&i&&p!==i&&r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${d} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${i} \u4E0D\u4E00\u81F4`,fixable:!1})}}return r}function me(e=".tasks"){let t=(0,L.join)(e,"archive"),n=w(t),r=[],o=0,s=null,i=(0,L.join)(e,".archive.lock");try{s=(0,x.openSync)(i,"wx")}catch{return console.warn("\u26A0\uFE0F \u68C0\u6D4B\u5230\u5F52\u6863\u9501\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5199\u64CD\u4F5C\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7\u4FEE\u590D"),{issues:r,fixed:o}}try{for(let a of n){let m=(0,L.basename)(a),c=m.replace(/\.md$/,""),d=(0,x.readFileSync)(a,"utf8"),{header:p,blocks:f}=ae(d),g=!1;for(let u of f){u.completed&&(!u.metaLine||!le(u.metaLine))&&(u.metaLine=ce(u.title,u.completed),g=!0,o++);let S=C(u.completed),h=S.replace(/-/g,"").slice(0,8);h&&c&&h!==c&&r.push({file:m,message:`\u5757\u300C${u.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${S} \u4E0E\u5F52\u6863\u65E5\u671F ${c} \u4E0D\u4E00\u81F4\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\u662F\u5426\u8FC1\u79FB\uFF09`,fixable:!1})}let l=f.filter(u=>u.completed),y=f.filter(u=>!u.completed),$=[...l].sort((u,S)=>C(S.completed).localeCompare(C(u.completed)));if(JSON.stringify($.map(u=>u.title))!==JSON.stringify(l.map(u=>u.title))&&(f.splice(0,f.length,...$,...y),g=!0),g){let u=p+f.map(_e).join(`
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
`)+`
|
|
29
|
+
`;(0,x.writeFileSync)(a,u,"utf8")}}return{issues:r,fixed:o}}finally{if(s!==null){(0,x.closeSync)(s);try{(0,x.unlinkSync)(i)}catch{}}}}var H={zh:{replacements:{"### Major Changes":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### \u91CD\u5927\u53D8\u66F4":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### Minor Changes":"### \u2728 \u65B0\u589E\u529F\u80FD","### \u65B0\u589E\u529F\u80FD":"### \u2728 \u65B0\u589E\u529F\u80FD","### Patch Changes":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### \u8865\u4E01\u4FEE\u590D":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### Dependent Changes":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","### \u4F9D\u8D56\u53D8\u66F4":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","- Updated dependencies":"- \u66F4\u65B0\u4F9D\u8D56"},deps:"- \u66F4\u65B0\u4F9D\u8D56",released:"\u53D1\u5E03"},en:{replacements:{"### Major Changes":"### \u{1F6A8} Major Changes","### Minor Changes":"### \u2728 Minor Changes","### Patch Changes":"### \u{1F41B} Patch Changes","### Dependent Changes":"### \u{1F517} Dependent Changes"},deps:"- Updated dependencies",released:"released"}},J="zh";var W=require("fs");var ue=require("fs"),Y=require("path");function de(e){let t=[],n=new Set(["node_modules",".git","dist"]),r=o=>{let s;try{s=(0,ue.readdirSync)(o,{withFileTypes:!0})}catch{return}for(let i of s)if(i.isDirectory()){if(n.has(i.name))continue;r((0,Y.join)(o,i.name))}else i.name==="CHANGELOG.md"&&t.push((0,Y.join)(o,i.name))};return r(e),t}function K(){let e=new Date,t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function ze(e,t,n,r=!0){let o=(0,W.readFileSync)(e,"utf8"),s=o.includes(`\r
|
|
17
30
|
`)?`\r
|
|
18
31
|
`:`
|
|
19
|
-
`,
|
|
20
|
-
`),
|
|
21
|
-
${
|
|
22
|
-
${
|
|
23
|
-
`),
|
|
24
|
-
`),
|
|
32
|
+
`,i=o.replace(/\r\n/g,`
|
|
33
|
+
`),a=i;for(let[f,g]of Object.entries(n.replacements))a=a.replaceAll(f,g);for(;a.includes(`${n.deps}
|
|
34
|
+
${n.deps}`);)a=a.replace(`${n.deps}
|
|
35
|
+
${n.deps}`,n.deps);for(;;){let f=a.replace(/^- (.+)\n- \1$/gm,"- $1");if(f===a)break;a=f}let m=a.split(`
|
|
36
|
+
`),c=[];for(let f=0;f<m.length;f++)if(c.push(m[f]),/^## \d+\.\d+\.\d+/.test(m[f])){let g=f+1;for(;g<m.length&&m[g].trim()==="";)g++;m[g]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(m[g].trim())||c.push(`> ${t} ${n.released}`)}let d=c.join(`
|
|
37
|
+
`),p=N(d,r);return p!==i?((0,W.writeFileSync)(e,p.replace(/\n/g,s),"utf8"),!0):!1}function X(e,t,n,r=!0){let o=[];for(let s of de(e))ze(s,t,n,r)&&o.push(s);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let s of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${s}`);return o}var be=(0,ge.createRequire)(v),Oe=be.resolve("@changesets/cli/bin.js"),{version:Me}=be("../package.json"),q=e=>{let t=(0,he.spawnSync)(process.execPath,[Oe,...e],{stdio:"inherit"});t.status!==0&&process.exit(t.status??1)};function We(){if(process.platform==="win32")try{process.stdout.setDefaultEncoding("utf8"),process.stderr.setDefaultEncoding("utf8")}catch{}}function ye(){let e=I("check");return typeof e?.warnings=="boolean"?e.warnings:void 0}function Ue(){let t=I("changelog")?.languages;if(!t||typeof t!="object")return H;let n={...H};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&(n[r]=o);return n}function Be(e=".changeset"){if(!(0,B.existsSync)(e))return!1;try{return(0,B.readdirSync)(e).some(t=>t.endsWith(".md")&&t!=="README.md")}catch{return!1}}function Pe(e=".tasks"){return w((0,ke.join)(e,"active")).length>0}function U(e){if(e.length===0){console.log("\u672A\u53D1\u73B0\u95EE\u9898");return}for(let t of e)console.log(` ${t.file}: ${t.message}`)}var P=new pe.Command;P.name("toolkit").description("\u5F00\u53D1\u5DE5\u7A0B\u5316\u5DE5\u5177\u96C6\uFF1A\u4EFB\u52A1\u7BA1\u7406 + \u591A\u8BED\u8A00 CHANGELOG \u53D1\u5E03").version(Me,"-v, --version","\u663E\u793A\u7248\u672C\u53F7").enablePositionalOptions(!0);P.command("tasks").description("\u4EFB\u52A1\u7BA1\u7406").option("--dir <path>","\u4EFB\u52A1\u76EE\u5F55",".tasks").option("--redact","\u5F00\u542F\u9690\u79C1\u8131\u654F").option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").option("--warn","\u5F00\u542F\u8F6F\u544A\u8B66").option("--no-warn","\u5173\u95ED\u8F6F\u544A\u8B66").option("--dry-run","\u5F52\u6863\u9884\u6F14\uFF08\u4EC5 archive \u6709\u6548\uFF09").option("--fix","\u5F52\u4E00\u5316\u4FEE\u590D\uFF08\u4EC5 normalize \u6709\u6548\uFF09").argument("[command]","\u5B50\u547D\u4EE4\uFF1Aarchive / check / normalize\uFF0C\u7559\u7A7A\u4E3A\u603B\u89C8").action((e,t)=>{let n=G(t.redact),r=_(t.warn,"FX_CHECK_WARN",ye(),!0),o=t.dir;if(e==="archive"){let s=oe(o,n,{dryRun:t.dryRun,warn:r});r&&!t.dryRun&&s.archived>0&&!Be()&&console.warn("\u26A0\uFE0F \u672C\u6B21\u5F52\u6863\u4E86\u4EFB\u52A1\uFF0C\u4F46 .changeset \u65E0\u5F85\u53D1\u5E03\u53D8\u66F4\u96C6\uFF0C\u5982\u9700\u53D1\u7248\u8BF7\u5148\u521B\u5EFA\u53D8\u66F4\u96C6")}else if(e==="check"){let s=ie(o);console.log("\u4EFB\u52A1\u6821\u9A8C\uFF1A"),console.log(`\u3010error\u3011${s.errorCount} \u9879`),U(s.issues.filter(i=>i.level==="error")),r?(console.log(`\u3010warn\u3011${s.warnCount} \u9879`),U(s.issues.filter(i=>i.level==="warn"))):console.log("\uFF08\u8F6F\u544A\u8B66\u5DF2\u5173\u95ED\uFF0Cwarn \u4E0D\u5C55\u793A\uFF09"),s.errorCount>0&&(process.exitCode=1)}else if(e==="normalize")if(t.fix){let s=me(o);console.log(`\u5DF2\u4FEE\u590D ${s.fixed} \u5904`),s.issues.length>0&&(console.log("\u4EE5\u4E0B\u95EE\u9898\u9700\u4EBA\u5DE5\u786E\u8BA4\uFF1A"),U(s.issues))}else{let s=fe(o);console.log(`\u5F52\u6863\u5F52\u4E00\u5316\u68C0\u67E5\uFF1A\u53D1\u73B0 ${s.length} \u5904\u95EE\u9898`),U(s)}else ne(o,n)});P.command("changelog").description("\u591A\u8BED\u8A00 CHANGELOG\uFF08\u5C01\u88C5 changesets\uFF09").option("--lang <lang>","\u8BED\u8A00 zh/en",J).option("--redact","\u5F00\u542F\u9690\u79C1\u8131\u654F").option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").option("--warn","\u5F00\u542F\u8F6F\u544A\u8B66").option("--no-warn","\u5173\u95ED\u8F6F\u544A\u8B66").argument("[command...]","\u5B50\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u900F\u4F20\u7ED9 changesets\uFF09").passThroughOptions(!0).action((e,t)=>{let n=G(t.redact),r=_(t.warn,"FX_CHECK_WARN",ye(),!0),o=Ue(),s=o[t.lang]??o[J],i=e[0];i==="version"?(r&&Pe()&&console.warn("\u26A0\uFE0F \u5B58\u5728\u672A\u5F52\u6863\u7684 active \u4EFB\u52A1\uFF0C\u5EFA\u8BAE\u5148\u5F52\u6863\u518D\u53D1\u7248"),q(["version"]),X(".",K(),s,n)):i==="format"?X(".",K(),s,n):q(i?e:[])});We();P.parse();
|
package/dist/cli.js
CHANGED
|
@@ -1,24 +1,37 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as
|
|
3
|
-
`);let
|
|
2
|
+
import{Command as rt}from"commander";import{createRequire as ot}from"module";import{spawnSync as st}from"child_process";import{existsSync as it,readdirSync as at}from"fs";import{join as ct}from"path";import{readFileSync as Ae}from"fs";import{join as Te,basename as Y}from"path";function C(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!t)return{};let n={};for(let r of t[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let s=r.slice(0,o).trim(),i=r.slice(o+1).trim();(i.startsWith("'")&&i.endsWith("'")||i.startsWith('"')&&i.endsWith('"'))&&(i=i.slice(1,-1)),s&&(n[s]=i)}return n}function A(e){let t=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return t?e.slice(t[0].length):e}import{existsSync as he,readdirSync as Z,statSync as ke}from"fs";import{join as H,basename as be,extname as ye}from"path";function v(e){if(!he(e))return[];let t=[];for(let n of Z(e)){let r=H(e,n);if(ke(r).isDirectory())for(let o of Z(r))o.endsWith(".md")&&t.push(H(r,o));else n.endsWith(".md")&&t.push(r)}return t}function E(e){let n=be(e,ye(e)).match(/^(\d{8})/);return n?n[1]:""}import{readFileSync as $e}from"fs";import{join as ve}from"path";var R;function we(){if(R!==void 0)return R;R=null;try{let e=$e(ve(process.cwd(),".toolkitrc.json"),"utf8");R=JSON.parse(e)}catch{}return R}function F(e){let t=we();if(!t)return;let n=t[e];return typeof n=="object"&&n!==null?n:void 0}function xe(e,t){let n=e.trim().toLowerCase();return["1","true","on","yes"].includes(n)?!0:["0","false","off","no"].includes(n)?!1:t}function D(e,t,n,r){if(e!==void 0)return e;let o=process.env[t];return o!==void 0&&o!==""?xe(o,r):n!==void 0?n:r}var Ce=[{name:"\u5185\u7F51URL",pattern:/(https?:\/\/)[a-zA-Z0-9.-]+(:\d{2,5})(?=\/|[\s]|$)/g,replacement:"$1***$2"},{name:"\u90AE\u7BB1",pattern:/([a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]*@(?:[a-zA-Z0-9-]+\.)+([a-zA-Z]{2,})/g,replacement:"$1***@***.$2"},{name:"JWT",pattern:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"eyJ***.eyJ***.***"},{name:"AWS\u5BC6\u94A5",pattern:/\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,replacement:"$1****"},{name:"GitHub\u5BC6\u94A5",pattern:/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,replacement:"$1_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"\u624B\u673A\u53F7",pattern:/(?<!\d)(1[3-9]\d)\d{4}(\d{4})(?!\d)/g,replacement:"$1****$2"},{name:"\u8EAB\u4EFD\u8BC1",pattern:/(?<!\d)(\d{6})\d{8}(\d{3}[\dXx])(?!\d)/g,replacement:"$1********$2"},{name:"IPv4",pattern:/(?<![\d.])(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}(?![\d.])/g,replacement:"$1.***.***"}],N=null;function J(){let e=F("redact");return e?{enabled:typeof e.enabled=="boolean"?e.enabled:void 0,disable:Array.isArray(e.disable)?e.disable.filter(t=>typeof t=="string"):void 0,rules:Array.isArray(e.rules)?e.rules:void 0}:null}function Se(){if(N)return N;let e=J(),t=new Set(e?.disable??[]),n=[];for(let r of e?.rules??[])try{n.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return N=[...n,...Ce.filter(r=>!t.has(r.name))],N}function T(e,t){if(!t||!e)return e;let n=e;for(let r of Se())n=n.replace(r.pattern,r.replacement);return n}function I(e){return D(e,"FX_REDACT",J()?.enabled,!0)}function Re(e=".tasks"){let t=Te(e,"active");return v(t).map(n=>{let r=Ae(n,"utf8"),o=C(r),s=r.split(/\r?\n/).find(i=>i.startsWith("# ")&&!i.startsWith("#!"))?.replace(/^#\s*/,"")||Y(n,".md");return{file:n,name:Y(n,".md"),date:E(n),title:s,frontmatter:o,body:A(r).trim()}})}function K(e=".tasks",t=!0){let n=Re(e);if(n.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let r=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],o={};for(let i of n){let a=r.includes(i.frontmatter.status)?i.frontmatter.status:"\u672A\u6807\u6CE8";(o[a]||=[]).push(i)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
|
|
3
|
+
`);let s=0;for(let i of r){let a=o[i]||[];if(a.length!==0){s+=a.length,console.log(`\u3010${i}\u3011${a.length} \u9879`);for(let m of a)console.log(` ${m.date} ${(m.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${T(m.title,t)}`);console.log("")}}console.log(`\u5171 ${s} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as Q,writeFileSync as Fe,mkdirSync as De,unlinkSync as q,existsSync as Le,readdirSync as Ee,rmdirSync as Ne,openSync as je,closeSync as ze}from"fs";import{join as L,basename as O,dirname as ee,resolve as V,sep as _e}from"path";var X=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function Ie(e,t){let n=V(e),r=V(t);for(;n!==r&&n.startsWith(r+_e);){try{if(Ee(n).length>0)break;Ne(n)}catch{break}n=ee(n)}}function x(e){let t=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return t?`${t[1]}-${t[2].padStart(2,"0")}-${t[3].padStart(2,"0")} ${t[4].padStart(2,"0")}:${t[5]}`:e}function Oe(e){let t=Q(e,"utf8"),n=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(t);)n.push({block:o[0].trim(),completed:o[2].trim()});return n}function te(e=".tasks",t=!0,n={}){let{dryRun:r=!1,warn:o=!0}=n,s=L(e,"active"),i=L(e,"archive"),a=[],m=v(s);if(m.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:a};let c=[],d=[];for(let l of m){let k=Q(l,"utf8"),b=C(k);if(!X.includes(b.status))continue;let u=x(b.completed||"");if(!u){d.push(O(l,".md")),console.log(`\u8DF3\u8FC7 ${O(l,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:l,name:O(l,".md"),owner:b.owner||"\u672A\u6807\u6CE8",status:b.status||"\u672A\u6807\u6CE8",scope:b.scope||"-",completed:u,body:A(k).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:d,warnings:a};if(o)for(let l of c){let k=l.completed.replace(/-/g,"").slice(0,8),b=E(l.file);b&&k!==b&&a.push(`\u4EFB\u52A1\u300C${l.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${l.completed} \u4E0E\u521B\u5EFA\u65E5 ${b} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let p={};for(let l of c){let k=l.completed.replace(/-/g,"").slice(0,8);(p[k]||=[]).push(l)}let f=null,g=L(e,".archive.lock");if(!r)try{f=je(g,"wx")}catch{let l="\u68C0\u6D4B\u5230\u5F52\u6863\u9501 .archive.lock\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5F52\u6863\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7";return console.warn(`\u26A0\uFE0F ${l}`),{archived:0,skipped:d,warnings:[...a,l]}}try{for(let[l,k]of Object.entries(p)){let b=L(i,l.slice(0,6)),u=L(b,`${l}.md`),w=Le(u)?Oe(u):[];if(o){let h=new Set(w.map(S=>S.block.match(/^## (.+)/)?.[1]??""));for(let S of k)h.has(S.name)&&a.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${S.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}w.push(...k.map(h=>({block:`## ${h.name}
|
|
4
4
|
|
|
5
|
-
> \u8D1F\u8D23\u4EBA\uFF1A${
|
|
5
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${h.owner}\u3000\u72B6\u6001\uFF1A${h.status}\u3000\u8303\u56F4\uFF1A${h.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${h.completed}
|
|
6
6
|
|
|
7
|
-
${h
|
|
7
|
+
${T(h.body,t)}`,completed:h.completed})));for(let h of w)h.completed=x(h.completed);if(w.sort((h,S)=>S.completed.localeCompare(h.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${k.length} \u4E2A\u4EFB\u52A1 \u2192 ${l}.md`);for(let h of k)console.log(`[\u9884\u6F14] - ${h.name}`);continue}De(b,{recursive:!0}),Fe(u,`# ${l} \u5F52\u6863
|
|
8
8
|
|
|
9
9
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
10
10
|
|
|
11
|
-
${
|
|
11
|
+
${w.map(h=>h.block).join(`
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
`)}
|
|
16
|
-
`,"utf8");for(let
|
|
16
|
+
`,"utf8");for(let h of k)q(h.file);Ie(ee(k[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${k.length} \u4E2A\u4EFB\u52A1 \u2192 ${l}.md`)}for(let l of a)console.warn(`\u26A0\uFE0F ${l}`);return console.log(r?`[\u9884\u6F14] \u5171 ${c.length} \u4E2A\u4EFB\u52A1\u53EF\u5F52\u6863\uFF08\u672A\u843D\u76D8\uFF09`:`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:d,warnings:a}}finally{if(f!==null){ze(f);try{q(g)}catch{}}}}import{readFileSync as re}from"fs";import{join as Me,basename as j}from"path";var ne=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u5DF2\u5B8C\u6210","\u963B\u585E","\u5DF2\u653E\u5F03"],We=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"],Be=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,Ge=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/;function Pe(e){let t=[],n=j(e),r=re(e,"utf8");if(!/^---\r?\n[\s\S]*?\r?\n---/.test(r))return t.push({level:"error",file:n,message:"\u7F3A\u5C11 frontmatter"}),t;let s=C(r);s.status?ne.includes(s.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${s.status}\u300D\uFF0C\u5E94\u4E3A ${ne.join(" / ")}`}):t.push({level:"error",file:n,message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),We.includes(s.status)&&!s.completed&&t.push({level:"error",file:n,message:`status \u4E3A\u300C${s.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),s.completed&&!Ge.test(s.completed.trim())&&t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`});let a=A(r).match(Be);return a&&t.push({level:"warn",file:n,message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${a[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),t}function oe(e=".tasks"){let t=v(Me(e,"active")),n=[];for(let i of t)n.push(...Pe(i));let r=new Map;for(let i of t){let a=j(i,".md"),m=r.get(a);m?m.push(i):r.set(a,[i])}for(let[i,a]of r)a.length>1&&n.push({level:"warn",file:i,message:`\u5B58\u5728 ${a.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});n.push(...Ze(t));let o=n.filter(i=>i.level==="error").length,s=n.length-o;return{issues:n,errorCount:o,warnCount:s}}function Ue(e){if(Array.isArray(e))return e.filter(t=>typeof t=="string");if(typeof e=="string"){let t=e.trim().match(/^\[(.*)\]$/);if(t)return t[1].split(",").map(n=>n.trim().replace(/^['"]|['"]$/g,"")).filter(Boolean)}return[]}function Ze(e){let t=[],n=new Set(e.map(c=>j(c,".md"))),r=new Map;for(let c of e){let d=j(c,".md"),p=re(c,"utf8"),f=C(p),g=Ue(f.depends_on);r.set(d,g);for(let l of g)n.has(l)||t.push({level:"warn",file:d,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${l}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}let o=0,s=1,i=2,a=new Map,m=(c,d)=>{a.set(c,s);for(let p of r.get(c)??[]){if(!n.has(p))continue;let f=a.get(p)??o;if(f===s)return[...d,p];if(f===o){let g=m(p,[...d,p]);if(g)return g}}return a.set(c,i),null};for(let c of r.keys())if((a.get(c)??o)===o){let d=m(c,[c]);if(d){t.push({level:"warn",file:c,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${d.join(" \u2192 ")}`});break}}return t}import{readFileSync as se,writeFileSync as He,openSync as Je,closeSync as Ye,unlinkSync as Ke}from"fs";import{join as M,basename as ie}from"path";function Xe(e){let t=e.match(/^\d{8}-(.+?)-/);return t?t[1]:""}function ae(e){let t=e.search(/\n## /);if(t===-1)return{header:e,blocks:[]};let n=e.slice(0,t+1),r=e.slice(t+1),o=[];for(let s of r.split(/\n\n---\n\n/)){let i=s.trim();if(!i.startsWith("## "))continue;let a=i.split(`
|
|
17
|
+
`),m=a[0].replace(/^## /,""),c=null,d="",p=1;for(let f=1;f<a.length;f++){let g=a[f].trim();if(g.startsWith("> ")&&g.includes("\u5B8C\u6210\u65F6\u95F4")){c=a[f];let l=g.match(/完成时间:(.+)$/);l&&(d=l[1].trim()),p=f+1;break}}o.push({title:m,metaLine:c,completed:d,body:a.slice(p).join(`
|
|
18
|
+
`).trim()})}return{header:n,blocks:o}}function ce(e,t){return`> \u8D1F\u8D23\u4EBA\uFF1A${Xe(e)||"\u672A\u6807\u6CE8"}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A-\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${x(t)}`}var qe=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function le(e){return qe.every(t=>e.includes(t))}function Ve(e){let t=e.metaLine??(e.completed?ce(e.title,e.completed):null);return t?`## ${e.title}
|
|
19
|
+
|
|
20
|
+
${t}
|
|
21
|
+
|
|
22
|
+
${e.body}`:`## ${e.title}
|
|
23
|
+
|
|
24
|
+
${e.body}`}function fe(e=".tasks"){let t=M(e,"archive"),n=v(t),r=[];for(let o of n){let s=ie(o),i=s.replace(/\.md$/,""),a=se(o,"utf8"),{blocks:m}=ae(a);for(let c=1;c<m.length;c++){let d=x(m[c-1].completed),p=x(m[c].completed);if(d&&p&&d<p){r.push({file:s,message:"\u4EFB\u52A1\u5757\u672A\u6309\u5B8C\u6210\u65F6\u95F4\u964D\u5E8F\u6392\u5217",fixable:!0});break}}for(let c of m){c.metaLine?le(c.metaLine)||r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u5143\u6570\u636E\u884C\u4E0D\u5B8C\u6574\uFF08\u7F3A\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4\u4E4B\u4E00\uFF09`,fixable:!!c.completed}):r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u7F3A\u5C11\u5143\u6570\u636E\u884C\uFF08\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4/\u5B8C\u6210\u65F6\u95F4\uFF09`,fixable:!!c.completed});let d=x(c.completed),p=d.replace(/-/g,"").slice(0,8);p&&i&&p!==i&&r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${d} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${i} \u4E0D\u4E00\u81F4`,fixable:!1})}}return r}function me(e=".tasks"){let t=M(e,"archive"),n=v(t),r=[],o=0,s=null,i=M(e,".archive.lock");try{s=Je(i,"wx")}catch{return console.warn("\u26A0\uFE0F \u68C0\u6D4B\u5230\u5F52\u6863\u9501\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5199\u64CD\u4F5C\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7\u4FEE\u590D"),{issues:r,fixed:o}}try{for(let a of n){let m=ie(a),c=m.replace(/\.md$/,""),d=se(a,"utf8"),{header:p,blocks:f}=ae(d),g=!1;for(let u of f){u.completed&&(!u.metaLine||!le(u.metaLine))&&(u.metaLine=ce(u.title,u.completed),g=!0,o++);let w=x(u.completed),h=w.replace(/-/g,"").slice(0,8);h&&c&&h!==c&&r.push({file:m,message:`\u5757\u300C${u.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${w} \u4E0E\u5F52\u6863\u65E5\u671F ${c} \u4E0D\u4E00\u81F4\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\u662F\u5426\u8FC1\u79FB\uFF09`,fixable:!1})}let l=f.filter(u=>u.completed),k=f.filter(u=>!u.completed),b=[...l].sort((u,w)=>x(w.completed).localeCompare(x(u.completed)));if(JSON.stringify(b.map(u=>u.title))!==JSON.stringify(l.map(u=>u.title))&&(f.splice(0,f.length,...b,...k),g=!0),g){let u=p+f.map(Ve).join(`
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
`)+`
|
|
29
|
+
`;He(a,u,"utf8")}}return{issues:r,fixed:o}}finally{if(s!==null){Ye(s);try{Ke(i)}catch{}}}}var W={zh:{replacements:{"### Major Changes":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### \u91CD\u5927\u53D8\u66F4":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### Minor Changes":"### \u2728 \u65B0\u589E\u529F\u80FD","### \u65B0\u589E\u529F\u80FD":"### \u2728 \u65B0\u589E\u529F\u80FD","### Patch Changes":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### \u8865\u4E01\u4FEE\u590D":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### Dependent Changes":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","### \u4F9D\u8D56\u53D8\u66F4":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","- Updated dependencies":"- \u66F4\u65B0\u4F9D\u8D56"},deps:"- \u66F4\u65B0\u4F9D\u8D56",released:"\u53D1\u5E03"},en:{replacements:{"### Major Changes":"### \u{1F6A8} Major Changes","### Minor Changes":"### \u2728 Minor Changes","### Patch Changes":"### \u{1F41B} Patch Changes","### Dependent Changes":"### \u{1F517} Dependent Changes"},deps:"- Updated dependencies",released:"released"}},B="zh";import{readFileSync as et,writeFileSync as tt}from"fs";import{readdirSync as Qe}from"fs";import{join as ue}from"path";function de(e){let t=[],n=new Set(["node_modules",".git","dist"]),r=o=>{let s;try{s=Qe(o,{withFileTypes:!0})}catch{return}for(let i of s)if(i.isDirectory()){if(n.has(i.name))continue;r(ue(o,i.name))}else i.name==="CHANGELOG.md"&&t.push(ue(o,i.name))};return r(e),t}function G(){let e=new Date,t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function nt(e,t,n,r=!0){let o=et(e,"utf8"),s=o.includes(`\r
|
|
17
30
|
`)?`\r
|
|
18
31
|
`:`
|
|
19
|
-
`,
|
|
20
|
-
`),
|
|
21
|
-
${
|
|
22
|
-
${
|
|
23
|
-
`),
|
|
24
|
-
`),
|
|
32
|
+
`,i=o.replace(/\r\n/g,`
|
|
33
|
+
`),a=i;for(let[f,g]of Object.entries(n.replacements))a=a.replaceAll(f,g);for(;a.includes(`${n.deps}
|
|
34
|
+
${n.deps}`);)a=a.replace(`${n.deps}
|
|
35
|
+
${n.deps}`,n.deps);for(;;){let f=a.replace(/^- (.+)\n- \1$/gm,"- $1");if(f===a)break;a=f}let m=a.split(`
|
|
36
|
+
`),c=[];for(let f=0;f<m.length;f++)if(c.push(m[f]),/^## \d+\.\d+\.\d+/.test(m[f])){let g=f+1;for(;g<m.length&&m[g].trim()==="";)g++;m[g]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(m[g].trim())||c.push(`> ${t} ${n.released}`)}let d=c.join(`
|
|
37
|
+
`),p=T(d,r);return p!==i?(tt(e,p.replace(/\n/g,s),"utf8"),!0):!1}function P(e,t,n,r=!0){let o=[];for(let s of de(e))nt(s,t,n,r)&&o.push(s);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let s of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${s}`);return o}var pe=ot(import.meta.url),lt=pe.resolve("@changesets/cli/bin.js"),{version:ft}=pe("../package.json"),U=e=>{let t=st(process.execPath,[lt,...e],{stdio:"inherit"});t.status!==0&&process.exit(t.status??1)};function mt(){if(process.platform==="win32")try{process.stdout.setDefaultEncoding("utf8"),process.stderr.setDefaultEncoding("utf8")}catch{}}function ge(){let e=F("check");return typeof e?.warnings=="boolean"?e.warnings:void 0}function ut(){let t=F("changelog")?.languages;if(!t||typeof t!="object")return W;let n={...W};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&(n[r]=o);return n}function dt(e=".changeset"){if(!it(e))return!1;try{return at(e).some(t=>t.endsWith(".md")&&t!=="README.md")}catch{return!1}}function pt(e=".tasks"){return v(ct(e,"active")).length>0}function z(e){if(e.length===0){console.log("\u672A\u53D1\u73B0\u95EE\u9898");return}for(let t of e)console.log(` ${t.file}: ${t.message}`)}var _=new rt;_.name("toolkit").description("\u5F00\u53D1\u5DE5\u7A0B\u5316\u5DE5\u5177\u96C6\uFF1A\u4EFB\u52A1\u7BA1\u7406 + \u591A\u8BED\u8A00 CHANGELOG \u53D1\u5E03").version(ft,"-v, --version","\u663E\u793A\u7248\u672C\u53F7").enablePositionalOptions(!0);_.command("tasks").description("\u4EFB\u52A1\u7BA1\u7406").option("--dir <path>","\u4EFB\u52A1\u76EE\u5F55",".tasks").option("--redact","\u5F00\u542F\u9690\u79C1\u8131\u654F").option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").option("--warn","\u5F00\u542F\u8F6F\u544A\u8B66").option("--no-warn","\u5173\u95ED\u8F6F\u544A\u8B66").option("--dry-run","\u5F52\u6863\u9884\u6F14\uFF08\u4EC5 archive \u6709\u6548\uFF09").option("--fix","\u5F52\u4E00\u5316\u4FEE\u590D\uFF08\u4EC5 normalize \u6709\u6548\uFF09").argument("[command]","\u5B50\u547D\u4EE4\uFF1Aarchive / check / normalize\uFF0C\u7559\u7A7A\u4E3A\u603B\u89C8").action((e,t)=>{let n=I(t.redact),r=D(t.warn,"FX_CHECK_WARN",ge(),!0),o=t.dir;if(e==="archive"){let s=te(o,n,{dryRun:t.dryRun,warn:r});r&&!t.dryRun&&s.archived>0&&!dt()&&console.warn("\u26A0\uFE0F \u672C\u6B21\u5F52\u6863\u4E86\u4EFB\u52A1\uFF0C\u4F46 .changeset \u65E0\u5F85\u53D1\u5E03\u53D8\u66F4\u96C6\uFF0C\u5982\u9700\u53D1\u7248\u8BF7\u5148\u521B\u5EFA\u53D8\u66F4\u96C6")}else if(e==="check"){let s=oe(o);console.log("\u4EFB\u52A1\u6821\u9A8C\uFF1A"),console.log(`\u3010error\u3011${s.errorCount} \u9879`),z(s.issues.filter(i=>i.level==="error")),r?(console.log(`\u3010warn\u3011${s.warnCount} \u9879`),z(s.issues.filter(i=>i.level==="warn"))):console.log("\uFF08\u8F6F\u544A\u8B66\u5DF2\u5173\u95ED\uFF0Cwarn \u4E0D\u5C55\u793A\uFF09"),s.errorCount>0&&(process.exitCode=1)}else if(e==="normalize")if(t.fix){let s=me(o);console.log(`\u5DF2\u4FEE\u590D ${s.fixed} \u5904`),s.issues.length>0&&(console.log("\u4EE5\u4E0B\u95EE\u9898\u9700\u4EBA\u5DE5\u786E\u8BA4\uFF1A"),z(s.issues))}else{let s=fe(o);console.log(`\u5F52\u6863\u5F52\u4E00\u5316\u68C0\u67E5\uFF1A\u53D1\u73B0 ${s.length} \u5904\u95EE\u9898`),z(s)}else K(o,n)});_.command("changelog").description("\u591A\u8BED\u8A00 CHANGELOG\uFF08\u5C01\u88C5 changesets\uFF09").option("--lang <lang>","\u8BED\u8A00 zh/en",B).option("--redact","\u5F00\u542F\u9690\u79C1\u8131\u654F").option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").option("--warn","\u5F00\u542F\u8F6F\u544A\u8B66").option("--no-warn","\u5173\u95ED\u8F6F\u544A\u8B66").argument("[command...]","\u5B50\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u900F\u4F20\u7ED9 changesets\uFF09").passThroughOptions(!0).action((e,t)=>{let n=I(t.redact),r=D(t.warn,"FX_CHECK_WARN",ge(),!0),o=ut(),s=o[t.lang]??o[B],i=e[0];i==="version"?(r&&pt()&&console.warn("\u26A0\uFE0F \u5B58\u5728\u672A\u5F52\u6863\u7684 active \u4EFB\u52A1\uFF0C\u5EFA\u8BAE\u5148\u5F52\u6863\u518D\u53D1\u7248"),U(["version"]),P(".",G(),s,n)):i==="format"?P(".",G(),s,n):U(i?e:[])});mt();_.parse();
|
package/dist/index.cjs
CHANGED
|
@@ -1,23 +1,36 @@
|
|
|
1
|
-
var
|
|
2
|
-
`);let
|
|
1
|
+
var W=Object.defineProperty;var ue=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames;var ge=Object.prototype.hasOwnProperty;var he=(e,t)=>{for(var n in t)W(e,n,{get:t[n],enumerable:!0})},ke=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of de(t))!ge.call(e,s)&&s!==n&&W(e,s,{get:()=>t[s],enumerable:!(r=ue(t,s))||r.enumerable});return e};var ye=e=>ke(W({},"__esModule",{value:!0}),e);var Ie={};he(Ie,{DEFAULT_LANG:()=>Ee,DONE_STATUSES:()=>Z,archiveTasks:()=>ne,checkArchive:()=>ce,collectChangelogs:()=>O,dateFromFileName:()=>z,fixArchive:()=>le,formatChangelog:()=>V,formatChangelogs:()=>pe,getConfigSection:()=>_,languages:()=>Le,listTaskFiles:()=>S,listTasks:()=>J,loadToolkitConfig:()=>P,localDate:()=>fe,normalizeCompleted:()=>v,parseArchiveTasks:()=>H,parseBool:()=>U,parseFrontmatter:()=>A,printTasks:()=>te,redactText:()=>F,resolveEnabled:()=>G,stripFrontmatter:()=>w,validateTaskFile:()=>K,validateTasks:()=>se});module.exports=ye(Ie);var Z=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function A(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!t)return{};let n={};for(let r of t[1].split(/\r?\n/)){let s=r.indexOf(":");if(s===-1)continue;let a=r.slice(0,s).trim(),o=r.slice(s+1).trim();(o.startsWith("'")&&o.endsWith("'")||o.startsWith('"')&&o.endsWith('"'))&&(o=o.slice(1,-1)),a&&(n[a]=o)}return n}function w(e){let t=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return t?e.slice(t[0].length):e}var R=require("fs"),D=require("path");function S(e){if(!(0,R.existsSync)(e))return[];let t=[];for(let n of(0,R.readdirSync)(e)){let r=(0,D.join)(e,n);if((0,R.statSync)(r).isDirectory())for(let s of(0,R.readdirSync)(r))s.endsWith(".md")&&t.push((0,D.join)(r,s));else n.endsWith(".md")&&t.push(r)}return t}function z(e){let n=(0,D.basename)(e,(0,D.extname)(e)).match(/^(\d{8})/);return n?n[1]:""}var ee=require("fs"),j=require("path");var q=require("fs"),Q=require("path"),N;function P(){if(N!==void 0)return N;N=null;try{let e=(0,q.readFileSync)((0,Q.join)(process.cwd(),".toolkitrc.json"),"utf8");N=JSON.parse(e)}catch{}return N}function _(e){let t=P();if(!t)return;let n=t[e];return typeof n=="object"&&n!==null?n:void 0}function U(e,t){let n=e.trim().toLowerCase();return["1","true","on","yes"].includes(n)?!0:["0","false","off","no"].includes(n)?!1:t}function G(e,t,n,r){if(e!==void 0)return e;let s=process.env[t];return s!==void 0&&s!==""?U(s,r):n!==void 0?n:r}var be=[{name:"\u5185\u7F51URL",pattern:/(https?:\/\/)[a-zA-Z0-9.-]+(:\d{2,5})(?=\/|[\s]|$)/g,replacement:"$1***$2"},{name:"\u90AE\u7BB1",pattern:/([a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]*@(?:[a-zA-Z0-9-]+\.)+([a-zA-Z]{2,})/g,replacement:"$1***@***.$2"},{name:"JWT",pattern:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"eyJ***.eyJ***.***"},{name:"AWS\u5BC6\u94A5",pattern:/\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,replacement:"$1****"},{name:"GitHub\u5BC6\u94A5",pattern:/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,replacement:"$1_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"\u624B\u673A\u53F7",pattern:/(?<!\d)(1[3-9]\d)\d{4}(\d{4})(?!\d)/g,replacement:"$1****$2"},{name:"\u8EAB\u4EFD\u8BC1",pattern:/(?<!\d)(\d{6})\d{8}(\d{3}[\dXx])(?!\d)/g,replacement:"$1********$2"},{name:"IPv4",pattern:/(?<![\d.])(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}(?![\d.])/g,replacement:"$1.***.***"}],M=null;function $e(){let e=_("redact");return e?{enabled:typeof e.enabled=="boolean"?e.enabled:void 0,disable:Array.isArray(e.disable)?e.disable.filter(t=>typeof t=="string"):void 0,rules:Array.isArray(e.rules)?e.rules:void 0}:null}function xe(){if(M)return M;let e=$e(),t=new Set(e?.disable??[]),n=[];for(let r of e?.rules??[])try{n.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return M=[...n,...be.filter(r=>!t.has(r.name))],M}function F(e,t){if(!t||!e)return e;let n=e;for(let r of xe())n=n.replace(r.pattern,r.replacement);return n}function J(e=".tasks"){let t=(0,j.join)(e,"active");return S(t).map(n=>{let r=(0,ee.readFileSync)(n,"utf8"),s=A(r),a=r.split(/\r?\n/).find(o=>o.startsWith("# ")&&!o.startsWith("#!"))?.replace(/^#\s*/,"")||(0,j.basename)(n,".md");return{file:n,name:(0,j.basename)(n,".md"),date:z(n),title:a,frontmatter:s,body:w(r).trim()}})}function te(e=".tasks",t=!0){let n=J(e);if(n.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let r=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],s={};for(let o of n){let i=r.includes(o.frontmatter.status)?o.frontmatter.status:"\u672A\u6807\u6CE8";(s[i]||=[]).push(o)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
|
|
2
|
+
`);let a=0;for(let o of r){let i=s[o]||[];if(i.length!==0){a+=i.length,console.log(`\u3010${o}\u3011${i.length} \u9879`);for(let f of i)console.log(` ${f.date} ${(f.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${F(f.title,t)}`);console.log("")}}console.log(`\u5171 ${a} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}var k=require("fs"),y=require("path");function ve(e,t){let n=(0,y.resolve)(e),r=(0,y.resolve)(t);for(;n!==r&&n.startsWith(r+y.sep);){try{if((0,k.readdirSync)(n).length>0)break;(0,k.rmdirSync)(n)}catch{break}n=(0,y.dirname)(n)}}function v(e){let t=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return t?`${t[1]}-${t[2].padStart(2,"0")}-${t[3].padStart(2,"0")} ${t[4].padStart(2,"0")}:${t[5]}`:e}function H(e){let t=(0,k.readFileSync)(e,"utf8"),n=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,s;for(;s=r.exec(t);)n.push({block:s[0].trim(),completed:s[2].trim()});return n}function ne(e=".tasks",t=!0,n={}){let{dryRun:r=!1,warn:s=!0}=n,a=(0,y.join)(e,"active"),o=(0,y.join)(e,"archive"),i=[],f=S(a);if(f.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:i};let c=[],u=[];for(let l of f){let b=(0,k.readFileSync)(l,"utf8"),$=A(b);if(!Z.includes($.status))continue;let p=v($.completed||"");if(!p){u.push((0,y.basename)(l,".md")),console.log(`\u8DF3\u8FC7 ${(0,y.basename)(l,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:l,name:(0,y.basename)(l,".md"),owner:$.owner||"\u672A\u6807\u6CE8",status:$.status||"\u672A\u6807\u6CE8",scope:$.scope||"-",completed:p,body:w(b).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:u,warnings:i};if(s)for(let l of c){let b=l.completed.replace(/-/g,"").slice(0,8),$=z(l.file);$&&b!==$&&i.push(`\u4EFB\u52A1\u300C${l.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${l.completed} \u4E0E\u521B\u5EFA\u65E5 ${$} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let d={};for(let l of c){let b=l.completed.replace(/-/g,"").slice(0,8);(d[b]||=[]).push(l)}let m=null,g=(0,y.join)(e,".archive.lock");if(!r)try{m=(0,k.openSync)(g,"wx")}catch{let l="\u68C0\u6D4B\u5230\u5F52\u6863\u9501 .archive.lock\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5F52\u6863\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7";return console.warn(`\u26A0\uFE0F ${l}`),{archived:0,skipped:u,warnings:[...i,l]}}try{for(let[l,b]of Object.entries(d)){let $=(0,y.join)(o,l.slice(0,6)),p=(0,y.join)($,`${l}.md`),C=(0,k.existsSync)(p)?H(p):[];if(s){let h=new Set(C.map(I=>I.block.match(/^## (.+)/)?.[1]??""));for(let I of b)h.has(I.name)&&i.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${I.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}C.push(...b.map(h=>({block:`## ${h.name}
|
|
3
3
|
|
|
4
|
-
> \u8D1F\u8D23\u4EBA\uFF1A${
|
|
4
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${h.owner}\u3000\u72B6\u6001\uFF1A${h.status}\u3000\u8303\u56F4\uFF1A${h.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${h.completed}
|
|
5
5
|
|
|
6
|
-
${
|
|
6
|
+
${F(h.body,t)}`,completed:h.completed})));for(let h of C)h.completed=v(h.completed);if(C.sort((h,I)=>I.completed.localeCompare(h.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${b.length} \u4E2A\u4EFB\u52A1 \u2192 ${l}.md`);for(let h of b)console.log(`[\u9884\u6F14] - ${h.name}`);continue}(0,k.mkdirSync)($,{recursive:!0}),(0,k.writeFileSync)(p,`# ${l} \u5F52\u6863
|
|
7
7
|
|
|
8
8
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
9
9
|
|
|
10
|
-
${
|
|
10
|
+
${C.map(h=>h.block).join(`
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
`)}
|
|
15
|
-
`,"utf8");for(let
|
|
15
|
+
`,"utf8");for(let h of b)(0,k.unlinkSync)(h.file);ve((0,y.dirname)(b[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${b.length} \u4E2A\u4EFB\u52A1 \u2192 ${l}.md`)}for(let l of i)console.warn(`\u26A0\uFE0F ${l}`);return console.log(r?`[\u9884\u6F14] \u5171 ${c.length} \u4E2A\u4EFB\u52A1\u53EF\u5F52\u6863\uFF08\u672A\u843D\u76D8\uFF09`:`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:u,warnings:i}}finally{if(m!==null){(0,k.closeSync)(m);try{(0,k.unlinkSync)(g)}catch{}}}}var Y=require("fs"),L=require("path");var re=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u5DF2\u5B8C\u6210","\u963B\u585E","\u5DF2\u653E\u5F03"],Se=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"],Te=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,Ce=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/;function K(e){let t=[],n=(0,L.basename)(e),r=(0,Y.readFileSync)(e,"utf8");if(!/^---\r?\n[\s\S]*?\r?\n---/.test(r))return t.push({level:"error",file:n,message:"\u7F3A\u5C11 frontmatter"}),t;let a=A(r);a.status?re.includes(a.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${a.status}\u300D\uFF0C\u5E94\u4E3A ${re.join(" / ")}`}):t.push({level:"error",file:n,message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),Se.includes(a.status)&&!a.completed&&t.push({level:"error",file:n,message:`status \u4E3A\u300C${a.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),a.completed&&!Ce.test(a.completed.trim())&&t.push({level:"warn",file:n,message:`completed\u300C${a.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`});let i=w(r).match(Te);return i&&t.push({level:"warn",file:n,message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${i[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),t}function se(e=".tasks"){let t=S((0,L.join)(e,"active")),n=[];for(let o of t)n.push(...K(o));let r=new Map;for(let o of t){let i=(0,L.basename)(o,".md"),f=r.get(i);f?f.push(o):r.set(i,[o])}for(let[o,i]of r)i.length>1&&n.push({level:"warn",file:o,message:`\u5B58\u5728 ${i.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});n.push(...we(t));let s=n.filter(o=>o.level==="error").length,a=n.length-s;return{issues:n,errorCount:s,warnCount:a}}function Ae(e){if(Array.isArray(e))return e.filter(t=>typeof t=="string");if(typeof e=="string"){let t=e.trim().match(/^\[(.*)\]$/);if(t)return t[1].split(",").map(n=>n.trim().replace(/^['"]|['"]$/g,"")).filter(Boolean)}return[]}function we(e){let t=[],n=new Set(e.map(c=>(0,L.basename)(c,".md"))),r=new Map;for(let c of e){let u=(0,L.basename)(c,".md"),d=(0,Y.readFileSync)(c,"utf8"),m=A(d),g=Ae(m.depends_on);r.set(u,g);for(let l of g)n.has(l)||t.push({level:"warn",file:u,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${l}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}let s=0,a=1,o=2,i=new Map,f=(c,u)=>{i.set(c,a);for(let d of r.get(c)??[]){if(!n.has(d))continue;let m=i.get(d)??s;if(m===a)return[...u,d];if(m===s){let g=f(d,[...u,d]);if(g)return g}}return i.set(c,o),null};for(let c of r.keys())if((i.get(c)??s)===s){let u=f(c,[c]);if(u){t.push({level:"warn",file:c,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${u.join(" \u2192 ")}`});break}}return t}var T=require("fs"),E=require("path");function Fe(e){let t=e.match(/^\d{8}-(.+?)-/);return t?t[1]:""}function oe(e){let t=e.search(/\n## /);if(t===-1)return{header:e,blocks:[]};let n=e.slice(0,t+1),r=e.slice(t+1),s=[];for(let a of r.split(/\n\n---\n\n/)){let o=a.trim();if(!o.startsWith("## "))continue;let i=o.split(`
|
|
16
|
+
`),f=i[0].replace(/^## /,""),c=null,u="",d=1;for(let m=1;m<i.length;m++){let g=i[m].trim();if(g.startsWith("> ")&&g.includes("\u5B8C\u6210\u65F6\u95F4")){c=i[m];let l=g.match(/完成时间:(.+)$/);l&&(u=l[1].trim()),d=m+1;break}}s.push({title:f,metaLine:c,completed:u,body:i.slice(d).join(`
|
|
17
|
+
`).trim()})}return{header:n,blocks:s}}function ie(e,t){return`> \u8D1F\u8D23\u4EBA\uFF1A${Fe(e)||"\u672A\u6807\u6CE8"}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A-\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${v(t)}`}var Re=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function ae(e){return Re.every(t=>e.includes(t))}function De(e){let t=e.metaLine??(e.completed?ie(e.title,e.completed):null);return t?`## ${e.title}
|
|
18
|
+
|
|
19
|
+
${t}
|
|
20
|
+
|
|
21
|
+
${e.body}`:`## ${e.title}
|
|
22
|
+
|
|
23
|
+
${e.body}`}function ce(e=".tasks"){let t=(0,E.join)(e,"archive"),n=S(t),r=[];for(let s of n){let a=(0,E.basename)(s),o=a.replace(/\.md$/,""),i=(0,T.readFileSync)(s,"utf8"),{blocks:f}=oe(i);for(let c=1;c<f.length;c++){let u=v(f[c-1].completed),d=v(f[c].completed);if(u&&d&&u<d){r.push({file:a,message:"\u4EFB\u52A1\u5757\u672A\u6309\u5B8C\u6210\u65F6\u95F4\u964D\u5E8F\u6392\u5217",fixable:!0});break}}for(let c of f){c.metaLine?ae(c.metaLine)||r.push({file:a,message:`\u5757\u300C${c.title}\u300D\u5143\u6570\u636E\u884C\u4E0D\u5B8C\u6574\uFF08\u7F3A\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4\u4E4B\u4E00\uFF09`,fixable:!!c.completed}):r.push({file:a,message:`\u5757\u300C${c.title}\u300D\u7F3A\u5C11\u5143\u6570\u636E\u884C\uFF08\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4/\u5B8C\u6210\u65F6\u95F4\uFF09`,fixable:!!c.completed});let u=v(c.completed),d=u.replace(/-/g,"").slice(0,8);d&&o&&d!==o&&r.push({file:a,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${u} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${o} \u4E0D\u4E00\u81F4`,fixable:!1})}}return r}function le(e=".tasks"){let t=(0,E.join)(e,"archive"),n=S(t),r=[],s=0,a=null,o=(0,E.join)(e,".archive.lock");try{a=(0,T.openSync)(o,"wx")}catch{return console.warn("\u26A0\uFE0F \u68C0\u6D4B\u5230\u5F52\u6863\u9501\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5199\u64CD\u4F5C\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7\u4FEE\u590D"),{issues:r,fixed:s}}try{for(let i of n){let f=(0,E.basename)(i),c=f.replace(/\.md$/,""),u=(0,T.readFileSync)(i,"utf8"),{header:d,blocks:m}=oe(u),g=!1;for(let p of m){p.completed&&(!p.metaLine||!ae(p.metaLine))&&(p.metaLine=ie(p.title,p.completed),g=!0,s++);let C=v(p.completed),h=C.replace(/-/g,"").slice(0,8);h&&c&&h!==c&&r.push({file:f,message:`\u5757\u300C${p.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${C} \u4E0E\u5F52\u6863\u65E5\u671F ${c} \u4E0D\u4E00\u81F4\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\u662F\u5426\u8FC1\u79FB\uFF09`,fixable:!1})}let l=m.filter(p=>p.completed),b=m.filter(p=>!p.completed),$=[...l].sort((p,C)=>v(C.completed).localeCompare(v(p.completed)));if(JSON.stringify($.map(p=>p.title))!==JSON.stringify(l.map(p=>p.title))&&(m.splice(0,m.length,...$,...b),g=!0),g){let p=d+m.map(De).join(`
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
`)+`
|
|
28
|
+
`;(0,T.writeFileSync)(i,p,"utf8")}}return{issues:r,fixed:s}}finally{if(a!==null){(0,T.closeSync)(a);try{(0,T.unlinkSync)(o)}catch{}}}}var Le={zh:{replacements:{"### Major Changes":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### \u91CD\u5927\u53D8\u66F4":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### Minor Changes":"### \u2728 \u65B0\u589E\u529F\u80FD","### \u65B0\u589E\u529F\u80FD":"### \u2728 \u65B0\u589E\u529F\u80FD","### Patch Changes":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### \u8865\u4E01\u4FEE\u590D":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### Dependent Changes":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","### \u4F9D\u8D56\u53D8\u66F4":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","- Updated dependencies":"- \u66F4\u65B0\u4F9D\u8D56"},deps:"- \u66F4\u65B0\u4F9D\u8D56",released:"\u53D1\u5E03"},en:{replacements:{"### Major Changes":"### \u{1F6A8} Major Changes","### Minor Changes":"### \u2728 Minor Changes","### Patch Changes":"### \u{1F41B} Patch Changes","### Dependent Changes":"### \u{1F517} Dependent Changes"},deps:"- Updated dependencies",released:"released"}},Ee="zh";var me=require("fs"),X=require("path");function O(e){let t=[],n=new Set(["node_modules",".git","dist"]),r=s=>{let a;try{a=(0,me.readdirSync)(s,{withFileTypes:!0})}catch{return}for(let o of a)if(o.isDirectory()){if(n.has(o.name))continue;r((0,X.join)(s,o.name))}else o.name==="CHANGELOG.md"&&t.push((0,X.join)(s,o.name))};return r(e),t}var B=require("fs");function fe(){let e=new Date,t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function V(e,t,n,r=!0){let s=(0,B.readFileSync)(e,"utf8"),a=s.includes(`\r
|
|
16
29
|
`)?`\r
|
|
17
30
|
`:`
|
|
18
|
-
`,s
|
|
19
|
-
`),
|
|
20
|
-
${
|
|
21
|
-
${
|
|
22
|
-
`),
|
|
23
|
-
`),
|
|
31
|
+
`,o=s.replace(/\r\n/g,`
|
|
32
|
+
`),i=o;for(let[m,g]of Object.entries(n.replacements))i=i.replaceAll(m,g);for(;i.includes(`${n.deps}
|
|
33
|
+
${n.deps}`);)i=i.replace(`${n.deps}
|
|
34
|
+
${n.deps}`,n.deps);for(;;){let m=i.replace(/^- (.+)\n- \1$/gm,"- $1");if(m===i)break;i=m}let f=i.split(`
|
|
35
|
+
`),c=[];for(let m=0;m<f.length;m++)if(c.push(f[m]),/^## \d+\.\d+\.\d+/.test(f[m])){let g=m+1;for(;g<f.length&&f[g].trim()==="";)g++;f[g]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(f[g].trim())||c.push(`> ${t} ${n.released}`)}let u=c.join(`
|
|
36
|
+
`),d=F(u,r);return d!==o?((0,B.writeFileSync)(e,d.replace(/\n/g,a),"utf8"),!0):!1}function pe(e,t,n,r=!0){let s=[];for(let a of O(e))V(a,t,n,r)&&s.push(a);if(s.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let a of s)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${a}`);return s}0&&(module.exports={DEFAULT_LANG,DONE_STATUSES,archiveTasks,checkArchive,collectChangelogs,dateFromFileName,fixArchive,formatChangelog,formatChangelogs,getConfigSection,languages,listTaskFiles,listTasks,loadToolkitConfig,localDate,normalizeCompleted,parseArchiveTasks,parseBool,parseFrontmatter,printTasks,redactText,resolveEnabled,stripFrontmatter,validateTaskFile,validateTasks});
|
package/dist/index.d.cts
CHANGED
|
@@ -24,6 +24,11 @@ interface ArchiveBlock {
|
|
|
24
24
|
interface ArchiveResult {
|
|
25
25
|
archived: number;
|
|
26
26
|
skipped: string[];
|
|
27
|
+
warnings: string[];
|
|
28
|
+
}
|
|
29
|
+
interface ArchiveOptions {
|
|
30
|
+
dryRun?: boolean;
|
|
31
|
+
warn?: boolean;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
declare function parseFrontmatter(content: string): Partial<TaskFrontmatter>;
|
|
@@ -35,8 +40,35 @@ declare function dateFromFileName(file: string): string;
|
|
|
35
40
|
declare function listTasks(tasksDir?: string): Task[];
|
|
36
41
|
declare function printTasks(tasksDir?: string, redact?: boolean): void;
|
|
37
42
|
|
|
43
|
+
declare function normalizeCompleted(completed: string): string;
|
|
38
44
|
declare function parseArchiveTasks(file: string): ArchiveBlock[];
|
|
39
|
-
declare function archiveTasks(tasksDir?: string, redact?: boolean): ArchiveResult;
|
|
45
|
+
declare function archiveTasks(tasksDir?: string, redact?: boolean, options?: ArchiveOptions): ArchiveResult;
|
|
46
|
+
|
|
47
|
+
type IssueLevel = "error" | "warn";
|
|
48
|
+
interface CheckIssue {
|
|
49
|
+
level: IssueLevel;
|
|
50
|
+
file: string;
|
|
51
|
+
message: string;
|
|
52
|
+
}
|
|
53
|
+
interface CheckResult {
|
|
54
|
+
issues: CheckIssue[];
|
|
55
|
+
errorCount: number;
|
|
56
|
+
warnCount: number;
|
|
57
|
+
}
|
|
58
|
+
declare function validateTaskFile(file: string): CheckIssue[];
|
|
59
|
+
declare function validateTasks(tasksDir?: string): CheckResult;
|
|
60
|
+
|
|
61
|
+
interface NormalizeIssue {
|
|
62
|
+
file: string;
|
|
63
|
+
message: string;
|
|
64
|
+
fixable: boolean;
|
|
65
|
+
}
|
|
66
|
+
interface NormalizeResult {
|
|
67
|
+
issues: NormalizeIssue[];
|
|
68
|
+
fixed: number;
|
|
69
|
+
}
|
|
70
|
+
declare function checkArchive(tasksDir?: string): NormalizeIssue[];
|
|
71
|
+
declare function fixArchive(tasksDir?: string): NormalizeResult;
|
|
40
72
|
|
|
41
73
|
type LanguageMap = Record<string, string>;
|
|
42
74
|
interface ChangelogLanguage {
|
|
@@ -55,4 +87,10 @@ declare function formatChangelogs(dir: string, today: string, lang: ChangelogLan
|
|
|
55
87
|
|
|
56
88
|
declare function redactText(text: string, enabled: boolean): string;
|
|
57
89
|
|
|
58
|
-
|
|
90
|
+
declare function parseBool(value: string, fallback: boolean): boolean;
|
|
91
|
+
declare function resolveEnabled(cli: boolean | undefined, envKey: string, config: boolean | undefined, fallback: boolean): boolean;
|
|
92
|
+
|
|
93
|
+
declare function loadToolkitConfig(): Record<string, unknown> | null;
|
|
94
|
+
declare function getConfigSection(name: string): Record<string, unknown> | undefined;
|
|
95
|
+
|
|
96
|
+
export { type ArchiveBlock, type ArchiveOptions, type ArchiveResult, type ChangelogLanguage, type CheckIssue, type CheckResult, DEFAULT_LANG, DONE_STATUSES, type IssueLevel, type LanguageMap, type NormalizeIssue, type NormalizeResult, type Task, type TaskFrontmatter, type TaskStatus, archiveTasks, checkArchive, collectChangelogs, dateFromFileName, fixArchive, formatChangelog, formatChangelogs, getConfigSection, languages, listTaskFiles, listTasks, loadToolkitConfig, localDate, normalizeCompleted, parseArchiveTasks, parseBool, parseFrontmatter, printTasks, redactText, resolveEnabled, stripFrontmatter, validateTaskFile, validateTasks };
|
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,11 @@ interface ArchiveBlock {
|
|
|
24
24
|
interface ArchiveResult {
|
|
25
25
|
archived: number;
|
|
26
26
|
skipped: string[];
|
|
27
|
+
warnings: string[];
|
|
28
|
+
}
|
|
29
|
+
interface ArchiveOptions {
|
|
30
|
+
dryRun?: boolean;
|
|
31
|
+
warn?: boolean;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
declare function parseFrontmatter(content: string): Partial<TaskFrontmatter>;
|
|
@@ -35,8 +40,35 @@ declare function dateFromFileName(file: string): string;
|
|
|
35
40
|
declare function listTasks(tasksDir?: string): Task[];
|
|
36
41
|
declare function printTasks(tasksDir?: string, redact?: boolean): void;
|
|
37
42
|
|
|
43
|
+
declare function normalizeCompleted(completed: string): string;
|
|
38
44
|
declare function parseArchiveTasks(file: string): ArchiveBlock[];
|
|
39
|
-
declare function archiveTasks(tasksDir?: string, redact?: boolean): ArchiveResult;
|
|
45
|
+
declare function archiveTasks(tasksDir?: string, redact?: boolean, options?: ArchiveOptions): ArchiveResult;
|
|
46
|
+
|
|
47
|
+
type IssueLevel = "error" | "warn";
|
|
48
|
+
interface CheckIssue {
|
|
49
|
+
level: IssueLevel;
|
|
50
|
+
file: string;
|
|
51
|
+
message: string;
|
|
52
|
+
}
|
|
53
|
+
interface CheckResult {
|
|
54
|
+
issues: CheckIssue[];
|
|
55
|
+
errorCount: number;
|
|
56
|
+
warnCount: number;
|
|
57
|
+
}
|
|
58
|
+
declare function validateTaskFile(file: string): CheckIssue[];
|
|
59
|
+
declare function validateTasks(tasksDir?: string): CheckResult;
|
|
60
|
+
|
|
61
|
+
interface NormalizeIssue {
|
|
62
|
+
file: string;
|
|
63
|
+
message: string;
|
|
64
|
+
fixable: boolean;
|
|
65
|
+
}
|
|
66
|
+
interface NormalizeResult {
|
|
67
|
+
issues: NormalizeIssue[];
|
|
68
|
+
fixed: number;
|
|
69
|
+
}
|
|
70
|
+
declare function checkArchive(tasksDir?: string): NormalizeIssue[];
|
|
71
|
+
declare function fixArchive(tasksDir?: string): NormalizeResult;
|
|
40
72
|
|
|
41
73
|
type LanguageMap = Record<string, string>;
|
|
42
74
|
interface ChangelogLanguage {
|
|
@@ -55,4 +87,10 @@ declare function formatChangelogs(dir: string, today: string, lang: ChangelogLan
|
|
|
55
87
|
|
|
56
88
|
declare function redactText(text: string, enabled: boolean): string;
|
|
57
89
|
|
|
58
|
-
|
|
90
|
+
declare function parseBool(value: string, fallback: boolean): boolean;
|
|
91
|
+
declare function resolveEnabled(cli: boolean | undefined, envKey: string, config: boolean | undefined, fallback: boolean): boolean;
|
|
92
|
+
|
|
93
|
+
declare function loadToolkitConfig(): Record<string, unknown> | null;
|
|
94
|
+
declare function getConfigSection(name: string): Record<string, unknown> | undefined;
|
|
95
|
+
|
|
96
|
+
export { type ArchiveBlock, type ArchiveOptions, type ArchiveResult, type ChangelogLanguage, type CheckIssue, type CheckResult, DEFAULT_LANG, DONE_STATUSES, type IssueLevel, type LanguageMap, type NormalizeIssue, type NormalizeResult, type Task, type TaskFrontmatter, type TaskStatus, archiveTasks, checkArchive, collectChangelogs, dateFromFileName, fixArchive, formatChangelog, formatChangelogs, getConfigSection, languages, listTaskFiles, listTasks, loadToolkitConfig, localDate, normalizeCompleted, parseArchiveTasks, parseBool, parseFrontmatter, printTasks, redactText, resolveEnabled, stripFrontmatter, validateTaskFile, validateTasks };
|
package/dist/index.js
CHANGED
|
@@ -1,23 +1,36 @@
|
|
|
1
|
-
var
|
|
2
|
-
`);let
|
|
1
|
+
var _=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function T(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!t)return{};let n={};for(let r of t[1].split(/\r?\n/)){let s=r.indexOf(":");if(s===-1)continue;let a=r.slice(0,s).trim(),o=r.slice(s+1).trim();(o.startsWith("'")&&o.endsWith("'")||o.startsWith('"')&&o.endsWith('"'))&&(o=o.slice(1,-1)),a&&(n[a]=o)}return n}function C(e){let t=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return t?e.slice(t[0].length):e}import{existsSync as ie,readdirSync as M,statSync as ae}from"fs";import{join as O,basename as ce,extname as le}from"path";function S(e){if(!ie(e))return[];let t=[];for(let n of M(e)){let r=O(e,n);if(ae(r).isDirectory())for(let s of M(r))s.endsWith(".md")&&t.push(O(r,s));else n.endsWith(".md")&&t.push(r)}return t}function F(e){let n=ce(e,le(e)).match(/^(\d{8})/);return n?n[1]:""}import{readFileSync as ge}from"fs";import{join as he,basename as P}from"path";import{readFileSync as me}from"fs";import{join as fe}from"path";var R;function B(){if(R!==void 0)return R;R=null;try{let e=me(fe(process.cwd(),".toolkitrc.json"),"utf8");R=JSON.parse(e)}catch{}return R}function I(e){let t=B();if(!t)return;let n=t[e];return typeof n=="object"&&n!==null?n:void 0}function W(e,t){let n=e.trim().toLowerCase();return["1","true","on","yes"].includes(n)?!0:["0","false","off","no"].includes(n)?!1:t}function Z(e,t,n,r){if(e!==void 0)return e;let s=process.env[t];return s!==void 0&&s!==""?W(s,r):n!==void 0?n:r}var pe=[{name:"\u5185\u7F51URL",pattern:/(https?:\/\/)[a-zA-Z0-9.-]+(:\d{2,5})(?=\/|[\s]|$)/g,replacement:"$1***$2"},{name:"\u90AE\u7BB1",pattern:/([a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]*@(?:[a-zA-Z0-9-]+\.)+([a-zA-Z]{2,})/g,replacement:"$1***@***.$2"},{name:"JWT",pattern:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"eyJ***.eyJ***.***"},{name:"AWS\u5BC6\u94A5",pattern:/\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,replacement:"$1****"},{name:"GitHub\u5BC6\u94A5",pattern:/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,replacement:"$1_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"\u624B\u673A\u53F7",pattern:/(?<!\d)(1[3-9]\d)\d{4}(\d{4})(?!\d)/g,replacement:"$1****$2"},{name:"\u8EAB\u4EFD\u8BC1",pattern:/(?<!\d)(\d{6})\d{8}(\d{3}[\dXx])(?!\d)/g,replacement:"$1********$2"},{name:"IPv4",pattern:/(?<![\d.])(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}(?![\d.])/g,replacement:"$1.***.***"}],L=null;function ue(){let e=I("redact");return e?{enabled:typeof e.enabled=="boolean"?e.enabled:void 0,disable:Array.isArray(e.disable)?e.disable.filter(t=>typeof t=="string"):void 0,rules:Array.isArray(e.rules)?e.rules:void 0}:null}function de(){if(L)return L;let e=ue(),t=new Set(e?.disable??[]),n=[];for(let r of e?.rules??[])try{n.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return L=[...n,...pe.filter(r=>!t.has(r.name))],L}function A(e,t){if(!t||!e)return e;let n=e;for(let r of de())n=n.replace(r.pattern,r.replacement);return n}function U(e=".tasks"){let t=he(e,"active");return S(t).map(n=>{let r=ge(n,"utf8"),s=T(r),a=r.split(/\r?\n/).find(o=>o.startsWith("# ")&&!o.startsWith("#!"))?.replace(/^#\s*/,"")||P(n,".md");return{file:n,name:P(n,".md"),date:F(n),title:a,frontmatter:s,body:C(r).trim()}})}function ke(e=".tasks",t=!0){let n=U(e);if(n.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let r=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],s={};for(let o of n){let i=r.includes(o.frontmatter.status)?o.frontmatter.status:"\u672A\u6807\u6CE8";(s[i]||=[]).push(o)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
|
|
2
|
+
`);let a=0;for(let o of r){let i=s[o]||[];if(i.length!==0){a+=i.length,console.log(`\u3010${o}\u3011${i.length} \u9879`);for(let f of i)console.log(` ${f.date} ${(f.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${A(f.title,t)}`);console.log("")}}console.log(`\u5171 ${a} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as H,writeFileSync as ye,mkdirSync as be,unlinkSync as G,existsSync as $e,readdirSync as xe,rmdirSync as ve,openSync as Se,closeSync as Te}from"fs";import{join as D,basename as z,dirname as Y,resolve as J,sep as Ce}from"path";function Ae(e,t){let n=J(e),r=J(t);for(;n!==r&&n.startsWith(r+Ce);){try{if(xe(n).length>0)break;ve(n)}catch{break}n=Y(n)}}function x(e){let t=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return t?`${t[1]}-${t[2].padStart(2,"0")}-${t[3].padStart(2,"0")} ${t[4].padStart(2,"0")}:${t[5]}`:e}function K(e){let t=H(e,"utf8"),n=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,s;for(;s=r.exec(t);)n.push({block:s[0].trim(),completed:s[2].trim()});return n}function we(e=".tasks",t=!0,n={}){let{dryRun:r=!1,warn:s=!0}=n,a=D(e,"active"),o=D(e,"archive"),i=[],f=S(a);if(f.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:i};let c=[],u=[];for(let l of f){let k=H(l,"utf8"),y=T(k);if(!_.includes(y.status))continue;let p=x(y.completed||"");if(!p){u.push(z(l,".md")),console.log(`\u8DF3\u8FC7 ${z(l,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:l,name:z(l,".md"),owner:y.owner||"\u672A\u6807\u6CE8",status:y.status||"\u672A\u6807\u6CE8",scope:y.scope||"-",completed:p,body:C(k).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:u,warnings:i};if(s)for(let l of c){let k=l.completed.replace(/-/g,"").slice(0,8),y=F(l.file);y&&k!==y&&i.push(`\u4EFB\u52A1\u300C${l.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${l.completed} \u4E0E\u521B\u5EFA\u65E5 ${y} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let d={};for(let l of c){let k=l.completed.replace(/-/g,"").slice(0,8);(d[k]||=[]).push(l)}let m=null,g=D(e,".archive.lock");if(!r)try{m=Se(g,"wx")}catch{let l="\u68C0\u6D4B\u5230\u5F52\u6863\u9501 .archive.lock\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5F52\u6863\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7";return console.warn(`\u26A0\uFE0F ${l}`),{archived:0,skipped:u,warnings:[...i,l]}}try{for(let[l,k]of Object.entries(d)){let y=D(o,l.slice(0,6)),p=D(y,`${l}.md`),v=$e(p)?K(p):[];if(s){let h=new Set(v.map(w=>w.block.match(/^## (.+)/)?.[1]??""));for(let w of k)h.has(w.name)&&i.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${w.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}v.push(...k.map(h=>({block:`## ${h.name}
|
|
3
3
|
|
|
4
|
-
> \u8D1F\u8D23\u4EBA\uFF1A${
|
|
4
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${h.owner}\u3000\u72B6\u6001\uFF1A${h.status}\u3000\u8303\u56F4\uFF1A${h.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${h.completed}
|
|
5
5
|
|
|
6
|
-
${h
|
|
6
|
+
${A(h.body,t)}`,completed:h.completed})));for(let h of v)h.completed=x(h.completed);if(v.sort((h,w)=>w.completed.localeCompare(h.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${k.length} \u4E2A\u4EFB\u52A1 \u2192 ${l}.md`);for(let h of k)console.log(`[\u9884\u6F14] - ${h.name}`);continue}be(y,{recursive:!0}),ye(p,`# ${l} \u5F52\u6863
|
|
7
7
|
|
|
8
8
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
9
9
|
|
|
10
|
-
${
|
|
10
|
+
${v.map(h=>h.block).join(`
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
`)}
|
|
15
|
-
`,"utf8");for(let
|
|
15
|
+
`,"utf8");for(let h of k)G(h.file);Ae(Y(k[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${k.length} \u4E2A\u4EFB\u52A1 \u2192 ${l}.md`)}for(let l of i)console.warn(`\u26A0\uFE0F ${l}`);return console.log(r?`[\u9884\u6F14] \u5171 ${c.length} \u4E2A\u4EFB\u52A1\u53EF\u5F52\u6863\uFF08\u672A\u843D\u76D8\uFF09`:`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:u,warnings:i}}finally{if(m!==null){Te(m);try{G(g)}catch{}}}}import{readFileSync as V}from"fs";import{join as Fe,basename as E}from"path";var X=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u5DF2\u5B8C\u6210","\u963B\u585E","\u5DF2\u653E\u5F03"],Re=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"],De=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,Le=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/;function q(e){let t=[],n=E(e),r=V(e,"utf8");if(!/^---\r?\n[\s\S]*?\r?\n---/.test(r))return t.push({level:"error",file:n,message:"\u7F3A\u5C11 frontmatter"}),t;let a=T(r);a.status?X.includes(a.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${a.status}\u300D\uFF0C\u5E94\u4E3A ${X.join(" / ")}`}):t.push({level:"error",file:n,message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),Re.includes(a.status)&&!a.completed&&t.push({level:"error",file:n,message:`status \u4E3A\u300C${a.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),a.completed&&!Le.test(a.completed.trim())&&t.push({level:"warn",file:n,message:`completed\u300C${a.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`});let i=C(r).match(De);return i&&t.push({level:"warn",file:n,message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${i[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),t}function Ee(e=".tasks"){let t=S(Fe(e,"active")),n=[];for(let o of t)n.push(...q(o));let r=new Map;for(let o of t){let i=E(o,".md"),f=r.get(i);f?f.push(o):r.set(i,[o])}for(let[o,i]of r)i.length>1&&n.push({level:"warn",file:o,message:`\u5B58\u5728 ${i.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});n.push(...ze(t));let s=n.filter(o=>o.level==="error").length,a=n.length-s;return{issues:n,errorCount:s,warnCount:a}}function Ie(e){if(Array.isArray(e))return e.filter(t=>typeof t=="string");if(typeof e=="string"){let t=e.trim().match(/^\[(.*)\]$/);if(t)return t[1].split(",").map(n=>n.trim().replace(/^['"]|['"]$/g,"")).filter(Boolean)}return[]}function ze(e){let t=[],n=new Set(e.map(c=>E(c,".md"))),r=new Map;for(let c of e){let u=E(c,".md"),d=V(c,"utf8"),m=T(d),g=Ie(m.depends_on);r.set(u,g);for(let l of g)n.has(l)||t.push({level:"warn",file:u,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${l}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}let s=0,a=1,o=2,i=new Map,f=(c,u)=>{i.set(c,a);for(let d of r.get(c)??[]){if(!n.has(d))continue;let m=i.get(d)??s;if(m===a)return[...u,d];if(m===s){let g=f(d,[...u,d]);if(g)return g}}return i.set(c,o),null};for(let c of r.keys())if((i.get(c)??s)===s){let u=f(c,[c]);if(u){t.push({level:"warn",file:c,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${u.join(" \u2192 ")}`});break}}return t}import{readFileSync as Q,writeFileSync as Ne,openSync as je,closeSync as _e,unlinkSync as Me}from"fs";import{join as N,basename as ee}from"path";function Oe(e){let t=e.match(/^\d{8}-(.+?)-/);return t?t[1]:""}function te(e){let t=e.search(/\n## /);if(t===-1)return{header:e,blocks:[]};let n=e.slice(0,t+1),r=e.slice(t+1),s=[];for(let a of r.split(/\n\n---\n\n/)){let o=a.trim();if(!o.startsWith("## "))continue;let i=o.split(`
|
|
16
|
+
`),f=i[0].replace(/^## /,""),c=null,u="",d=1;for(let m=1;m<i.length;m++){let g=i[m].trim();if(g.startsWith("> ")&&g.includes("\u5B8C\u6210\u65F6\u95F4")){c=i[m];let l=g.match(/完成时间:(.+)$/);l&&(u=l[1].trim()),d=m+1;break}}s.push({title:f,metaLine:c,completed:u,body:i.slice(d).join(`
|
|
17
|
+
`).trim()})}return{header:n,blocks:s}}function ne(e,t){return`> \u8D1F\u8D23\u4EBA\uFF1A${Oe(e)||"\u672A\u6807\u6CE8"}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A-\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${x(t)}`}var Be=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function re(e){return Be.every(t=>e.includes(t))}function We(e){let t=e.metaLine??(e.completed?ne(e.title,e.completed):null);return t?`## ${e.title}
|
|
18
|
+
|
|
19
|
+
${t}
|
|
20
|
+
|
|
21
|
+
${e.body}`:`## ${e.title}
|
|
22
|
+
|
|
23
|
+
${e.body}`}function Ze(e=".tasks"){let t=N(e,"archive"),n=S(t),r=[];for(let s of n){let a=ee(s),o=a.replace(/\.md$/,""),i=Q(s,"utf8"),{blocks:f}=te(i);for(let c=1;c<f.length;c++){let u=x(f[c-1].completed),d=x(f[c].completed);if(u&&d&&u<d){r.push({file:a,message:"\u4EFB\u52A1\u5757\u672A\u6309\u5B8C\u6210\u65F6\u95F4\u964D\u5E8F\u6392\u5217",fixable:!0});break}}for(let c of f){c.metaLine?re(c.metaLine)||r.push({file:a,message:`\u5757\u300C${c.title}\u300D\u5143\u6570\u636E\u884C\u4E0D\u5B8C\u6574\uFF08\u7F3A\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4\u4E4B\u4E00\uFF09`,fixable:!!c.completed}):r.push({file:a,message:`\u5757\u300C${c.title}\u300D\u7F3A\u5C11\u5143\u6570\u636E\u884C\uFF08\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4/\u5B8C\u6210\u65F6\u95F4\uFF09`,fixable:!!c.completed});let u=x(c.completed),d=u.replace(/-/g,"").slice(0,8);d&&o&&d!==o&&r.push({file:a,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${u} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${o} \u4E0D\u4E00\u81F4`,fixable:!1})}}return r}function Pe(e=".tasks"){let t=N(e,"archive"),n=S(t),r=[],s=0,a=null,o=N(e,".archive.lock");try{a=je(o,"wx")}catch{return console.warn("\u26A0\uFE0F \u68C0\u6D4B\u5230\u5F52\u6863\u9501\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5199\u64CD\u4F5C\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7\u4FEE\u590D"),{issues:r,fixed:s}}try{for(let i of n){let f=ee(i),c=f.replace(/\.md$/,""),u=Q(i,"utf8"),{header:d,blocks:m}=te(u),g=!1;for(let p of m){p.completed&&(!p.metaLine||!re(p.metaLine))&&(p.metaLine=ne(p.title,p.completed),g=!0,s++);let v=x(p.completed),h=v.replace(/-/g,"").slice(0,8);h&&c&&h!==c&&r.push({file:f,message:`\u5757\u300C${p.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${v} \u4E0E\u5F52\u6863\u65E5\u671F ${c} \u4E0D\u4E00\u81F4\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\u662F\u5426\u8FC1\u79FB\uFF09`,fixable:!1})}let l=m.filter(p=>p.completed),k=m.filter(p=>!p.completed),y=[...l].sort((p,v)=>x(v.completed).localeCompare(x(p.completed)));if(JSON.stringify(y.map(p=>p.title))!==JSON.stringify(l.map(p=>p.title))&&(m.splice(0,m.length,...y,...k),g=!0),g){let p=d+m.map(We).join(`
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
`)+`
|
|
28
|
+
`;Ne(i,p,"utf8")}}return{issues:r,fixed:s}}finally{if(a!==null){_e(a);try{Me(o)}catch{}}}}var Bt={zh:{replacements:{"### Major Changes":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### \u91CD\u5927\u53D8\u66F4":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### Minor Changes":"### \u2728 \u65B0\u589E\u529F\u80FD","### \u65B0\u589E\u529F\u80FD":"### \u2728 \u65B0\u589E\u529F\u80FD","### Patch Changes":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### \u8865\u4E01\u4FEE\u590D":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","### Dependent Changes":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","### \u4F9D\u8D56\u53D8\u66F4":"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4","- Updated dependencies":"- \u66F4\u65B0\u4F9D\u8D56"},deps:"- \u66F4\u65B0\u4F9D\u8D56",released:"\u53D1\u5E03"},en:{replacements:{"### Major Changes":"### \u{1F6A8} Major Changes","### Minor Changes":"### \u2728 Minor Changes","### Patch Changes":"### \u{1F41B} Patch Changes","### Dependent Changes":"### \u{1F517} Dependent Changes"},deps:"- Updated dependencies",released:"released"}},Wt="zh";import{readdirSync as Ue}from"fs";import{join as se}from"path";function j(e){let t=[],n=new Set(["node_modules",".git","dist"]),r=s=>{let a;try{a=Ue(s,{withFileTypes:!0})}catch{return}for(let o of a)if(o.isDirectory()){if(n.has(o.name))continue;r(se(s,o.name))}else o.name==="CHANGELOG.md"&&t.push(se(s,o.name))};return r(e),t}import{readFileSync as Ge,writeFileSync as Je}from"fs";function He(){let e=new Date,t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function oe(e,t,n,r=!0){let s=Ge(e,"utf8"),a=s.includes(`\r
|
|
16
29
|
`)?`\r
|
|
17
30
|
`:`
|
|
18
|
-
`,s
|
|
19
|
-
`),
|
|
20
|
-
${
|
|
21
|
-
${
|
|
22
|
-
`),
|
|
23
|
-
`),
|
|
31
|
+
`,o=s.replace(/\r\n/g,`
|
|
32
|
+
`),i=o;for(let[m,g]of Object.entries(n.replacements))i=i.replaceAll(m,g);for(;i.includes(`${n.deps}
|
|
33
|
+
${n.deps}`);)i=i.replace(`${n.deps}
|
|
34
|
+
${n.deps}`,n.deps);for(;;){let m=i.replace(/^- (.+)\n- \1$/gm,"- $1");if(m===i)break;i=m}let f=i.split(`
|
|
35
|
+
`),c=[];for(let m=0;m<f.length;m++)if(c.push(f[m]),/^## \d+\.\d+\.\d+/.test(f[m])){let g=m+1;for(;g<f.length&&f[g].trim()==="";)g++;f[g]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(f[g].trim())||c.push(`> ${t} ${n.released}`)}let u=c.join(`
|
|
36
|
+
`),d=A(u,r);return d!==o?(Je(e,d.replace(/\n/g,a),"utf8"),!0):!1}function Ye(e,t,n,r=!0){let s=[];for(let a of j(e))oe(a,t,n,r)&&s.push(a);if(s.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let a of s)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${a}`);return s}export{Wt as DEFAULT_LANG,_ as DONE_STATUSES,we as archiveTasks,Ze as checkArchive,j as collectChangelogs,F as dateFromFileName,Pe as fixArchive,oe as formatChangelog,Ye as formatChangelogs,I as getConfigSection,Bt as languages,S as listTaskFiles,U as listTasks,B as loadToolkitConfig,He as localDate,x as normalizeCompleted,K as parseArchiveTasks,W as parseBool,T as parseFrontmatter,ke as printTasks,A as redactText,Z as resolveEnabled,C as stripFrontmatter,q as validateTaskFile,Ee as validateTasks};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fxri/toolkit",
|
|
3
|
-
"version": "1.1
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.3.1",
|
|
4
|
+
"description": "专为多人 + AI 跨项目协作打造:任务管理 + 多语言 CHANGELOG。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "唐启云",
|
|
@@ -40,6 +40,12 @@
|
|
|
40
40
|
"NOTICE",
|
|
41
41
|
"package.json"
|
|
42
42
|
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"dev": "pnpm build:debug && node ./dist/cli.js",
|
|
45
|
+
"build": "cross-env NODE_ENV=production tsup",
|
|
46
|
+
"build:debug": "cross-env NODE_ENV=development tsup --config tsup.dev.config.ts",
|
|
47
|
+
"release": "pnpm build && pnpm publish"
|
|
48
|
+
},
|
|
43
49
|
"keywords": [
|
|
44
50
|
"toolkit",
|
|
45
51
|
"task",
|
|
@@ -49,7 +55,7 @@
|
|
|
49
55
|
],
|
|
50
56
|
"dependencies": {
|
|
51
57
|
"@changesets/cli": "^2.31.1",
|
|
52
|
-
"commander": "^
|
|
58
|
+
"commander": "^15.0.0"
|
|
53
59
|
},
|
|
54
60
|
"devDependencies": {
|
|
55
61
|
"@types/node": "^20.19.21",
|
|
@@ -57,17 +63,12 @@
|
|
|
57
63
|
"tsup": "^8.5.0",
|
|
58
64
|
"typescript": "^5.9.3"
|
|
59
65
|
},
|
|
66
|
+
"packageManager": "pnpm@10.34.4",
|
|
60
67
|
"engines": {
|
|
61
68
|
"node": ">=20"
|
|
62
69
|
},
|
|
63
70
|
"publishConfig": {
|
|
64
71
|
"registry": "https://registry.npmjs.org/",
|
|
65
72
|
"access": "public"
|
|
66
|
-
},
|
|
67
|
-
"scripts": {
|
|
68
|
-
"dev": "pnpm build:debug && node ./dist/cli.js",
|
|
69
|
-
"build": "cross-env NODE_ENV=production tsup",
|
|
70
|
-
"build:debug": "cross-env NODE_ENV=development tsup --config tsup.dev.config.ts",
|
|
71
|
-
"release": "pnpm build && pnpm publish"
|
|
72
73
|
}
|
|
73
|
-
}
|
|
74
|
+
}
|