@fxri/toolkit 1.0.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @fxri/toolkit
2
2
 
3
+ ## 1.1.1
4
+ > 2026-09-03 发布
5
+
6
+ ### 🐛 补丁修复
7
+
8
+ - CLI 改用 Commander 实现,新增 --help/--version 与 tasks/changelog 子命令帮助,changelog 透传子命令支持未知选项;commander@^14 作为运行时依赖。
9
+
10
+ ## 1.1.0
11
+ > 2026-09-03 发布
12
+
13
+ ### ✨ 新增功能
14
+
15
+ - 新增隐私脱敏能力:落盘记录自由文本时默认对邮箱、手机号、身份证、IPv4、密钥、JWT、内网 URL 做掩码,支持 --no-redact / FX_REDACT / .toolkitrc.json 三档开关与自定义规则;归档任务改为按完成时间降序并规范化 completed;修复 CHANGELOG 日期补全重复插入。
16
+
3
17
  ## 1.0.2
4
18
  > 2026-09-03 发布
5
19
 
package/README.md CHANGED
@@ -40,6 +40,14 @@ npx toolkit changelog format # 仅格式化已有 CHANGELOG
40
40
  npx toolkit changelog status / publish # 其余 changeset 子命令透传
41
41
  ```
42
42
 
43
+ ### 通用选项
44
+
45
+ ```bash
46
+ -h, --help 显示帮助(全局或子命令)
47
+ -v, --version 显示版本号
48
+ --no-redact 关闭隐私脱敏(tasks / changelog 均可用)
49
+ ```
50
+
43
51
  ### 接入 package.json
44
52
 
45
53
  ```json
@@ -68,7 +76,7 @@ npx toolkit changelog status / publish # 其余 changeset 子命令透传
68
76
  ```typescript
69
77
  import {
70
78
  listTasks, printTasks, archiveTasks, parseFrontmatter,
71
- languages, DEFAULT_LANG, localDate, formatChangelogs,
79
+ languages, DEFAULT_LANG, localDate, formatChangelogs, redactText,
72
80
  } from "@fxri/toolkit"
73
81
 
74
82
  // 任务管理
@@ -79,23 +87,72 @@ const result = archiveTasks(".tasks")
79
87
  // CHANGELOG 格式化(默认中文)
80
88
  formatChangelogs(".", localDate(), languages[DEFAULT_LANG])
81
89
  formatChangelogs(".", localDate(), languages.en)
90
+
91
+ // 隐私脱敏(printTasks/archiveTasks/formatChangelog(s) 的第 2/4 个参数 redact 默认 true)
92
+ const masked = redactText("联系 tqy@fxri.net", true) // → "联系 t***@***.net"
82
93
  ```
83
94
 
95
+ `printTasks` / `archiveTasks` / `formatChangelog` / `formatChangelogs` 均提供可选 `redact` 参数(默认 `true`),传 `false` 可关闭本次脱敏。
96
+
84
97
  ### 语言扩展
85
98
 
86
99
  新增语言只需在 `languages` 里追加一个映射项:
87
100
 
88
101
  ```typescript
89
102
  export const languages = {
90
- zh: { replacements: { "### Major Changes": "### 🚨 重大变更", ... }, deps: "- 更新依赖" },
91
- en: { replacements: {}, deps: "- Updated dependencies" },
103
+ zh: { replacements: { "### Major Changes": "### 🚨 重大变更", ... }, deps: "- 更新依赖", released: "发布" },
104
+ en: { replacements: {}, deps: "- Updated dependencies", released: "released" },
92
105
  // 未来:ja / ko / ...
93
106
  }
94
107
  ```
95
108
 
109
+ ## 🔒 隐私脱敏
110
+
111
+ 落盘记录自由文本(任务正文/标题、CHANGELOG 条目)时默认脱敏敏感信息,`owner` 等结构化 frontmatter 字段不脱敏。
112
+
113
+ - **内置规则**:邮箱、手机号、身份证、IPv4、AWS/GitHub/OpenAI/Slack 密钥、JWT、含端口内网 URL
114
+ - **关闭开关**(默认开启,优先级从高到低):
115
+ - CLI 参数 `--no-redact`
116
+ - 环境变量 `FX_REDACT=0`
117
+ - 配置文件 `redact.enabled: false`
118
+ - **自定义规则**:项目根 `.toolkitrc.json`,追加规则(优先于内置)或按 `name` 禁用内置规则:
119
+
120
+ ```json
121
+ {
122
+ "redact": {
123
+ "enabled": true,
124
+ "disable": ["手机号"],
125
+ "rules": [
126
+ { "name": "自定义码", "pattern": "cod-[0-9]{6}", "flags": "i", "replacement": "cod-******" }
127
+ ]
128
+ }
129
+ }
130
+ ```
131
+
132
+ **效果示例**:以上配置下,任务正文 `联系 tqy@fxri.net,电话 13812345678,验证码 COD-123456` 归档后:
133
+
134
+ | 类型 | 原文 | 归档后 |
135
+ | --- | --- | --- |
136
+ | 邮箱(内置) | `tqy@fxri.net` | `t***@***.net` |
137
+ | 手机号(已禁用) | `13812345678` | `13812345678` |
138
+ | 自定义码(自定义,flags i) | `COD-123456` | `cod-******` |
139
+
96
140
  ## ⚙️ 环境要求
97
141
 
