@fxri/toolkit 1.1.0 → 1.1.2
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 +18 -0
- package/README.md +10 -0
- package/dist/cli.cjs +10 -10
- package/dist/cli.js +10 -10
- package/package.json +7 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
# @fxri/toolkit
|
|
2
2
|
|
|
3
|
+
## 1.1.2
|
|
4
|
+
> 2026-09-03 发布
|
|
5
|
+
|
|
6
|
+
### 🐛 补丁修复
|
|
7
|
+
|
|
8
|
+
- package.json 补充 repository 字段,npm 包详情页展示 GitHub 仓库地址。
|
|
9
|
+
|
|
10
|
+
## 1.1.1
|
|
11
|
+
> 2026-09-03 发布
|
|
12
|
+
|
|
13
|
+
### 🐛 补丁修复
|
|
14
|
+
|
|
15
|
+
- CLI 改用 Commander 实现,新增 --help/--version 与 tasks/changelog 子命令帮助,changelog 透传子命令支持未知选项;commander@^14 作为运行时依赖。
|
|
16
|
+
|
|
3
17
|
## 1.1.0
|
|
18
|
+
|
|
4
19
|
> 2026-09-03 发布
|
|
5
20
|
|
|
6
21
|
### ✨ 新增功能
|
|
@@ -8,6 +23,7 @@
|
|
|
8
23
|
- 新增隐私脱敏能力:落盘记录自由文本时默认对邮箱、手机号、身份证、IPv4、密钥、JWT、内网 URL 做掩码,支持 --no-redact / FX_REDACT / .toolkitrc.json 三档开关与自定义规则;归档任务改为按完成时间降序并规范化 completed;修复 CHANGELOG 日期补全重复插入。
|
|
9
24
|
|
|
10
25
|
## 1.0.2
|
|
26
|
+
|
|
11
27
|
> 2026-09-03 发布
|
|
12
28
|
|
|
13
29
|
### 🐛 补丁修复
|
|
@@ -15,6 +31,7 @@
|
|
|
15
31
|
- README 新增「方案落盘(任务区)」章节,明确 npx→ 全局 → 兜底输出的调用优先级,以及 toolkit tasks 校验/归档与 changelog 变更集/发版的使用流程。
|
|
16
32
|
|
|
17
33
|
## 1.0.1
|
|
34
|
+
|
|
18
35
|
> 2026-09-02 发布
|
|
19
36
|
|
|
20
37
|
### 🐛 补丁修复
|
|
@@ -27,6 +44,7 @@
|
|
|
27
44
|
- 移除公开包元数据中的私有仓库地址
|
|
28
45
|
|
|
29
46
|
## 1.0.0
|
|
47
|
+
|
|
30
48
|
> 2026-09-02 发布
|
|
31
49
|
|
|
32
50
|
### ✨ 新增功能
|
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
|
|
@@ -138,7 +146,9 @@ export const languages = {
|
|
|
138
146
|
| 能力 | Node 20 | Node 18 |
|
|
139
147
|
| --- | --- | --- |
|
|
140
148
|
| 安装 | ✅ | ✅(npm 报 EBADENGINE 警告) |
|
|
149
|
+
| 帮助 / 版本(--help / --version) | ✅ | ✅ |
|
|
141
150
|
| tasks(总览 / 归档) | ✅ | ✅ |
|
|
151
|
+
| 隐私脱敏(含 --no-redact 开关) | ✅ | ✅ |
|
|
142
152
|
| changelog format(纯格式化) | ✅ | ✅ |
|
|
143
153
|
| changelog init/add/version/publish | ✅ | ❌ |
|
|
144
154
|
|
package/dist/cli.cjs
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`);let
|
|
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${
|
|
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
|
-
${b(
|
|
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
|
-
${p.map(
|
|
11
|
+
${p.map(i=>i.block).join(`
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
`)}
|
|
16
|
-
`,"utf8");for(let
|
|
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
19
|
`,s=o.replace(/\r\n/g,`
|
|
20
|
-
`),l=s;for(let[p,
|
|
20
|
+
`),l=s;for(let[p,i]of Object.entries(t.replacements))l=l.replaceAll(p,i);for(;l.includes(`${t.deps}
|
|
21
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
|
|
23
|
-
`),g=[];for(let p=0;p<
|
|
24
|
-
`),h=b(u,r);return h!==s?((0,
|
|
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
|
|
3
|
-
`);let
|
|
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${
|
|
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
|
-
${
|
|
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
|
-
${m.map(
|
|
11
|
+
${m.map(i=>i.block).join(`
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
`)}
|
|
16
|
-
`,"utf8");for(let
|
|
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
19
|
`,s=o.replace(/\r\n/g,`
|
|
20
|
-
`),l=s;for(let[m,
|
|
20
|
+
`),l=s;for(let[m,i]of Object.entries(t.replacements))l=l.replaceAll(m,i);for(;l.includes(`${t.deps}
|
|
21
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
|
|
23
|
-
`),p=[];for(let m=0;m<
|
|
24
|
-
`),
|
|
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fxri/toolkit",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "开发工程化工具集:任务管理 + 多语言 CHANGELOG 发布。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
"email": "tqy@fxri.net",
|
|
9
9
|
"url": "https://fxri.net:444/"
|
|
10
10
|
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/fxri-net/toolkit.git"
|
|
14
|
+
},
|
|
11
15
|
"type": "module",
|
|
12
16
|
"main": "./dist/index.js",
|
|
13
17
|
"exports": {
|
|
@@ -44,7 +48,8 @@
|
|
|
44
48
|
"i18n"
|
|
45
49
|
],
|
|
46
50
|
"dependencies": {
|
|
47
|
-
"@changesets/cli": "^2.31.1"
|
|
51
|
+
"@changesets/cli": "^2.31.1",
|
|
52
|
+
"commander": "^14.0.0"
|
|
48
53
|
},
|
|
49
54
|
"devDependencies": {
|
|
50
55
|
"@types/node": "^20.19.21",
|