@fxri/toolkit 1.1.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,40 @@
1
1
  # @fxri/toolkit
2
2
 
3
+ ## 1.3.0
4
+ > 2026-09-03 发布
5
+
6
+ ### ✨ 新增功能
7
+
8
+ - - 依赖升级:commander 14 → 15,`changelog` 自有选项(`--lang`/`--redact`/`--warn`)改为置于子命令之前
9
+ - changelog 全语言化:`.toolkitrc.json` 的 `changelog.languages` 支持自定义语言与覆盖内置 zh/en
10
+ - 文档:SPEC/README 语言描述改为「全语言支持」
11
+
12
+ ## 1.2.0
13
+
14
+ > 2026-09-03 发布
15
+
16
+ ### ✨ 新增功能
17
+
18
+ - 新增任务校验与归档归一化能力:
19
+
20
+ - 新增 `tasks check` 校验 active(frontmatter 合法性、跨文件重名、depends_on 依赖闭环、未闭合待办)
21
+ - 新增 `tasks normalize --check/--fix` 检查与修复归档块(元数据四字段、日期漂移、降序)
22
+ - `tasks archive` 新增 `--dry-run` 预演与排他锁防并发覆盖
23
+ - 软告警双向三档开关(`--warn/--no-warn`、`FX_CHECK_WARN`、`.toolkitrc.json`),默认开启
24
+ - 隐私脱敏开关升级为双向(`--redact/--no-redact`、`FX_REDACT=0/1`)
25
+ - changelog 协同软告警:归档时无变更集提示、发版时未归档提示
26
+ - 统一配置读取(.toolkitrc.json)与开关解析,供各能力域复用
27
+
28
+ ## 1.1.3
29
+
30
+ > 2026-09-03 发布
31
+
32
+ ### 🐛 补丁修复
33
+
34
+ - README 与 .tasks/SPEC 文档补充「归档与提交约束」:任务完成后先归档再提交,保证任务记录与代码变更同批入库。
35
+
3
36
  ## 1.1.2
37
+
4
38
  > 2026-09-03 发布
5
39
 
6
40
  ### 🐛 补丁修复
@@ -8,6 +42,7 @@
8
42
  - package.json 补充 repository 字段,npm 包详情页展示 GitHub 仓库地址。
9
43
 
10
44
  ## 1.1.1
45
+
11
46
  > 2026-09-03 发布
12
47
 
13
48
  ### 🐛 补丁修复
package/README.md CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  ## ✨ 特性
6
6
 
7
- - 📋 **任务管理** - 扫描、总览、按完成时间归档 Markdown 任务文件(语言无关,见 [SPEC.md](./SPEC.md))
8
- - 🌍 **多语言 CHANGELOG** - 封装 changesets,标题中文化/英文,语言通过 `--lang` 选择,可扩展
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 --dir <path> # 指定任务目录(默认 .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 # 创建变更集(等价 changeset)
37
- npx toolkit changelog version # 发版 + 格式化(默认中文)
38
- npx toolkit changelog version --lang en # 指定语言(当前 zh / en)
39
- npx toolkit changelog format # 仅格式化已有 CHANGELOG
40
- npx toolkit changelog status / publish # 其余 changeset 子命令透传
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
- --no-redact 关闭隐私脱敏(tasks / changelog 均可用)
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,14 +81,28 @@ npx toolkit changelog status / publish # 其余 changeset 子命令透传
68
81
 
69
82
  - **调用优先级**:`npx toolkit`(项目本地依赖)→ `toolkit`(全局安装);两者均不可用时直接以 Markdown 输出方案,不阻塞执行
70
83
  - **规范来源**:优先读取项目根 `SPEC.md`,缺失时读取包内 `SPEC.md`(目录结构、文件命名与 frontmatter 字段均以该规范为准)
71
- - **校验与归档**:写入方案文件后执行 `toolkit tasks` 校验总览;任务完成后执行 `toolkit tasks archive` 归档
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
 
89
+ ### 归档与提交约束
90
+
91
+ 项目内任务(含 AI 工作流)完成后,遵循**先归档、后提交**的顺序,保证任务记录与代码变更落在**同一个 git 提交**:
92
+
93
+ 1. 任务完成后,在任务文件 frontmatter 标记 `status: 已完成` 并填写 `completed` 完成时间
94
+ 2. 执行 `toolkit tasks archive` 归档,任务从 `active/` 移入 `archive/`
95
+ 3. 归档后再将代码变更与归档文件一起 `git commit`
96
+
97
+ 避免两种情形:任务完成但文件长期滞留 `active/` 未归档;或代码已提交、归档又单独形成一条提交记录。
98
+
74
99
  ## 📚 库 API
75
100
 
