@fxri/toolkit 1.3.2 → 1.4.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 +16 -0
- package/README.md +63 -3
- package/dist/cli.cjs +50 -17
- package/dist/cli.js +50 -17
- package/dist/index.cjs +53 -19
- package/dist/index.d.cts +59 -2
- package/dist/index.d.ts +59 -2
- package/dist/index.js +53 -19
- package/package.json +3 -2
package/dist/index.d.ts
CHANGED
|
@@ -30,6 +30,46 @@ interface ArchiveOptions {
|
|
|
30
30
|
dryRun?: boolean;
|
|
31
31
|
warn?: boolean;
|
|
32
32
|
}
|
|
33
|
+
type TaskView = "active" | "archived" | "all";
|
|
34
|
+
interface TaskRow {
|
|
35
|
+
view: "待完成" | "已归档";
|
|
36
|
+
title: string;
|
|
37
|
+
status: string;
|
|
38
|
+
owner: string;
|
|
39
|
+
scope: string;
|
|
40
|
+
created: string;
|
|
41
|
+
updated: string;
|
|
42
|
+
completed: string;
|
|
43
|
+
depends: string[];
|
|
44
|
+
file: string;
|
|
45
|
+
}
|
|
46
|
+
interface TaskFilter {
|
|
47
|
+
owner?: string;
|
|
48
|
+
scope?: string;
|
|
49
|
+
status?: string[];
|
|
50
|
+
date?: string;
|
|
51
|
+
since?: string;
|
|
52
|
+
until?: string;
|
|
53
|
+
}
|
|
54
|
+
interface TaskSummary {
|
|
55
|
+
total: number;
|
|
56
|
+
byStatus: Record<string, number>;
|
|
57
|
+
byOwner: Record<string, number>;
|
|
58
|
+
}
|
|
59
|
+
type ImportTarget = "active" | "archive";
|
|
60
|
+
interface ImportOptions {
|
|
61
|
+
owner?: string;
|
|
62
|
+
scope?: string;
|
|
63
|
+
target?: ImportTarget;
|
|
64
|
+
dryRun?: boolean;
|
|
65
|
+
importColumns?: Record<string, string>;
|
|
66
|
+
}
|
|
67
|
+
interface ImportResult {
|
|
68
|
+
created: number;
|
|
69
|
+
skipped: number;
|
|
70
|
+
warnings: string[];
|
|
71
|
+
dryRun: boolean;
|
|
72
|
+
}
|
|
33
73
|
|
|
34
74
|
declare function parseFrontmatter(content: string): Partial<TaskFrontmatter>;
|
|
35
75
|
declare function stripFrontmatter(content: string): string;
|
|
@@ -39,11 +79,28 @@ declare function dateFromFileName(file: string): string;
|
|
|
39
79
|
|
|
40
80
|
declare function listTasks(tasksDir?: string): Task[];
|
|
41
81
|
declare function printTasks(tasksDir?: string, redact?: boolean): void;
|
|
82
|
+
declare function printTaskBoard(tasksDir?: string, view?: TaskView, filter?: TaskFilter, redact?: boolean): void;
|
|
83
|
+
|
|
84
|
+
declare function listActiveTasks(tasksDir?: string): TaskRow[];
|
|
85
|
+
declare function listArchivedTasks(tasksDir?: string): TaskRow[];
|
|
86
|
+
declare function orderRows(rows: TaskRow[]): TaskRow[];
|
|
87
|
+
declare function buildSummary(rows: TaskRow[]): TaskSummary;
|
|
88
|
+
declare function queryTasks(tasksDir?: string, view?: TaskView, filter?: TaskFilter): {
|
|
89
|
+
rows: TaskRow[];
|
|
90
|
+
summary: TaskSummary;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
declare function toCSV(rows: TaskRow[], redact?: boolean): string;
|
|
94
|
+
declare function toJSON(rows: TaskRow[], summary: TaskSummary, redact?: boolean): string;
|
|
95
|
+
declare function exportTasks(file: string, rows: TaskRow[], summary: TaskSummary, redact?: boolean): Promise<void>;
|
|
96
|
+
|
|
97
|
+
declare function importTasks(file: string, tasksDir?: string, opts?: ImportOptions): Promise<ImportResult>;
|
|
42
98
|
|
|
43
|
-
declare function normalizeCompleted(completed: string): string;
|
|
44
99
|
declare function parseArchiveTasks(file: string): ArchiveBlock[];
|
|
45
100
|
declare function archiveTasks(tasksDir?: string, redact?: boolean, options?: ArchiveOptions): ArchiveResult;
|
|
46
101
|
|
|
102
|
+
declare function normalizeCompleted(completed: string): string;
|
|
103
|
+
|
|
47
104
|
type IssueLevel = "error" | "warn";
|
|
48
105
|
interface CheckIssue {
|
|
49
106
|
level: IssueLevel;
|
|
@@ -93,4 +150,4 @@ declare function resolveEnabled(cli: boolean | undefined, envKey: string, config
|
|
|
93
150
|
declare function loadToolkitConfig(): Record<string, unknown> | null;
|
|
94
151
|
declare function getConfigSection(name: string): Record<string, unknown> | undefined;
|
|
95
152
|
|
|
96
|
-
export { type ArchiveBlock, type ArchiveOptions, type ArchiveResult, type ChangelogLanguage, type CheckIssue, type CheckResult, DEFAULT_LANG, DONE_STATUSES, type IssueLevel, type LanguageMap, type NormalizeIssue, type NormalizeResult, type Task, type TaskFrontmatter, type TaskStatus, archiveTasks, checkArchive, collectChangelogs, dateFromFileName, fixArchive, formatChangelog, formatChangelogs, getConfigSection, languages, listTaskFiles, listTasks, loadToolkitConfig, localDate, normalizeCompleted, parseArchiveTasks, parseBool, parseFrontmatter, printTasks, redactText, resolveEnabled, stripFrontmatter, validateTaskFile, validateTasks };
|
|
153
|
+
export { type ArchiveBlock, type ArchiveOptions, type ArchiveResult, type ChangelogLanguage, type CheckIssue, type CheckResult, DEFAULT_LANG, DONE_STATUSES, type ImportOptions, type ImportResult, type ImportTarget, type IssueLevel, type LanguageMap, type NormalizeIssue, type NormalizeResult, type Task, type TaskFilter, type TaskFrontmatter, type TaskRow, type TaskStatus, type TaskSummary, type TaskView, archiveTasks, buildSummary, checkArchive, collectChangelogs, dateFromFileName, exportTasks, fixArchive, formatChangelog, formatChangelogs, getConfigSection, importTasks, languages, listActiveTasks, listArchivedTasks, listTaskFiles, listTasks, loadToolkitConfig, localDate, normalizeCompleted, orderRows, parseArchiveTasks, parseBool, parseFrontmatter, printTaskBoard, printTasks, queryTasks, redactText, resolveEnabled, stripFrontmatter, toCSV, toJSON, validateTaskFile, validateTasks };
|
package/dist/index.js
CHANGED
|
@@ -1,36 +1,70 @@
|
|
|
1
|
-
var
|
|
2
|
-
`)
|
|
1
|
+
var E=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function R(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!t)return{};let n={};for(let r of t[1].split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let i=r.slice(0,o).trim(),s=r.slice(o+1).trim();(s.startsWith("'")&&s.endsWith("'")||s.startsWith('"')&&s.endsWith('"'))&&(s=s.slice(1,-1)),i&&(n[i]=s)}return n}function C(e){let t=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return t?e.slice(t[0].length):e}import{existsSync as Le,readdirSync as q,statSync as Oe}from"fs";import{join as G,basename as Ie,extname as De}from"path";function x(e){if(!Le(e))return[];let t=[];for(let n of q(e)){let r=G(e,n);if(Oe(r).isDirectory())for(let o of q(r))o.endsWith(".md")&&t.push(G(r,o));else n.endsWith(".md")&&t.push(r)}return t}function F(e){let n=Ie(e,De(e)).match(/^(\d{8})/);return n?n[1]:""}import{readFileSync as Ye}from"fs";import{join as qe,basename as ce}from"path";import{readFileSync as Ee}from"fs";import{join as Ne}from"path";var O;function H(){if(O!==void 0)return O;O=null;try{let e=Ee(Ne(process.cwd(),".toolkitrc.json"),"utf8");O=JSON.parse(e)}catch{}return O}function z(e){let t=H();if(!t)return;let n=t[e];return typeof n=="object"&&n!==null?n:void 0}function X(e,t){let n=e.trim().toLowerCase();return["1","true","on","yes"].includes(n)?!0:["0","false","off","no"].includes(n)?!1:t}function K(e,t,n,r){if(e!==void 0)return e;let o=process.env[t];return o!==void 0&&o!==""?X(o,r):n!==void 0?n:r}var _e=[{name:"\u5185\u7F51URL",pattern:/(https?:\/\/)[a-zA-Z0-9.-]+(:\d{2,5})(?=\/|[\s]|$)/g,replacement:"$1***$2"},{name:"\u90AE\u7BB1",pattern:/([a-zA-Z0-9._%+-])[a-zA-Z0-9._%+-]*@(?:[a-zA-Z0-9-]+\.)+([a-zA-Z]{2,})/g,replacement:"$1***@***.$2"},{name:"JWT",pattern:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,replacement:"eyJ***.eyJ***.***"},{name:"AWS\u5BC6\u94A5",pattern:/\b(AKIA|ASIA)[A-Z0-9]{16}\b/g,replacement:"$1****"},{name:"GitHub\u5BC6\u94A5",pattern:/\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,replacement:"$1_****"},{name:"OpenAI\u5BC6\u94A5",pattern:/\bsk-[A-Za-z0-9]{20,}\b/g,replacement:"sk-****"},{name:"Slack\u5BC6\u94A5",pattern:/\b(xox[baprs])-[A-Za-z0-9-]{10,}\b/g,replacement:"$1-****"},{name:"\u624B\u673A\u53F7",pattern:/(?<!\d)(1[3-9]\d)\d{4}(\d{4})(?!\d)/g,replacement:"$1****$2"},{name:"\u8EAB\u4EFD\u8BC1",pattern:/(?<!\d)(\d{6})\d{8}(\d{3}[\dXx])(?!\d)/g,replacement:"$1********$2"},{name:"IPv4",pattern:/(?<![\d.])(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}(?![\d.])/g,replacement:"$1.***.***"}],N=null;function Be(){let e=z("redact");return e?{enabled:typeof e.enabled=="boolean"?e.enabled:void 0,disable:Array.isArray(e.disable)?e.disable.filter(t=>typeof t=="string"):void 0,rules:Array.isArray(e.rules)?e.rules:void 0}:null}function Me(){if(N)return N;let e=Be(),t=new Set(e?.disable??[]),n=[];for(let r of e?.rules??[])try{n.push({name:r.name,pattern:new RegExp(r.pattern,r.flags??""),replacement:r.replacement})}catch{}return N=[...n,..._e.filter(r=>!t.has(r.name))],N}function S(e,t){if(!t||!e)return e;let n=e;for(let r of Me())n=n.replace(r.pattern,r.replacement);return n}import{readFileSync as ee}from"fs";import{join as te,basename as We,relative as Ue,sep as Je}from"path";function $(e){let t=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/);return t?`${t[1]}-${t[2].padStart(2,"0")}-${t[3].padStart(2,"0")} ${t[4].padStart(2,"0")}:${t[5]}`:e}function ze(e){let t=e.match(/^\d{8}-(.+?)-/);return t?t[1]:""}function W(e,t){return`> \u8D1F\u8D23\u4EBA\uFF1A${ze(e)||"\u672A\u6807\u6CE8"}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A-\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${$(t)}`}function A(e){let t=e.split(/\r?\n/),n=[];for(let i=0;i<t.length;i++){if(!/^## .+/.test(t[i]))continue;let s=i+1;for(;s<t.length&&t[s].trim()==="";)s++;let a=t[s]?.trim()??"";a.startsWith("> ")&&a.includes("\u5B8C\u6210\u65F6\u95F4")&&n.push(i)}if(n.length===0)return{header:e,blocks:[]};let r=t.slice(0,n[0]).join(`
|
|
2
|
+
`).trimEnd(),o=[];for(let i=0;i<n.length;i++){let s=n[i],a=i+1<n.length?n[i+1]:t.length,l=t.slice(s,a).join(`
|
|
3
|
+
`).trim().split(`
|
|
4
|
+
`),c=l[0].replace(/^## /,""),d=null,g="",m=1;for(let u=1;u<l.length;u++){let p=l[u].trim();if(p.startsWith("> ")&&p.includes("\u5B8C\u6210\u65F6\u95F4")){d=l[u];let f=p.match(/完成时间:(.+)$/);f&&(g=f[1].trim()),m=u+1;break}}o.push({title:c,metaLine:d,completed:g,body:l.slice(m).join(`
|
|
5
|
+
`).trim()})}return{header:r,blocks:o}}function _(e){let t=e.metaLine??(e.completed?W(e.title,e.completed):null);return t?`## ${e.title}
|
|
3
6
|
|
|
4
|
-
|
|
7
|
+
${t}
|
|
5
8
|
|
|
6
|
-
${
|
|
9
|
+
${e.body}`:`## ${e.title}
|
|
7
10
|
|
|
8
|
-
|
|
11
|
+
${e.body}`}var L=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u963B\u585E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"];function Pe(e){if(Array.isArray(e))return e.map(String);if(typeof e!="string"||!e.trim())return[];let t=e.trim();if(t==="[]")return[];try{let n=JSON.parse(t);if(Array.isArray(n))return n.map(String)}catch{}return[...t.matchAll(/'([^']*)'|"([^"]*)"/g)].map(n=>n[1]??n[2])}function v(e){let t=e.trim().match(/^(\d{4})[-/]?(\d{1,2})[-/]?(\d{1,2})/);return t?`${t[1]}-${t[2].padStart(2,"0")}-${t[3].padStart(2,"0")}`:""}function ne(e,t){return Ue(e,t).split(Je).join("/")}function re(e=".tasks"){let t=te(e,"active");return x(t).map(n=>{let r=ee(n,"utf8"),o=R(r);return{view:"\u5F85\u5B8C\u6210",title:r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||We(n,".md"),status:o.status||"\u672A\u6807\u6CE8",owner:o.owner||"\u672A\u6807\u6CE8",scope:o.scope||"-",created:o.created||F(n),updated:o.updated||"",completed:o.completed||"",depends:Pe(o.depends_on),file:ne(e,n)}})}function Ve(e){let t={owner:"\u672A\u6807\u6CE8",status:"\u5DF2\u5B8C\u6210",scope:"-"};if(!e)return t;for(let n of e.replace(/^>\s*/,"").split(/\s* \s*/)){let[r,...o]=n.split(/[::]/),i=o.join("").trim();i&&(r.includes("\u8D1F\u8D23\u4EBA")?t.owner=i:r.includes("\u72B6\u6001")?t.status=i:r.includes("\u8303\u56F4")&&(t.scope=i))}return t}function oe(e=".tasks"){let t=te(e,"archive"),n=[];for(let r of x(t)){let o=ee(r,"utf8");for(let i of A(o).blocks){let s=Ve(i.metaLine);n.push({view:"\u5DF2\u5F52\u6863",title:i.title,status:s.status,owner:s.owner,scope:s.scope,created:"",updated:"",completed:i.completed,depends:[],file:ne(e,r)})}}return n}function Ze(e,t){if(t.owner&&e.owner!==t.owner||t.scope&&e.scope!==t.scope||t.status?.length&&!t.status.includes(e.status))return!1;if(t.date||t.since||t.until){let n=t.date?v(t.date):v(t.since||""),r=t.date?v(t.date):v(t.until||"");if(!n&&!r||!(e.view==="\u5DF2\u5F52\u6863"?[v(e.completed)]:[v(e.created),v(e.updated)].filter(Boolean)).some(s=>s&&(!n||s>=n)&&(!r||s<=r)))return!1}return!0}function se(e){return e.view==="\u5DF2\u5F52\u6863"?v(e.completed):v(e.created||e.updated||e.completed)}function Q(e){let t=e.view==="\u5DF2\u5F52\u6863"?e.completed:e.completed||e.updated||e.created,n=v(t);if(!n)return"";let r=t.match(/(\d{1,2}):(\d{2})/);return n.replace(/-/g,"")+(r?`${r[1].padStart(2,"0")}${r[2]}`:"0000")}function ie(e){let t=new Map(L.map((n,r)=>[n,r]));return[...e].sort((n,r)=>{let o=t.get(n.status)??L.length,i=t.get(r.status)??L.length;return o!==i?o-i:Q(r).localeCompare(Q(n))})}function ae(e){let t={},n={};for(let r of e)t[r.status]=(t[r.status]||0)+1,n[r.owner]=(n[r.owner]||0)+1;return{total:e.length,byStatus:t,byOwner:n}}function U(e=".tasks",t="active",n={}){let r=[];(t==="active"||t==="all")&&r.push(...re(e)),(t==="archived"||t==="all")&&r.push(...oe(e)),r=r.filter(i=>Ze(i,n));let o=ie(r);return{rows:o,summary:ae(o)}}function le(e=".tasks"){let t=qe(e,"active");return x(t).map(n=>{let r=Ye(n,"utf8"),o=R(r),i=r.split(/\r?\n/).find(s=>s.startsWith("# ")&&!s.startsWith("#!"))?.replace(/^#\s*/,"")||ce(n,".md");return{file:n,name:ce(n,".md"),date:F(n),title:i,frontmatter:o,body:C(r).trim()}})}function Ge(e=".tasks",t=!0){let n=le(e);if(n.length===0){console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1");return}let r=["\u8FDB\u884C\u4E2D","\u963B\u585E","\u5F85\u529E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"],o={};for(let s of n){let a=r.includes(s.frontmatter.status)?s.frontmatter.status:"\u672A\u6807\u6CE8";(o[a]||=[]).push(s)}console.log(`\u4EFB\u52A1\u603B\u89C8\uFF1A
|
|
12
|
+
`);let i=0;for(let s of r){let a=o[s]||[];if(a.length!==0){i+=a.length,console.log(`\u3010${s}\u3011${a.length} \u9879`);for(let l of a)console.log(` ${l.date} ${(l.frontmatter.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${S(l.title,t)}`);console.log("")}}console.log(`\u5171 ${i} \u4E2A\u4EFB\u52A1\u6587\u4EF6`)}function He(e=".tasks",t="active",n={},r=!0){let{rows:o,summary:i}=U(e,t,n);if(console.log(`\u4EFB\u52A1\u603B\u89C8\uFF08${t==="active"?"\u5F85\u5B8C\u6210":t==="archived"?"\u5DF2\u5F52\u6863":"\u5F85\u5B8C\u6210 + \u5DF2\u5F52\u6863"}\uFF09\uFF1A
|
|
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 L){let c=a[l]||[];if(c.length!==0){console.log(`\u3010${l}\u3011${c.length} \u9879`);for(let d of c){let g=t==="all"?`${d.view} `:"";console.log(` ${se(d)} ${g}${(d.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${S(d.title,r)}\uFF08${d.scope||"-"}\uFF09`)}console.log("")}}Xe(i)}function Xe(e){let t=L.filter(r=>e.byStatus[r]),n=Object.keys(e.byOwner).sort((r,o)=>e.byOwner[o]-e.byOwner[r]);console.log(`\u5171 ${e.total} \u4E2A\u4EFB\u52A1`),t.length>0&&console.log(`\u6309\u72B6\u6001\uFF1A${t.map(r=>`${r} ${e.byStatus[r]}`).join("\u3000")}`),n.length>0&&console.log(`\u6309\u8D1F\u8D23\u4EBA\uFF1A${n.map(r=>`${r} ${e.byOwner[r]}`).join("\u3000")}`)}import{writeFileSync as J}from"fs";import{createRequire as Ke}from"module";var Qe=Ke(import.meta.url),B=[{label:"\u89C6\u56FE",value:e=>e.view==="\u5DF2\u5F52\u6863"?"\u5DF2\u5F52\u6863":"\u5F85\u5B8C\u6210"},{label:"\u4EFB\u52A1\u540D",value:e=>e.title},{label:"\u72B6\u6001",value:e=>e.status},{label:"\u8D1F\u8D23\u4EBA",value:e=>e.owner},{label:"\u8303\u56F4",value:e=>e.scope},{label:"\u521B\u5EFA\u65E5\u671F",value:e=>e.created?v(e.created):""},{label:"\u66F4\u65B0\u65E5\u671F",value:e=>e.updated?v(e.updated):""},{label:"\u5B8C\u6210\u65F6\u95F4",value:e=>e.completed},{label:"\u4F9D\u8D56",value:e=>e.depends.join(", ")},{label:"\u6765\u6E90\u6587\u4EF6",value:e=>e.file}],et=[{label:"\u4EFB\u52A1\u540D",value:e=>e.title},{label:"\u72B6\u6001",value:e=>e.status},{label:"\u8D1F\u8D23\u4EBA",value:e=>e.owner},{label:"\u8303\u56F4",value:e=>e.scope},{label:"\u521B\u5EFA\u65E5\u671F",value:e=>e.created?v(e.created):""},{label:"\u66F4\u65B0\u65E5\u671F",value:e=>e.updated?v(e.updated):""},{label:"\u5B8C\u6210\u65F6\u95F4",value:e=>e.completed},{label:"\u4F9D\u8D56",value:e=>e.depends.join(", ")},{label:"\u6765\u6E90\u6587\u4EF6",value:e=>e.file}],tt=[{label:"\u4EFB\u52A1\u540D",value:e=>e.title},{label:"\u72B6\u6001",value:e=>e.status},{label:"\u8D1F\u8D23\u4EBA",value:e=>e.owner},{label:"\u8303\u56F4",value:e=>e.scope},{label:"\u5B8C\u6210\u65F6\u95F4",value:e=>e.completed},{label:"\u6765\u6E90\u6587\u4EF6",value:e=>e.file}];function nt(e){return/[",\n\r]/.test(e)?`"${e.replace(/"/g,'""')}"`:e}function de(e,t=!0){let n=B.map(o=>o.label).join(","),r=e.map(o=>B.map(i=>{let s=i.label==="\u4EFB\u52A1\u540D"?S(i.value(o),t):i.value(o);return nt(s)}).join(",")).join(`\r
|
|
14
|
+
`);return`\uFEFF${n}${r?`\r
|
|
15
|
+
${r}`:""}`}function ue(e,t,n=!0){let r=e.map(o=>({view:o.view==="\u5DF2\u5F52\u6863"?"archived":"active",title:S(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:t,items:r},null,2)}async function rt(e,t,n=!0){let r=Qe("exceljs"),o=new r.Workbook,i=e.filter(u=>u.view==="\u5F85\u5B8C\u6210"),s=e.filter(u=>u.view==="\u5DF2\u5F52\u6863"),a=(u,p,f)=>{u.columns=p.map(k=>({header:k.label,key:k.label,width:Math.max(k.label.length+4,14)})),u.getRow(1).font={bold:!0};for(let k of f)u.addRow(p.map(h=>h.label==="\u4EFB\u52A1\u540D"?S(h.value(k),n):h.value(k)))},l=o.addWorksheet("\u5F85\u5B8C\u6210");a(l,et,i);let c=o.addWorksheet("\u5DF2\u5F52\u6863");a(c,tt,s);let d=o.addWorksheet("\u6C47\u603B");d.columns=[{header:"\u7C7B\u522B",key:"k",width:10},{header:"\u6570\u503C",key:"v",width:12}];let g=(u,p)=>{d.addRow([u,""]).font={bold:!0};for(let[f,k]of Object.entries(p).sort((h,T)=>T[1]-h[1]))d.addRow([f,k])};d.addRow(["\u4EFB\u52A1\u603B\u6570",t.total]).font={bold:!0},g("\u6309\u72B6\u6001",t.byStatus),g("\u6309\u8D1F\u8D23\u4EBA",t.byOwner),d.addRow([]);let m=d.addRow(B.map(u=>u.label));m.font={bold:!0};for(let u of e)d.addRow(B.map(p=>p.label==="\u4EFB\u52A1\u540D"?S(p.value(u),n):p.value(u)));return Buffer.from(await o.xlsx.writeBuffer())}async function ot(e,t,n,r=!0){let o=e.split(".").pop()?.toLowerCase();if(o==="csv")J(e,de(t,r),"utf8");else if(o==="json")J(e,ue(t,n,r),"utf8");else if(o==="xlsx")J(e,await rt(t,n,r));else throw new Error(`\u4E0D\u652F\u6301\u7684\u5BFC\u51FA\u683C\u5F0F\u300C${o||""}\u300D\uFF0C\u4EC5\u652F\u6301 .csv / .xlsx / .json`)}import{readFileSync as P,existsSync as me,writeFileSync as fe,mkdirSync as ge}from"fs";import{join as I}from"path";import{createRequire as st}from"module";var it=st(import.meta.url),he={\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:""},at=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u963B\u585E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];function ke(e,t={}){let n=new Map;return e.forEach((r,o)=>{let i=String(r??"").trim().toLowerCase();if(!i)return;let s;t[i]!==void 0&&(s=t[i]),s===void 0&&(s=he[i]),s!==""&&s&&!n.has(s)&&n.set(s,o)}),n}function ct(e){let t=[],n=e.replace(/^\uFEFF/,"").replace(/\r\n/g,`
|
|
16
|
+
`).replace(/\r/g,`
|
|
17
|
+
`),r=[],o="",i=!1;for(let s=0;s<n.length;s++){let a=n[s];i?a==='"'?n[s+1]==='"'?(o+='"',s++):i=!1:o+=a:a==='"'?i=!0:a===","?(r.push(o),o=""):a===`
|
|
18
|
+
`?(r.push(o),t.push(r),r=[],o=""):o+=a}return(o!==""||r.length>0)&&(r.push(o),t.push(r)),t.filter(s=>s.length>1||(s[0]||"").trim()!=="")}function lt(e,t){let n=ct(e);if(n.length===0)return[];let r=ke(n[0],t),o=[];for(let i=1;i<n.length;i++){let s={};for(let[a,l]of r)s[a]=(n[i][l]??"").trim();(s.title||Object.keys(s).length>0)&&o.push(s)}return o}function dt(e,t){let n=[];for(let r=1;r<=(e.rowCount||0);r++){let o=e.getRow(r),i=[];for(let a=1;a<=(o.cellCount||0);a++)i.push(o.getCell(a).text??"");if(i.every(a=>a.trim()===""))continue;let s=ke(i,t);if(s.has("title")){for(let a=r+1;a<=e.rowCount;a++){let l=e.getRow(a),c={},d=!0;for(let[g,m]of s){let u=(l.getCell(m+1).text??"").trim();u&&(d=!1),c[g]=u}!d&&(c.title||Object.keys(c).length>0)&&n.push(c)}break}}return n}async function ut(e,t){let n=it("exceljs"),r=new n.Workbook;await r.xlsx.readFile(e);let o=[];for(let i of r.worksheets)i.name.includes("\u6C47\u603B")||o.push(...dt(i,t));return o}function pt(e,t){let n=JSON.parse(e),r=Array.isArray(n)?n:Array.isArray(n.items)?n.items:[],o=[];for(let i of r){if(!i||typeof i!="object")continue;let s={};for(let[a,l]of Object.entries(i)){let c=a.trim().toLowerCase(),d;t[c]!==void 0&&(d=t[c]),d===void 0&&(d=he[c]),d&&(Array.isArray(l)?s[d]=l.join(","):l!=null&&(s[d]=String(l)))}o.push(s)}return o}function mt(e){let t=e.trim().match(/^(\d{4})-(\d{1,2})-(\d{1,2})/);return t?`${t[1]}${t[2].padStart(2,"0")}${t[3].padStart(2,"0")}`:e.trim().replace(/[-/]/g,"")}function ft(e){return e.trim().replace(/[\\/:*?"<>|]/g," ").replace(/\s+/g," ").slice(0,24).trim().replace(/\s+/g,"-")||"\u4EFB\u52A1"}function gt(e,t,n){let r=(e.title||"").trim();if(!r)return n.push(`\u8DF3\u8FC7\u4E00\u884C\uFF1A\u7F3A\u5C11\u4EFB\u52A1\u540D\uFF08${Object.entries(e).slice(0,3).map(([c,d])=>`${c}=${d}`).join(" ")}\uFF09`),{ok:!1};let o=(e.status||"").trim()||"\u5F85\u529E";at.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 i=e.completed?.trim()?$(e.completed.trim()):"";i&&!E.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 s=(e.owner||"").trim()||t.owner||"";s=s.replace(/\s+/g,"");let a=(e.scope||"").trim()||t.scope||"-",l=(e.depends||"").split(/[,,;;]/).map(c=>c.trim()).filter(Boolean);return{ok:!0,t:{title:r,status:o,owner:s||"\u672A\u6807\u6CE8",scope:a,created:mt(e.created||""),completed:i,depends:l,body:e.body?.trim()||""}}}function pe(){let e=new Date,t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}${t(e.getMonth()+1)}${t(e.getDate())}`}function ht(e,t,n){let r=t.created||pe(),o=I(e,"active",r.slice(0,6)),i=`${r}-${t.owner}-${ft(t.title)}`,s=I(o,`${i}.md`),a=2;for(;me(s);)s=I(o,`${i}-${a++}.md`);let c=["---",`owner: ${t.owner}`,`status: ${t.status}`,`created: ${r}`,`updated: ${pe()}`,`completed: ${t.completed?`'${t.completed}'`:"''"}`,`depends_on: ${JSON.stringify(t.depends)}`,`scope: ${t.scope}`,"---","",`# ${t.title}`].join(`
|
|
19
|
+
`)+(t.body?`
|
|
20
|
+
|
|
21
|
+
${t.body}
|
|
22
|
+
`:`
|
|
23
|
+
`);return n||(ge(o,{recursive:!0}),fe(s,c,"utf8")),s}function kt(e,t,n,r){let o=t.completed||(t.status==="\u5DF2\u5B8C\u6210",""),i=o?v(o):"";if(!i)return r.push(`\u4EFB\u52A1\u300C${t.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 s=i.replace(/-/g,""),a=I(e,"archive",s.slice(0,6)),l=I(a,`${s}.md`),c=`> \u8D1F\u8D23\u4EBA\uFF1A${t.owner}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A${t.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${o}`,d=`# ${t.title}${t.body?`
|
|
9
24
|
|
|
10
|
-
${
|
|
25
|
+
${t.body}`:""}`,g={title:t.title,metaLine:c,completed:o,body:d};if(n)return l;ge(a,{recursive:!0});let m=`# ${s} \u5F52\u6863
|
|
26
|
+
|
|
27
|
+
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks import --target archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
28
|
+
`,u=[];if(me(l)){let f=A(P(l,"utf8"));f.header&&(m=f.header),u=f.blocks}u.push(g),u.sort((f,k)=>$(k.completed).localeCompare($(f.completed)));let p=u.map(f=>`## ${f.title}
|
|
29
|
+
|
|
30
|
+
${f.metaLine}
|
|
31
|
+
|
|
32
|
+
${f.body}`);return fe(l,`${m}
|
|
33
|
+
|
|
34
|
+
${p.join(`
|
|
11
35
|
|
|
12
36
|
---
|
|
13
37
|
|
|
14
38
|
`)}
|
|
15
|
-
`,"utf8")
|
|
16
|
-
`),f=o[0].replace(/^## /,""),c=null,u="",d=1;for(let m=1;m<o.length;m++){let g=o[m].trim();if(g.startsWith("> ")&&g.includes("\u5B8C\u6210\u65F6\u95F4")){c=o[m];let l=g.match(/完成时间:(.+)$/);l&&(u=l[1].trim()),d=m+1;break}}s.push({title:f,metaLine:c,completed:u,body:o.slice(d).join(`
|
|
17
|
-
`).trim()})}return{header:n,blocks:s}}function ne(e,t){return`> \u8D1F\u8D23\u4EBA\uFF1A${Oe(e)||"\u672A\u6807\u6CE8"}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A-\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${x(t)}`}var Be=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function re(e){return Be.every(t=>e.includes(t))}function We(e){let t=e.metaLine??(e.completed?ne(e.title,e.completed):null);return t?`## ${e.title}
|
|
39
|
+
`,"utf8"),l}async function wt(e,t=".tasks",n={}){let r=!!n.dryRun,o=[],i=n.importColumns??{},s=e.split(".").pop()?.toLowerCase(),a;if(s==="csv")a=lt(P(e,"utf8"),i);else if(s==="xlsx")a=await ut(e,i);else if(s==="json")a=pt(P(e,"utf8"),i);else throw new Error(`\u4E0D\u652F\u6301\u7684\u5BFC\u5165\u683C\u5F0F\u300C${s||""}\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 u=gt(m,n,o);if(!u.ok){c++;continue}let p=u.t;if(d==="archive"){let f=kt(t,p,r,o);if(!f){c++;continue}console.log(`${r?"[\u9884\u6F14] \u5C06\u5199\u5165\u5F52\u6863":"\u5DF2\u5199\u5165\u5F52\u6863"} \u2192 ${f}`)}else{let f=ht(t,p,r);console.log(`${r?"[\u9884\u6F14] \u5C06\u521B\u5EFA":"\u5DF2\u521B\u5EFA"} \u2192 ${f}`)}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}}import{readFileSync as ye,writeFileSync as bt,mkdirSync as yt,unlinkSync as we,existsSync as vt,readdirSync as $t,rmdirSync as Tt,openSync as xt,closeSync as St}from"fs";import{join as D,basename as V,dirname as ve,resolve as be,sep as Rt}from"path";function At(e,t){let n=be(e),r=be(t);for(;n!==r&&n.startsWith(r+Rt);){try{if($t(n).length>0)break;Tt(n)}catch{break}n=ve(n)}}function $e(e){let t=ye(e,"utf8"),{blocks:n}=A(t);return n.map(r=>({block:_(r),completed:r.completed}))}function Ct(e=".tasks",t=!0,n={}){let{dryRun:r=!1,warn:o=!0}=n,i=D(e,"active"),s=D(e,"archive"),a=[],l=x(i);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 p of l){let f=ye(p,"utf8"),k=R(f);if(!E.includes(k.status))continue;let h=$(k.completed||"");if(!h){d.push(V(p,".md")),console.log(`\u8DF3\u8FC7 ${V(p,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}c.push({file:p,name:V(p,".md"),owner:k.owner||"\u672A\u6807\u6CE8",status:k.status||"\u672A\u6807\u6CE8",scope:k.scope||"-",completed:h,body:C(f).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 p of c){let f=p.completed.replace(/-/g,"").slice(0,8),k=F(p.file);k&&f!==k&&a.push(`\u4EFB\u52A1\u300C${p.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${p.completed} \u4E0E\u521B\u5EFA\u65E5 ${k} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`)}let g={};for(let p of c){let f=p.completed.replace(/-/g,"").slice(0,8);(g[f]||=[]).push(p)}let m=null,u=D(e,".archive.lock");if(!r)try{m=xt(u,"wx")}catch{let p="\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 ${p}`),{archived:0,skipped:d,warnings:[...a,p]}}try{for(let[p,f]of Object.entries(g)){let k=D(s,p.slice(0,6)),h=D(k,`${p}.md`),T=vt(h)?$e(h):[];if(o){let w=new Set(T.map(j=>j.block.match(/^## (.+)/)?.[1]??""));for(let j of f)w.has(j.name)&&a.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${j.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}T.push(...f.map(w=>({block:`## ${w.name}
|
|
18
40
|
|
|
19
|
-
${
|
|
41
|
+
> \u8D1F\u8D23\u4EBA\uFF1A${w.owner}\u3000\u72B6\u6001\uFF1A${w.status}\u3000\u8303\u56F4\uFF1A${w.scope}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${w.completed}
|
|
20
42
|
|
|
21
|
-
${
|
|
43
|
+
${S(w.body,t)}`,completed:w.completed})));for(let w of T)w.completed=$(w.completed);if(T.sort((w,j)=>j.completed.localeCompare(w.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${f.length} \u4E2A\u4EFB\u52A1 \u2192 ${p}.md`);for(let w of f)console.log(`[\u9884\u6F14] - ${w.name}`);continue}yt(k,{recursive:!0}),bt(h,`# ${p} \u5F52\u6863
|
|
44
|
+
|
|
45
|
+
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002
|
|
46
|
+
|
|
47
|
+
${T.map(w=>w.block).join(`
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
`)}
|
|
52
|
+
`,"utf8");for(let w of f)we(w.file);At(ve(f[0].file),e),console.log(`\u5DF2\u5F52\u6863 ${f.length} \u4E2A\u4EFB\u52A1 \u2192 ${p}.md`)}for(let p of a)console.warn(`\u26A0\uFE0F ${p}`);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){St(m);try{we(u)}catch{}}}}import{readFileSync as xe}from"fs";import{join as Ft,basename as M}from"path";var Te=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u5DF2\u5B8C\u6210","\u963B\u585E","\u5DF2\u653E\u5F03"],jt=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"],Lt=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,Ot=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/;function Se(e){let t=[],n=M(e),r=xe(e,"utf8");if(!/^---\r?\n[\s\S]*?\r?\n---/.test(r))return t.push({level:"error",file:n,message:"\u7F3A\u5C11 frontmatter"}),t;let i=R(r);i.status?Te.includes(i.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${i.status}\u300D\uFF0C\u5E94\u4E3A ${Te.join(" / ")}`}):t.push({level:"error",file:n,message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),jt.includes(i.status)&&!i.completed&&t.push({level:"error",file:n,message:`status \u4E3A\u300C${i.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),i.completed&&!Ot.test(i.completed.trim())&&t.push({level:"warn",file:n,message:`completed\u300C${i.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`});let a=C(r).match(Lt);return a&&t.push({level:"warn",file:n,message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${a[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),t}function It(e=".tasks"){let t=x(Ft(e,"active")),n=[];for(let s of t)n.push(...Se(s));let r=new Map;for(let s of t){let a=M(s,".md"),l=r.get(a);l?l.push(s):r.set(a,[s])}for(let[s,a]of r)a.length>1&&n.push({level:"warn",file:s,message:`\u5B58\u5728 ${a.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});n.push(...Et(t));let o=n.filter(s=>s.level==="error").length,i=n.length-o;return{issues:n,errorCount:o,warnCount:i}}function Dt(e){if(Array.isArray(e))return e.filter(t=>typeof t=="string");if(typeof e=="string"){let t=e.trim().match(/^\[(.*)\]$/);if(t)return t[1].split(",").map(n=>n.trim().replace(/^['"]|['"]$/g,"")).filter(Boolean)}return[]}function Et(e){let t=[],n=new Set(e.map(c=>M(c,".md"))),r=new Map;for(let c of e){let d=M(c,".md"),g=xe(c,"utf8"),m=R(g),u=Dt(m.depends_on);r.set(d,u);for(let p of u)n.has(p)||t.push({level:"warn",file:d,message:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${p}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}let o=0,i=1,s=2,a=new Map,l=(c,d)=>{a.set(c,i);for(let g of r.get(c)??[]){if(!n.has(g))continue;let m=a.get(g)??o;if(m===i)return[...d,g];if(m===o){let u=l(g,[...d,g]);if(u)return u}}return a.set(c,s),null};for(let c of r.keys())if((a.get(c)??o)===o){let d=l(c,[c]);if(d){t.push({level:"warn",file:c,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${d.join(" \u2192 ")}`});break}}return t}import{readFileSync as Re,writeFileSync as Nt,openSync as _t,closeSync as Bt,unlinkSync as Mt}from"fs";import{join as Z,basename as Ae}from"path";var zt=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function Ce(e){return zt.every(t=>e.includes(t))}function Wt(e=".tasks"){let t=Z(e,"archive"),n=x(t),r=[];for(let o of n){let i=Ae(o),s=i.replace(/\.md$/,""),a=Re(o,"utf8"),{blocks:l}=A(a);for(let c=1;c<l.length;c++){let d=$(l[c-1].completed),g=$(l[c].completed);if(d&&g&&d<g){r.push({file:i,message:"\u4EFB\u52A1\u5757\u672A\u6309\u5B8C\u6210\u65F6\u95F4\u964D\u5E8F\u6392\u5217",fixable:!0});break}}for(let c of l){c.metaLine?Ce(c.metaLine)||r.push({file:i,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:i,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),g=d.replace(/-/g,"").slice(0,8);g&&s&&g!==s&&r.push({file:i,message:`\u5757\u300C${c.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${d} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${s} \u4E0D\u4E00\u81F4`,fixable:!1})}}return r}function Ut(e=".tasks"){let t=Z(e,"archive"),n=x(t),r=[],o=0,i=null,s=Z(e,".archive.lock");try{i=_t(s,"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 l=Ae(a),c=l.replace(/\.md$/,""),d=Re(a,"utf8"),{header:g,blocks:m}=A(d),u=!1;for(let h of m){h.completed&&(!h.metaLine||!Ce(h.metaLine))&&(h.metaLine=W(h.title,h.completed),u=!0,o++);let T=$(h.completed),w=T.replace(/-/g,"").slice(0,8);w&&c&&w!==c&&r.push({file:l,message:`\u5757\u300C${h.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${T} \u4E0E\u5F52\u6863\u65E5\u671F ${c} \u4E0D\u4E00\u81F4\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\u662F\u5426\u8FC1\u79FB\uFF09`,fixable:!1})}let p=m.filter(h=>h.completed),f=m.filter(h=>!h.completed),k=[...p].sort((h,T)=>$(T.completed).localeCompare($(h.completed)));if(JSON.stringify(k.map(h=>h.title))!==JSON.stringify(p.map(h=>h.title))&&(m.splice(0,m.length,...k,...f),u=!0),u){let h=d.includes(`\r
|
|
53
|
+
`)?`\r
|
|
54
|
+
`:`
|
|
55
|
+
`,T=((g?g+`
|
|
22
56
|
|
|
23
|
-
|
|
57
|
+
`:"")+m.map(_).join(`
|
|
24
58
|
|
|
25
59
|
---
|
|
26
60
|
|
|
27
61
|
`)+`
|
|
28
|
-
|
|
62
|
+
`).replace(/\n/g,h);Nt(a,T,"utf8")}}return{issues:r,fixed:o}}finally{if(i!==null){Bt(i);try{Mt(s)}catch{}}}}var ur={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"}},pr="zh";import{readdirSync as Jt}from"fs";import{join as Fe}from"path";function Y(e){let t=[],n=new Set(["node_modules",".git","dist"]),r=o=>{let i;try{i=Jt(o,{withFileTypes:!0})}catch{return}for(let s of i)if(s.isDirectory()){if(n.has(s.name))continue;r(Fe(o,s.name))}else s.name==="CHANGELOG.md"&&t.push(Fe(o,s.name))};return r(e),t}import{readFileSync as Pt,writeFileSync as Vt}from"fs";function Zt(){let e=new Date,t=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function je(e,t,n,r=!0){let o=Pt(e,"utf8"),i=o.includes(`\r
|
|
29
63
|
`)?`\r
|
|
30
64
|
`:`
|
|
31
|
-
`,
|
|
32
|
-
`),
|
|
33
|
-
${n.deps}`);)
|
|
34
|
-
${n.deps}`,n.deps);for(;;){let m=
|
|
35
|
-
`),c=[];for(let m=0;m<
|
|
36
|
-
`),
|
|
65
|
+
`,s=o.replace(/\r\n/g,`
|
|
66
|
+
`),a=s;for(let[m,u]of Object.entries(n.replacements))a=a.replaceAll(m,u);for(a=a.replace(/^- [0-9a-f]{7}: /gm,"- ");a.includes(`${n.deps}
|
|
67
|
+
${n.deps}`);)a=a.replace(`${n.deps}
|
|
68
|
+
${n.deps}`,n.deps);for(;;){let m=a.replace(/^- (.+)\n- \1$/gm,"- $1");if(m===a)break;a=m}let l=a.split(`
|
|
69
|
+
`),c=[];for(let m=0;m<l.length;m++)if(c.push(l[m]),/^## \d+\.\d+\.\d+/.test(l[m])){let u=m+1;for(;u<l.length&&l[u].trim()==="";)u++;l[u]?.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(l[u].trim())||c.push(`> ${t} ${n.released}`)}let d=c.join(`
|
|
70
|
+
`),g=S(d,r);return g!==s?(Vt(e,g.replace(/\n/g,i),"utf8"),!0):!1}function Yt(e,t,n,r=!0){let o=[];for(let i of Y(e))je(i,t,n,r)&&o.push(i);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let i of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${i}`);return o}export{pr as DEFAULT_LANG,E as DONE_STATUSES,Ct as archiveTasks,ae as buildSummary,Wt as checkArchive,Y as collectChangelogs,F as dateFromFileName,ot as exportTasks,Ut as fixArchive,je as formatChangelog,Yt as formatChangelogs,z as getConfigSection,wt as importTasks,ur as languages,re as listActiveTasks,oe as listArchivedTasks,x as listTaskFiles,le as listTasks,H as loadToolkitConfig,Zt as localDate,$ as normalizeCompleted,ie as orderRows,$e as parseArchiveTasks,X as parseBool,R as parseFrontmatter,He as printTaskBoard,Ge as printTasks,U as queryTasks,S as redactText,K as resolveEnabled,C as stripFrontmatter,de as toCSV,ue as toJSON,Se as validateTaskFile,It as validateTasks};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fxri/toolkit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "专为多人 + AI 跨项目协作打造:任务管理 + 多语言 CHANGELOG。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -55,7 +55,8 @@
|
|
|
55
55
|
],
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@changesets/cli": "^2.31.1",
|
|
58
|
-
"commander": "^15.0.0"
|
|
58
|
+
"commander": "^15.0.0",
|
|
59
|
+
"exceljs": "^4.4.0"
|
|
59
60
|
},
|
|
60
61
|
"devDependencies": {
|
|
61
62
|
"@types/node": "^20.19.21",
|