98
- - Node.js >= 20
142
+ - Node.js >= 20(正式支持)
143
+
144
+ ### 版本兼容性实测
145
+
146
+ | 能力 | Node 20 | Node 18 |
147
+ | --- | --- | --- |
148
+ | 安装 | ✅ | ✅(npm 报 EBADENGINE 警告) |
149
+ | 帮助 / 版本(--help / --version) | ✅ | ✅ |
150
+ | tasks(总览 / 归档) | ✅ | ✅ |
151
+ | 隐私脱敏(含 --no-redact 开关) | ✅ | ✅ |
152
+ | changelog format(纯格式化) | ✅ | ✅ |
153
+ | changelog init/add/version/publish | ✅ | ❌ |
154
+
155
+ ⚠️ Node 18 下依赖 changesets 的 changelog 子命令因上游 `human-id@4`(ESM-only)无法被 `require()`,报 `ERR_REQUIRE_ESM`;属 changesets 生态限制,非本工具代码问题。
99
156
 
100
157
  ## 📄 版权信息
101
158
 
package/SPEC.md CHANGED
@@ -60,7 +60,7 @@ scope: app
60
60
 
61
61
  ### 3.2 内容
62
62
 
63
- 同一天完成的任务整合进同一文件,**按完成时间升序排序**,任务之间用 `---` 分隔:
63
+ 同一天完成的任务整合进同一文件,**按完成时间降序排序**(最新在前),任务之间用 `---` 分隔:
64
64
 
65
65
  ```markdown
66
66
  # 20260902 归档
@@ -87,7 +87,7 @@ scope: app
87
87
  2. **任务级归档**:`status ∈ {已完成, 已放弃}` 且带 `completed` 的任务可归档。
88
88
  3. `待办` / `进行中` / `阻塞` 均不归档。
89
89
  4. 归档文件按 `completed` 的日期(`YYYYMMDD`)划分。
90
- 5. 归档文件内任务按 `completed` 升序排序(`YYYY-MM-DD HH:mm` 字符串排序即时间序)。
90
+ 5. 归档文件内任务按 `completed` **降序**排序(最新在前,`YYYY-MM-DD HH:mm` 定宽字符串比较即时间序)。
91
91
 
92
92
  ## 5. 其他语言实现要点
93
93
 
@@ -98,3 +98,4 @@ scope: app
98
98
  3. **完成时间提取**:从 frontmatter 的 `completed` 字段读取。
99
99
  4. **归档合并**:读取已有归档文件的任务块,与新任务合并后按 `completed` 排序,重写归档文件。
100
100
  5. **任务块分隔**:归档文件内任务以 `---` + `## ` 为边界,勿将正文内部的 `## ` 小节误判为任务边界。