76
101
  ```typescript
77
102
  import {
78
103
  listTasks, printTasks, archiveTasks, parseFrontmatter,
104
+ validateTasks, checkArchive, fixArchive, normalizeCompleted,
105
+ resolveEnabled, parseBool, loadToolkitConfig,
79
106
  languages, DEFAULT_LANG, localDate, formatChangelogs, redactText,
80
107
  } from "@fxri/toolkit"
81
108
 
@@ -83,6 +110,9 @@ import {
83
110
  const tasks = listTasks(".tasks")
84
111
  printTasks(".tasks")
85
112
  const result = archiveTasks(".tasks")
113
+ const check = validateTasks(".tasks") // 校验 active
114
+ const issues = checkArchive(".tasks") // 检查归档
115
+ const fixed = fixArchive(".tasks") // 归一化修复
86
116
 
87
117
  // CHANGELOG 格式化(默认中文)
88
118
  formatChangelogs(".", localDate(), languages[DEFAULT_LANG])
@@ -94,27 +124,37 @@ const masked = redactText("联系 tqy@fxri.net", true) // → "联系 t***@***.n
94
124
 
95
125
  `printTasks` / `archiveTasks` / `formatChangelog` / `formatChangelogs` 均提供可选 `redact` 参数(默认 `true`),传 `false` 可关闭本次脱敏。
96
126
 
97
- ### 语言扩展
127
+ ### 全语言支持
98
128
 
99
- 新增语言只需在 `languages` 里追加一个映射项:
129
+ 内置 `zh` / `en`,其余任意语言通过 `.toolkitrc.json` 的 `changelog.languages` 配置扩展,配置的同名 key 覆盖内置:
100
130
 
101
- ```typescript
102
- export const languages = {
103
- zh: { replacements: { "### Major Changes": "### 🚨 重大变更", ... }, deps: "- 更新依赖", released: "发布" },
104
- en: { replacements: {}, deps: "- Updated dependencies", released: "released" },
105
- // 未来:ja / ko / ...
131
+ ```json
132
+ {
133
+ "changelog": {
134
+ "languages": {
135
+ "ja": {
136
+ "replacements": { "### Major Changes": "### 🚨 重大変更" },
137
+ "deps": "- 依存関係を更新",
138
+ "released": "リリース"
139
+ }
140
+ }
141
+ }
106
142
  }
107
143
  ```
108
144
 
145
+ 使用 `--lang ja` 指定(选项前置):`toolkit changelog --lang ja format`。
146
+
147
+ 每个语言的 `ChangelogLanguage` 结构:`replacements`(标题替换映射,源标题 → 目标标题)、`deps`(依赖更新条目文案)、`released`(发布日期后缀)。库 API 侧也可直接操作 `languages` 对象追加语言。
148
+
109
149
  ## 🔒 隐私脱敏
110
150
 
111
151
  落盘记录自由文本(任务正文/标题、CHANGELOG 条目)时默认脱敏敏感信息,`owner` 等结构化 frontmatter 字段不脱敏。
112
152
 
113
153
  - **内置规则**:邮箱、手机号、身份证、IPv4、AWS/GitHub/OpenAI/Slack 密钥、JWT、含端口内网 URL
114
- - **关闭开关**(默认开启,优先级从高到低):
115
- - CLI 参数 `--no-redact`
116
- - 环境变量 `FX_REDACT=0`
117
- - 配置文件 `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`
118
158
  - **自定义规则**:项目根 `.toolkitrc.json`,追加规则(优先于内置)或按 `name` 禁用内置规则:
119
159
 
120
160
  ```json
package/SPEC.md CHANGED
@@ -1,6 +1,15 @@
1
1
  # 任务文件规范(SPEC)
2
2
 
3
- > 本规范**语言无关**,定义任务文件的目录结构、文件格式与归档规则。任何语言(Node / PHP / Java / Go 等)均可按本规范实现读写;@fxri/toolkit 的 `tasks` 域仅为参考实现。
3
+ > 本规范**全语言支持**,定义任务文件的目录结构、文件格式与归档规则。任何编程语言均可按本规范实现读写;@fxri/toolkit 的 `tasks` 域仅为参考实现。
4
+
5
+ ## 0. 协作模型
6
+
7
+ 任务区是**多写者共享**的:同一 `.tasks/` 可能被多个 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,18 +85,20 @@ 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
  ```
83
92
 
84
93
  ## 4. 归档规则
85
94
 
86
- 1. 归档触发是**人工 / 事件驱动**,非定时任务。
95
+ 1. 归档触发是**人工 / 事件驱动**,非定时任务;常见触发时机为任务完成、相关变更提交版本控制之前,此时应先行归档再提交。
87
96
  2. **任务级归档**:`status ∈ {已完成, 已放弃}` 且带 `completed` 的任务可归档。
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 Y=()=>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,f=Y();var H=require("commander"),q=require("module"),X=require("child_process");var Z=require("fs"),S=require("path");function v(e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let t={};for(let r of n[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let c=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))&&(s=s.slice(1,-1)),c&&(t[c]=s)}return t}function x(e){let n=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?e.slice(n[0].length):e}var k=require("fs"),$=require("path");function T(e){if(!(0,k.existsSync)(e))return[];let n=[];for(let t of(0,k.readdirSync)(e)){let r=(0,$.join)(e,t);if((0,k.statSync)(r).isDirectory())for(let o of(0,k.readdirSync)(r))o.endsWith(".md")&&n.push((0,$.join)(r,o));else t.endsWith(".md")&&n.push(r)}return n}function U(e){let t=(0,$.basename)(e,(0,$.extname)(e)).match(/^(\d{8})/);return t?t[1]:""}var N=require("fs"),O=require("path"),Q=[{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.***.***"}],y,C=null;function W(){if(y!==void 0)return y;y=null;try{let e=(0,N.readFileSync)((0,O.join)(process.cwd(),".toolkitrc.json"),"utf8");y=JSON.parse(e).redact??null}catch{}return y}function V(){if(C)return C;let e=W(),n=new Set(e?.disable??[]),t=[];for(let r of e?.rules??[])try{t.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return C=[...t,...Q.filter(r=>!n.has(r.name))],C}function b(e,n){if(!n||!e)return e;let t=e;for(let r of V())t=t.replace(r.pattern,r.replacement);return t}function F(e){return!(!e||process.env.FX_REDACT==="0"||W()?.enabled===!1)}function ee(e=".tasks"){let n=(0,S.join)(e,"active");return T(n).map(t=>{let r=(0,Z.readFileSync)(t,"utf8"),o=v(r),c=r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||(0,S.basename)(t,".md");return{file:t,name:(0,S.basename)(t,".md"),date:U(t),title:c,frontmatter:o,body:x(r).trim()}})}function G(e=".tasks",n=!0){let t=ee(e);if(t.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 s of t){let l=r.includes(s.frontmatter.status)?s.frontmatter.status:"\u672A\u6807\u6CE8";(o[l]||=[]).push(s)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
3
- `);let c=0;for(let s of r){let l=o[s]||[];if(l.length!==0){c+=l.length,console.log(`\u3010${s}\u3011${l.length} \u9879`);for(let a of l)console.log(` ${a.date} ${(a.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${b(a.title,n)}`);console.log("")}}console.log(`\u5171 ${c} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}var d=require("fs"),m=require("path");var M=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function te(e,n){let t=(0,m.resolve)(e),r=(0,m.resolve)(n);for(;t!==r&&t.startsWith(r+m.sep);){try{if((0,d.readdirSync)(t).length>0)break;(0,d.rmdirSync)(t)}catch{break}t=(0,m.dirname)(t)}}function I(e){let n=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return n?`${n[1]}-${n[2].padStart(2,"0")}-${n[3].padStart(2,"0")} ${n[4].padStart(2,"0")}:${n[5]}`:e}function ne(e){let n=(0,d.readFileSync)(e,"utf8"),t=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(n);)t.push({block:o[0].trim(),completed:o[2].trim()});return t}function P(e=".tasks",n=!0){let t=(0,m.join)(e,"active"),r=(0,m.join)(e,"archive"),o=T(t);if(o.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let c=[],s=[];for(let a of o){let g=(0,d.readFileSync)(a,"utf8"),u=v(g);if(!M.includes(u.status))continue;let h=I(u.completed||"");if(!h){s.push((0,m.basename)(a,".md")),console.log(`\u8DF3\u8FC7 ${(0,m.basename)(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:a,name:(0,m.basename)(a,".md"),owner:u.owner||"\u672A\u6807\u6CE8",status:u.status||"\u672A\u6807\u6CE8",scope:u.scope||"-",completed:h,body:x(g).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:s};let l={};for(let a of c){let g=a.completed.replace(/-/g,"").slice(0,8);(l[g]||=[]).push(a)}for(let[a,g]of Object.entries(l)){let u=(0,m.join)(r,a.slice(0,6));(0,d.mkdirSync)(u,{recursive:!0});let h=(0,m.join)(u,`${a}.md`),p=(0,d.existsSync)(h)?ne(h):[];p.push(...g.map(i=>({block:`## ${i.name}
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,$=$e();var pe=require("commander"),ge=require("module"),he=require("child_process"),B=require("fs"),ke=require("path");var te=require("fs"),_=require("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 F(e){let t=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return t?e.slice(t[0].length):e}var S=require("fs"),A=require("path");function v(e){if(!(0,S.existsSync)(e))return[];let t=[];for(let n of(0,S.readdirSync)(e)){let r=(0,A.join)(e,n);if((0,S.statSync)(r).isDirectory())for(let o of(0,S.readdirSync)(r))o.endsWith(".md")&&t.push((0,A.join)(r,o));else n.endsWith(".md")&&t.push(r)}return t}function O(e){let n=(0,A.basename)(e,(0,A.extname)(e)).match(/^(\d{8})/);return n?n[1]:""}var V=require("fs"),Q=require("path"),N;function ve(){if(N!==void 0)return N;N=null;try{let e=(0,V.readFileSync)((0,Q.join)(process.cwd(),".toolkitrc.json"),"utf8");N=JSON.parse(e)}catch{}return N}function j(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 I(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=j("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 Ce(){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 L(e,t){if(!t||!e)return e;let n=e;for(let r of Ce())n=n.replace(r.pattern,r.replacement);return n}function P(e){return I(e,"FX_REDACT",ee()?.enabled,!0)}function Se(e=".tasks"){let t=(0,_.join)(e,"active");return v(t).map(n=>{let r=(0,te.readFileSync)(n,"utf8"),o=C(r),s=r.split(/\r?\n/).find(i=>i.startsWith("# ")&&!i.startsWith("#!"))?.replace(/^#\s*/,"")||(0,_.basename)(n,".md");return{file:n,name:(0,_.basename)(n,".md"),date:O(n),title:s,frontmatter:o,body:F(r).trim()}})}function ne(e=".tasks",t=!0){let n=Se(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 u of a)console.log(` ${u.date} ${(u.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${L(u.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 w(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=[],u=v(s);if(u.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:a};let c=[],m=[];for(let f of u){let l=(0,k.readFileSync)(f,"utf8"),y=C(l);if(!re.includes(y.status))continue;let x=w(y.completed||"");if(!x){m.push((0,b.basename)(f,".md")),console.log(`\u8DF3\u8FC7 ${(0,b.basename)(f,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:f,name:(0,b.basename)(f,".md"),owner:y.owner||"\u672A\u6807\u6CE8",status:y.status||"\u672A\u6807\u6CE8",scope:y.scope||"-",completed:x,body:F(l).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:m,warnings:a};if(o)for(let f of c){let l=f.completed.replace(/-/g,"").slice(0,8),y=O(f.file);y&&l!==y&&a.push(`\u4EFB\u52A1\u300C${f.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${f.completed} \u4E0E\u521B\u5EFA\u65E5 ${y} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let p={};for(let f of c){let l=f.completed.replace(/-/g,"").slice(0,8);(p[l]||=[]).push(f)}let d=null,g=(0,b.join)(e,".archive.lock");if(!r)try{d=(0,k.openSync)(g,"wx")}catch{let f="\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 ${f}`),{archived:0,skipped:m,warnings:[...a,f]}}try{for(let[f,l]of Object.entries(p)){let y=(0,b.join)(i,f.slice(0,6)),x=(0,b.join)(y,`${f}.md`),E=(0,k.existsSync)(x)?Te(x):[];if(o){let h=new Set(E.map(R=>R.block.match(/^## (.+)/)?.[1]??""));for(let R of l)h.has(R.name)&&a.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${R.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}E.push(...l.map(h=>({block:`## ${h.name}
4
4
 
5
- > \u8D1F\u8D23\u4EBA\uFF1A${i.owner}\u3000\u72B6\u6001\uFF1A${i.status}\u3000\u8303\u56F4\uFF1A${i.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${i.completed}
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
- ${b(i.body,n)}`,completed:i.completed})));for(let i of p)i.completed=I(i.completed);p.sort((i,z)=>z.completed.localeCompare(i.completed)),(0,d.writeFileSync)(h,`# ${a} \u5F52\u6863
7
+ ${L(h.body,t)}`,completed:h.completed})));for(let h of E)h.completed=w(h.completed);if(E.sort((h,R)=>R.completed.localeCompare(h.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${l.length} \u4E2A\u4EFB\u52A1 \u2192 ${f}.md`);for(let h of l)console.log(`[\u9884\u6F14] - ${h.name}`);continue}(0,k.mkdirSync)(y,{recursive:!0}),(0,k.writeFileSync)(x,`# ${f} \u5F52\u6863
8
8
 
9
9
  > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
10
10
 
11
- ${p.map(i=>i.block).join(`
11
+ ${E.map(h=>h.block).join(`
12
12
 
13
13
  ---
14
14
 
15
15
  `)}
16
- `,"utf8");for(let i of g)(0,d.unlinkSync)(i.file);te((0,m.dirname)(g[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${g.length} \u4E2A\u4EFB\u52A1 \u2192 ${a}.md`)}return console.log(`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:s}}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"}},D="zh";var A=require("fs");var B=require("fs"),L=require("path");function J(e){let n=[],t=new Set(["node_modules",".git","dist"]),r=o=>{let c;try{c=(0,B.readdirSync)(o,{withFileTypes:!0})}catch{return}for(let s of c)if(s.isDirectory()){if(t.has(s.name))continue;r((0,L.join)(o,s.name))}else s.name==="CHANGELOG.md"&&n.push((0,L.join)(o,s.name))};return r(e),n}function j(){let e=new Date,n=t=>String(t).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}function re(e,n,t,r=!0){let o=(0,A.readFileSync)(e,"utf8"),c=o.includes(`\r
16
+ `,"utf8");for(let h of l)(0,k.unlinkSync)(h.file);Ae((0,b.dirname)(l[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${l.length} \u4E2A\u4EFB\u52A1 \u2192 ${f}.md`)}for(let f of a)console.warn(`\u26A0\uFE0F ${f}`);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:m,warnings:a}}finally{if(d!==null){(0,k.closeSync)(d);try{(0,k.unlinkSync)(g)}catch{}}}}var Z=require("fs"),T=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,T.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=C(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=F(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=v((0,T.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,T.basename)(i,".md"),u=r.get(a);u?u.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,T.basename)(c,".md"))),r=new Map;for(let c of e){let m=(0,T.basename)(c,".md"),p=(0,Z.readFileSync)(c,"utf8"),d=C(p),g=Ee(d.depends_on);r.set(m,g);for(let f of g)n.has(f)||t.push({level:"warn",file:m,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${f}\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,u=(c,m)=>{a.set(c,s);for(let p of r.get(c)??[]){if(!n.has(p))continue;let d=a.get(p)??o;if(d===s)return[...m,p];if(d===o){let g=u(p,[...m,p]);if(g)return g}}return a.set(c,i),null};for(let c of r.keys())if((a.get(c)??o)===o){let m=u(c,[c]);if(m){t.push({level:"warn",file:c,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${m.join(" \u2192 ")}`});break}}return t}var z=require("fs"),D=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
+ `),u=a[0].replace(/^## /,""),c=null,m="",p=1;for(let d=1;d<a.length;d++){let g=a[d].trim();if(g.startsWith("> ")&&g.includes("\u5B8C\u6210\u65F6\u95F4")){c=a[d];let f=g.match(/完成时间:(.+)$/);f&&(m=f[1].trim()),p=d+1;break}}o.push({title:u,metaLine:c,completed:m,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${w(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,D.join)(e,"archive"),n=v(t),r=[];for(let o of n){let s=(0,D.basename)(o),i=s.replace(/\.md$/,""),a=(0,z.readFileSync)(o,"utf8"),{blocks:u}=ae(a);for(let c=1;c<u.length;c++){let m=w(u[c-1].completed),p=w(u[c].completed);if(m&&p&&m<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 u){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 m=w(c.completed),p=m.replace(/-/g,"").slice(0,8);p&&i&&p!==i&&r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${m} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${i} \u4E0D\u4E00\u81F4`,fixable:!1})}}return r}function me(e=".tasks"){let t=(0,D.join)(e,"archive"),n=v(t),r=[],o=0;for(let s of n){let i=(0,D.basename)(s),a=i.replace(/\.md$/,""),u=(0,z.readFileSync)(s,"utf8"),{header:c,blocks:m}=ae(u),p=!1;for(let l of m){l.completed&&(!l.metaLine||!le(l.metaLine))&&(l.metaLine=ce(l.title,l.completed),p=!0,o++);let y=w(l.completed),x=y.replace(/-/g,"").slice(0,8);x&&a&&x!==a&&r.push({file:i,message:`\u5757\u300C${l.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${y} \u4E0E\u5F52\u6863\u65E5\u671F ${a} \u4E0D\u4E00\u81F4\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\u662F\u5426\u8FC1\u79FB\uFF09`,fixable:!1})}let d=m.filter(l=>l.completed),g=m.filter(l=>!l.completed),f=[...d].sort((l,y)=>w(y.completed).localeCompare(w(l.completed)));if(JSON.stringify(f.map(l=>l.title))!==JSON.stringify(d.map(l=>l.title))&&(m.splice(0,m.length,...f,...g),p=!0),p){let l=c+m.map(_e).join(`
25
+
26
+ ---
27
+
28
+ `)+`
29
+ `;(0,z.writeFileSync)(s,l,"utf8")}}return{issues:r,fixed:o}}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
- `,s=o.replace(/\r\n/g,`
20
- `),l=s;for(let[p,i]of Object.entries(t.replacements))l=l.replaceAll(p,i);for(;l.includes(`${t.deps}
21
- ${t.deps}`);)l=l.replace(`${t.deps}
22
- ${t.deps}`,t.deps);for(;;){let p=l.replace(/^- (.+)\n- \1$/gm,"- $1");if(p===l)break;l=p}let a=l.split(`
23
- `),g=[];for(let p=0;p<a.length;p++)if(g.push(a[p]),/^## \d+\.\d+\.\d+/.test(a[p])){let i=p+1;for(;i<a.length&&a[i].trim()==="";)i++;a[i]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(a[i].trim())||g.push(`> ${n} ${t.released}`)}let u=g.join(`
24
- `),h=b(u,r);return h!==s?((0,A.writeFileSync)(e,h.replace(/\n/g,c),"utf8"),!0):!1}function E(e,n,t,r=!0){let o=[];for(let c of J(e))re(c,n,t,r)&&o.push(c);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let c of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${c}`);return o}var K=(0,q.createRequire)(f),oe=K.resolve("@changesets/cli/bin.js"),{version:se}=K("../package.json"),_=e=>{let n=(0,X.spawnSync)(process.execPath,[oe,...e],{stdio:"inherit"});n.status!==0&&process.exit(n.status??1)},R=new H.Command;R.name("toolkit").description("\u5F00\u53D1\u5DE5\u7A0B\u5316\u5DE5\u5177\u96C6\uFF1A\u4EFB\u52A1\u7BA1\u7406 + \u591A\u8BED\u8A00 CHANGELOG \u53D1\u5E03").version(se,"-v, --version","\u663E\u793A\u7248\u672C\u53F7").enablePositionalOptions(!0);R.command("tasks").description("\u4EFB\u52A1\u7BA1\u7406").option("--dir <path>","\u4EFB\u52A1\u76EE\u5F55",".tasks").option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").argument("[command]","\u5B50\u547D\u4EE4\uFF1Aarchive \u5F52\u6863\uFF0C\u7559\u7A7A\u4E3A\u603B\u89C8").action((e,n)=>{let t=F(n.redact);e==="archive"?P(n.dir,t):G(n.dir,t)});R.command("changelog").description("\u591A\u8BED\u8A00 CHANGELOG\uFF08\u5C01\u88C5 changesets\uFF09").option("--lang <lang>","\u8BED\u8A00 zh/en",D).option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").argument("[command...]","\u5B50\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u900F\u4F20\u7ED9 changesets\uFF09").passThroughOptions(!0).action((e,n)=>{let t=F(n.redact),r=w[n.lang]??w[D],o=e[0];o==="version"?(_(["version"]),E(".",j(),r,t)):o==="format"?E(".",j(),r,t):_(o?e:[])});R.parse();
32
+ `,i=o.replace(/\r\n/g,`
33
+ `),a=i;for(let[d,g]of Object.entries(n.replacements))a=a.replaceAll(d,g);for(;a.includes(`${n.deps}
34
+ ${n.deps}`);)a=a.replace(`${n.deps}
35
+ ${n.deps}`,n.deps);for(;;){let d=a.replace(/^- (.+)\n- \1$/gm,"- $1");if(d===a)break;a=d}let u=a.split(`
36
+ `),c=[];for(let d=0;d<u.length;d++)if(c.push(u[d]),/^## \d+\.\d+\.\d+/.test(u[d])){let g=d+1;for(;g<u.length&&u[g].trim()==="";)g++;u[g]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(u[g].trim())||c.push(`> ${t} ${n.released}`)}let m=c.join(`
37
+ `),p=L(m,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)($),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=j("check");return typeof e?.warnings=="boolean"?e.warnings:void 0}function Ue(){let t=j("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 Ge(e=".tasks"){return v((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 G=new pe.Command;G.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);G.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=P(t.redact),r=I(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)});G.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=P(t.redact),r=I(t.warn,"FX_CHECK_WARN",ye(),!0),o=Ue(),s=o[t.lang]??o[J],i=e[0];i==="version"?(r&&Ge()&&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();G.parse();
package/dist/cli.js CHANGED
@@ -1,24 +1,37 @@
1
1
  #!/usr/bin/env node
2
- import{Command as ke}from"commander";import{createRequire as $e}from"module";import{spawnSync as be}from"child_process";import{readFileSync as te}from"fs";import{join as ne,basename as O}from"path";function $(e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let t={};for(let r of n[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let c=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))&&(s=s.slice(1,-1)),c&&(t[c]=s)}return t}function b(e){let n=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?e.slice(n[0].length):e}import{existsSync as H,readdirSync as E,statSync as q}from"fs";import{join as L,basename as X,extname as K}from"path";function y(e){if(!H(e))return[];let n=[];for(let t of E(e)){let r=L(e,t);if(q(r).isDirectory())for(let o of E(r))o.endsWith(".md")&&n.push(L(r,o));else t.endsWith(".md")&&n.push(r)}return n}function z(e){let t=X(e,K(e)).match(/^(\d{8})/);return t?t[1]:""}import{readFileSync as Y}from"fs";import{join as Q}from"path";var V=[{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.***.***"}],k,v=null;function _(){if(k!==void 0)return k;k=null;try{let e=Y(Q(process.cwd(),".toolkitrc.json"),"utf8");k=JSON.parse(e).redact??null}catch{}return k}function ee(){if(v)return v;let e=_(),n=new Set(e?.disable??[]),t=[];for(let r of e?.rules??[])try{t.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return v=[...t,...V.filter(r=>!n.has(r.name))],v}function h(e,n){if(!n||!e)return e;let t=e;for(let r of ee())t=t.replace(r.pattern,r.replacement);return t}function A(e){return!(!e||process.env.FX_REDACT==="0"||_()?.enabled===!1)}function re(e=".tasks"){let n=ne(e,"active");return y(n).map(t=>{let r=te(t,"utf8"),o=$(r),c=r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||O(t,".md");return{file:t,name:O(t,".md"),date:z(t),title:c,frontmatter:o,body:b(r).trim()}})}function N(e=".tasks",n=!0){let t=re(e);if(t.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 s of t){let l=r.includes(s.frontmatter.status)?s.frontmatter.status:"\u672A\u6807\u6CE8";(o[l]||=[]).push(s)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
3
- `);let c=0;for(let s of r){let l=o[s]||[];if(l.length!==0){c+=l.length,console.log(`\u3010${s}\u3011${l.length} \u9879`);for(let a of l)console.log(` ${a.date} ${(a.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${h(a.title,n)}`);console.log("")}}console.log(`\u5171 ${c} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as M,writeFileSync as oe,mkdirSync as se,unlinkSync as ae,existsSync as ie,readdirSync as ce,rmdirSync as le}from"fs";import{join as x,basename as S,dirname as U,resolve as Z,sep as me}from"path";var W=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function pe(e,n){let t=Z(e),r=Z(n);for(;t!==r&&t.startsWith(r+me);){try{if(ce(t).length>0)break;le(t)}catch{break}t=U(t)}}function G(e){let n=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return n?`${n[1]}-${n[2].padStart(2,"0")}-${n[3].padStart(2,"0")} ${n[4].padStart(2,"0")}:${n[5]}`:e}function de(e){let n=M(e,"utf8"),t=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(n);)t.push({block:o[0].trim(),completed:o[2].trim()});return t}function P(e=".tasks",n=!0){let t=x(e,"active"),r=x(e,"archive"),o=y(t);if(o.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let c=[],s=[];for(let a of o){let p=M(a,"utf8"),d=$(p);if(!W.includes(d.status))continue;let g=G(d.completed||"");if(!g){s.push(S(a,".md")),console.log(`\u8DF3\u8FC7 ${S(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:a,name:S(a,".md"),owner:d.owner||"\u672A\u6807\u6CE8",status:d.status||"\u672A\u6807\u6CE8",scope:d.scope||"-",completed:g,body:b(p).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:s};let l={};for(let a of c){let p=a.completed.replace(/-/g,"").slice(0,8);(l[p]||=[]).push(a)}for(let[a,p]of Object.entries(l)){let d=x(r,a.slice(0,6));se(d,{recursive:!0});let g=x(d,`${a}.md`),m=ie(g)?de(g):[];m.push(...p.map(i=>({block:`## ${i.name}
2
+ import{Command as et}from"commander";import{createRequire as tt}from"module";import{spawnSync as nt}from"child_process";import{existsSync as rt,readdirSync as ot}from"fs";import{join as st}from"path";import{readFileSync as Ae}from"fs";import{join as Te,basename as J}from"path";function x(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 S(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 U,statSync as ke}from"fs";import{join as Z,basename as be,extname as ye}from"path";function $(e){if(!he(e))return[];let t=[];for(let n of U(e)){let r=Z(e,n);if(ke(r).isDirectory())for(let o of U(r))o.endsWith(".md")&&t.push(Z(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 H(){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=H(),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 A(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",H()?.enabled,!0)}function Re(e=".tasks"){let t=Te(e,"active");return $(t).map(n=>{let r=Ae(n,"utf8"),o=x(r),s=r.split(/\r?\n/).find(i=>i.startsWith("# ")&&!i.startsWith("#!"))?.replace(/^#\s*/,"")||J(n,".md");return{file:n,name:J(n,".md"),date:E(n),title:s,frontmatter:o,body:S(r).trim()}})}function Y(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 u of a)console.log(` ${u.date} ${(u.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${A(u.title,t)}`);console.log("")}}console.log(`\u5171 ${s} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as V,writeFileSync as Fe,mkdirSync as De,unlinkSync as X,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 Q,resolve as q,sep as _e}from"path";var K=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function Ie(e,t){let n=q(e),r=q(t);for(;n!==r&&n.startsWith(r+_e);){try{if(Ee(n).length>0)break;Ne(n)}catch{break}n=Q(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 Oe(e){let t=V(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 ee(e=".tasks",t=!0,n={}){let{dryRun:r=!1,warn:o=!0}=n,s=L(e,"active"),i=L(e,"archive"),a=[],u=$(s);if(u.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:a};let c=[],m=[];for(let f of u){let l=V(f,"utf8"),k=x(l);if(!K.includes(k.status))continue;let w=v(k.completed||"");if(!w){m.push(O(f,".md")),console.log(`\u8DF3\u8FC7 ${O(f,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:f,name:O(f,".md"),owner:k.owner||"\u672A\u6807\u6CE8",status:k.status||"\u672A\u6807\u6CE8",scope:k.scope||"-",completed:w,body:S(l).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:m,warnings:a};if(o)for(let f of c){let l=f.completed.replace(/-/g,"").slice(0,8),k=E(f.file);k&&l!==k&&a.push(`\u4EFB\u52A1\u300C${f.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${f.completed} \u4E0E\u521B\u5EFA\u65E5 ${k} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let p={};for(let f of c){let l=f.completed.replace(/-/g,"").slice(0,8);(p[l]||=[]).push(f)}let d=null,g=L(e,".archive.lock");if(!r)try{d=je(g,"wx")}catch{let f="\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 ${f}`),{archived:0,skipped:m,warnings:[...a,f]}}try{for(let[f,l]of Object.entries(p)){let k=L(i,f.slice(0,6)),w=L(k,`${f}.md`),T=Le(w)?Oe(w):[];if(o){let h=new Set(T.map(C=>C.block.match(/^## (.+)/)?.[1]??""));for(let C of l)h.has(C.name)&&a.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${C.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}T.push(...l.map(h=>({block:`## ${h.name}
4
4
 
5
- > \u8D1F\u8D23\u4EBA\uFF1A${i.owner}\u3000\u72B6\u6001\uFF1A${i.status}\u3000\u8303\u56F4\uFF1A${i.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${i.completed}
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(i.body,n)}`,completed:i.completed})));for(let i of m)i.completed=G(i.completed);m.sort((i,j)=>j.completed.localeCompare(i.completed)),oe(g,`# ${a} \u5F52\u6863
7
+ ${A(h.body,t)}`,completed:h.completed})));for(let h of T)h.completed=v(h.completed);if(T.sort((h,C)=>C.completed.localeCompare(h.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${l.length} \u4E2A\u4EFB\u52A1 \u2192 ${f}.md`);for(let h of l)console.log(`[\u9884\u6F14] - ${h.name}`);continue}De(k,{recursive:!0}),Fe(w,`# ${f} \u5F52\u6863
8
8
 
9
9
  > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
10
10
 
11
- ${m.map(i=>i.block).join(`
11
+ ${T.map(h=>h.block).join(`
12
12
 
13
13
  ---
14
14
 
15
15
  `)}
16
- `,"utf8");for(let i of p)ae(i.file);pe(U(p[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${p.length} \u4E2A\u4EFB\u52A1 \u2192 ${a}.md`)}return console.log(`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:s}}var C={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"}},R="zh";import{readFileSync as fe,writeFileSync as ue}from"fs";import{readdirSync as ge}from"fs";import{join as B}from"path";function I(e){let n=[],t=new Set(["node_modules",".git","dist"]),r=o=>{let c;try{c=ge(o,{withFileTypes:!0})}catch{return}for(let s of c)if(s.isDirectory()){if(t.has(s.name))continue;r(B(o,s.name))}else s.name==="CHANGELOG.md"&&n.push(B(o,s.name))};return r(e),n}function F(){let e=new Date,n=t=>String(t).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}function he(e,n,t,r=!0){let o=fe(e,"utf8"),c=o.includes(`\r
16
+ `,"utf8");for(let h of l)X(h.file);Ie(Q(l[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${l.length} \u4E2A\u4EFB\u52A1 \u2192 ${f}.md`)}for(let f of a)console.warn(`\u26A0\uFE0F ${f}`);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:m,warnings:a}}finally{if(d!==null){ze(d);try{X(g)}catch{}}}}import{readFileSync as ne}from"fs";import{join as Me,basename as j}from"path";var te=["\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=ne(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=x(r);s.status?te.includes(s.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${s.status}\u300D\uFF0C\u5E94\u4E3A ${te.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=S(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 re(e=".tasks"){let t=$(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"),u=r.get(a);u?u.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 m=j(c,".md"),p=ne(c,"utf8"),d=x(p),g=Ue(d.depends_on);r.set(m,g);for(let f of g)n.has(f)||t.push({level:"warn",file:m,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${f}\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,u=(c,m)=>{a.set(c,s);for(let p of r.get(c)??[]){if(!n.has(p))continue;let d=a.get(p)??o;if(d===s)return[...m,p];if(d===o){let g=u(p,[...m,p]);if(g)return g}}return a.set(c,i),null};for(let c of r.keys())if((a.get(c)??o)===o){let m=u(c,[c]);if(m){t.push({level:"warn",file:c,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${m.join(" \u2192 ")}`});break}}return t}import{readFileSync as oe,writeFileSync as He}from"fs";import{join as se,basename as ie}from"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
+ `),u=a[0].replace(/^## /,""),c=null,m="",p=1;for(let d=1;d<a.length;d++){let g=a[d].trim();if(g.startsWith("> ")&&g.includes("\u5B8C\u6210\u65F6\u95F4")){c=a[d];let f=g.match(/完成时间:(.+)$/);f&&(m=f[1].trim()),p=d+1;break}}o.push({title:u,metaLine:c,completed:m,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${v(t)}`}var Ye=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function le(e){return Ye.every(t=>e.includes(t))}function Ke(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=se(e,"archive"),n=$(t),r=[];for(let o of n){let s=ie(o),i=s.replace(/\.md$/,""),a=oe(o,"utf8"),{blocks:u}=ae(a);for(let c=1;c<u.length;c++){let m=v(u[c-1].completed),p=v(u[c].completed);if(m&&p&&m<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 u){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 m=v(c.completed),p=m.replace(/-/g,"").slice(0,8);p&&i&&p!==i&&r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${m} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${i} \u4E0D\u4E00\u81F4`,fixable:!1})}}return r}function me(e=".tasks"){let t=se(e,"archive"),n=$(t),r=[],o=0;for(let s of n){let i=ie(s),a=i.replace(/\.md$/,""),u=oe(s,"utf8"),{header:c,blocks:m}=ae(u),p=!1;for(let l of m){l.completed&&(!l.metaLine||!le(l.metaLine))&&(l.metaLine=ce(l.title,l.completed),p=!0,o++);let k=v(l.completed),w=k.replace(/-/g,"").slice(0,8);w&&a&&w!==a&&r.push({file:i,message:`\u5757\u300C${l.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${k} \u4E0E\u5F52\u6863\u65E5\u671F ${a} \u4E0D\u4E00\u81F4\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\u662F\u5426\u8FC1\u79FB\uFF09`,fixable:!1})}let d=m.filter(l=>l.completed),g=m.filter(l=>!l.completed),f=[...d].sort((l,k)=>v(k.completed).localeCompare(v(l.completed)));if(JSON.stringify(f.map(l=>l.title))!==JSON.stringify(d.map(l=>l.title))&&(m.splice(0,m.length,...f,...g),p=!0),p){let l=c+m.map(Ke).join(`
25
+
26
+ ---
27
+
28
+ `)+`
29
+ `;He(s,l,"utf8")}}return{issues:r,fixed:o}}var M={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"}},W="zh";import{readFileSync as qe,writeFileSync as Ve}from"fs";import{readdirSync as Xe}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=Xe(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 B(){let e=new Date,t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function Qe(e,t,n,r=!0){let o=qe(e,"utf8"),s=o.includes(`\r
17
30
  `)?`\r
18
31
  `:`
19
- `,s=o.replace(/\r\n/g,`
20
- `),l=s;for(let[m,i]of Object.entries(t.replacements))l=l.replaceAll(m,i);for(;l.includes(`${t.deps}
21
- ${t.deps}`);)l=l.replace(`${t.deps}
22
- ${t.deps}`,t.deps);for(;;){let m=l.replace(/^- (.+)\n- \1$/gm,"- $1");if(m===l)break;l=m}let a=l.split(`
23
- `),p=[];for(let m=0;m<a.length;m++)if(p.push(a[m]),/^## \d+\.\d+\.\d+/.test(a[m])){let i=m+1;for(;i<a.length&&a[i].trim()==="";)i++;a[i]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(a[i].trim())||p.push(`> ${n} ${t.released}`)}let d=p.join(`
24
- `),g=h(d,r);return g!==s?(ue(e,g.replace(/\n/g,c),"utf8"),!0):!1}function w(e,n,t,r=!0){let o=[];for(let c of I(e))he(c,n,t,r)&&o.push(c);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let c of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${c}`);return o}var J=$e(import.meta.url),ye=J.resolve("@changesets/cli/bin.js"),{version:ve}=J("../package.json"),D=e=>{let n=be(process.execPath,[ye,...e],{stdio:"inherit"});n.status!==0&&process.exit(n.status??1)},T=new ke;T.name("toolkit").description("\u5F00\u53D1\u5DE5\u7A0B\u5316\u5DE5\u5177\u96C6\uFF1A\u4EFB\u52A1\u7BA1\u7406 + \u591A\u8BED\u8A00 CHANGELOG \u53D1\u5E03").version(ve,"-v, --version","\u663E\u793A\u7248\u672C\u53F7").enablePositionalOptions(!0);T.command("tasks").description("\u4EFB\u52A1\u7BA1\u7406").option("--dir <path>","\u4EFB\u52A1\u76EE\u5F55",".tasks").option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").argument("[command]","\u5B50\u547D\u4EE4\uFF1Aarchive \u5F52\u6863\uFF0C\u7559\u7A7A\u4E3A\u603B\u89C8").action((e,n)=>{let t=A(n.redact);e==="archive"?P(n.dir,t):N(n.dir,t)});T.command("changelog").description("\u591A\u8BED\u8A00 CHANGELOG\uFF08\u5C01\u88C5 changesets\uFF09").option("--lang <lang>","\u8BED\u8A00 zh/en",R).option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").argument("[command...]","\u5B50\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u900F\u4F20\u7ED9 changesets\uFF09").passThroughOptions(!0).action((e,n)=>{let t=A(n.redact),r=C[n.lang]??C[R],o=e[0];o==="version"?(D(["version"]),w(".",F(),r,t)):o==="format"?w(".",F(),r,t):D(o?e:[])});T.parse();
32
+ `,i=o.replace(/\r\n/g,`
33
+ `),a=i;for(let[d,g]of Object.entries(n.replacements))a=a.replaceAll(d,g);for(;a.includes(`${n.deps}
34
+ ${n.deps}`);)a=a.replace(`${n.deps}
35
+ ${n.deps}`,n.deps);for(;;){let d=a.replace(/^- (.+)\n- \1$/gm,"- $1");if(d===a)break;a=d}let u=a.split(`
36
+ `),c=[];for(let d=0;d<u.length;d++)if(c.push(u[d]),/^## \d+\.\d+\.\d+/.test(u[d])){let g=d+1;for(;g<u.length&&u[g].trim()==="";)g++;u[g]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(u[g].trim())||c.push(`> ${t} ${n.released}`)}let m=c.join(`
37
+ `),p=A(m,r);return p!==i?(Ve(e,p.replace(/\n/g,s),"utf8"),!0):!1}function G(e,t,n,r=!0){let o=[];for(let s of de(e))Qe(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=tt(import.meta.url),it=pe.resolve("@changesets/cli/bin.js"),{version:at}=pe("../package.json"),P=e=>{let t=nt(process.execPath,[it,...e],{stdio:"inherit"});t.status!==0&&process.exit(t.status??1)};function ct(){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 lt(){let t=F("changelog")?.languages;if(!t||typeof t!="object")return M;let n={...M};for(let[r,o]of Object.entries(t))o&&typeof o=="object"&&(n[r]=o);return n}function ft(e=".changeset"){if(!rt(e))return!1;try{return ot(e).some(t=>t.endsWith(".md")&&t!=="README.md")}catch{return!1}}function mt(e=".tasks"){return $(st(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 et;_.name("toolkit").description("\u5F00\u53D1\u5DE5\u7A0B\u5316\u5DE5\u5177\u96C6\uFF1A\u4EFB\u52A1\u7BA1\u7406 + \u591A\u8BED\u8A00 CHANGELOG \u53D1\u5E03").version(at,"-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=ee(o,n,{dryRun:t.dryRun,warn:r});r&&!t.dryRun&&s.archived>0&&!ft()&&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=re(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 Y(o,n)});_.command("changelog").description("\u591A\u8BED\u8A00 CHANGELOG\uFF08\u5C01\u88C5 changesets\uFF09").option("--lang <lang>","\u8BED\u8A00 zh/en",W).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=lt(),s=o[t.lang]??o[W],i=e[0];i==="version"?(r&&mt()&&console.warn("\u26A0\uFE0F \u5B58\u5728\u672A\u5F52\u6863\u7684 active \u4EFB\u52A1\uFF0C\u5EFA\u8BAE\u5148\u5F52\u6863\u518D\u53D1\u7248"),P(["version"]),G(".",B(),s,n)):i==="format"?G(".",B(),s,n):P(i?e:[])});ct();_.parse();
package/dist/index.cjs CHANGED
@@ -1,23 +1,36 @@
1
- var w=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var H=Object.prototype.hasOwnProperty;var X=(e,n)=>{for(var t in n)w(e,t,{get:n[t],enumerable:!0})},K=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of P(n))!H.call(e,o)&&o!==t&&w(e,o,{get:()=>n[o],enumerable:!(r=J(n,o))||r.enumerable});return e};var Y=e=>K(w({},"__esModule",{value:!0}),e);var re={};X(re,{DEFAULT_LANG:()=>ne,DONE_STATUSES:()=>D,archiveTasks:()=>U,collectChangelogs:()=>v,dateFromFileName:()=>C,formatChangelog:()=>L,formatChangelogs:()=>I,languages:()=>te,listTaskFiles:()=>T,listTasks:()=>j,localDate:()=>G,parseArchiveTasks:()=>z,parseFrontmatter:()=>y,printTasks:()=>M,redactText:()=>k,stripFrontmatter:()=>b});module.exports=Y(re);var D=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function y(e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let t={};for(let r of n[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let c=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))&&(s=s.slice(1,-1)),c&&(t[c]=s)}return t}function b(e){let n=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?e.slice(n[0].length):e}var $=require("fs"),x=require("path");function T(e){if(!(0,$.existsSync)(e))return[];let n=[];for(let t of(0,$.readdirSync)(e)){let r=(0,x.join)(e,t);if((0,$.statSync)(r).isDirectory())for(let o of(0,$.readdirSync)(r))o.endsWith(".md")&&n.push((0,x.join)(r,o));else t.endsWith(".md")&&n.push(r)}return n}function C(e){let t=(0,x.basename)(e,(0,x.extname)(e)).match(/^(\d{8})/);return t?t[1]:""}var N=require("fs"),A=require("path");var W=require("fs"),Z=require("path"),q=[{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.***.***"}],S,F=null;function Q(){if(S!==void 0)return S;S=null;try{let e=(0,W.readFileSync)((0,Z.join)(process.cwd(),".toolkitrc.json"),"utf8");S=JSON.parse(e).redact??null}catch{}return S}function V(){if(F)return F;let e=Q(),n=new Set(e?.disable??[]),t=[];for(let r of e?.rules??[])try{t.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return F=[...t,...q.filter(r=>!n.has(r.name))],F}function k(e,n){if(!n||!e)return e;let t=e;for(let r of V())t=t.replace(r.pattern,r.replacement);return t}function j(e=".tasks"){let n=(0,A.join)(e,"active");return T(n).map(t=>{let r=(0,N.readFileSync)(t,"utf8"),o=y(r),c=r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||(0,A.basename)(t,".md");return{file:t,name:(0,A.basename)(t,".md"),date:C(t),title:c,frontmatter:o,body:b(r).trim()}})}function M(e=".tasks",n=!0){let t=j(e);if(t.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 s of t){let l=r.includes(s.frontmatter.status)?s.frontmatter.status:"\u672A\u6807\u6CE8";(o[l]||=[]).push(s)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
2
- `);let c=0;for(let s of r){let l=o[s]||[];if(l.length!==0){c+=l.length,console.log(`\u3010${s}\u3011${l.length} \u9879`);for(let a of l)console.log(` ${a.date} ${(a.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${k(a.title,n)}`);console.log("")}}console.log(`\u5171 ${c} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}var d=require("fs"),p=require("path");function ee(e,n){let t=(0,p.resolve)(e),r=(0,p.resolve)(n);for(;t!==r&&t.startsWith(r+p.sep);){try{if((0,d.readdirSync)(t).length>0)break;(0,d.rmdirSync)(t)}catch{break}t=(0,p.dirname)(t)}}function O(e){let n=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return n?`${n[1]}-${n[2].padStart(2,"0")}-${n[3].padStart(2,"0")} ${n[4].padStart(2,"0")}:${n[5]}`:e}function z(e){let n=(0,d.readFileSync)(e,"utf8"),t=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(n);)t.push({block:o[0].trim(),completed:o[2].trim()});return t}function U(e=".tasks",n=!0){let t=(0,p.join)(e,"active"),r=(0,p.join)(e,"archive"),o=T(t);if(o.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let c=[],s=[];for(let a of o){let g=(0,d.readFileSync)(a,"utf8"),f=y(g);if(!D.includes(f.status))continue;let u=O(f.completed||"");if(!u){s.push((0,p.basename)(a,".md")),console.log(`\u8DF3\u8FC7 ${(0,p.basename)(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:a,name:(0,p.basename)(a,".md"),owner:f.owner||"\u672A\u6807\u6CE8",status:f.status||"\u672A\u6807\u6CE8",scope:f.scope||"-",completed:u,body:b(g).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:s};let l={};for(let a of c){let g=a.completed.replace(/-/g,"").slice(0,8);(l[g]||=[]).push(a)}for(let[a,g]of Object.entries(l)){let f=(0,p.join)(r,a.slice(0,6));(0,d.mkdirSync)(f,{recursive:!0});let u=(0,p.join)(f,`${a}.md`),m=(0,d.existsSync)(u)?z(u):[];m.push(...g.map(i=>({block:`## ${i.name}
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 be=e=>ke(W({},"__esModule",{value:!0}),e);var Ie={};he(Ie,{DEFAULT_LANG:()=>Ee,DONE_STATUSES:()=>Z,archiveTasks:()=>ne,checkArchive:()=>ce,collectChangelogs:()=>O,dateFromFileName:()=>L,fixArchive:()=>le,formatChangelog:()=>V,formatChangelogs:()=>pe,getConfigSection:()=>_,languages:()=>Le,listTaskFiles:()=>v,listTasks:()=>J,loadToolkitConfig:()=>U,localDate:()=>fe,normalizeCompleted:()=>x,parseArchiveTasks:()=>H,parseBool:()=>P,parseFrontmatter:()=>T,printTasks:()=>te,redactText:()=>A,resolveEnabled:()=>G,stripFrontmatter:()=>C,validateTaskFile:()=>K,validateTasks:()=>se});module.exports=be(Ie);var Z=["\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}var w=require("fs"),F=require("path");function v(e){if(!(0,w.existsSync)(e))return[];let t=[];for(let n of(0,w.readdirSync)(e)){let r=(0,F.join)(e,n);if((0,w.statSync)(r).isDirectory())for(let s of(0,w.readdirSync)(r))s.endsWith(".md")&&t.push((0,F.join)(r,s));else n.endsWith(".md")&&t.push(r)}return t}function L(e){let n=(0,F.basename)(e,(0,F.extname)(e)).match(/^(\d{8})/);return n?n[1]:""}var ee=require("fs"),N=require("path");var q=require("fs"),Q=require("path"),z;function U(){if(z!==void 0)return z;z=null;try{let e=(0,q.readFileSync)((0,Q.join)(process.cwd(),".toolkitrc.json"),"utf8");z=JSON.parse(e)}catch{}return z}function _(e){let t=U();if(!t)return;let n=t[e];return typeof n=="object"&&n!==null?n:void 0}function P(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!==""?P(s,r):n!==void 0?n:r}var $e=[{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 ye(){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=ye(),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,...$e.filter(r=>!t.has(r.name))],M}function A(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,N.join)(e,"active");return v(t).map(n=>{let r=(0,ee.readFileSync)(n,"utf8"),s=T(r),a=r.split(/\r?\n/).find(o=>o.startsWith("# ")&&!o.startsWith("#!"))?.replace(/^#\s*/,"")||(0,N.basename)(n,".md");return{file:n,name:(0,N.basename)(n,".md"),date:L(n),title:a,frontmatter:s,body:C(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 p of i)console.log(` ${p.date} ${(p.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${A(p.title,t)}`);console.log("")}}console.log(`\u5171 ${a} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}var k=require("fs"),b=require("path");function ve(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 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 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,b.join)(e,"active"),o=(0,b.join)(e,"archive"),i=[],p=v(a);if(p.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:i};let c=[],f=[];for(let m of p){let l=(0,k.readFileSync)(m,"utf8"),$=T(l);if(!Z.includes($.status))continue;let S=x($.completed||"");if(!S){f.push((0,b.basename)(m,".md")),console.log(`\u8DF3\u8FC7 ${(0,b.basename)(m,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:m,name:(0,b.basename)(m,".md"),owner:$.owner||"\u672A\u6807\u6CE8",status:$.status||"\u672A\u6807\u6CE8",scope:$.scope||"-",completed:S,body:C(l).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:f,warnings:i};if(s)for(let m of c){let l=m.completed.replace(/-/g,"").slice(0,8),$=L(m.file);$&&l!==$&&i.push(`\u4EFB\u52A1\u300C${m.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${m.completed} \u4E0E\u521B\u5EFA\u65E5 ${$} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let d={};for(let m of c){let l=m.completed.replace(/-/g,"").slice(0,8);(d[l]||=[]).push(m)}let u=null,g=(0,b.join)(e,".archive.lock");if(!r)try{u=(0,k.openSync)(g,"wx")}catch{let m="\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 ${m}`),{archived:0,skipped:f,warnings:[...i,m]}}try{for(let[m,l]of Object.entries(d)){let $=(0,b.join)(o,m.slice(0,6)),S=(0,b.join)($,`${m}.md`),I=(0,k.existsSync)(S)?H(S):[];if(s){let h=new Set(I.map(D=>D.block.match(/^## (.+)/)?.[1]??""));for(let D of l)h.has(D.name)&&i.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${D.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}I.push(...l.map(h=>({block:`## ${h.name}
3
3
 
4
- > \u8D1F\u8D23\u4EBA\uFF1A${i.owner}\u3000\u72B6\u6001\uFF1A${i.status}\u3000\u8303\u56F4\uFF1A${i.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${i.completed}
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
- ${k(i.body,n)}`,completed:i.completed})));for(let i of m)i.completed=O(i.completed);m.sort((i,_)=>_.completed.localeCompare(i.completed)),(0,d.writeFileSync)(u,`# ${a} \u5F52\u6863
6
+ ${A(h.body,t)}`,completed:h.completed})));for(let h of I)h.completed=x(h.completed);if(I.sort((h,D)=>D.completed.localeCompare(h.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${l.length} \u4E2A\u4EFB\u52A1 \u2192 ${m}.md`);for(let h of l)console.log(`[\u9884\u6F14] - ${h.name}`);continue}(0,k.mkdirSync)($,{recursive:!0}),(0,k.writeFileSync)(S,`# ${m} \u5F52\u6863
7
7
 
8
8
  > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
9
9
 
10
- ${m.map(i=>i.block).join(`
10
+ ${I.map(h=>h.block).join(`
11
11
 
12
12
  ---
13
13
 
14
14
  `)}
15
- `,"utf8");for(let i of g)(0,d.unlinkSync)(i.file);ee((0,p.dirname)(g[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${g.length} \u4E2A\u4EFB\u52A1 \u2192 ${a}.md`)}return console.log(`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:s}}var te={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"}},ne="zh";var B=require("fs"),E=require("path");function v(e){let n=[],t=new Set(["node_modules",".git","dist"]),r=o=>{let c;try{c=(0,B.readdirSync)(o,{withFileTypes:!0})}catch{return}for(let s of c)if(s.isDirectory()){if(t.has(s.name))continue;r((0,E.join)(o,s.name))}else s.name==="CHANGELOG.md"&&n.push((0,E.join)(o,s.name))};return r(e),n}var R=require("fs");function G(){let e=new Date,n=t=>String(t).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}function L(e,n,t,r=!0){let o=(0,R.readFileSync)(e,"utf8"),c=o.includes(`\r
15
+ `,"utf8");for(let h of l)(0,k.unlinkSync)(h.file);ve((0,b.dirname)(l[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${l.length} \u4E2A\u4EFB\u52A1 \u2192 ${m}.md`)}for(let m of i)console.warn(`\u26A0\uFE0F ${m}`);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:f,warnings:i}}finally{if(u!==null){(0,k.closeSync)(u);try{(0,k.unlinkSync)(g)}catch{}}}}var Y=require("fs"),R=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,R.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=T(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=C(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=v((0,R.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,R.basename)(o,".md"),p=r.get(i);p?p.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,R.basename)(c,".md"))),r=new Map;for(let c of e){let f=(0,R.basename)(c,".md"),d=(0,Y.readFileSync)(c,"utf8"),u=T(d),g=Ae(u.depends_on);r.set(f,g);for(let m of g)n.has(m)||t.push({level:"warn",file:f,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${m}\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,p=(c,f)=>{i.set(c,a);for(let d of r.get(c)??[]){if(!n.has(d))continue;let u=i.get(d)??s;if(u===a)return[...f,d];if(u===s){let g=p(d,[...f,d]);if(g)return g}}return i.set(c,o),null};for(let c of r.keys())if((i.get(c)??s)===s){let f=p(c,[c]);if(f){t.push({level:"warn",file:c,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${f.join(" \u2192 ")}`});break}}return t}var j=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
+ `),p=i[0].replace(/^## /,""),c=null,f="",d=1;for(let u=1;u<i.length;u++){let g=i[u].trim();if(g.startsWith("> ")&&g.includes("\u5B8C\u6210\u65F6\u95F4")){c=i[u];let m=g.match(/完成时间:(.+)$/);m&&(f=m[1].trim()),d=u+1;break}}s.push({title:p,metaLine:c,completed:f,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${x(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=v(t),r=[];for(let s of n){let a=(0,E.basename)(s),o=a.replace(/\.md$/,""),i=(0,j.readFileSync)(s,"utf8"),{blocks:p}=oe(i);for(let c=1;c<p.length;c++){let f=x(p[c-1].completed),d=x(p[c].completed);if(f&&d&&f<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 p){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 f=x(c.completed),d=f.replace(/-/g,"").slice(0,8);d&&o&&d!==o&&r.push({file:a,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${f} \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=v(t),r=[],s=0;for(let a of n){let o=(0,E.basename)(a),i=o.replace(/\.md$/,""),p=(0,j.readFileSync)(a,"utf8"),{header:c,blocks:f}=oe(p),d=!1;for(let l of f){l.completed&&(!l.metaLine||!ae(l.metaLine))&&(l.metaLine=ie(l.title,l.completed),d=!0,s++);let $=x(l.completed),S=$.replace(/-/g,"").slice(0,8);S&&i&&S!==i&&r.push({file:o,message:`\u5757\u300C${l.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${$} \u4E0E\u5F52\u6863\u65E5\u671F ${i} \u4E0D\u4E00\u81F4\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\u662F\u5426\u8FC1\u79FB\uFF09`,fixable:!1})}let u=f.filter(l=>l.completed),g=f.filter(l=>!l.completed),m=[...u].sort((l,$)=>x($.completed).localeCompare(x(l.completed)));if(JSON.stringify(m.map(l=>l.title))!==JSON.stringify(u.map(l=>l.title))&&(f.splice(0,f.length,...m,...g),d=!0),d){let l=c+f.map(De).join(`
24
+
25
+ ---
26
+
27
+ `)+`
28
+ `;(0,j.writeFileSync)(a,l,"utf8")}}return{issues:r,fixed:s}}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=o.replace(/\r\n/g,`
19
- `),l=s;for(let[m,i]of Object.entries(t.replacements))l=l.replaceAll(m,i);for(;l.includes(`${t.deps}
20
- ${t.deps}`);)l=l.replace(`${t.deps}
21
- ${t.deps}`,t.deps);for(;;){let m=l.replace(/^- (.+)\n- \1$/gm,"- $1");if(m===l)break;l=m}let a=l.split(`
22
- `),g=[];for(let m=0;m<a.length;m++)if(g.push(a[m]),/^## \d+\.\d+\.\d+/.test(a[m])){let i=m+1;for(;i<a.length&&a[i].trim()==="";)i++;a[i]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(a[i].trim())||g.push(`> ${n} ${t.released}`)}let f=g.join(`
23
- `),u=k(f,r);return u!==s?((0,R.writeFileSync)(e,u.replace(/\n/g,c),"utf8"),!0):!1}function I(e,n,t,r=!0){let o=[];for(let c of v(e))L(c,n,t,r)&&o.push(c);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let c of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${c}`);return o}0&&(module.exports={DEFAULT_LANG,DONE_STATUSES,archiveTasks,collectChangelogs,dateFromFileName,formatChangelog,formatChangelogs,languages,listTaskFiles,listTasks,localDate,parseArchiveTasks,parseFrontmatter,printTasks,redactText,stripFrontmatter});
31
+ `,o=s.replace(/\r\n/g,`
32
+ `),i=o;for(let[u,g]of Object.entries(n.replacements))i=i.replaceAll(u,g);for(;i.includes(`${n.deps}
33
+ ${n.deps}`);)i=i.replace(`${n.deps}
34
+ ${n.deps}`,n.deps);for(;;){let u=i.replace(/^- (.+)\n- \1$/gm,"- $1");if(u===i)break;i=u}let p=i.split(`
35
+ `),c=[];for(let u=0;u<p.length;u++)if(c.push(p[u]),/^## \d+\.\d+\.\d+/.test(p[u])){let g=u+1;for(;g<p.length&&p[g].trim()==="";)g++;p[g]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(p[g].trim())||c.push(`> ${t} ${n.released}`)}let f=c.join(`
36
+ `),d=A(f,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
- export { type ArchiveBlock, type ArchiveResult, type ChangelogLanguage, DEFAULT_LANG, DONE_STATUSES, type LanguageMap, type Task, type TaskFrontmatter, type TaskStatus, archiveTasks, collectChangelogs, dateFromFileName, formatChangelog, formatChangelogs, languages, listTaskFiles, listTasks, localDate, parseArchiveTasks, parseFrontmatter, printTasks, redactText, stripFrontmatter };
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
- export { type ArchiveBlock, type ArchiveResult, type ChangelogLanguage, DEFAULT_LANG, DONE_STATUSES, type LanguageMap, type Task, type TaskFrontmatter, type TaskStatus, archiveTasks, collectChangelogs, dateFromFileName, formatChangelog, formatChangelogs, languages, listTaskFiles, listTasks, localDate, parseArchiveTasks, parseFrontmatter, printTasks, redactText, stripFrontmatter };
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 v=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function k(t){let n=t.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let e={};for(let r of n[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let c=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))&&(s=s.slice(1,-1)),c&&(e[c]=s)}return e}function $(t){let n=t.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?t.slice(n[0].length):t}import{existsSync as M,readdirSync as R,statSync as O}from"fs";import{join as w,basename as U,extname as B}from"path";function x(t){if(!M(t))return[];let n=[];for(let e of R(t)){let r=w(t,e);if(O(r).isDirectory())for(let o of R(r))o.endsWith(".md")&&n.push(w(r,o));else e.endsWith(".md")&&n.push(r)}return n}function S(t){let e=U(t,B(t)).match(/^(\d{8})/);return e?e[1]:""}import{readFileSync as X}from"fs";import{join as K,basename as D}from"path";import{readFileSync as G}from"fs";import{join as I}from"path";var J=[{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.***.***"}],y,b=null;function P(){if(y!==void 0)return y;y=null;try{let t=G(I(process.cwd(),".toolkitrc.json"),"utf8");y=JSON.parse(t).redact??null}catch{}return y}function H(){if(b)return b;let t=P(),n=new Set(t?.disable??[]),e=[];for(let r of t?.rules??[])try{e.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return b=[...e,...J.filter(r=>!n.has(r.name))],b}function h(t,n){if(!n||!t)return t;let e=t;for(let r of H())e=e.replace(r.pattern,r.replacement);return e}function j(t=".tasks"){let n=K(t,"active");return x(n).map(e=>{let r=X(e,"utf8"),o=k(r),c=r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||D(e,".md");return{file:e,name:D(e,".md"),date:S(e),title:c,frontmatter:o,body:$(r).trim()}})}function Y(t=".tasks",n=!0){let e=j(t);if(e.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 s of e){let l=r.includes(s.frontmatter.status)?s.frontmatter.status:"\u672A\u6807\u6CE8";(o[l]||=[]).push(s)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
2
- `);let c=0;for(let s of r){let l=o[s]||[];if(l.length!==0){c+=l.length,console.log(`\u3010${s}\u3011${l.length} \u9879`);for(let a of l)console.log(` ${a.date} ${(a.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${h(a.title,n)}`);console.log("")}}console.log(`\u5171 ${c} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as L,writeFileSync as q,mkdirSync as Q,unlinkSync as V,existsSync as ee,readdirSync as te,rmdirSync as ne}from"fs";import{join as T,basename as A,dirname as _,resolve as z,sep as re}from"path";function oe(t,n){let e=z(t),r=z(n);for(;e!==r&&e.startsWith(r+re);){try{if(te(e).length>0)break;ne(e)}catch{break}e=_(e)}}function E(t){let n=t.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return n?`${n[1]}-${n[2].padStart(2,"0")}-${n[3].padStart(2,"0")} ${n[4].padStart(2,"0")}:${n[5]}`:t}function W(t){let n=L(t,"utf8"),e=[],r=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=r.exec(n);)e.push({block:o[0].trim(),completed:o[2].trim()});return e}function se(t=".tasks",n=!0){let e=T(t,"active"),r=T(t,"archive"),o=x(e);if(o.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let c=[],s=[];for(let a of o){let m=L(a,"utf8"),d=k(m);if(!v.includes(d.status))continue;let g=E(d.completed||"");if(!g){s.push(A(a,".md")),console.log(`\u8DF3\u8FC7 ${A(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:a,name:A(a,".md"),owner:d.owner||"\u672A\u6807\u6CE8",status:d.status||"\u672A\u6807\u6CE8",scope:d.scope||"-",completed:g,body:$(m).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:s};let l={};for(let a of c){let m=a.completed.replace(/-/g,"").slice(0,8);(l[m]||=[]).push(a)}for(let[a,m]of Object.entries(l)){let d=T(r,a.slice(0,6));Q(d,{recursive:!0});let g=T(d,`${a}.md`),p=ee(g)?W(g):[];p.push(...m.map(i=>({block:`## ${i.name}
1
+ var j=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function S(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 T(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 _,statSync as ae}from"fs";import{join as M,basename as ce,extname as le}from"path";function x(e){if(!ie(e))return[];let t=[];for(let n of _(e)){let r=M(e,n);if(ae(r).isDirectory())for(let s of _(r))s.endsWith(".md")&&t.push(M(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 Z}from"path";import{readFileSync as me}from"fs";import{join as fe}from"path";var R;function O(){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=O();if(!t)return;let n=t[e];return typeof n=="object"&&n!==null?n:void 0}function B(e,t){let n=e.trim().toLowerCase();return["1","true","on","yes"].includes(n)?!0:["0","false","off","no"].includes(n)?!1:t}function W(e,t,n,r){if(e!==void 0)return e;let s=process.env[t];return s!==void 0&&s!==""?B(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 C(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 x(t).map(n=>{let r=ge(n,"utf8"),s=S(r),a=r.split(/\r?\n/).find(o=>o.startsWith("# ")&&!o.startsWith("#!"))?.replace(/^#\s*/,"")||Z(n,".md");return{file:n,name:Z(n,".md"),date:F(n),title:a,frontmatter:s,body:T(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 p of i)console.log(` ${p.date} ${(p.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${C(p.title,t)}`);console.log("")}}console.log(`\u5171 ${a} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as J,writeFileSync as be,mkdirSync as $e,unlinkSync as P,existsSync as ye,readdirSync as xe,rmdirSync as ve,openSync as Se,closeSync as Te}from"fs";import{join as D,basename as z,dirname as H,resolve as G,sep as Ce}from"path";function Ae(e,t){let n=G(e),r=G(t);for(;n!==r&&n.startsWith(r+Ce);){try{if(xe(n).length>0)break;ve(n)}catch{break}n=H(n)}}function y(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 Y(e){let t=J(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=[],p=x(a);if(p.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:i};let c=[],f=[];for(let m of p){let l=J(m,"utf8"),k=S(l);if(!j.includes(k.status))continue;let v=y(k.completed||"");if(!v){f.push(z(m,".md")),console.log(`\u8DF3\u8FC7 ${z(m,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:m,name:z(m,".md"),owner:k.owner||"\u672A\u6807\u6CE8",status:k.status||"\u672A\u6807\u6CE8",scope:k.scope||"-",completed:v,body:T(l).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:f,warnings:i};if(s)for(let m of c){let l=m.completed.replace(/-/g,"").slice(0,8),k=F(m.file);k&&l!==k&&i.push(`\u4EFB\u52A1\u300C${m.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${m.completed} \u4E0E\u521B\u5EFA\u65E5 ${k} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let d={};for(let m of c){let l=m.completed.replace(/-/g,"").slice(0,8);(d[l]||=[]).push(m)}let u=null,g=D(e,".archive.lock");if(!r)try{u=Se(g,"wx")}catch{let m="\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 ${m}`),{archived:0,skipped:f,warnings:[...i,m]}}try{for(let[m,l]of Object.entries(d)){let k=D(o,m.slice(0,6)),v=D(k,`${m}.md`),w=ye(v)?Y(v):[];if(s){let h=new Set(w.map(A=>A.block.match(/^## (.+)/)?.[1]??""));for(let A of l)h.has(A.name)&&i.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${A.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}w.push(...l.map(h=>({block:`## ${h.name}
3
3
 
4
- > \u8D1F\u8D23\u4EBA\uFF1A${i.owner}\u3000\u72B6\u6001\uFF1A${i.status}\u3000\u8303\u56F4\uFF1A${i.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${i.completed}
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(i.body,n)}`,completed:i.completed})));for(let i of p)i.completed=E(i.completed);p.sort((i,F)=>F.completed.localeCompare(i.completed)),q(g,`# ${a} \u5F52\u6863
6
+ ${C(h.body,t)}`,completed:h.completed})));for(let h of w)h.completed=y(h.completed);if(w.sort((h,A)=>A.completed.localeCompare(h.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${l.length} \u4E2A\u4EFB\u52A1 \u2192 ${m}.md`);for(let h of l)console.log(`[\u9884\u6F14] - ${h.name}`);continue}$e(k,{recursive:!0}),be(v,`# ${m} \u5F52\u6863
7
7
 
8
8
  > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
9
9
 
10
- ${p.map(i=>i.block).join(`
10
+ ${w.map(h=>h.block).join(`
11
11
 
12
12
  ---
13
13
 
14
14
  `)}
15
- `,"utf8");for(let i of m)V(i.file);oe(_(m[0].file),t),console.log(`\u5DF2\u5F52\u6863 ${m.length} \u4E2A\u4EFB\u52A1 \u2192 ${a}.md`)}return console.log(`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:s}}var Ne={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"}},Me="zh";import{readdirSync as ae}from"fs";import{join as Z}from"path";function C(t){let n=[],e=new Set(["node_modules",".git","dist"]),r=o=>{let c;try{c=ae(o,{withFileTypes:!0})}catch{return}for(let s of c)if(s.isDirectory()){if(e.has(s.name))continue;r(Z(o,s.name))}else s.name==="CHANGELOG.md"&&n.push(Z(o,s.name))};return r(t),n}import{readFileSync as ie,writeFileSync as ce}from"fs";function le(){let t=new Date,n=e=>String(e).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}`}function N(t,n,e,r=!0){let o=ie(t,"utf8"),c=o.includes(`\r
15
+ `,"utf8");for(let h of l)P(h.file);Ae(H(l[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${l.length} \u4E2A\u4EFB\u52A1 \u2192 ${m}.md`)}for(let m of i)console.warn(`\u26A0\uFE0F ${m}`);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:f,warnings:i}}finally{if(u!==null){Te(u);try{P(g)}catch{}}}}import{readFileSync as X}from"fs";import{join as Fe,basename as E}from"path";var K=["\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 V(e){let t=[],n=E(e),r=X(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=S(r);a.status?K.includes(a.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${a.status}\u300D\uFF0C\u5E94\u4E3A ${K.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=T(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=x(Fe(e,"active")),n=[];for(let o of t)n.push(...V(o));let r=new Map;for(let o of t){let i=E(o,".md"),p=r.get(i);p?p.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 f=E(c,".md"),d=X(c,"utf8"),u=S(d),g=Ie(u.depends_on);r.set(f,g);for(let m of g)n.has(m)||t.push({level:"warn",file:f,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${m}\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,p=(c,f)=>{i.set(c,a);for(let d of r.get(c)??[]){if(!n.has(d))continue;let u=i.get(d)??s;if(u===a)return[...f,d];if(u===s){let g=p(d,[...f,d]);if(g)return g}}return i.set(c,o),null};for(let c of r.keys())if((i.get(c)??s)===s){let f=p(c,[c]);if(f){t.push({level:"warn",file:c,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${f.join(" \u2192 ")}`});break}}return t}import{readFileSync as q,writeFileSync as Ne}from"fs";import{join as Q,basename as ee}from"path";function je(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
+ `),p=i[0].replace(/^## /,""),c=null,f="",d=1;for(let u=1;u<i.length;u++){let g=i[u].trim();if(g.startsWith("> ")&&g.includes("\u5B8C\u6210\u65F6\u95F4")){c=i[u];let m=g.match(/完成时间:(.+)$/);m&&(f=m[1].trim()),d=u+1;break}}s.push({title:p,metaLine:c,completed:f,body:i.slice(d).join(`
17
+ `).trim()})}return{header:n,blocks:s}}function ne(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${y(t)}`}var _e=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function re(e){return _e.every(t=>e.includes(t))}function Me(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 Oe(e=".tasks"){let t=Q(e,"archive"),n=x(t),r=[];for(let s of n){let a=ee(s),o=a.replace(/\.md$/,""),i=q(s,"utf8"),{blocks:p}=te(i);for(let c=1;c<p.length;c++){let f=y(p[c-1].completed),d=y(p[c].completed);if(f&&d&&f<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 p){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 f=y(c.completed),d=f.replace(/-/g,"").slice(0,8);d&&o&&d!==o&&r.push({file:a,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${f} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${o} \u4E0D\u4E00\u81F4`,fixable:!1})}}return r}function Be(e=".tasks"){let t=Q(e,"archive"),n=x(t),r=[],s=0;for(let a of n){let o=ee(a),i=o.replace(/\.md$/,""),p=q(a,"utf8"),{header:c,blocks:f}=te(p),d=!1;for(let l of f){l.completed&&(!l.metaLine||!re(l.metaLine))&&(l.metaLine=ne(l.title,l.completed),d=!0,s++);let k=y(l.completed),v=k.replace(/-/g,"").slice(0,8);v&&i&&v!==i&&r.push({file:o,message:`\u5757\u300C${l.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${k} \u4E0E\u5F52\u6863\u65E5\u671F ${i} \u4E0D\u4E00\u81F4\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\u662F\u5426\u8FC1\u79FB\uFF09`,fixable:!1})}let u=f.filter(l=>l.completed),g=f.filter(l=>!l.completed),m=[...u].sort((l,k)=>y(k.completed).localeCompare(y(l.completed)));if(JSON.stringify(m.map(l=>l.title))!==JSON.stringify(u.map(l=>l.title))&&(f.splice(0,f.length,...m,...g),d=!0),d){let l=c+f.map(Me).join(`
24
+
25
+ ---
26
+
27
+ `)+`
28
+ `;Ne(a,l,"utf8")}}return{issues:r,fixed:s}}var _t={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"}},Mt="zh";import{readdirSync as We}from"fs";import{join as se}from"path";function N(e){let t=[],n=new Set(["node_modules",".git","dist"]),r=s=>{let a;try{a=We(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 Ze,writeFileSync as Ue}from"fs";function Pe(){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=Ze(e,"utf8"),a=s.includes(`\r
16
29
  `)?`\r
17
30
  `:`
18
- `,s=o.replace(/\r\n/g,`
19
- `),l=s;for(let[p,i]of Object.entries(e.replacements))l=l.replaceAll(p,i);for(;l.includes(`${e.deps}
20
- ${e.deps}`);)l=l.replace(`${e.deps}
21
- ${e.deps}`,e.deps);for(;;){let p=l.replace(/^- (.+)\n- \1$/gm,"- $1");if(p===l)break;l=p}let a=l.split(`
22
- `),m=[];for(let p=0;p<a.length;p++)if(m.push(a[p]),/^## \d+\.\d+\.\d+/.test(a[p])){let i=p+1;for(;i<a.length&&a[i].trim()==="";)i++;a[i]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(a[i].trim())||m.push(`> ${n} ${e.released}`)}let d=m.join(`
23
- `),g=h(d,r);return g!==s?(ce(t,g.replace(/\n/g,c),"utf8"),!0):!1}function pe(t,n,e,r=!0){let o=[];for(let c of C(t))N(c,n,e,r)&&o.push(c);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let c of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${c}`);return o}export{Me as DEFAULT_LANG,v as DONE_STATUSES,se as archiveTasks,C as collectChangelogs,S as dateFromFileName,N as formatChangelog,pe as formatChangelogs,Ne as languages,x as listTaskFiles,j as listTasks,le as localDate,W as parseArchiveTasks,k as parseFrontmatter,Y as printTasks,h as redactText,$ as stripFrontmatter};
31
+ `,o=s.replace(/\r\n/g,`
32
+ `),i=o;for(let[u,g]of Object.entries(n.replacements))i=i.replaceAll(u,g);for(;i.includes(`${n.deps}
33
+ ${n.deps}`);)i=i.replace(`${n.deps}
34
+ ${n.deps}`,n.deps);for(;;){let u=i.replace(/^- (.+)\n- \1$/gm,"- $1");if(u===i)break;i=u}let p=i.split(`
35
+ `),c=[];for(let u=0;u<p.length;u++)if(c.push(p[u]),/^## \d+\.\d+\.\d+/.test(p[u])){let g=u+1;for(;g<p.length&&p[g].trim()==="";)g++;p[g]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(p[g].trim())||c.push(`> ${t} ${n.released}`)}let f=c.join(`
36
+ `),d=C(f,r);return d!==o?(Ue(e,d.replace(/\n/g,a),"utf8"),!0):!1}function Ge(e,t,n,r=!0){let s=[];for(let a of N(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{Mt as DEFAULT_LANG,j as DONE_STATUSES,we as archiveTasks,Oe as checkArchive,N as collectChangelogs,F as dateFromFileName,Be as fixArchive,oe as formatChangelog,Ge as formatChangelogs,I as getConfigSection,_t as languages,x as listTaskFiles,U as listTasks,O as loadToolkitConfig,Pe as localDate,y as normalizeCompleted,Y as parseArchiveTasks,B as parseBool,S as parseFrontmatter,ke as printTasks,C as redactText,W as resolveEnabled,T as stripFrontmatter,V as validateTaskFile,Ee as validateTasks};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fxri/toolkit",
3
- "version": "1.1.2",
3
+ "version": "1.3.0",
4
4
  "description": "开发工程化工具集:任务管理 + 多语言 CHANGELOG 发布。",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -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": "^14.0.0"
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
+ }