@fxri/toolkit 1.4.2 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +20 -8
- package/SPEC.md +9 -6
- package/dist/cli.cjs +42 -30
- package/dist/cli.js +42 -30
- package/dist/index.cjs +41 -29
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +41 -29
- package/package.json +12 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
# @fxri/toolkit
|
|
2
2
|
|
|
3
|
+
## 1.5.0
|
|
4
|
+
> 2026-09-03 发布
|
|
5
|
+
|
|
6
|
+
### ✨ 新增功能
|
|
7
|
+
|
|
8
|
+
- 任务校验增强:`depends_on` 引用自动归一(带 `.md` 后缀也能命中与成环检测);新增软告警——缺 owner/created、created 与文件名日期不一致、文件命名不规范、`completed` 仅日期未补全;未勾选 `- [ ]` 默认纳入未闭合待办扫描(`check.includeCheckbox` 可关)
|
|
9
|
+
- 归档归一化增强:`normalize` 检出疑似任务块(元数据缺「完成时间」被并块);`--fix` 自动把完成时间漂移块迁移到对应日期归档文件并清理冗余分隔符
|
|
10
|
+
- `completed` 落盘统一补 `00:00` 定宽;导入文件名冲突序号改为 `-1` 起,标题截断时告警
|
|
11
|
+
- 脱敏规则配置即时生效(移除模块级缓存);自定义导入列映射英文键大小写不敏感
|
|
12
|
+
- 空态提示区分「视图为空 / 过滤无匹配」,默认视图带过滤空结果时给出 `--view` 引导提示
|
|
13
|
+
- 工程化:接入 vitest(20 用例)、eslint/typecheck 脚本与 GitHub Actions CI,补充 changesets 自举发版说明
|
|
14
|
+
|
|
3
15
|
## 1.4.2
|
|
16
|
+
|
|
4
17
|
> 2026-09-03 发布
|
|
5
18
|
|
|
6
19
|
### 🐛 补丁修复
|
|
@@ -8,6 +21,7 @@
|
|
|
8
21
|
- 修复隐私脱敏对密钥新格式覆盖不全:补充 GitHub 细粒度 `github_pat_`、OpenAI 项目 `sk-proj-`、Slack app 级 `xapp-` 规则(均带长度门槛防误伤);JWT 放宽为仅头段要求 `eyJ` 前缀,载荷/签名允许任意 base64url,避免真实载荷起始非 `eyJ` 时漏掩。
|
|
9
22
|
|
|
10
23
|
## 1.4.1
|
|
24
|
+
|
|
11
25
|
> 2026-09-03 发布
|
|
12
26
|
|
|
13
27
|
### 🐛 补丁修复
|
package/README.md
CHANGED
|
@@ -30,9 +30,9 @@ npx toolkit tasks --view archived # 仅已归档
|
|
|
30
30
|
npx toolkit tasks --view all # 待完成 + 已归档(状态分组,来源可辨)
|
|
31
31
|
npx toolkit tasks archive # 归档已完成任务
|
|
32
32
|
npx toolkit tasks archive --dry-run # 归档预演(只预览,不落盘)
|
|
33
|
-
npx toolkit tasks check # 校验 active(frontmatter
|
|
34
|
-
npx toolkit tasks normalize #
|
|
35
|
-
npx toolkit tasks normalize --fix # 补齐元数据 + 降序重排
|
|
33
|
+
npx toolkit tasks check # 校验 active(frontmatter/命名规范/重名/依赖闭环/未闭合待办与 - [ ])
|
|
34
|
+
npx toolkit tasks normalize # 检查归档块(元数据/疑似任务块/日期漂移/排序)
|
|
35
|
+
npx toolkit tasks normalize --fix # 补齐元数据 + 漂移块迁移到对应日期文件 + 降序重排
|
|
36
36
|
npx toolkit tasks --dir <path> # 指定任务目录(默认 .tasks)
|
|
37
37
|
```
|
|
38
38
|
|
|
@@ -45,6 +45,8 @@ npx toolkit tasks --scope 工程化 --since 2026-09-01 --until 2026-09-03
|
|
|
45
45
|
npx toolkit tasks --date 2026-09-03 # 单日(与 --since/--until 互斥)
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
⚠️ **过滤与视图**:`--owner/--scope/--status/--date/--since/--until` 只作用于所选视图,不指定 `--view` 时默认只查待完成(active)。想看归档需显式 `--view archived` 或 `--view all`;过滤落在空视图时会提示「无匹配任务」,并附 `--view` 引导提示。
|
|
49
|
+
|
|
48
50
|
导入导出(扩展名驱动,均受过滤与脱敏开关影响):
|
|
49
51
|
|
|
50
52
|
```bash
|
|
@@ -58,7 +60,7 @@ npx toolkit tasks --import tasks.json --target archive # 直接写归档
|
|
|
58
60
|
```
|
|
59
61
|
|
|
60
62
|
- 导入兼容本工具三种导出产物;表头自动识别(中文/英文别名),`.toolkitrc.json` 的 `tasks.importColumns` 可自定义列映射,优先级高于内置
|
|
61
|
-
-
|
|
63
|
+
- 文件名冲突自动追加序号(`-1`、`-2`…),不覆盖已有任务;标题过长导致文件名截断时会告警
|
|
62
64
|
|
|
63
65
|
### 任务视图与导出结构
|
|
64
66
|
|
|
@@ -107,7 +109,7 @@ npx toolkit tasks --import tasks.json --target archive # 直接写归档
|
|
|
107
109
|
| `scope` 范围 | 范围 / 项目 / 模块;scope / project |
|
|
108
110
|
| `created` 创建日期 | 创建日期 / 创建时间;created / created_at / createdAt |
|
|
109
111
|
| `updated` 更新日期 | 更新日期 / 更新时间;updated / updated_at / updatedAt |
|
|
110
|
-
| `completed` 完成时间 | 完成时间 / 完成日期 / 截止时间 / 截止日期 / 结束时间;completed / done / finished / due |
|
|
112
|
+
| `completed` 完成时间 | 完成时间 / 完成日期 / 截止时间 / 截止日期 / 结束时间;completed / done / finished / completedAt / due |
|
|
111
113
|
| `depends` 依赖 | 依赖 / 依赖任务;depends / depends_on / dependency / dependencies |
|
|
112
114
|
| `body` 正文 | 备注 / 描述 / 正文 / 说明;description / body / note / notes |
|
|
113
115
|
| 忽略列(元信息) | 视图 / 来源文件 / 文件;view / file / path |
|
|
@@ -139,7 +141,7 @@ npx toolkit changelog status / publish # 其余 changeset 子命令透传
|
|
|
139
141
|
- 环境变量:`FX_CHECK_WARN=0`
|
|
140
142
|
- 配置文件:`.toolkitrc.json` 写 `{ "check": { "warnings": false } }`
|
|
141
143
|
|
|
142
|
-
隐私脱敏同理,环境变量 `FX_REDACT`(`0` 关 / `1` 开)、配置 `redact.enabled
|
|
144
|
+
隐私脱敏同理,环境变量 `FX_REDACT`(`0` 关 / `1` 开)、配置 `redact.enabled`。`toolkit tasks check` 默认把正文未勾选的 `- [ ]` 当作未闭合待办扫描,可用 `{ "check": { "includeCheckbox": false } }` 关闭。
|
|
143
145
|
|
|
144
146
|
### 接入 package.json
|
|
145
147
|
|
|
@@ -162,8 +164,8 @@ npx toolkit changelog status / publish # 其余 changeset 子命令透传
|
|
|
162
164
|
- **调用优先级**:`npx toolkit`(项目本地依赖)→ `toolkit`(全局安装);两者均不可用时直接以 Markdown 输出方案,不阻塞执行
|
|
163
165
|
- **规范来源**:优先读取项目根 `SPEC.md`,缺失时读取包内 `SPEC.md`(目录结构、文件命名与 frontmatter 字段均以该规范为准)
|
|
164
166
|
- **多人协作(先查后写)**:`.tasks/` 是多写者共享区,新建/更新任务前先 `toolkit tasks` 查 active 总览并核对 archive,避免重复建档;同一需求共用一个任务文件
|
|
165
|
-
- **校验**:`toolkit tasks check` 校验 active(frontmatter
|
|
166
|
-
- **归档**:任务完成后执行 `toolkit tasks archive`(可 `--dry-run`
|
|
167
|
+
- **校验**:`toolkit tasks check` 校验 active(frontmatter 合法性、owner/created/文件命名规范、重名、depends_on 闭环与引用归一、未闭合待办与 `- [ ]`,可配置关闭复选框扫描);`toolkit tasks normalize` 检查归档块(元数据完整性/疑似任务块/漂移/排序),`--fix` 补齐元数据并将漂移块迁移到对应日期文件
|
|
168
|
+
- **归档**:任务完成后执行 `toolkit tasks archive`(可 `--dry-run` 预演);归档采用排他锁防并发覆盖。归档完成后若 `.changeset`(相对当前目录)无待发布变更集会有提示,仅为提醒,不影响归档
|
|
167
169
|
- **版本管理**:涉及发版时先 `toolkit changelog` 创建变更集,再 `toolkit changelog version` 发版并格式化 CHANGELOG
|
|
168
170
|
|
|
169
171
|
### 归档与提交约束
|
|
@@ -233,6 +235,16 @@ const masked = redactText("联系 tqy@fxri.net", true) // → "联系 t***@***.n
|
|
|
233
235
|
|
|
234
236
|
每个语言的 `ChangelogLanguage` 结构:`replacements`(标题替换映射,源标题 → 目标标题)、`deps`(依赖更新条目文案)、`released`(发布日期后缀)。库 API 侧也可直接操作 `languages` 对象追加语言。
|
|
235
237
|
|
|
238
|
+
## 🧭 维护者发版(本仓库自举 changesets)
|
|
239
|
+
|
|
240
|
+
本仓库(toolkit 自身)与对外用法一致,用 changesets 驱动发版,配合中文格式转换:
|
|
241
|
+
|
|
242
|
+
1. 记录变更:`pnpm changeset`(或 `pnpm build && node ./dist/cli.js changelog`),选择版本类型并填写变更描述
|
|
243
|
+
2. 消费变更集:`pnpm build && node ./dist/cli.js changelog version`——changesets 写版本号与英文 CHANGELOG 后,工具自动做中文标题格式化
|
|
244
|
+
3. 微调:将变更条目润色为中文说明(与既有 CHANGELOG 风格一致),删除已消费的 `.changeset/*.md`
|
|
245
|
+
4. 提交:代码与 CHANGELOG/版本改动分两次提交(如「修复:…」「文档:发布 vX.Y.Z」)
|
|
246
|
+
5. 标签与发布:`git tag vX.Y.Z` 并推送各 remote,再执行 `pnpm publish`(`pnpm release` = build + publish)
|
|
247
|
+
|
|
236
248
|
## 🔒 隐私脱敏
|
|
237
249
|
|
|
238
250
|
落盘记录自由文本(任务正文/标题、CHANGELOG 条目)时默认脱敏敏感信息,`owner` 等结构化 frontmatter 字段不脱敏。
|
package/SPEC.md
CHANGED
|
@@ -53,14 +53,16 @@ scope: app
|
|
|
53
53
|
|
|
54
54
|
| 字段 | 类型 | 说明 |
|
|
55
55
|
| --- | --- | --- |
|
|
56
|
-
| owner | string | 负责人(git
|
|
56
|
+
| owner | string | 负责人(git 用户名);缺失时 `check` 软告警 |
|
|
57
57
|
| status | enum | `待办` / `进行中` / `已完成` / `阻塞` / `已放弃` |
|
|
58
|
-
| created | string | 创建日 `YYYYMMDD` |
|
|
58
|
+
| created | string | 创建日 `YYYYMMDD`,应等于文件名日期前缀;缺失/不一致/格式错误时 `check` 软告警 |
|
|
59
59
|
| updated | string | 更新日 `YYYYMMDD` |
|
|
60
|
-
| completed | string | 完成时间 `YYYY-MM-DD HH:mm`,`status` 为 `已完成`/`已放弃`
|
|
61
|
-
| depends_on | array |
|
|
60
|
+
| completed | string | 完成时间 `YYYY-MM-DD HH:mm`,`status` 为 `已完成`/`已放弃` 时必填;纯日期写法(`YYYY-MM-DD`)会被补齐 `00:00`,仅日期未补全完整时间会软告警 |
|
|
61
|
+
| depends_on | array | 依赖任务文件名,引用可带 `.md` 扩展名(校验时自动归一为不含扩展名的 basename) |
|
|
62
62
|
| scope | string | 影响范围 |
|
|
63
63
|
|
|
64
|
+
> 文件名命名 `{年月日}-{用户名}-{任务简述}.md`(`年月日` = 创建日),不符规范或与 created 不一致时 `check` 软告警。
|
|
65
|
+
|
|
64
66
|
## 3. archive 归档文件
|
|
65
67
|
|
|
66
68
|
### 3.1 命名
|
|
@@ -97,8 +99,9 @@ scope: app
|
|
|
97
99
|
3. `待办` / `进行中` / `阻塞` 均不归档。
|
|
98
100
|
4. 归档文件按 `completed` 的日期(`YYYYMMDD`)划分。
|
|
99
101
|
5. 归档文件内任务按 `completed` **降序**排序(最新在前,`YYYY-MM-DD HH:mm` 定宽字符串比较即时间序)。
|
|
100
|
-
6. **完成时间口径**:`completed` 只填真实收工时间,日期应与归档文件日期一致;不一致属「日期漂移」,`toolkit tasks
|
|
101
|
-
7.
|
|
102
|
+
6. **完成时间口径**:`completed` 只填真实收工时间,日期应与归档文件日期一致;不一致属「日期漂移」,`toolkit tasks normalize` 会检出,`--fix` 自动把漂移块迁移到对应日期文件(迁移前可用 `normalize` 只读检查)。
|
|
103
|
+
7. **疑似任务块**:任务块判定要求标题后首个非空行为含「完成时间」的元数据行;形如 `{年月日}-{负责人}-{简述}` 的 `## ` 标题后跟 `> ` 元数据但缺「完成时间」时,会被视为疑似任务块并在 `normalize` 检出提示人工确认(不自动修复)。
|
|
104
|
+
8. **并发归档防护**:归档采用排他锁(`.archive.lock`),检测到并发归档时跳过并告警;`--dry-run` 可预演归档动作而不落盘。
|
|
102
105
|
|
|
103
106
|
## 5. 其他语言实现要点
|
|
104
107
|
|
package/dist/cli.cjs
CHANGED
|
@@ -1,70 +1,82 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var ze=()=>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,b=ze();var Ie=require("commander"),De=require("module"),_e=require("child_process"),
|
|
3
|
-
`).trimEnd(),o=[];for(let s=0;s<n.length;s++){let i=n[s],a=s+1<n.length?n[s+1]:
|
|
2
|
+
var ze=()=>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,b=ze();var Ie=require("commander"),De=require("module"),_e=require("child_process"),X=require("fs"),Be=require("path");var et=require("fs"),ke=require("path");function E(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!e)return{};let n={};for(let r of e[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let s=r.slice(0,o).trim(),i=r.slice(o+1).trim();(i.startsWith("'")&&i.endsWith("'")||i.startsWith('"')&&i.endsWith('"'))&&(i=i.slice(1,-1)),s&&(n[s]=i)}return n}function z(t){let e=t.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return e?t.slice(e[0].length):t}var D=require("fs"),_=require("path");function S(t){if(!(0,D.existsSync)(t))return[];let e=[];for(let n of(0,D.readdirSync)(t)){let r=(0,_.join)(t,n);if((0,D.statSync)(r).isDirectory())for(let o of(0,D.readdirSync)(r))o.endsWith(".md")&&e.push((0,_.join)(r,o));else n.endsWith(".md")&&e.push(r)}return e}function W(t){let n=(0,_.basename)(t,(0,_.extname)(t)).match(/^(\d{8})/);return n?n[1]:""}var de=require("fs"),ue=require("path"),U;function We(){if(U!==void 0)return U;U=null;try{let t=(0,de.readFileSync)((0,ue.join)(process.cwd(),".toolkitrc.json"),"utf8");U=JSON.parse(t)}catch{}return U}function I(t){let e=We();if(!e)return;let n=e[t];return typeof n=="object"&&n!==null?n:void 0}function Ue(t,e){let n=t.trim().toLowerCase();return["1","true","on","yes"].includes(n)?!0:["0","false","off","no"].includes(n)?!1:e}function Y(t,e,n,r){if(t!==void 0)return t;let o=process.env[e];return o!==void 0&&o!==""?Ue(o,r):n!==void 0?n:r}var Ye=[{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,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"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:"GitHub\u7EC6\u7C92\u5EA6\u5BC6\u94A5",pattern:/\bgithub_pat_[A-Za-z0-9_]{80,}\b/g,replacement:"github_pat_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"OpenAI\u9879\u76EE\u5BC6\u94A5",pattern:/\bsk-proj-[A-Za-z0-9_-]{40,}\b/g,replacement:"sk-proj-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"Slack\u5E94\u7528\u4EE4\u724C",pattern:/\bxapp-\d+-[A-Za-z0-9-]{15,}\b/g,replacement:"xapp-****"},{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.***.***"}];function pe(){let t=I("redact");return t?{enabled:typeof t.enabled=="boolean"?t.enabled:void 0,disable:Array.isArray(t.disable)?t.disable.filter(e=>typeof e=="string"):void 0,rules:Array.isArray(t.rules)?t.rules:void 0}:null}function Pe(){let t=pe(),e=new Set(t?.disable??[]),n=[];for(let r of t?.rules??[])try{n.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return[...n,...Ye.filter(r=>!e.has(r.name))]}function A(t,e){if(!e||!t)return t;let n=t;for(let r of Pe())n=n.replace(r.pattern,r.replacement);return n}function Q(t){return Y(t,"FX_REDACT",pe()?.enabled,!0)}var te=require("fs"),O=require("path");function $(t){let e=t.trim(),n=e.match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);if(n||(n=e.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/)),!n)return e;let r=`${n[1]}-${n[2].padStart(2,"0")}-${n[3].padStart(2,"0")}`;return n.length===4?`${r} 00:00`:`${r} ${n[4].padStart(2,"0")}:${n[5]}`}function He(t){let e=t.match(/^\d{8}-(.+?)-/);return e?e[1]:""}function ee(t,e){return`> \u8D1F\u8D23\u4EBA\uFF1A${He(t)||"\u672A\u6807\u6CE8"}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A-\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${$(e)}`}function j(t){let e=t.split(/\r?\n/),n=[];for(let s=0;s<e.length;s++){if(!/^## .+/.test(e[s]))continue;let i=s+1;for(;i<e.length&&e[i].trim()==="";)i++;let a=e[i]?.trim()??"";a.startsWith("> ")&&a.includes("\u5B8C\u6210\u65F6\u95F4")&&n.push(s)}if(n.length===0)return{header:t,blocks:[]};let r=e.slice(0,n[0]).join(`
|
|
3
|
+
`).trimEnd(),o=[];for(let s=0;s<n.length;s++){let i=n[s],a=s+1<n.length?n[s+1]:e.length,l=e.slice(i,a).join(`
|
|
4
4
|
`).trim().split(`
|
|
5
|
-
`),c=l[0].replace(/^## /,""),
|
|
6
|
-
`).trim()})
|
|
5
|
+
`),c=l[0].replace(/^## /,""),d=null,h="",m=1;for(let p=1;p<l.length;p++){let u=l[p].trim();if(u.startsWith("> ")&&u.includes("\u5B8C\u6210\u65F6\u95F4")){d=l[p];let g=u.match(/完成时间:(.+)$/);g&&(h=g[1].trim()),m=p+1;break}}o.push({title:c,metaLine:d,completed:h,body:Je(l.slice(m))})}return{header:r,blocks:o}}function Je(t){let e=[...t];for(;;){for(;e.length>0&&e[e.length-1].trim()==="";)e.pop();if(e.length>0&&/^---+\s*$/.test(e[e.length-1].trim()))e.pop();else break}return e.join(`
|
|
6
|
+
`).trim()}function me(t){let e=t.split(/\r?\n/),n=[];for(let r=0;r<e.length;r++){let o=e[r].match(/^## (\d{8}-[^-]+-.+)$/)?.[1];if(!o)continue;let s=r+1;for(;s<e.length&&e[s].trim()==="";)s++;let i=e[s]?.trim()??"";i.startsWith("> ")&&!i.includes("\u5B8C\u6210\u65F6\u95F4")&&n.push(o)}return n}function P(t){let e=t.metaLine??(t.completed?ee(t.title,t.completed):null);return e?`## ${t.title}
|
|
7
7
|
|
|
8
|
-
${
|
|
8
|
+
${e}
|
|
9
9
|
|
|
10
|
-
${
|
|
10
|
+
${t.body}`:`## ${t.title}
|
|
11
11
|
|
|
12
|
-
${
|
|
13
|
-
`),o.length===0){console.log("\u65E0\u5339\u914D\u4EFB\u52A1");return}let a={};for(let l of o)(a[l.status]||=[]).push(l);for(let l of
|
|
12
|
+
${t.body}`}var N=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u963B\u585E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"];function Ve(t){if(Array.isArray(t))return t.map(String);if(typeof t!="string"||!t.trim())return[];let e=t.trim();if(e==="[]")return[];try{let n=JSON.parse(e);if(Array.isArray(n))return n.map(String)}catch{}return[...e.matchAll(/'([^']*)'|"([^"]*)"/g)].map(n=>n[1]??n[2])}function x(t){let e=t.trim().match(/^(\d{4})[-/]?(\d{1,2})[-/]?(\d{1,2})/);return e?`${e[1]}-${e[2].padStart(2,"0")}-${e[3].padStart(2,"0")}`:""}function ge(t,e){return(0,O.relative)(t,e).split(O.sep).join("/")}function Ze(t=".tasks"){let e=(0,O.join)(t,"active");return S(e).map(n=>{let r=(0,te.readFileSync)(n,"utf8"),o=E(r);return{view:"\u5F85\u5B8C\u6210",title:r.split(/\r?\n/).find(i=>i.startsWith("# ")&&!i.startsWith("#!"))?.replace(/^#\s*/,"")||(0,O.basename)(n,".md"),status:o.status||"\u672A\u6807\u6CE8",owner:o.owner||"\u672A\u6807\u6CE8",scope:o.scope||"-",created:o.created||W(n),updated:o.updated||"",completed:o.completed||"",depends:Ve(o.depends_on),file:ge(t,n)}})}function Ge(t){let e={owner:"\u672A\u6807\u6CE8",status:"\u5DF2\u5B8C\u6210",scope:"-"};if(!t)return e;for(let n of t.replace(/^>\s*/,"").split(/\s* \s*/)){let[r,...o]=n.split(/[::]/),s=o.join("").trim();s&&(r.includes("\u8D1F\u8D23\u4EBA")?e.owner=s:r.includes("\u72B6\u6001")?e.status=s:r.includes("\u8303\u56F4")&&(e.scope=s))}return e}function qe(t=".tasks"){let e=(0,O.join)(t,"archive"),n=[];for(let r of S(e)){let o=(0,te.readFileSync)(r,"utf8");for(let s of j(o).blocks){let i=Ge(s.metaLine);n.push({view:"\u5DF2\u5F52\u6863",title:s.title,status:i.status,owner:i.owner,scope:i.scope,created:"",updated:"",completed:s.completed,depends:[],file:ge(t,r)})}}return n}function Xe(t,e){if(e.owner&&t.owner!==e.owner||e.scope&&t.scope!==e.scope||e.status?.length&&!e.status.includes(t.status))return!1;if(e.date||e.since||e.until){let n=e.date?x(e.date):x(e.since||""),r=e.date?x(e.date):x(e.until||"");if(!n&&!r||!(t.view==="\u5DF2\u5F52\u6863"?[x(t.completed)]:[x(t.created),x(t.updated)].filter(Boolean)).some(i=>i&&(!n||i>=n)&&(!r||i<=r)))return!1}return!0}function he(t){return t.view==="\u5DF2\u5F52\u6863"?x(t.completed):x(t.created||t.updated||t.completed)}function fe(t){let e=t.view==="\u5DF2\u5F52\u6863"?t.completed:t.completed||t.updated||t.created,n=x(e);if(!n)return"";let r=e.match(/(\d{1,2}):(\d{2})/);return n.replace(/-/g,"")+(r?`${r[1].padStart(2,"0")}${r[2]}`:"0000")}function Ke(t){let e=new Map(N.map((n,r)=>[n,r]));return[...t].sort((n,r)=>{let o=e.get(n.status)??N.length,s=e.get(r.status)??N.length;return o!==s?o-s:fe(r).localeCompare(fe(n))})}function Qe(t){let e={},n={};for(let r of t)e[r.status]=(e[r.status]||0)+1,n[r.owner]=(n[r.owner]||0)+1;return{total:t.length,byStatus:e,byOwner:n}}function H(t=".tasks",e="active",n={}){let r=[];(e==="active"||e==="all")&&r.push(...Ze(t)),(e==="archived"||e==="all")&&r.push(...qe(t)),r=r.filter(s=>Xe(s,n));let o=Ke(r);return{rows:o,summary:Qe(o)}}function we(t=".tasks",e="active",n={},r=!0){let{rows:o,summary:s}=H(t,e,n);if(console.log(`\u4EFB\u52A1\u603B\u89C8\uFF08${e==="active"?"\u5F85\u5B8C\u6210":e==="archived"?"\u5DF2\u5F52\u6863":"\u5F85\u5B8C\u6210 + \u5DF2\u5F52\u6863"}\uFF09\uFF1A
|
|
13
|
+
`),o.length===0){let l=Object.values(n).some(c=>Array.isArray(c)?c.length>0:!!c);console.log(l?"\u65E0\u5339\u914D\u4EFB\u52A1":e==="archived"?"\u5F53\u524D\u65E0\u5DF2\u5F52\u6863\u4EFB\u52A1":e==="all"?"\u5F53\u524D\u65E0\u4EFB\u52A1":"\u5F53\u524D\u65E0\u5F85\u5B8C\u6210\u4EFB\u52A1");return}let a={};for(let l of o)(a[l.status]||=[]).push(l);for(let l of N){let c=a[l]||[];if(c.length!==0){console.log(`\u3010${l}\u3011${c.length} \u9879`);for(let d of c){let h=e==="all"?`${d.view} `:"";console.log(` ${he(d)} ${h}${(d.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${A(d.title,r)}\uFF08${d.scope||"-"}\uFF09`)}console.log("")}}tt(s)}function tt(t){let e=N.filter(r=>t.byStatus[r]),n=Object.keys(t.byOwner).sort((r,o)=>t.byOwner[o]-t.byOwner[r]);console.log(`\u5171 ${t.total} \u4E2A\u4EFB\u52A1`),e.length>0&&console.log(`\u6309\u72B6\u6001\uFF1A${e.map(r=>`${r} ${t.byStatus[r]}`).join("\u3000")}`),n.length>0&&console.log(`\u6309\u8D1F\u8D23\u4EBA\uFF1A${n.map(r=>`${r} ${t.byOwner[r]}`).join("\u3000")}`)}var J=require("fs"),be=require("module");var nt=(0,be.createRequire)(b),V=[{label:"\u89C6\u56FE",value:t=>t.view==="\u5DF2\u5F52\u6863"?"\u5DF2\u5F52\u6863":"\u5F85\u5B8C\u6210"},{label:"\u4EFB\u52A1\u540D",value:t=>t.title},{label:"\u72B6\u6001",value:t=>t.status},{label:"\u8D1F\u8D23\u4EBA",value:t=>t.owner},{label:"\u8303\u56F4",value:t=>t.scope},{label:"\u521B\u5EFA\u65E5\u671F",value:t=>t.created?x(t.created):""},{label:"\u66F4\u65B0\u65E5\u671F",value:t=>t.updated?x(t.updated):""},{label:"\u5B8C\u6210\u65F6\u95F4",value:t=>t.completed},{label:"\u4F9D\u8D56",value:t=>t.depends.join(", ")},{label:"\u6765\u6E90\u6587\u4EF6",value:t=>t.file}],rt=[{label:"\u4EFB\u52A1\u540D",value:t=>t.title},{label:"\u72B6\u6001",value:t=>t.status},{label:"\u8D1F\u8D23\u4EBA",value:t=>t.owner},{label:"\u8303\u56F4",value:t=>t.scope},{label:"\u521B\u5EFA\u65E5\u671F",value:t=>t.created?x(t.created):""},{label:"\u66F4\u65B0\u65E5\u671F",value:t=>t.updated?x(t.updated):""},{label:"\u5B8C\u6210\u65F6\u95F4",value:t=>t.completed},{label:"\u4F9D\u8D56",value:t=>t.depends.join(", ")},{label:"\u6765\u6E90\u6587\u4EF6",value:t=>t.file}],ot=[{label:"\u4EFB\u52A1\u540D",value:t=>t.title},{label:"\u72B6\u6001",value:t=>t.status},{label:"\u8D1F\u8D23\u4EBA",value:t=>t.owner},{label:"\u8303\u56F4",value:t=>t.scope},{label:"\u5B8C\u6210\u65F6\u95F4",value:t=>t.completed},{label:"\u6765\u6E90\u6587\u4EF6",value:t=>t.file}];function st(t){return/[",\n\r]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}function it(t,e=!0){let n=V.map(o=>o.label).join(","),r=t.map(o=>V.map(s=>{let i=s.label==="\u4EFB\u52A1\u540D"?A(s.value(o),e):s.value(o);return st(i)}).join(",")).join(`\r
|
|
14
14
|
`);return`\uFEFF${n}${r?`\r
|
|
15
|
-
${r}`:""}`}function
|
|
15
|
+
${r}`:""}`}function ne(t,e,n=!0){let r=t.map(o=>({view:o.view==="\u5DF2\u5F52\u6863"?"archived":"active",title:A(o.title,n),status:o.status,owner:o.owner,scope:o.scope,created:o.created,updated:o.updated,completed:o.completed,depends:o.depends,file:o.file}));return JSON.stringify({summary:e,items:r},null,2)}async function at(t,e,n=!0){let r=nt("exceljs"),o=new r.Workbook,s=t.filter(p=>p.view==="\u5F85\u5B8C\u6210"),i=t.filter(p=>p.view==="\u5DF2\u5F52\u6863"),a=(p,u,g)=>{p.columns=u.map(k=>({header:k.label,key:k.label,width:Math.max(k.label.length+4,14)})),p.getRow(1).font={bold:!0};for(let k of g)p.addRow(u.map(T=>T.label==="\u4EFB\u52A1\u540D"?A(T.value(k),n):T.value(k)))},l=o.addWorksheet("\u5F85\u5B8C\u6210");a(l,rt,s);let c=o.addWorksheet("\u5DF2\u5F52\u6863");a(c,ot,i);let d=o.addWorksheet("\u6C47\u603B");d.columns=[{header:"\u7C7B\u522B",key:"k",width:10},{header:"\u6570\u503C",key:"v",width:12}];let h=(p,u)=>{d.addRow([p,""]).font={bold:!0};for(let[g,k]of Object.entries(u).sort((T,L)=>L[1]-T[1]))d.addRow([g,k])};d.addRow(["\u4EFB\u52A1\u603B\u6570",e.total]).font={bold:!0},h("\u6309\u72B6\u6001",e.byStatus),h("\u6309\u8D1F\u8D23\u4EBA",e.byOwner),d.addRow([]);let m=d.addRow(V.map(p=>p.label));m.font={bold:!0};for(let p of t)d.addRow(V.map(u=>u.label==="\u4EFB\u52A1\u540D"?A(u.value(p),n):u.value(p)));return Buffer.from(await o.xlsx.writeBuffer())}async function ve(t,e,n,r=!0){let o=t.split(".").pop()?.toLowerCase();if(o==="csv")(0,J.writeFileSync)(t,it(e,r),"utf8");else if(o==="json")(0,J.writeFileSync)(t,ne(e,n,r),"utf8");else if(o==="xlsx")(0,J.writeFileSync)(t,await at(e,n,r));else throw new Error(`\u4E0D\u652F\u6301\u7684\u5BFC\u51FA\u683C\u5F0F\u300C${o||""}\u300D\uFF0C\u4EC5\u652F\u6301 .csv / .xlsx / .json`)}var R=require("fs"),M=require("path"),$e=require("module");var Z=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];var ct=(0,$e.createRequire)(b),xe={\u4EFB\u52A1\u540D:"title",\u6807\u9898:"title",\u4E8B\u9879:"title",\u4EFB\u52A1:"title",\u4EFB\u52A1\u6807\u9898:"title",\u4E8B\u9879\u540D\u79F0:"title",title:"title",name:"title",task:"title",subject:"title",summary:"title",\u72B6\u6001:"status",status:"status",state:"status",\u8D1F\u8D23\u4EBA:"owner",\u7ECF\u529E\u4EBA:"owner",\u5904\u7406\u4EBA:"owner",\u6267\u884C\u4EBA:"owner",\u6307\u6D3E\u7ED9:"owner",owner:"owner",assignee:"owner",handler:"owner",\u8303\u56F4:"scope",\u9879\u76EE:"scope",\u6A21\u5757:"scope",scope:"scope",project:"scope",\u521B\u5EFA\u65E5\u671F:"created",\u521B\u5EFA\u65F6\u95F4:"created",created:"created",created_at:"created",createdat:"created",\u66F4\u65B0\u65E5\u671F:"updated",\u66F4\u65B0\u65F6\u95F4:"updated",updated:"updated",updated_at:"updated",updatedat:"updated",\u5B8C\u6210\u65F6\u95F4:"completed",\u5B8C\u6210\u65E5\u671F:"completed",\u622A\u6B62\u65F6\u95F4:"completed",\u622A\u6B62\u65E5\u671F:"completed",\u7ED3\u675F\u65F6\u95F4:"completed",completed:"completed",done:"completed",finished:"completed",completedat:"completed",due:"completed",\u4F9D\u8D56:"depends",\u4F9D\u8D56\u4EFB\u52A1:"depends",depends:"depends",depends_on:"depends",dependency:"depends",dependencies:"depends",\u5907\u6CE8:"body",\u63CF\u8FF0:"body",\u6B63\u6587:"body",\u8BF4\u660E:"body",description:"body",body:"body",note:"body",notes:"body",\u89C6\u56FE:"",\u6765\u6E90\u6587\u4EF6:"",\u6587\u4EF6:"",view:"",file:"",path:""},lt=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u963B\u585E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function Te(t,e={}){let n=new Map;return t.forEach((r,o)=>{let s=String(r??"").trim().toLowerCase();if(!s)return;let i;e[s]!==void 0&&(i=e[s]),i===void 0&&(i=xe[s]),i!==""&&i&&!n.has(i)&&n.set(i,o)}),n}function dt(t){let e=[],n=t.replace(/^\uFEFF/,"").replace(/\r\n/g,`
|
|
16
16
|
`).replace(/\r/g,`
|
|
17
17
|
`),r=[],o="",s=!1;for(let i=0;i<n.length;i++){let a=n[i];s?a==='"'?n[i+1]==='"'?(o+='"',i++):s=!1:o+=a:a==='"'?s=!0:a===","?(r.push(o),o=""):a===`
|
|
18
|
-
`?(r.push(o),
|
|
19
|
-
`)+(
|
|
18
|
+
`?(r.push(o),e.push(r),r=[],o=""):o+=a}return(o!==""||r.length>0)&&(r.push(o),e.push(r)),e.filter(i=>i.length>1||(i[0]||"").trim()!=="")}function ut(t,e){let n=dt(t);if(n.length===0)return[];let r=Te(n[0],e),o=[];for(let s=1;s<n.length;s++){let i={};for(let[a,l]of r)i[a]=(n[s][l]??"").trim();(i.title||Object.keys(i).length>0)&&o.push(i)}return o}function pt(t,e){let n=[];for(let r=1;r<=(t.rowCount||0);r++){let o=t.getRow(r),s=[];for(let a=1;a<=(o.cellCount||0);a++)s.push(o.getCell(a).text??"");if(s.every(a=>a.trim()===""))continue;let i=Te(s,e);if(i.has("title")){for(let a=r+1;a<=t.rowCount;a++){let l=t.getRow(a),c={},d=!0;for(let[h,m]of i){let p=(l.getCell(m+1).text??"").trim();p&&(d=!1),c[h]=p}!d&&(c.title||Object.keys(c).length>0)&&n.push(c)}break}}return n}async function mt(t,e){let n=ct("exceljs"),r=new n.Workbook;await r.xlsx.readFile(t);let o=[];for(let s of r.worksheets)s.name.includes("\u6C47\u603B")||o.push(...pt(s,e));return o}function ft(t,e){let n=JSON.parse(t),r=Array.isArray(n)?n:Array.isArray(n.items)?n.items:[],o=[];for(let s of r){if(!s||typeof s!="object")continue;let i={};for(let[a,l]of Object.entries(s)){let c=a.trim().toLowerCase(),d;e[c]!==void 0&&(d=e[c]),d===void 0&&(d=xe[c]),d&&(Array.isArray(l)?i[d]=l.join(","):l!=null&&(i[d]=String(l)))}o.push(i)}return o}function gt(t){let e=t.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})/);return e?`${e[1]}${e[2].padStart(2,"0")}${e[3].padStart(2,"0")}`:t.trim().replace(/[-/]/g,"")}function ht(t){let e=t.trim().replace(/[\\/:*?"<>|]/g," ").replace(/\s+/g," "),n=e.length>24;return{slug:e.slice(0,24).trim().replace(/\s+/g,"-")||"\u4EFB\u52A1",truncated:n}}function kt(t,e,n){let r=(t.title||"").trim();if(!r)return n.push(`\u8DF3\u8FC7\u4E00\u884C\uFF1A\u7F3A\u5C11\u4EFB\u52A1\u540D\uFF08${Object.entries(t).slice(0,3).map(([c,d])=>`${c}=${d}`).join(" ")}\uFF09`),{ok:!1};let o=(t.status||"").trim()||"\u5F85\u529E";lt.includes(o)||(n.push(`\u4EFB\u52A1\u300C${r}\u300D\u72B6\u6001\u300C${o}\u300D\u975E\u6CD5\uFF0C\u5DF2\u5F52\u4E3A\u5F85\u529E`),o="\u5F85\u529E");let s=t.completed?.trim()?$(t.completed.trim()):"";s&&!Z.includes(o)&&(n.push(`\u4EFB\u52A1\u300C${r}\u300D\u5E26\u5B8C\u6210\u65F6\u95F4\u4F46\u72B6\u6001\u4E3A\u300C${o}\u300D\uFF0C\u5DF2\u7F6E\u4E3A\u5DF2\u5B8C\u6210`),o="\u5DF2\u5B8C\u6210");let i=(t.owner||"").trim()||e.owner||"";i=i.replace(/\s+/g,"");let a=(t.scope||"").trim()||e.scope||"-",l=(t.depends||"").split(/[,,;;]/).map(c=>c.trim()).filter(Boolean);return{ok:!0,t:{title:r,status:o,owner:i||"\u672A\u6807\u6CE8",scope:a,created:gt(t.created||""),completed:s,depends:l,body:t.body?.trim()||""}}}function ye(){let t=new Date,e=n=>String(n).padStart(2,"0");return`${t.getFullYear()}${e(t.getMonth()+1)}${e(t.getDate())}`}function wt(t,e,n,r){let o=e.created||ye(),s=(0,M.join)(t,"active",o.slice(0,6)),{slug:i,truncated:a}=ht(e.title);a&&r.push(`\u4EFB\u52A1\u300C${e.title}\u300D\u6807\u9898\u8FC7\u957F\uFF0C\u6587\u4EF6\u540D\u5DF2\u622A\u65AD`);let l=`${o}-${e.owner}-${i}`,c=1,d=(0,M.join)(s,`${l}.md`);for(;(0,R.existsSync)(d);)d=(0,M.join)(s,`${l}-${c++}.md`);let m=["---",`owner: ${e.owner}`,`status: ${e.status}`,`created: ${o}`,`updated: ${ye()}`,`completed: ${e.completed?`'${e.completed}'`:"''"}`,`depends_on: ${JSON.stringify(e.depends)}`,`scope: ${e.scope}`,"---","",`# ${e.title}`].join(`
|
|
19
|
+
`)+(e.body?`
|
|
20
20
|
|
|
21
|
-
${
|
|
21
|
+
${e.body}
|
|
22
22
|
`:`
|
|
23
|
-
`);return n||((0,
|
|
23
|
+
`);return n||((0,R.mkdirSync)(s,{recursive:!0}),(0,R.writeFileSync)(d,m,"utf8")),d}function bt(t,e,n,r){let o=e.completed||(e.status==="\u5DF2\u5B8C\u6210",""),s=o?x(o):"";if(!s)return r.push(`\u4EFB\u52A1\u300C${e.title}\u300D\u7F3A\u5C11\u5B8C\u6210\u65F6\u95F4\uFF0C\u65E0\u6CD5\u76F4\u63A5\u5F52\u6863\uFF08\u53EF\u6539\u7528 active \u76EE\u6807\uFF09`),null;let i=s.replace(/-/g,""),a=(0,M.join)(t,"archive",i.slice(0,6)),l=(0,M.join)(a,`${i}.md`),c=`> \u8D1F\u8D23\u4EBA\uFF1A${e.owner}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A${e.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${o}`,d=`# ${e.title}${e.body?`
|
|
24
24
|
|
|
25
|
-
${
|
|
25
|
+
${e.body}`:""}`,h={title:e.title,metaLine:c,completed:o,body:d};if(n)return l;(0,R.mkdirSync)(a,{recursive:!0});let m=`# ${i} \u5F52\u6863
|
|
26
26
|
|
|
27
27
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks import --target archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
28
|
-
`,
|
|
28
|
+
`,p=[];if((0,R.existsSync)(l)){let g=j((0,R.readFileSync)(l,"utf8"));g.header&&(m=g.header),p=g.blocks}p.push(h),p.sort((g,k)=>$(k.completed).localeCompare($(g.completed)));let u=p.map(g=>`## ${g.title}
|
|
29
29
|
|
|
30
|
-
${
|
|
30
|
+
${g.metaLine}
|
|
31
31
|
|
|
32
|
-
${
|
|
32
|
+
${g.body}`);return(0,R.writeFileSync)(l,`${m}
|
|
33
33
|
|
|
34
|
-
${
|
|
34
|
+
${u.join(`
|
|
35
35
|
|
|
36
36
|
---
|
|
37
37
|
|
|
38
38
|
`)}
|
|
39
|
-
`,"utf8"),l}async function
|
|
39
|
+
`,"utf8"),l}async function Se(t,e=".tasks",n={}){let r=!!n.dryRun,o=[],s=Object.fromEntries(Object.entries(n.importColumns??{}).map(([m,p])=>[String(m).trim().toLowerCase(),String(p)])),i=t.split(".").pop()?.toLowerCase(),a;if(i==="csv")a=ut((0,R.readFileSync)(t,"utf8"),s);else if(i==="xlsx")a=await mt(t,s);else if(i==="json")a=ft((0,R.readFileSync)(t,"utf8"),s);else throw new Error(`\u4E0D\u652F\u6301\u7684\u5BFC\u5165\u683C\u5F0F\u300C${i||""}\u300D\uFF0C\u4EC5\u652F\u6301 .csv / .xlsx / .json`);if(a.length===0)return console.log("\u672A\u8BC6\u522B\u5230\u53EF\u5BFC\u5165\u7684\u4EFB\u52A1\u884C\uFF08\u68C0\u67E5\u8868\u5934\u662F\u5426\u5305\u542B\u300C\u4EFB\u52A1\u540D/\u6807\u9898\u300D\u7B49\u5217\u540D\uFF09"),{created:0,skipped:0,warnings:o,dryRun:r};let l=0,c=0,d=n.target??"active";for(let m of a){let p=kt(m,n,o);if(!p.ok){c++;continue}let u=p.t;if(d==="archive"){let g=bt(e,u,r,o);if(!g){c++;continue}console.log(`${r?"[\u9884\u6F14] \u5C06\u5199\u5165\u5F52\u6863":"\u5DF2\u5199\u5165\u5F52\u6863"} \u2192 ${g}`)}else{let g=wt(e,u,r,o);console.log(`${r?"[\u9884\u6F14] \u5C06\u521B\u5EFA":"\u5DF2\u521B\u5EFA"} \u2192 ${g}`)}l++}for(let m of o)console.warn(`\u26A0\uFE0F ${m}`);return console.log(`${r?"\u9884\u6F14\u53EF\u5BFC\u5165":"\u5DF2\u5BFC\u5165"} ${l} \u4E2A\u4EFB\u52A1\uFF0C\u8DF3\u8FC7 ${c} \u884C`),{created:l,skipped:c,warnings:o,dryRun:r}}var v=require("fs"),y=require("path");function vt(t,e){let n=(0,y.resolve)(t),r=(0,y.resolve)(e);for(;n!==r&&n.startsWith(r+y.sep);){try{if((0,v.readdirSync)(n).length>0)break;(0,v.rmdirSync)(n)}catch{break}n=(0,y.dirname)(n)}}function yt(t){let e=(0,v.readFileSync)(t,"utf8"),{blocks:n}=j(e);return n.map(r=>({block:P(r),completed:r.completed}))}function Re(t=".tasks",e=!0,n={}){let{dryRun:r=!1,warn:o=!0}=n,s=(0,y.join)(t,"active"),i=(0,y.join)(t,"archive"),a=[],l=S(s);if(l.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:a};let c=[],d=[];for(let u of l){let g=(0,v.readFileSync)(u,"utf8"),k=E(g);if(!Z.includes(k.status))continue;let T=$(k.completed||"");if(!T){d.push((0,y.basename)(u,".md")),console.log(`\u8DF3\u8FC7 ${(0,y.basename)(u,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:u,name:(0,y.basename)(u,".md"),owner:k.owner||"\u672A\u6807\u6CE8",status:k.status||"\u672A\u6807\u6CE8",scope:k.scope||"-",completed:T,body:z(g).trim()})}if(c.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:d,warnings:a};if(o)for(let u of c){let g=u.completed.replace(/-/g,"").slice(0,8),k=W(u.file);k&&g!==k&&a.push(`\u4EFB\u52A1\u300C${u.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${u.completed} \u4E0E\u521B\u5EFA\u65E5 ${k} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let h={};for(let u of c){let g=u.completed.replace(/-/g,"").slice(0,8);(h[g]||=[]).push(u)}let m=null,p=(0,y.join)(t,".archive.lock");if(!r)try{m=(0,v.openSync)(p,"wx")}catch{let u="\u68C0\u6D4B\u5230\u5F52\u6863\u9501 .archive.lock\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5F52\u6863\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7";return console.warn(`\u26A0\uFE0F ${u}`),{archived:0,skipped:d,warnings:[...a,u]}}try{for(let[u,g]of Object.entries(h)){let k=(0,y.join)(i,u.slice(0,6)),T=(0,y.join)(k,`${u}.md`),L=(0,v.existsSync)(T)?yt(T):[];if(o){let f=new Set(L.map(C=>C.block.match(/^## (.+)/)?.[1]??""));for(let C of g)f.has(C.name)&&a.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${C.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}L.push(...g.map(f=>({block:`## ${f.name}
|
|
40
40
|
|
|
41
|
-
> \u8D1F\u8D23\u4EBA\uFF1A${
|
|
41
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${f.owner}\u3000\u72B6\u6001\uFF1A${f.status}\u3000\u8303\u56F4\uFF1A${f.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${f.completed}
|
|
42
42
|
|
|
43
|
-
${
|
|
43
|
+
${A(f.body,e)}`,completed:f.completed})));for(let f of L)f.completed=$(f.completed);if(L.sort((f,C)=>C.completed.localeCompare(f.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${g.length} \u4E2A\u4EFB\u52A1 \u2192 ${u}.md`);for(let f of g)console.log(`[\u9884\u6F14] - ${f.name}`);continue}(0,v.mkdirSync)(k,{recursive:!0}),(0,v.writeFileSync)(T,`# ${u} \u5F52\u6863
|
|
44
44
|
|
|
45
45
|
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
46
46
|
|
|
47
|
-
${
|
|
47
|
+
${L.map(f=>f.block).join(`
|
|
48
48
|
|
|
49
49
|
---
|
|
50
50
|
|
|
51
51
|
`)}
|
|
52
|
-
`,"utf8");for(let
|
|
52
|
+
`,"utf8");for(let f of g)(0,v.unlinkSync)(f.file);vt((0,y.dirname)(g[0].file),t),console.log(`\u5DF2\u5F52\u6863 ${g.length} \u4E2A\u4EFB\u52A1 \u2192 ${u}.md`)}for(let u of a)console.warn(`\u26A0\uFE0F ${u}`);return console.log(r?`[\u9884\u6F14] \u5171 ${c.length} \u4E2A\u4EFB\u52A1\u53EF\u5F52\u6863\uFF08\u672A\u843D\u76D8\uFF09`:`\u5171\u5F52\u6863 ${c.length} \u4E2A\u4EFB\u52A1`),{archived:c.length,skipped:d,warnings:a}}finally{if(m!==null){(0,v.closeSync)(m);try{(0,v.unlinkSync)(p)}catch{}}}}var re=require("fs"),B=require("path");var Ce=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u5DF2\u5B8C\u6210","\u963B\u585E","\u5DF2\u653E\u5F03"],$t=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"],xt=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,Tt=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/,St=/^\d{4}-\d{1,2}-\d{1,2}[T\s]\d{1,2}:\d{2}(?::\d{2})?$/,Rt=/^\d{8}-[^-]+-.+\.md$/;function Ct(t){let e=[],n=(0,B.basename)(t),r=(0,re.readFileSync)(t,"utf8");if(!/^---\r?\n[\s\S]*?\r?\n---/.test(r))return e.push({level:"error",file:n,message:"\u7F3A\u5C11 frontmatter"}),e;let s=E(r);s.status?Ce.includes(s.status)||e.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${s.status}\u300D\uFF0C\u5E94\u4E3A ${Ce.join(" / ")}`}):e.push({level:"error",file:n,message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),$t.includes(s.status)&&!s.completed&&e.push({level:"error",file:n,message:`status \u4E3A\u300C${s.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),s.completed&&!Tt.test(s.completed.trim())?e.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`}):s.completed&&!St.test(s.completed.trim())&&e.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u5EFA\u8BAE\u8865\u5168\u4E3A\u5B8C\u6574\u65F6\u95F4 YYYY-MM-DD HH:mm`}),s.owner||e.push({level:"warn",file:n,message:"\u7F3A\u5C11 owner \u8D1F\u8D23\u4EBA\u5B57\u6BB5"}),s.created?/^\d{8}$/.test(s.created.trim())||e.push({level:"warn",file:n,message:`created\u300C${s.created}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYYMMDD`}):e.push({level:"warn",file:n,message:"\u7F3A\u5C11 created \u521B\u5EFA\u65E5\u671F\u5B57\u6BB5"});let i=n.match(/^(\d{8})-/);Rt.test(n)?s.created&&/^\d{8}$/.test(s.created.trim())&&i&&s.created.trim()!==i[1]&&e.push({level:"warn",file:n,message:`\u6587\u4EF6\u540D\u65E5\u671F ${i[1]} \u4E0E created ${s.created.trim()} \u4E0D\u4E00\u81F4`}):e.push({level:"warn",file:n,message:"\u6587\u4EF6\u540D\u4E0D\u7B26\u5408\u89C4\u8303 {YYYYMMDD}-{\u8D1F\u8D23\u4EBA}-{\u7B80\u8FF0}.md"});let a=z(r),l=a.match(xt);return l&&e.push({level:"warn",file:n,message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${l[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),I("check")?.includeCheckbox!==!1&&/^[-*]\s*\[ \]\s/m.test(a)&&e.push({level:"warn",file:n,message:"\u6B63\u6587\u542B\u672A\u52FE\u9009\u5F85\u529E\u9879\u300C- [ ]\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u52FE\u9009\u5B8C\u6210"}),e}function Ae(t=".tasks"){let e=S((0,B.join)(t,"active")),n=[];for(let i of e)n.push(...Ct(i));let r=new Map;for(let i of e){let a=(0,B.basename)(i,".md"),l=r.get(a);l?l.push(i):r.set(a,[i])}for(let[i,a]of r)a.length>1&&n.push({level:"warn",file:i,message:`\u5B58\u5728 ${a.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});n.push(...Ft(e));let o=n.filter(i=>i.level==="error").length,s=n.length-o;return{issues:n,errorCount:o,warnCount:s}}function At(t){if(Array.isArray(t))return t.filter(e=>typeof e=="string");if(typeof t=="string"){let e=t.trim().match(/^\[(.*)\]$/);if(e)return e[1].split(",").map(n=>n.trim().replace(/^['"]|['"]$/g,"")).filter(Boolean)}return[]}function Ft(t){let e=[],n=new Set(t.map(d=>(0,B.basename)(d,".md"))),r=new Map,o=d=>d.trim().replace(/\.md$/,"").trim();for(let d of t){let h=(0,B.basename)(d,".md"),m=(0,re.readFileSync)(d,"utf8"),p=E(m),u=At(p.depends_on).map(o);r.set(h,u);for(let g of u)n.has(g)||e.push({level:"warn",file:h,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${g}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}let s=0,i=1,a=2,l=new Map,c=(d,h)=>{l.set(d,i);for(let m of r.get(d)??[]){if(!n.has(m))continue;let p=l.get(m)??s;if(p===i)return[...h,m];if(p===s){let u=c(m,[...h,m]);if(u)return u}}return l.set(d,a),null};for(let d of r.keys())if((l.get(d)??s)===s){let h=c(d,[d]);if(h){e.push({level:"warn",file:d,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${h.join(" \u2192 ")}`});break}}return e}var w=require("fs"),F=require("path");var jt=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function Fe(t){return jt.every(e=>t.includes(e))}function je(t=".tasks"){let e=(0,F.join)(t,"archive"),n=S(e),r=[];for(let o of n){let s=(0,F.basename)(o),i=s.replace(/\.md$/,""),a=(0,w.readFileSync)(o,"utf8"),{blocks:l}=j(a);for(let c of me(a))r.push({file:s,message:`\u7591\u4F3C\u4EFB\u52A1\u5757\u300C${c}\u300D\u5143\u6570\u636E\u7F3A\u300C\u5B8C\u6210\u65F6\u95F4\u300D\uFF0C\u5DF2\u88AB\u5F52\u5165\u524D\u4E00\u5757\u6B63\u6587\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\uFF09`,fixable:!1});for(let c=1;c<l.length;c++){let d=$(l[c-1].completed),h=$(l[c].completed);if(d&&h&&d<h){r.push({file:s,message:"\u4EFB\u52A1\u5757\u672A\u6309\u5B8C\u6210\u65F6\u95F4\u964D\u5E8F\u6392\u5217",fixable:!0});break}}for(let c of l){c.metaLine?Fe(c.metaLine)||r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u5143\u6570\u636E\u884C\u4E0D\u5B8C\u6574\uFF08\u7F3A\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4\u4E4B\u4E00\uFF09`,fixable:!!c.completed}):r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u7F3A\u5C11\u5143\u6570\u636E\u884C\uFF08\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4/\u5B8C\u6210\u65F6\u95F4\uFF09`,fixable:!!c.completed});let d=$(c.completed),h=d.replace(/-/g,"").slice(0,8);h&&i&&h!==i&&r.push({file:s,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${d} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${i} \u4E0D\u4E00\u81F4`,fixable:!1})}}return r}function Lt(t,e,n){let r=(0,F.join)(t,"archive",n.slice(0,6)),o=(0,F.join)(r,`${n}.md`);(0,w.mkdirSync)(r,{recursive:!0});let s=`# ${n} \u5F52\u6863
|
|
53
|
+
|
|
54
|
+
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002`,i=[];if((0,w.existsSync)(o)){let c=j((0,w.readFileSync)(o,"utf8"));c.header&&(s=c.header),i.push(...c.blocks)}i.push(e),i.sort((c,d)=>$(d.completed).localeCompare($(c.completed)));let a=(0,w.existsSync)(o)&&(0,w.readFileSync)(o,"utf8").includes(`\r
|
|
55
|
+
`)?`\r
|
|
56
|
+
`:`
|
|
57
|
+
`,l=`${s}
|
|
58
|
+
|
|
59
|
+
${i.map(P).join(`
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
`)}
|
|
64
|
+
`.replace(/\n/g,a);(0,w.writeFileSync)(o,l,"utf8"),console.log(` \u5757\u300C${e.title}\u300D\u8FC1\u79FB \u2192 ${n}.md`)}function Le(t=".tasks"){let e=(0,F.join)(t,"archive"),n=S(e),r=[],o=0,s=null,i=(0,F.join)(t,".archive.lock");try{s=(0,w.openSync)(i,"wx")}catch{return console.warn("\u26A0\uFE0F \u68C0\u6D4B\u5230\u5F52\u6863\u9501\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5199\u64CD\u4F5C\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7\u4FEE\u590D"),{issues:r,fixed:o}}try{for(let a of n){let c=(0,F.basename)(a).replace(/\.md$/,""),d=(0,w.readFileSync)(a,"utf8"),{header:h,blocks:m}=j(d),p=!1;for(let f of m)f.completed&&(!f.metaLine||!Fe(f.metaLine))&&(f.metaLine=ee(f.title,f.completed),p=!0,o++);let u=[];for(let f of m){let C=f.completed?$(f.completed).replace(/-/g,"").slice(0,8):"";C&&C!==c?(Lt(t,f,C),o++,p=!0):u.push(f)}let g=u.filter(f=>f.completed),k=u.filter(f=>!f.completed),T=[...g].sort((f,C)=>$(C.completed).localeCompare($(f.completed)));JSON.stringify(T.map(f=>f.title))!==JSON.stringify(g.map(f=>f.title))&&(u.splice(0,u.length,...T,...k),p=!0);let L=d.includes(`\r
|
|
53
65
|
`)?`\r
|
|
54
66
|
`:`
|
|
55
|
-
|
|
67
|
+
`;if(m.length>0&&u.length===0){(0,w.existsSync)(a)&&(0,w.unlinkSync)(a);try{(0,w.rmdirSync)((0,F.dirname)(a))}catch{}p=!0}else if(p){let f=((h?h+`
|
|
56
68
|
|
|
57
|
-
`:"")+
|
|
69
|
+
`:"")+u.map(P).join(`
|
|
58
70
|
|
|
59
71
|
---
|
|
60
72
|
|
|
61
73
|
`)+`
|
|
62
|
-
`).replace(/\n/g,
|
|
74
|
+
`).replace(/\n/g,L);(0,w.writeFileSync)(a,f,"utf8")}}return{issues:r,fixed:o}}finally{if(s!==null){(0,w.closeSync)(s);try{(0,w.unlinkSync)(i)}catch{}}}}var oe={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"}},se="zh";var G=require("fs");var Oe=require("fs"),ie=require("path");function Ee(t){let e=[],n=new Set(["node_modules",".git","dist"]),r=o=>{let s;try{s=(0,Oe.readdirSync)(o,{withFileTypes:!0})}catch{return}for(let i of s)if(i.isDirectory()){if(n.has(i.name))continue;r((0,ie.join)(o,i.name))}else i.name==="CHANGELOG.md"&&e.push((0,ie.join)(o,i.name))};return r(t),e}function ae(){let t=new Date,e=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${e(t.getMonth()+1)}-${e(t.getDate())}`}function Ot(t,e,n,r=!0){let o=(0,G.readFileSync)(t,"utf8"),s=o.includes(`\r
|
|
63
75
|
`)?`\r
|
|
64
76
|
`:`
|
|
65
77
|
`,i=o.replace(/\r\n/g,`
|
|
66
|
-
`),a=i;for(let[
|
|
78
|
+
`),a=i;for(let[m,p]of Object.entries(n.replacements))a=a.replaceAll(m,p);for(a=a.replace(/^- [0-9a-f]{7}: /gm,"- ");a.includes(`${n.deps}
|
|
67
79
|
${n.deps}`);)a=a.replace(`${n.deps}
|
|
68
|
-
${n.deps}`,n.deps);for(;;){let
|
|
69
|
-
`),c=[];for(let
|
|
70
|
-
`),
|
|
80
|
+
${n.deps}`,n.deps);for(;;){let m=a.replace(/^- (.+)\n- \1$/gm,"- $1");if(m===a)break;a=m}let l=a.split(`
|
|
81
|
+
`),c=[];for(let m=0;m<l.length;m++)if(c.push(l[m]),/^## \d+\.\d+\.\d+/.test(l[m])){let p=m+1;for(;p<l.length&&l[p].trim()==="";)p++;l[p]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(l[p].trim())||c.push(`> ${e} ${n.released}`)}let d=c.join(`
|
|
82
|
+
`),h=A(d,r);return h!==i?((0,G.writeFileSync)(t,h.replace(/\n/g,s),"utf8"),!0):!1}function ce(t,e,n,r=!0){let o=[];for(let s of Ee(t))Ot(s,e,n,r)&&o.push(s);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let s of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${s}`);return o}var Ne=(0,De.createRequire)(b),Et=Ne.resolve("@changesets/cli/bin.js"),{version:It}=Ne("../package.json"),le=t=>{let e=(0,_e.spawnSync)(process.execPath,[Et,...t],{stdio:"inherit"});e.status!==0&&process.exit(e.status??1)};function Dt(){if(process.platform==="win32")try{process.stdout.setDefaultEncoding("utf8"),process.stderr.setDefaultEncoding("utf8")}catch{}}function Me(){let t=I("check");return typeof t?.warnings=="boolean"?t.warnings:void 0}function _t(){let e=I("changelog")?.languages;if(!e||typeof e!="object")return oe;let n={...oe};for(let[r,o]of Object.entries(e))o&&typeof o=="object"&&(n[r]=o);return n}function Bt(t=".changeset"){if(!(0,X.existsSync)(t))return!1;try{return(0,X.readdirSync)(t).some(e=>e.endsWith(".md")&&e!=="README.md")}catch{return!1}}function Nt(t=".tasks"){return S((0,Be.join)(t,"active")).length>0}function q(t){if(t.length===0){console.log("\u672A\u53D1\u73B0\u95EE\u9898");return}for(let e of t)console.log(` ${e.file}: ${e.message}`)}var K=new Ie.Command;K.name("toolkit").description("\u5F00\u53D1\u5DE5\u7A0B\u5316\u5DE5\u5177\u96C6\uFF1A\u4EFB\u52A1\u7BA1\u7406 + \u591A\u8BED\u8A00 CHANGELOG \u53D1\u5E03").version(It,"-v, --version","\u663E\u793A\u7248\u672C\u53F7").enablePositionalOptions(!0);K.command("tasks").description("\u4EFB\u52A1\u7BA1\u7406").option("--dir <path>","\u4EFB\u52A1\u76EE\u5F55",".tasks").option("--redact","\u5F00\u542F\u9690\u79C1\u8131\u654F").option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").option("--warn","\u5F00\u542F\u8F6F\u544A\u8B66").option("--no-warn","\u5173\u95ED\u8F6F\u544A\u8B66").option("--dry-run","\u9884\u6F14\uFF08archive \u5F52\u6863 / import \u5BFC\u5165\u53EA\u9884\u89C8\uFF0C\u4E0D\u843D\u76D8\uFF09").option("--fix","\u5F52\u4E00\u5316\u4FEE\u590D\uFF08\u4EC5 normalize \u6709\u6548\uFF09").option("--view <view>","\u4EFB\u52A1\u89C6\u56FE\uFF1Aactive / archived / all\uFF08\u9ED8\u8BA4 active\uFF09").option("--owner <name>","\u6309\u8D1F\u8D23\u4EBA\u8FC7\u6EE4").option("--scope <scope>","\u6309\u8303\u56F4\u8FC7\u6EE4").option("--status <status>","\u6309\u72B6\u6001\u8FC7\u6EE4\uFF08\u9017\u53F7\u5206\u9694\u591A\u503C\uFF09").option("--date <date>","\u6309\u5355\u65E5\u8FC7\u6EE4\uFF08YYYY-MM-DD\uFF0C\u4E0E --since/--until \u4E92\u65A5\uFF09").option("--since <date>","\u8D77\u59CB\u65E5\u671F\uFF08\u542B\u5F53\u5929\uFF09").option("--until <date>","\u7ED3\u675F\u65E5\u671F\uFF08\u542B\u5F53\u5929\uFF09").option("--export <path>","\u5BFC\u51FA\u5230\u6587\u4EF6\uFF08.csv / .xlsx / .json\uFF09").option("--format <format>","\u8F93\u51FA\u683C\u5F0F\uFF08json\uFF0C\u8F93\u51FA\u5230 stdout\uFF09").option("--import <file>","\u4ECE\u6587\u4EF6\u5BFC\u5165\u4EFB\u52A1\uFF08.csv / .xlsx / .json\uFF09").option("--target <target>","\u5BFC\u5165\u76EE\u6807\uFF1Aactive / archive\uFF08\u9ED8\u8BA4 active\uFF09").argument("[command]","\u5B50\u547D\u4EE4\uFF1Aarchive / check / normalize\uFF0C\u7559\u7A7A\u4E3A\u603B\u89C8\uFF08\u542B\u5BFC\u5165\u7528 --import\uFF09").action(async(t,e)=>{let n=Q(e.redact),r=Y(e.warn,"FX_CHECK_WARN",Me(),!0),o=e.dir;if(e.import){if(t||e.export||e.format){console.error("\u26A0\uFE0F --import \u4E3A\u72EC\u7ACB\u6A21\u5F0F\uFF0C\u4E0D\u80FD\u4E0E\u5B50\u547D\u4EE4\u3001--export\u3001--format \u540C\u65F6\u4F7F\u7528"),process.exitCode=1;return}let s=I("tasks"),i=s?.importColumns&&typeof s.importColumns=="object"?s.importColumns:void 0;try{await Se(e.import,o,{owner:e.owner,scope:e.scope,target:e.target??"active",dryRun:e.dryRun,importColumns:i})}catch(a){console.error(`\u26A0\uFE0F \u5BFC\u5165\u5931\u8D25\uFF1A${a.message}`),process.exitCode=1}return}if(t==="archive"){let s=Re(o,n,{dryRun:e.dryRun,warn:r});r&&!e.dryRun&&s.archived>0&&!Bt()&&console.warn("\u26A0\uFE0F \u672C\u6B21\u5F52\u6863\u4E86\u4EFB\u52A1\uFF0C\u4F46 .changeset \u65E0\u5F85\u53D1\u5E03\u53D8\u66F4\u96C6\uFF0C\u5982\u9700\u53D1\u7248\u8BF7\u5148\u521B\u5EFA\u53D8\u66F4\u96C6")}else if(t==="check"){let s=Ae(o);console.log("\u4EFB\u52A1\u6821\u9A8C\uFF1A"),console.log(`\u3010error\u3011${s.errorCount} \u9879`),q(s.issues.filter(i=>i.level==="error")),r?(console.log(`\u3010warn\u3011${s.warnCount} \u9879`),q(s.issues.filter(i=>i.level==="warn"))):console.log("\uFF08\u8F6F\u544A\u8B66\u5DF2\u5173\u95ED\uFF0Cwarn \u4E0D\u5C55\u793A\uFF09"),s.errorCount>0&&(process.exitCode=1)}else if(t==="normalize")if(e.fix){let s=Le(o);console.log(`\u5DF2\u4FEE\u590D ${s.fixed} \u5904`),s.issues.length>0&&(console.log("\u4EE5\u4E0B\u95EE\u9898\u9700\u4EBA\u5DE5\u786E\u8BA4\uFF1A"),q(s.issues))}else{let s=je(o);console.log(`\u5F52\u6863\u5F52\u4E00\u5316\u68C0\u67E5\uFF1A\u53D1\u73B0 ${s.length} \u5904\u95EE\u9898`),q(s)}else{let s=e.view??"active";if(!["active","archived","all"].includes(s)){console.error(`\u26A0\uFE0F \u975E\u6CD5\u89C6\u56FE\u300C${s}\u300D\uFF0C\u4EC5\u652F\u6301 active / archived / all`),process.exitCode=1;return}if(e.date&&(e.since||e.until)){console.error("\u26A0\uFE0F --date \u4E0D\u80FD\u4E0E --since / --until \u540C\u65F6\u4F7F\u7528"),process.exitCode=1;return}if(e.export&&e.format){console.error("\u26A0\uFE0F --export \u4E0E --format \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\uFF08--format json \u8F93\u51FA\u5230 stdout\uFF09"),process.exitCode=1;return}if(e.format&&e.format!=="json"){console.error(`\u26A0\uFE0F \u4E0D\u652F\u6301\u7684\u8F93\u51FA\u683C\u5F0F\u300C${e.format}\u300D\uFF0C\u4EC5\u652F\u6301 json`),process.exitCode=1;return}let i={};e.owner&&(i.owner=e.owner),e.scope&&(i.scope=e.scope),e.status&&(i.status=e.status.split(/[,,]/).map(a=>a.trim()).filter(Boolean)),e.date&&(i.date=e.date),e.since&&(i.since=e.since),e.until&&(i.until=e.until);try{let{rows:a,summary:l}=H(o,s,i);if(e.export)await ve(e.export,a,l,n),console.log(`\u5DF2\u5BFC\u51FA ${a.length} \u4E2A\u4EFB\u52A1 \u2192 ${e.export}`);else if(e.format==="json")console.log(ne(a,l,n));else{we(o,s,i,n);let c=!!(e.owner||e.scope||e.status||e.date||e.since||e.until);!e.view&&c&&a.length===0&&console.log("\uFF08\u63D0\u793A\uFF1A\u8FC7\u6EE4\u9ED8\u8BA4\u4F5C\u7528\u4E8E\u5F85\u5B8C\u6210\u89C6\u56FE\uFF0C\u67E5\u770B\u5F52\u6863\u8BF7\u52A0 --view archived \u6216 --view all\uFF09")}}catch(a){console.error(`\u26A0\uFE0F \u64CD\u4F5C\u5931\u8D25\uFF1A${a.message}`),process.exitCode=1}}});K.command("changelog").description("\u591A\u8BED\u8A00 CHANGELOG\uFF08\u5C01\u88C5 changesets\uFF09").option("--lang <lang>","\u8BED\u8A00 zh/en",se).option("--redact","\u5F00\u542F\u9690\u79C1\u8131\u654F").option("--no-redact","\u5173\u95ED\u9690\u79C1\u8131\u654F").option("--warn","\u5F00\u542F\u8F6F\u544A\u8B66").option("--no-warn","\u5173\u95ED\u8F6F\u544A\u8B66").argument("[command...]","\u5B50\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u900F\u4F20\u7ED9 changesets\uFF09").passThroughOptions(!0).action((t,e)=>{let n=Q(e.redact),r=Y(e.warn,"FX_CHECK_WARN",Me(),!0),o=_t(),s=o[e.lang]??o[se],i=t[0];i==="version"?(r&&Nt()&&console.warn("\u26A0\uFE0F \u5B58\u5728\u672A\u5F52\u6863\u7684 active \u4EFB\u52A1\uFF0C\u5EFA\u8BAE\u5148\u5F52\u6863\u518D\u53D1\u7248"),le(["version"]),ce(".",ae(),s,n)):i==="format"?ce(".",ae(),s,n):le(i?t:[])});Dt();K.parse();
|