101
+ 6. **敏感信息脱敏(可选)**:如需保护隐私,可在写归档前对正文自由文本做掩码;`owner` 等结构化字段保留原值。
package/dist/cli.cjs CHANGED
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
- var G=()=>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=G();var O=require("module"),_=require("child_process");var j=require("fs"),y=require("path");function x(t){let n=t.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let e={};for(let o of n[1].split(/\r?\n/)){let s=o.indexOf(":");if(s===-1)continue;let r=o.slice(0,s).trim(),i=o.slice(s+1).trim();(i.startsWith("'")&&i.endsWith("'")||i.startsWith('"')&&i.endsWith('"'))&&(i=i.slice(1,-1)),r&&(e[r]=i)}return e}function S(t){let n=t.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?t.slice(n[0].length):t}var h=require("fs"),k=require("path");function T(t){if(!(0,h.existsSync)(t))return[];let n=[];for(let e of(0,h.readdirSync)(t)){let o=(0,k.join)(t,e);if((0,h.statSync)(o).isDirectory())for(let s of(0,h.readdirSync)(o))s.endsWith(".md")&&n.push((0,k.join)(o,s));else e.endsWith(".md")&&n.push(o)}return n}function L(t){let e=(0,k.basename)(t,(0,k.extname)(t)).match(/^(\d{8})/);return e?e[1]:""}function I(t=".tasks"){let n=(0,y.join)(t,"active");return T(n).map(e=>{let o=(0,j.readFileSync)(e,"utf8"),s=x(o),r=o.split(/\r?\n/).find(i=>i.startsWith("# ")&&!i.startsWith("#!"))?.replace(/^#\s*/,"")||(0,y.basename)(e,".md");return{file:e,name:(0,y.basename)(e,".md"),date:L(e),title:r,frontmatter:s,body:S(o).trim()}})}function R(t=".tasks"){let n=I(t);if(n.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let e=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],o={};for(let r of n){let i=e.includes(r.frontmatter.status)?r.frontmatter.status:"\u672A\u6807\u6CE8";(o[i]||=[]).push(r)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
3
- `);let s=0;for(let r of e){let i=o[r]||[];if(i.length!==0){s+=i.length,console.log(`\u3010${r}\u3011${i.length} \u9879`);for(let c of i)console.log(` ${c.date} ${(c.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${c.title}`);console.log("")}}console.log(`\u5171 ${s} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}var m=require("fs"),l=require("path");var U=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function q(t,n){let e=(0,l.resolve)(t),o=(0,l.resolve)(n);for(;e!==o&&e.startsWith(o+l.sep);){try{if((0,m.readdirSync)(e).length>0)break;(0,m.rmdirSync)(e)}catch{break}e=(0,l.dirname)(e)}}function z(t){let n=(0,m.readFileSync)(t,"utf8"),e=[],o=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,s;for(;s=o.exec(n);)e.push({block:s[0].trim(),completed:s[2].trim()});return e}function W(t=".tasks"){let n=(0,l.join)(t,"active"),e=(0,l.join)(t,"archive"),o=T(n);if(o.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let s=[],r=[];for(let c of o){let p=(0,m.readFileSync)(c,"utf8"),a=x(p);if(!U.includes(a.status))continue;let u=a.completed;if(!u){r.push((0,l.basename)(c,".md")),console.log(`\u8DF3\u8FC7 ${(0,l.basename)(c,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}s.push({file:c,name:(0,l.basename)(c,".md"),owner:a.owner||"\u672A\u6807\u6CE8",status:a.status||"\u672A\u6807\u6CE8",scope:a.scope||"-",completed:u,body:S(p).trim()})}if(s.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:r};let i={};for(let c of s){let p=c.completed.replace(/-/g,"").slice(0,8);(i[p]||=[]).push(c)}for(let[c,p]of Object.entries(i)){let a=(0,l.join)(e,c.slice(0,6));(0,m.mkdirSync)(a,{recursive:!0});let u=(0,l.join)(a,`${c}.md`),F=(0,m.existsSync)(u)?z(u):[];F.push(...p.map(g=>({block:`## ${g.name}
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}
4
4
 
5
- > \u8D1F\u8D23\u4EBA\uFF1A${g.owner}\u3000\u72B6\u6001\uFF1A${g.status}\u3000\u8303\u56F4\uFF1A${g.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${g.completed}
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}
6
6
 
7
- ${g.body}`,completed:g.completed}))),F.sort((g,B)=>g.completed.localeCompare(B.completed)),(0,m.writeFileSync)(u,`# ${c} \u5F52\u6863
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
8
8
 
9
9
  > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
10
10
 
11
- ${F.map(g=>g.block).join(`
11
+ ${p.map(i=>i.block).join(`
12
12
 
13
13
  ---
14
14
 
15
15
  `)}
16
- `,"utf8");for(let g of p)(0,m.unlinkSync)(g.file);q((0,l.dirname)(p[0].file),t),console.log(`\u5DF2\u5F52\u6863 ${p.length} \u4E2A\u4EFB\u52A1 \u2192 ${c}.md`)}return console.log(`\u5171\u5F52\u6863 ${s.length} \u4E2A\u4EFB\u52A1`),{archived:s.length,skipped:r}}var v={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"}},$="zh";var C=require("fs");var E=require("fs"),b=require("path");function M(t){let n=[],e=new Set(["node_modules",".git","dist"]),o=s=>{let r;try{r=(0,E.readdirSync)(s,{withFileTypes:!0})}catch{return}for(let i of r)if(i.isDirectory()){if(e.has(i.name))continue;o((0,b.join)(s,i.name))}else i.name==="CHANGELOG.md"&&n.push((0,b.join)(s,i.name))};return o(t),n}function w(){let t=new Date,n=e=>String(e).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}`}function H(t,n,e){let o=(0,C.readFileSync)(t,"utf8"),s=o.includes(`\r
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
17
17
  `)?`\r
18
18
  `:`
19
- `,r=o.replace(/\r\n/g,`
20
- `);for(let[a,u]of Object.entries(e.replacements))r=r.replaceAll(a,u);for(;r.includes(`${e.deps}
21
- ${e.deps}`);)r=r.replace(`${e.deps}
22
- ${e.deps}`,e.deps);for(;;){let a=r.replace(/^- (.+)\n- \1$/gm,"- $1");if(a===r)break;r=a}let i=r.split(`
23
- `),c=[];for(let a=0;a<i.length;a++)c.push(i[a]),/^## \d+\.\d+\.\d+/.test(i[a])&&!i[a+1]?.startsWith("> ")&&c.push(`> ${n} ${e.released}`);let p=c.join(`
24
- `);return p!==r?((0,C.writeFileSync)(t,p.replace(/\n/g,s),"utf8"),!0):!1}function A(t,n,e){let o=[];for(let s of M(t))H(s,n,e)&&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 Y=(0,O.createRequire)(f),J=Y.resolve("@changesets/cli/bin.js"),D=t=>{let n=(0,_.spawnSync)(process.execPath,[J,...t],{stdio:"inherit"});n.status!==0&&process.exit(n.status??1)},P=process.argv.slice(2),N=P[0],d=P.slice(1);if(N==="tasks"){let t=d.indexOf("--dir"),n=t>=0&&d[t+1]?d[t+1]:".tasks";(d.find(o=>!o.startsWith("--")&&o!==n)||"list")==="archive"?W(n):R(n)}else if(N==="changelog"){let t=d.indexOf("--lang"),n=t>=0&&d[t+1]?d[t+1]:$,e=t>=0?d.filter((s,r)=>r!==t&&r!==t+1):d,o=e[0];o==="version"?(D(["version"]),A(".",w(),v[n]??v[$])):o==="format"?A(".",w(),v[n]??v[$]):D(o?e:[])}else console.log("\u7528\u6CD5\uFF1Atoolkit <tasks|changelog> ..."),console.log(" toolkit tasks \u4EFB\u52A1\u603B\u89C8"),console.log(" toolkit tasks archive \u5F52\u6863\u5DF2\u5B8C\u6210\u4EFB\u52A1"),console.log(" toolkit changelog \u521B\u5EFA\u53D8\u66F4\u96C6"),console.log(" toolkit changelog version \u53D1\u7248 + \u591A\u8BED\u8A00\u683C\u5F0F\u5316"),console.log(" toolkit changelog format \u7EAF\u683C\u5F0F\u5316");
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();
package/dist/cli.js CHANGED
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import{createRequire as at}from"module";import{spawnSync as ct}from"child_process";import{readFileSync as H}from"fs";import{join as I,basename as D}from"path";function u(t){let n=t.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let e={};for(let s of n[1].split(/\r?\n/)){let o=s.indexOf(":");if(o===-1)continue;let r=s.slice(0,o).trim(),i=s.slice(o+1).trim();(i.startsWith("'")&&i.endsWith("'")||i.startsWith('"')&&i.endsWith('"'))&&(i=i.slice(1,-1)),r&&(e[r]=i)}return e}function k(t){let n=t.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?t.slice(n[0].length):t}import{existsSync as P,readdirSync as b,statSync as U}from"fs";import{join as w,basename as q,extname as z}from"path";function y(t){if(!P(t))return[];let n=[];for(let e of b(t)){let s=w(t,e);if(U(s).isDirectory())for(let o of b(s))o.endsWith(".md")&&n.push(w(s,o));else e.endsWith(".md")&&n.push(s)}return n}function A(t){let e=q(t,z(t)).match(/^(\d{8})/);return e?e[1]:""}function Y(t=".tasks"){let n=I(t,"active");return y(n).map(e=>{let s=H(e,"utf8"),o=u(s),r=s.split(/\r?\n/).find(i=>i.startsWith("# ")&&!i.startsWith("#!"))?.replace(/^#\s*/,"")||D(e,".md");return{file:e,name:D(e,".md"),date:A(e),title:r,frontmatter:o,body:k(s).trim()}})}function L(t=".tasks"){let n=Y(t);if(n.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let e=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],s={};for(let r of n){let i=e.includes(r.frontmatter.status)?r.frontmatter.status:"\u672A\u6807\u6CE8";(s[i]||=[]).push(r)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
3
- `);let o=0;for(let r of e){let i=s[r]||[];if(i.length!==0){o+=i.length,console.log(`\u3010${r}\u3011${i.length} \u9879`);for(let a of i)console.log(` ${a.date} ${(a.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${a.title}`);console.log("")}}console.log(`\u5171 ${o} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as E,writeFileSync as J,mkdirSync as K,unlinkSync as Q,existsSync as V,readdirSync as X,rmdirSync as Z}from"fs";import{join as v,basename as $,dirname as M,resolve as W,sep as tt}from"path";var j=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function et(t,n){let e=W(t),s=W(n);for(;e!==s&&e.startsWith(s+tt);){try{if(X(e).length>0)break;Z(e)}catch{break}e=M(e)}}function nt(t){let n=E(t,"utf8"),e=[],s=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,o;for(;o=s.exec(n);)e.push({block:o[0].trim(),completed:o[2].trim()});return e}function O(t=".tasks"){let n=v(t,"active"),e=v(t,"archive"),s=y(n);if(s.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let o=[],r=[];for(let a of s){let g=E(a,"utf8"),c=u(g);if(!j.includes(c.status))continue;let p=c.completed;if(!p){r.push($(a,".md")),console.log(`\u8DF3\u8FC7 ${$(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}o.push({file:a,name:$(a,".md"),owner:c.owner||"\u672A\u6807\u6CE8",status:c.status||"\u672A\u6807\u6CE8",scope:c.scope||"-",completed:p,body:k(g).trim()})}if(o.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:r};let i={};for(let a of o){let g=a.completed.replace(/-/g,"").slice(0,8);(i[g]||=[]).push(a)}for(let[a,g]of Object.entries(i)){let c=v(e,a.slice(0,6));K(c,{recursive:!0});let p=v(c,`${a}.md`),T=V(p)?nt(p):[];T.push(...g.map(l=>({block:`## ${l.name}
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}
4
4
 
5
- > \u8D1F\u8D23\u4EBA\uFF1A${l.owner}\u3000\u72B6\u6001\uFF1A${l.status}\u3000\u8303\u56F4\uFF1A${l.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${l.completed}
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}
6
6
 
7
- ${l.body}`,completed:l.completed}))),T.sort((l,G)=>l.completed.localeCompare(G.completed)),J(p,`# ${a} \u5F52\u6863
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
8
8
 
9
9
  > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
10
10
 
11
- ${T.map(l=>l.block).join(`
11
+ ${m.map(i=>i.block).join(`
12
12
 
13
13
  ---
14
14
 
15
15
  `)}
16
- `,"utf8");for(let l of g)Q(l.file);et(M(g[0].file),t),console.log(`\u5DF2\u5F52\u6863 ${g.length} \u4E2A\u4EFB\u52A1 \u2192 ${a}.md`)}return console.log(`\u5171\u5F52\u6863 ${o.length} \u4E2A\u4EFB\u52A1`),{archived:o.length,skipped:r}}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"}},x="zh";import{readFileSync as ot,writeFileSync as rt}from"fs";import{readdirSync as st}from"fs";import{join as R}from"path";function N(t){let n=[],e=new Set(["node_modules",".git","dist"]),s=o=>{let r;try{r=st(o,{withFileTypes:!0})}catch{return}for(let i of r)if(i.isDirectory()){if(e.has(i.name))continue;s(R(o,i.name))}else i.name==="CHANGELOG.md"&&n.push(R(o,i.name))};return s(t),n}function S(){let t=new Date,n=e=>String(e).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}`}function it(t,n,e){let s=ot(t,"utf8"),o=s.includes(`\r
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
17
17
  `)?`\r
18
18
  `:`
19
- `,r=s.replace(/\r\n/g,`
20
- `);for(let[c,p]of Object.entries(e.replacements))r=r.replaceAll(c,p);for(;r.includes(`${e.deps}
21
- ${e.deps}`);)r=r.replace(`${e.deps}
22
- ${e.deps}`,e.deps);for(;;){let c=r.replace(/^- (.+)\n- \1$/gm,"- $1");if(c===r)break;r=c}let i=r.split(`
23
- `),a=[];for(let c=0;c<i.length;c++)a.push(i[c]),/^## \d+\.\d+\.\d+/.test(i[c])&&!i[c+1]?.startsWith("> ")&&a.push(`> ${n} ${e.released}`);let g=a.join(`
24
- `);return g!==r?(rt(t,g.replace(/\n/g,o),"utf8"),!0):!1}function F(t,n,e){let s=[];for(let o of N(t))it(o,n,e)&&s.push(o);if(s.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let o of s)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${o}`);return s}var lt=at(import.meta.url),gt=lt.resolve("@changesets/cli/bin.js"),C=t=>{let n=ct(process.execPath,[gt,...t],{stdio:"inherit"});n.status!==0&&process.exit(n.status??1)},B=process.argv.slice(2),_=B[0],m=B.slice(1);if(_==="tasks"){let t=m.indexOf("--dir"),n=t>=0&&m[t+1]?m[t+1]:".tasks";(m.find(s=>!s.startsWith("--")&&s!==n)||"list")==="archive"?O(n):L(n)}else if(_==="changelog"){let t=m.indexOf("--lang"),n=t>=0&&m[t+1]?m[t+1]:x,e=t>=0?m.filter((o,r)=>r!==t&&r!==t+1):m,s=e[0];s==="version"?(C(["version"]),F(".",S(),h[n]??h[x])):s==="format"?F(".",S(),h[n]??h[x]):C(s?e:[])}else console.log("\u7528\u6CD5\uFF1Atoolkit <tasks|changelog> ..."),console.log(" toolkit tasks \u4EFB\u52A1\u603B\u89C8"),console.log(" toolkit tasks archive \u5F52\u6863\u5DF2\u5B8C\u6210\u4EFB\u52A1"),console.log(" toolkit changelog \u521B\u5EFA\u53D8\u66F4\u96C6"),console.log(" toolkit changelog version \u53D1\u7248 + \u591A\u8BED\u8A00\u683C\u5F0F\u5316"),console.log(" toolkit changelog format \u7EAF\u683C\u5F0F\u5316");
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();
package/dist/index.cjs CHANGED
@@ -1,23 +1,23 @@
1
- var C=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var U=(e,n)=>{for(var t in n)C(e,t,{get:n[t],enumerable:!0})},_=(e,n,t,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of G(n))!P.call(e,r)&&r!==t&&C(e,r,{get:()=>n[r],enumerable:!(s=B(n,r))||s.enumerable});return e};var z=e=>_(C({},"__esModule",{value:!0}),e);var I={};U(I,{DEFAULT_LANG:()=>q,DONE_STATUSES:()=>b,archiveTasks:()=>E,collectChangelogs:()=>$,dateFromFileName:()=>F,formatChangelog:()=>j,formatChangelogs:()=>R,languages:()=>Y,listTaskFiles:()=>x,listTasks:()=>w,localDate:()=>N,parseArchiveTasks:()=>A,parseFrontmatter:()=>k,printTasks:()=>W,stripFrontmatter:()=>y});module.exports=z(I);var b=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function k(e){let n=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return{};let t={};for(let s of n[1].split(/\r?\n/)){let r=s.indexOf(":");if(r===-1)continue;let i=s.slice(0,r).trim(),o=s.slice(r+1).trim();(o.startsWith("'")&&o.endsWith("'")||o.startsWith('"')&&o.endsWith('"'))&&(o=o.slice(1,-1)),i&&(t[i]=o)}return t}function y(e){let n=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?e.slice(n[0].length):e}var h=require("fs"),u=require("path");function x(e){if(!(0,h.existsSync)(e))return[];let n=[];for(let t of(0,h.readdirSync)(e)){let s=(0,u.join)(e,t);if((0,h.statSync)(s).isDirectory())for(let r of(0,h.readdirSync)(s))r.endsWith(".md")&&n.push((0,u.join)(s,r));else t.endsWith(".md")&&n.push(s)}return n}function F(e){let t=(0,u.basename)(e,(0,u.extname)(e)).match(/^(\d{8})/);return t?t[1]:""}var L=require("fs"),T=require("path");function w(e=".tasks"){let n=(0,T.join)(e,"active");return x(n).map(t=>{let s=(0,L.readFileSync)(t,"utf8"),r=k(s),i=s.split(/\r?\n/).find(o=>o.startsWith("# ")&&!o.startsWith("#!"))?.replace(/^#\s*/,"")||(0,T.basename)(t,".md");return{file:t,name:(0,T.basename)(t,".md"),date:F(t),title:i,frontmatter:r,body:y(s).trim()}})}function W(e=".tasks"){let n=w(e);if(n.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let t=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],s={};for(let i of n){let o=t.includes(i.frontmatter.status)?i.frontmatter.status:"\u672A\u6807\u6CE8";(s[o]||=[]).push(i)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
2
- `);let r=0;for(let i of t){let o=s[i]||[];if(o.length!==0){r+=o.length,console.log(`\u3010${i}\u3011${o.length} \u9879`);for(let a of o)console.log(` ${a.date} ${(a.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${a.title}`);console.log("")}}console.log(`\u5171 ${r} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}var p=require("fs"),l=require("path");function H(e,n){let t=(0,l.resolve)(e),s=(0,l.resolve)(n);for(;t!==s&&t.startsWith(s+l.sep);){try{if((0,p.readdirSync)(t).length>0)break;(0,p.rmdirSync)(t)}catch{break}t=(0,l.dirname)(t)}}function A(e){let n=(0,p.readFileSync)(e,"utf8"),t=[],s=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,r;for(;r=s.exec(n);)t.push({block:r[0].trim(),completed:r[2].trim()});return t}function E(e=".tasks"){let n=(0,l.join)(e,"active"),t=(0,l.join)(e,"archive"),s=x(n);if(s.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let r=[],i=[];for(let a of s){let g=(0,p.readFileSync)(a,"utf8"),c=k(g);if(!b.includes(c.status))continue;let f=c.completed;if(!f){i.push((0,l.basename)(a,".md")),console.log(`\u8DF3\u8FC7 ${(0,l.basename)(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}r.push({file:a,name:(0,l.basename)(a,".md"),owner:c.owner||"\u672A\u6807\u6CE8",status:c.status||"\u672A\u6807\u6CE8",scope:c.scope||"-",completed:f,body:y(g).trim()})}if(r.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:i};let o={};for(let a of r){let g=a.completed.replace(/-/g,"").slice(0,8);(o[g]||=[]).push(a)}for(let[a,g]of Object.entries(o)){let c=(0,l.join)(t,a.slice(0,6));(0,p.mkdirSync)(c,{recursive:!0});let f=(0,l.join)(c,`${a}.md`),S=(0,p.existsSync)(f)?A(f):[];S.push(...g.map(m=>({block:`## ${m.name}
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}
3
3
 
4
- > \u8D1F\u8D23\u4EBA\uFF1A${m.owner}\u3000\u72B6\u6001\uFF1A${m.status}\u3000\u8303\u56F4\uFF1A${m.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${m.completed}
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}
5
5
 
6
- ${m.body}`,completed:m.completed}))),S.sort((m,O)=>m.completed.localeCompare(O.completed)),(0,p.writeFileSync)(f,`# ${a} \u5F52\u6863
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
7
7
 
8
8
  > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
9
9
 
10
- ${S.map(m=>m.block).join(`
10
+ ${m.map(i=>i.block).join(`
11
11
 
12
12
  ---
13
13
 
14
14
  `)}
15
- `,"utf8");for(let m of g)(0,p.unlinkSync)(m.file);H((0,l.dirname)(g[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${g.length} \u4E2A\u4EFB\u52A1 \u2192 ${a}.md`)}return console.log(`\u5171\u5F52\u6863 ${r.length} \u4E2A\u4EFB\u52A1`),{archived:r.length,skipped:i}}var Y={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"}},q="zh";var M=require("fs"),D=require("path");function $(e){let n=[],t=new Set(["node_modules",".git","dist"]),s=r=>{let i;try{i=(0,M.readdirSync)(r,{withFileTypes:!0})}catch{return}for(let o of i)if(o.isDirectory()){if(t.has(o.name))continue;s((0,D.join)(r,o.name))}else o.name==="CHANGELOG.md"&&n.push((0,D.join)(r,o.name))};return s(e),n}var v=require("fs");function N(){let e=new Date,n=t=>String(t).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}function j(e,n,t){let s=(0,v.readFileSync)(e,"utf8"),r=s.includes(`\r
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
16
16
  `)?`\r
17
17
  `:`
18
- `,i=s.replace(/\r\n/g,`
19
- `);for(let[c,f]of Object.entries(t.replacements))i=i.replaceAll(c,f);for(;i.includes(`${t.deps}
20
- ${t.deps}`);)i=i.replace(`${t.deps}
21
- ${t.deps}`,t.deps);for(;;){let c=i.replace(/^- (.+)\n- \1$/gm,"- $1");if(c===i)break;i=c}let o=i.split(`
22
- `),a=[];for(let c=0;c<o.length;c++)a.push(o[c]),/^## \d+\.\d+\.\d+/.test(o[c])&&!o[c+1]?.startsWith("> ")&&a.push(`> ${n} ${t.released}`);let g=a.join(`
23
- `);return g!==i?((0,v.writeFileSync)(e,g.replace(/\n/g,r),"utf8"),!0):!1}function R(e,n,t){let s=[];for(let r of $(e))j(r,n,t)&&s.push(r);if(s.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let r of s)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${r}`);return s}0&&(module.exports={DEFAULT_LANG,DONE_STATUSES,archiveTasks,collectChangelogs,dateFromFileName,formatChangelog,formatChangelogs,languages,listTaskFiles,listTasks,localDate,parseArchiveTasks,parseFrontmatter,printTasks,stripFrontmatter});
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});
package/dist/index.d.cts CHANGED
@@ -33,10 +33,10 @@ declare function listTaskFiles(dir: string): string[];
33
33
  declare function dateFromFileName(file: string): string;
34
34
 
35
35
  declare function listTasks(tasksDir?: string): Task[];
36
- declare function printTasks(tasksDir?: string): void;
36
+ declare function printTasks(tasksDir?: string, redact?: boolean): void;
37
37
 
38
38
  declare function parseArchiveTasks(file: string): ArchiveBlock[];
39
- declare function archiveTasks(tasksDir?: string): ArchiveResult;
39
+ declare function archiveTasks(tasksDir?: string, redact?: boolean): ArchiveResult;
40
40
 
41
41
  type LanguageMap = Record<string, string>;
42
42
  interface ChangelogLanguage {
@@ -50,7 +50,9 @@ declare const DEFAULT_LANG = "zh";
50
50
  declare function collectChangelogs(dir: string): string[];
51
51
 
52
52
  declare function localDate(): string;
53
- declare function formatChangelog(file: string, today: string, lang: ChangelogLanguage): boolean;
54
- declare function formatChangelogs(dir: string, today: string, lang: ChangelogLanguage): string[];
53
+ declare function formatChangelog(file: string, today: string, lang: ChangelogLanguage, redact?: boolean): boolean;
54
+ declare function formatChangelogs(dir: string, today: string, lang: ChangelogLanguage, redact?: boolean): string[];
55
55
 
56
- 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, stripFrontmatter };
56
+ declare function redactText(text: string, enabled: boolean): string;
57
+
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 };
package/dist/index.d.ts CHANGED
@@ -33,10 +33,10 @@ declare function listTaskFiles(dir: string): string[];
33
33
  declare function dateFromFileName(file: string): string;
34
34
 
35
35
  declare function listTasks(tasksDir?: string): Task[];
36
- declare function printTasks(tasksDir?: string): void;
36
+ declare function printTasks(tasksDir?: string, redact?: boolean): void;
37
37
 
38
38
  declare function parseArchiveTasks(file: string): ArchiveBlock[];
39
- declare function archiveTasks(tasksDir?: string): ArchiveResult;
39
+ declare function archiveTasks(tasksDir?: string, redact?: boolean): ArchiveResult;
40
40
 
41
41
  type LanguageMap = Record<string, string>;
42
42
  interface ChangelogLanguage {
@@ -50,7 +50,9 @@ declare const DEFAULT_LANG = "zh";
50
50
  declare function collectChangelogs(dir: string): string[];
51
51
 
52
52
  declare function localDate(): string;
53
- declare function formatChangelog(file: string, today: string, lang: ChangelogLanguage): boolean;
54
- declare function formatChangelogs(dir: string, today: string, lang: ChangelogLanguage): string[];
53
+ declare function formatChangelog(file: string, today: string, lang: ChangelogLanguage, redact?: boolean): boolean;
54
+ declare function formatChangelogs(dir: string, today: string, lang: ChangelogLanguage, redact?: boolean): string[];
55
55
 
56
- 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, stripFrontmatter };
56
+ declare function redactText(text: string, enabled: boolean): string;
57
+
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 };
package/dist/index.js CHANGED
@@ -1,23 +1,23 @@
1
- var $=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function d(e){let s=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!s)return{};let t={};for(let n of s[1].split(/\r?\n/)){let r=n.indexOf(":");if(r===-1)continue;let i=n.slice(0,r).trim(),o=n.slice(r+1).trim();(o.startsWith("'")&&o.endsWith("'")||o.startsWith('"')&&o.endsWith('"'))&&(o=o.slice(1,-1)),i&&(t[i]=o)}return t}function h(e){let s=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return s?e.slice(s[0].length):e}import{existsSync as M,readdirSync as v,statSync as N}from"fs";import{join as S,basename as R,extname as O}from"path";function u(e){if(!M(e))return[];let s=[];for(let t of v(e)){let n=S(e,t);if(N(n).isDirectory())for(let r of v(n))r.endsWith(".md")&&s.push(S(n,r));else t.endsWith(".md")&&s.push(n)}return s}function x(e){let t=R(e,O(e)).match(/^(\d{8})/);return t?t[1]:""}import{readFileSync as B}from"fs";import{join as G,basename as C}from"path";function b(e=".tasks"){let s=G(e,"active");return u(s).map(t=>{let n=B(t,"utf8"),r=d(n),i=n.split(/\r?\n/).find(o=>o.startsWith("# ")&&!o.startsWith("#!"))?.replace(/^#\s*/,"")||C(t,".md");return{file:t,name:C(t,".md"),date:x(t),title:i,frontmatter:r,body:h(n).trim()}})}function P(e=".tasks"){let s=b(e);if(s.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let t=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],n={};for(let i of s){let o=t.includes(i.frontmatter.status)?i.frontmatter.status:"\u672A\u6807\u6CE8";(n[o]||=[]).push(i)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
2
- `);let r=0;for(let i of t){let o=n[i]||[];if(o.length!==0){r+=o.length,console.log(`\u3010${i}\u3011${o.length} \u9879`);for(let a of o)console.log(` ${a.date} ${(a.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${a.title}`);console.log("")}}console.log(`\u5171 ${r} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}import{readFileSync as A,writeFileSync as U,mkdirSync as _,unlinkSync as z,existsSync as H,readdirSync as Y,rmdirSync as q}from"fs";import{join as k,basename as T,dirname as D,resolve as w,sep as I}from"path";function J(e,s){let t=w(e),n=w(s);for(;t!==n&&t.startsWith(n+I);){try{if(Y(t).length>0)break;q(t)}catch{break}t=D(t)}}function j(e){let s=A(e,"utf8"),t=[],n=/## (.+?)\n\n> [^\n]*完成时间:([^\n]+)\n\n([\s\S]*?)(?=\n\n---\n\n## |$)/g,r;for(;r=n.exec(s);)t.push({block:r[0].trim(),completed:r[2].trim()});return t}function K(e=".tasks"){let s=k(e,"active"),t=k(e,"archive"),n=u(s);if(n.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[]};let r=[],i=[];for(let a of n){let p=A(a,"utf8"),c=d(p);if(!$.includes(c.status))continue;let m=c.completed;if(!m){i.push(T(a,".md")),console.log(`\u8DF3\u8FC7 ${T(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}r.push({file:a,name:T(a,".md"),owner:c.owner||"\u672A\u6807\u6CE8",status:c.status||"\u672A\u6807\u6CE8",scope:c.scope||"-",completed:m,body:h(p).trim()})}if(r.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:i};let o={};for(let a of r){let p=a.completed.replace(/-/g,"").slice(0,8);(o[p]||=[]).push(a)}for(let[a,p]of Object.entries(o)){let c=k(t,a.slice(0,6));_(c,{recursive:!0});let m=k(c,`${a}.md`),y=H(m)?j(m):[];y.push(...p.map(l=>({block:`## ${l.name}
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}
3
3
 
4
- > \u8D1F\u8D23\u4EBA\uFF1A${l.owner}\u3000\u72B6\u6001\uFF1A${l.status}\u3000\u8303\u56F4\uFF1A${l.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${l.completed}
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}
5
5
 
6
- ${l.body}`,completed:l.completed}))),y.sort((l,E)=>l.completed.localeCompare(E.completed)),U(m,`# ${a} \u5F52\u6863
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
7
7
 
8
8
  > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
9
9
 
10
- ${y.map(l=>l.block).join(`
10
+ ${p.map(i=>i.block).join(`
11
11
 
12
12
  ---
13
13
 
14
14
  `)}
15
- `,"utf8");for(let l of p)z(l.file);J(D(p[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${p.length} \u4E2A\u4EFB\u52A1 \u2192 ${a}.md`)}return console.log(`\u5171\u5F52\u6863 ${r.length} \u4E2A\u4EFB\u52A1`),{archived:r.length,skipped:i}}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"}},vt="zh";import{readdirSync as Q}from"fs";import{join as L}from"path";function F(e){let s=[],t=new Set(["node_modules",".git","dist"]),n=r=>{let i;try{i=Q(r,{withFileTypes:!0})}catch{return}for(let o of i)if(o.isDirectory()){if(t.has(o.name))continue;n(L(r,o.name))}else o.name==="CHANGELOG.md"&&s.push(L(r,o.name))};return n(e),s}import{readFileSync as V,writeFileSync as X}from"fs";function Z(){let e=new Date,s=t=>String(t).padStart(2,"0");return`${e.getFullYear()}-${s(e.getMonth()+1)}-${s(e.getDate())}`}function W(e,s,t){let n=V(e,"utf8"),r=n.includes(`\r
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
16
16
  `)?`\r
17
17
  `:`
18
- `,i=n.replace(/\r\n/g,`
19
- `);for(let[c,m]of Object.entries(t.replacements))i=i.replaceAll(c,m);for(;i.includes(`${t.deps}
20
- ${t.deps}`);)i=i.replace(`${t.deps}
21
- ${t.deps}`,t.deps);for(;;){let c=i.replace(/^- (.+)\n- \1$/gm,"- $1");if(c===i)break;i=c}let o=i.split(`
22
- `),a=[];for(let c=0;c<o.length;c++)a.push(o[c]),/^## \d+\.\d+\.\d+/.test(o[c])&&!o[c+1]?.startsWith("> ")&&a.push(`> ${s} ${t.released}`);let p=a.join(`
23
- `);return p!==i?(X(e,p.replace(/\n/g,r),"utf8"),!0):!1}function tt(e,s,t){let n=[];for(let r of F(e))W(r,s,t)&&n.push(r);if(n.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let r of n)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${r}`);return n}export{vt as DEFAULT_LANG,$ as DONE_STATUSES,K as archiveTasks,F as collectChangelogs,x as dateFromFileName,W as formatChangelog,tt as formatChangelogs,$t as languages,u as listTaskFiles,b as listTasks,Z as localDate,j as parseArchiveTasks,d as parseFrontmatter,P as printTasks,h as stripFrontmatter};
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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fxri/toolkit",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "description": "开发工程化工具集:任务管理 + 多语言 CHANGELOG 发布。",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -44,7 +44,8 @@
44
44
  "i18n"
45
45
  ],
46
46
  "dependencies": {
47
- "@changesets/cli": "^2.31.1"
47
+ "@changesets/cli": "^2.31.1",
48
+ "commander": "^14.0.0"
48
49
  },
49
50
  "devDependencies": {
50
51
  "@types/node": "^20.19.21",