@fxri/toolkit 1.9.0 → 1.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,88 +1,91 @@
1
- var Z=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u5DF2\u5B8C\u6210","\u963B\u585E","\u5DF2\u653E\u5F03"],N=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];var ce=/^---\r?\n([\s\S]*?)\r?\n---/;function j(e){let t=e.replace(/^\uFEFF/,"").match(ce);if(!t)return{};let n={};for(let r of(t[1]??"").split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let s=r.slice(0,o).trim(),i=r.slice(o+1).trim();(i.startsWith("'")&&i.endsWith("'")||i.startsWith('"')&&i.endsWith('"'))&&(i=i.slice(1,-1)),s&&(n[s]=i)}return n}function D(e){let t=e.replace(/^\uFEFF/,""),n=t.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?t.slice(n[0].length):t}function ee(e){return e.split(/\r?\n/).find(t=>t.startsWith("# ")&&!t.startsWith("#!"))?.replace(/^#\s*/,"")??""}function be(e){let t=e.split(/\r?\n/),n=t.findIndex(r=>/^# /.test(r));return n===-1?e:(t.splice(n,1),t.join(`
2
- `))}import{existsSync as ct,readdirSync as ye,statSync as at}from"fs";import{join as $e,basename as lt,extname as pt}from"path";function S(e){if(!ct(e))return[];let t=[];for(let n of ye(e)){let r=$e(e,n);if(at(r).isDirectory())for(let o of ye(r))o.endsWith(".md")&&t.push($e(r,o));else n.endsWith(".md")&&t.push(r)}return t}function I(e){return lt(e,pt(e)).match(/^(\d{8})/)?.[1]??""}import{readFileSync as jt}from"fs";import{join as Ot,basename as We}from"path";import{existsSync as ut,readFileSync as mt}from"fs";import{join as ve,dirname as dt}from"path";import{homedir as ft}from"os";var H,gt;function ht(){return gt??ft()}function xe(e){if(!ut(e))return null;try{let t=JSON.parse(mt(e,"utf8").replace(/^\uFEFF/,""));return typeof t=="object"&&t!==null?t:null}catch{return null}}function kt(e,t){if(!e)return t;if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))n[r]=o;return n}function Te(){if(H!==void 0)return H;let e=xe(ve(ht(),".toolkitrc.json")),t=null,n=process.cwd();for(;;){let r=xe(ve(n,".toolkitrc.json"));if(r){t=r;break}let o=dt(n);if(o===n)break;n=o}return H=kt(e,t),H}function Y(e){let t=Te();if(!t)return;let n=t[e];return typeof n=="object"&&n!==null?n:void 0}function wt(){H=void 0}function Se(e,t){let n=e.trim().toLowerCase();return["1","true","on","yes"].includes(n)?!0:["0","false","off","no"].includes(n)?!1:t}function Re(e,t,n,r){if(e!==void 0)return e;let o=process.env[t];return o!==void 0&&o!==""?Se(o,r):n!==void 0?n:r}var bt=[{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 yt(){let e=Y("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 $t(){let e=yt(),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,...bt.filter(r=>!t.has(r.name))]}function C(e,t){if(!t||!e)return e;let n=e;for(let r of $t())n=n.replace(r.pattern,r.replacement);return n}import{readFileSync as De}from"fs";import{join as Ie,basename as Rt}from"path";function B(e){let t={};if(!e)return t;for(let n of e.replace(/^>\s*/,"").split(/[ ]+/).map(r=>r.trim()).filter(Boolean)){let r=n.search(/[::]/);if(r<=0)continue;let o=n.slice(0,r).trim(),s=n.slice(r+1).trim();!o||!s||(o.includes("\u8D1F\u8D23\u4EBA")?t.owner=s:o.includes("\u72B6\u6001")?t.status=s:o.includes("\u8303\u56F4")?t.scope=s:o.includes("\u5B8C\u6210\u65F6\u95F4")&&(t.completed=s))}return t}function v(e){let t=e.trim(),n=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/)??t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/);if(!n)return t;let r=s=>s?.padStart(2,"0")??"",o=`${n[1]??""}-${r(n[2])}-${r(n[3])}`;return n.length===4?`${o} 00:00`:`${o} ${r(n[4])}:${r(n[5])}`}function Ae(e){return e.match(/^\d{8}-(.+?)-/)?.[1]??""}function vt(e,t){return`> \u8D1F\u8D23\u4EBA\uFF1A${Ae(e)||"\u672A\u6807\u6CE8"}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A-\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${v(t)}`}function Ce(e,t,n){let r=B(n),o=r.owner||Ae(e)||"\u672A\u6807\u6CE8",s=r.status||"\u5DF2\u5B8C\u6210",i=r.scope||"-";return`> \u8D1F\u8D23\u4EBA\uFF1A${o}\u3000\u72B6\u6001\uFF1A${s}\u3000\u8303\u56F4\uFF1A${i}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${v(t)}`}function A(e){e=e.replace(/^\uFEFF/,"");let t=e.split(/\r?\n/).map(s=>s.replace(/\r$/,"")),n=[];for(let s=0;s<t.length;s++){let i=t[s];if(!i||!/^## .+/.test(i))continue;let c=s+1;for(;c<t.length&&(t[c]??"").trim()==="";)c++;let l=t[c]?.trim()??"";l.startsWith("> ")&&l.includes("\u5B8C\u6210\u65F6\u95F4")&&n.push(s)}if(n.length===0)return{header:e,blocks:[]};let r=t.slice(0,n[0]??0).join(`
3
- `).trimEnd(),o=[];for(let s=0;s<n.length;s++){let i=n[s]??0,c=s+1<n.length?n[s+1]??t.length:t.length,l=t.slice(i,c).join(`
1
+ var G=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u5DF2\u5B8C\u6210","\u963B\u585E","\u5DF2\u653E\u5F03"],N=["\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03"];var ae=/^---\r?\n([\s\S]*?)\r?\n---/;function E(e){let t=e.replace(/^\uFEFF/,"").match(ae);if(!t)return{};let n={};for(let r of(t[1]??"").split(/\r?\n/)){let o=r.indexOf(":");if(o===-1)continue;let s=r.slice(0,o).trim(),i=r.slice(o+1).trim();(i.startsWith("'")&&i.endsWith("'")||i.startsWith('"')&&i.endsWith('"'))&&(i=i.slice(1,-1)),s&&(n[s]=i)}return n}function I(e){let t=e.replace(/^\uFEFF/,""),n=t.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);return n?t.slice(n[0].length):t}function ee(e){return e.split(/\r?\n/).find(t=>t.startsWith("# ")&&!t.startsWith("#!"))?.replace(/^#\s*/,"")??""}function ve(e){let t=e.split(/\r?\n/),n=t.findIndex(r=>/^# /.test(r));return n===-1?e:(t.splice(n,1),t.join(`
2
+ `))}import{existsSync as dt,readdirSync as $e,statSync as ft}from"fs";import{join as xe,basename as mt,extname as gt}from"path";function R(e){if(!dt(e))return[];let t=[];for(let n of $e(e)){let r=xe(e,n);if(ft(r).isDirectory())for(let o of $e(r))o.endsWith(".md")&&t.push(xe(r,o));else n.endsWith(".md")&&t.push(r)}return t}function B(e){return mt(e,gt(e)).match(/^(\d{8})/)?.[1]??""}import{readFileSync as Bt}from"fs";import{join as Dt,basename as Pe}from"path";import{existsSync as ht,readFileSync as kt}from"fs";import{join as Se,dirname as bt}from"path";import{homedir as wt}from"os";var H,yt;function vt(){return yt??wt()}function Te(e){if(!ht(e))return null;try{let t=JSON.parse(kt(e,"utf8").replace(/^\uFEFF/,""));return typeof t=="object"&&t!==null?t:null}catch{return null}}function $t(e,t){if(!e)return t;if(!t)return e;let n={...e};for(let[r,o]of Object.entries(t))n[r]=o;return n}function Re(){if(H!==void 0)return H;let e=Te(Se(vt(),".toolkitrc.json")),t=null,n=process.cwd();for(;;){let r=Te(Se(n,".toolkitrc.json"));if(r){t=r;break}let o=bt(n);if(o===n)break;n=o}return H=$t(e,t),H}function W(e){let t=Re();if(!t)return;let n=t[e];return typeof n=="object"&&n!==null?n:void 0}function xt(){H=void 0}function Ae(e,t){let n=e.trim().toLowerCase();return["1","true","on","yes"].includes(n)?!0:["0","false","off","no"].includes(n)?!1:t}function Ce(e,t,n,r){if(e!==void 0)return e;let o=process.env[t];return o!==void 0&&o!==""?Ae(o,r):n!==void 0?n:r}var St=[{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 Tt(){let e=W("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 Rt(){let e=Tt(),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,...St.filter(r=>!t.has(r.name))]}function C(e,t){if(!t||!e)return e;let n=e;for(let r of Rt())n=n.replace(r.pattern,r.replacement);return n}import{readFileSync as De}from"fs";import{join as _e,basename as Et}from"path";function D(e){let t={};if(!e)return t;for(let n of e.replace(/^>\s*/,"").split(/[ ]+/).map(r=>r.trim()).filter(Boolean)){let r=n.search(/[::]/);if(r<=0)continue;let o=n.slice(0,r).trim(),s=n.slice(r+1).trim();!o||!s||(o.includes("\u8D1F\u8D23\u4EBA")?t.owner=s:o.includes("\u72B6\u6001")?t.status=s:o.includes("\u8303\u56F4")?t.scope=s:o.includes("\u5B8C\u6210\u65F6\u95F4")&&(t.completed=s))}return t}function $(e){let t=e.trim(),n=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})[T\s](\d{1,2}):(\d{2})(?::\d{2})?$/)??t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/);if(!n)return t;let r=s=>s?.padStart(2,"0")??"",o=`${n[1]??""}-${r(n[2])}-${r(n[3])}`;return n.length===4?`${o} 00:00`:`${o} ${r(n[4])}:${r(n[5])}`}function Fe(e){return e.match(/^\d{8}-(.+?)-/)?.[1]??""}function At(e,t){return`> \u8D1F\u8D23\u4EBA\uFF1A${Fe(e)||"\u672A\u6807\u6CE8"}\u3000\u72B6\u6001\uFF1A\u5DF2\u5B8C\u6210\u3000\u8303\u56F4\uFF1A-\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${$(t)}`}function Le(e,t,n){let r=D(n),o=r.owner||Fe(e)||"\u672A\u6807\u6CE8",s=r.status||"\u5DF2\u5B8C\u6210",i=r.scope||"-";return`> \u8D1F\u8D23\u4EBA\uFF1A${o}\u3000\u72B6\u6001\uFF1A${s}\u3000\u8303\u56F4\uFF1A${i}\u3000\u5B8C\u6210\u65F6\u95F4\uFF1A${$(t)}`}function A(e){e=e.replace(/^\uFEFF/,"");let t=e.split(/\r?\n/).map(s=>s.replace(/\r$/,"")),n=[];for(let s=0;s<t.length;s++){let i=t[s];if(!i||!/^## .+/.test(i))continue;let c=s+1;for(;c<t.length&&(t[c]??"").trim()==="";)c++;let a=t[c]?.trim()??"";a.startsWith("> ")&&a.includes("\u5B8C\u6210\u65F6\u95F4")&&n.push(s)}if(n.length===0)return{header:e,blocks:[]};let r=t.slice(0,n[0]??0).join(`
3
+ `).trimEnd(),o=[];for(let s=0;s<n.length;s++){let i=n[s]??0,c=s+1<n.length?n[s+1]??t.length:t.length,a=t.slice(i,c).join(`
4
4
  `).trim().split(`
5
- `),p=(l[0]??"").replace(/^## /,""),f=null,m="",g=1;for(let a=1;a<l.length;a++){let d=l[a]??"",u=d.trim();if(u.startsWith("> ")&&u.includes("\u5B8C\u6210\u65F6\u95F4")){f=d;let h=u.match(/完成时间:(.+)$/);h&&(m=(h[1]??"").trim()),g=a+1;break}}o.push({title:p,metaLine:f,completed:m,body:xt(l.slice(g))})}return{header:r,blocks:o}}function xt(e){let t=[...e];for(;;){for(;t.length>0&&(t[t.length-1]??"").trim()==="";)t.pop();let n=t[t.length-1]??"";if(t.length>0&&/^---+\s*$/.test(n.trim()))t.pop();else break}return t.join(`
6
- `).trim()}function Fe(e){let t=e.split(/\r?\n/),n=[];for(let r=0;r<t.length;r++){let o=t[r]?.match(/^## (\d{8}-[^-]+-.+)$/)?.[1];if(!o)continue;let s=r+1;for(;s<t.length&&(t[s]??"").trim()==="";)s++;let i=t[s]?.trim()??"";i.startsWith("> ")&&!i.includes("\u5B8C\u6210\u65F6\u95F4")&&n.push(o)}return n}function z(e){let t=e.metaLine??(e.completed?vt(e.title,e.completed):null);return t?`## ${e.title}
5
+ `),u=(a[0]??"").replace(/^## /,""),m=null,p="",f=1;for(let l=1;l<a.length;l++){let g=a[l]??"",d=g.trim();if(d.startsWith("> ")&&d.includes("\u5B8C\u6210\u65F6\u95F4")){m=g;let h=d.match(/完成时间:(.+)$/);h&&(p=(h[1]??"").trim()),f=l+1;break}}o.push({title:u,metaLine:m,completed:p,body:Ct(a.slice(f))})}return{header:r,blocks:o}}function Ct(e){let t=[...e];for(;;){for(;t.length>0&&(t[t.length-1]??"").trim()==="";)t.pop();let n=t[t.length-1]??"";if(t.length>0&&/^---+\s*$/.test(n.trim()))t.pop();else break}return t.join(`
6
+ `).trim()}function Ee(e){let t=e.split(/\r?\n/),n=[];for(let r=0;r<t.length;r++){let o=t[r]?.match(/^## (\d{8}-[^-]+-.+)$/)?.[1];if(!o)continue;let s=r+1;for(;s<t.length&&(t[s]??"").trim()==="";)s++;let i=t[s]?.trim()??"";i.startsWith("> ")&&!i.includes("\u5B8C\u6210\u65F6\u95F4")&&n.push(o)}return n}function Y(e){let t=e.metaLine??(e.completed?At(e.title,e.completed):null);return t?`## ${e.title}
7
7
 
8
8
  ${t}
9
9
 
10
10
  ${e.body}`:`## ${e.title}
11
11
 
12
- ${e.body}`}function te(e){if(Array.isArray(e))return e.filter(o=>typeof o=="string");if(typeof e!="string")return[];let t=e.trim();if(!t||t==="[]")return[];try{let o=JSON.parse(t);if(Array.isArray(o))return o.map(String).filter(Boolean)}catch{}let n=[...t.matchAll(/'([^']*)'|"([^"]*)"/g)].map(o=>o[1]??o[2]).filter(o=>!!o);if(n.length>0)return n;let r=t.match(/^\[(.*)\]$/)?.[1];return r!=null?r.split(/[,,]/).map(o=>o.trim().replace(/^['"]|['"]$/g,"")).filter(Boolean):[]}import{relative as Tt,sep as St}from"path";function M(e,t){return Tt(e,t).split(St).join("/")}var W=e=>String(e).padStart(2,"0");function Le(e){let t=e.trim().match(/^(\d{4})[-/]?(\d{1,2})[-/]?(\d{1,2})/);if(!t)return null;let[,n,r,o]=t;return!n||!r||!o?null:{y:n,m:W(+r),d:W(+o)}}function x(e){let t=Le(e);return t?`${t.y}-${t.m}-${t.d}`:""}function je(e){let t=Le(e);return t?`${t.y}${t.m}${t.d}`:e.trim().replace(/[-/]/g,"")}function Oe(){let e=new Date;return`${e.getFullYear()}-${W(e.getMonth()+1)}-${W(e.getDate())}`}function ae(){let e=new Date;return`${e.getFullYear()}${W(e.getMonth()+1)}${W(e.getDate())}`}var E=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u963B\u585E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"];function Be(e=".tasks"){let t=Ie(e,"active");return S(t).map(n=>{let r=De(n,"utf8"),o=j(r);return{view:"\u5F85\u5B8C\u6210",title:ee(r)||Rt(n,".md"),status:o.status||"\u672A\u6807\u6CE8",owner:o.owner||"\u672A\u6807\u6CE8",scope:o.scope||"-",created:o.created||I(n),updated:o.updated||"",completed:o.completed||"",depends:te(o.depends_on),file:M(e,n)}})}function At(e){let t=B(e);return{owner:t.owner||"\u672A\u6807\u6CE8",status:t.status||"\u5DF2\u5B8C\u6210",scope:t.scope||"-"}}function _e(e=".tasks"){let t=Ie(e,"archive"),n=[];for(let r of S(t)){let o=De(r,"utf8");for(let s of A(o).blocks){let i=At(s.metaLine);n.push({view:"\u5DF2\u5F52\u6863",title:s.title,status:i.status,owner:i.owner,scope:i.scope,created:s.title.match(/^(\d{8})-/)?.[1]??"",updated:"",completed:s.completed,depends:[],file:M(e,r)})}}return n}function Ct(e){return e.split("+").map(t=>t.trim()).filter(Boolean)}function Ft(e,t){if(e===void 0)return!0;let n=Array.isArray(e)?e:[e],r=Ct(t);return n.some(o=>r.includes(o))}function Me(e,t){return e===void 0?!0:Array.isArray(e)?e.includes(t):e===t}function Lt(e,t){if(!Me(t.owner,e.owner)||!Ft(t.scope,e.scope)||!Me(t.status,e.status))return!1;if(t.date||t.since||t.until){let n=t.date?x(t.date):x(t.since||""),r=t.date?x(t.date):x(t.until||"");if(!n&&!r||!(e.view==="\u5DF2\u5F52\u6863"?[x(e.completed)]:[x(e.created),x(e.updated)].filter(Boolean)).some(i=>i&&(!n||i>=n)&&(!r||i<=r)))return!1}return!0}function Ne(e){return e.view==="\u5DF2\u5F52\u6863"?x(e.completed):x(e.created||e.updated||e.completed)}function Ee(e){let t=e.view==="\u5DF2\u5F52\u6863"?e.completed:e.completed||e.updated||e.created,n=x(t);if(!n)return"";let r=t.match(/(\d{1,2}):(\d{2})/),o=r?.[1]??"",s=r?.[2]??"";return n.replace(/-/g,"")+(r?`${o.padStart(2,"0")}${s}`:"0000")}function Ye(e){let t=new Map(E.map((n,r)=>[n,r]));return[...e].sort((n,r)=>{let o=t.get(n.status)??E.length,s=t.get(r.status)??E.length;return o!==s?o-s:Ee(r).localeCompare(Ee(n))})}function ze(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 le(e=".tasks",t="active",n={}){let r=[];(t==="active"||t==="all")&&r.push(...Be(e)),(t==="archived"||t==="all")&&r.push(..._e(e)),r=r.filter(s=>Lt(s,n));let o=Ye(r);return{rows:o,summary:ze(o)}}function Mt(e=".tasks"){let t=Ot(e,"active");return S(t).map(n=>{let r=jt(n,"utf8"),o=j(r),s=ee(r)||We(n,".md");return{file:n,name:We(n,".md"),date:I(n),title:s,frontmatter:o,body:D(r).trim()}})}function Et(e=".tasks",t=!0){Ue(e,"active",{},t)}function Ue(e=".tasks",t="active",n={},r=!0){let{rows:o,summary:s}=le(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){let p=Object.values(n).some(f=>Array.isArray(f)?f.length>0:!!f);console.log(p?"\u65E0\u5339\u914D\u4EFB\u52A1":t==="archived"?"\u5F53\u524D\u65E0\u5DF2\u5F52\u6863\u4EFB\u52A1":t==="all"?"\u5F53\u524D\u65E0\u4EFB\u52A1":"\u5F53\u524D\u65E0\u5F85\u5B8C\u6210\u4EFB\u52A1");return}let c={};for(let p of o)(c[p.status]||=[]).push(p);let l=Object.keys(c).filter(p=>!E.includes(p)).sort();for(let p of[...E,...l]){let f=c[p]||[];if(f.length!==0){console.log(`\u3010${p}\u3011${f.length} \u9879`);for(let m of f){let g=t==="all"?`${m.view} `:"";console.log(` ${Ne(m)} ${g}${(m.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${C(m.title,r)}\uFF08${m.scope||"-"}\uFF09`)}console.log("")}}Dt(s)}function Dt(e){let t=E.filter(o=>e.byStatus[o]),n=Object.keys(e.byStatus).filter(o=>!E.includes(o)),r=Object.keys(e.byOwner).sort((o,s)=>(e.byOwner[s]??0)-(e.byOwner[o]??0));if(console.log(`\u5171 ${e.total} \u4E2A\u4EFB\u52A1`),t.length>0||n.length>0){let o=t.map(s=>`${s} ${e.byStatus[s]}`);n.length>0&&o.push(`\u5176\u4ED6 ${n.reduce((s,i)=>s+(e.byStatus[i]??0),0)}`),console.log(`\u6309\u72B6\u6001\uFF1A${o.join("\u3000")}`)}r.length>0&&console.log(`\u6309\u8D1F\u8D23\u4EBA\uFF1A${r.map(o=>`${o} ${e.byOwner[o]}`).join("\u3000")}`)}import{mkdirSync as Yt}from"fs";import{dirname as zt}from"path";import{createRequire as Wt}from"module";import{writeFileSync as It,renameSync as Bt}from"fs";import{dirname as _t,join as Nt}from"path";function F(e,t){let n=Nt(_t(e),`.tmp-${process.pid}-${Date.now().toString(36)}`);It(n,t),Bt(n,e)}var Ut=Wt(import.meta.url);function pe(e){Yt(zt(e),{recursive:!0})}var ne=[{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?x(e.created):""},{label:"\u66F4\u65B0\u65E5\u671F",value:e=>e.updated?x(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}],Vt=[{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?x(e.created):""},{label:"\u66F4\u65B0\u65E5\u671F",value:e=>e.updated?x(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}],Jt=[{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 Pt(e){return/[",\n\r]/.test(e)?`"${e.replace(/"/g,'""')}"`:e}function Ve(e,t=!0){let n=ne.map(o=>o.label).join(","),r=e.map(o=>ne.map(s=>{let i=s.label==="\u4EFB\u52A1\u540D"?C(s.value(o),t):s.value(o);return Pt(i)}).join(",")).join(`\r
12
+ ${e.body}`}function te(e){if(Array.isArray(e))return e.filter(o=>typeof o=="string");if(typeof e!="string")return[];let t=e.trim();if(!t||t==="[]")return[];try{let o=JSON.parse(t);if(Array.isArray(o))return o.map(String).filter(Boolean)}catch{}let n=[...t.matchAll(/'([^']*)'|"([^"]*)"/g)].map(o=>o[1]??o[2]).filter(o=>!!o);if(n.length>0)return n;let r=t.match(/^\[(.*)\]$/)?.[1];return r!=null?r.split(/[,,]/).map(o=>o.trim().replace(/^['"]|['"]$/g,"")).filter(Boolean):[]}import{relative as Ft,sep as Lt}from"path";function j(e,t){return Ft(e,t).split(Lt).join("/")}var z=e=>String(e).padStart(2,"0");function Oe(e){let t=e.trim().match(/^(\d{4})[-/]?(\d{1,2})[-/]?(\d{1,2})/);if(!t)return null;let[,n,r,o]=t;return!n||!r||!o?null:{y:n,m:z(+r),d:z(+o)}}function x(e){let t=Oe(e);return t?`${t.y}-${t.m}-${t.d}`:""}function je(e){let t=Oe(e);return t?`${t.y}${t.m}${t.d}`:e.trim().replace(/[-/]/g,"")}function Me(){let e=new Date;return`${e.getFullYear()}-${z(e.getMonth()+1)}-${z(e.getDate())}`}function le(){let e=new Date;return`${e.getFullYear()}${z(e.getMonth()+1)}${z(e.getDate())}`}var M=["\u5F85\u529E","\u8FDB\u884C\u4E2D","\u963B\u585E","\u5DF2\u5B8C\u6210","\u5DF2\u653E\u5F03","\u672A\u6807\u6CE8"];function Ne(e=".tasks"){let t=_e(e,"active");return R(t).map(n=>{let r=De(n,"utf8"),o=E(r);return{view:"\u5F85\u5B8C\u6210",title:ee(r)||Et(n,".md"),status:o.status||"\u672A\u6807\u6CE8",owner:o.owner||"\u672A\u6807\u6CE8",scope:o.scope||"-",created:o.created||B(n),updated:o.updated||"",completed:o.completed||"",depends:te(o.depends_on),file:j(e,n)}})}function Ot(e){let t=D(e);return{owner:t.owner||"\u672A\u6807\u6CE8",status:t.status||"\u5DF2\u5B8C\u6210",scope:t.scope||"-"}}function We(e=".tasks"){let t=_e(e,"archive"),n=[];for(let r of R(t)){let o=De(r,"utf8");for(let s of A(o).blocks){let i=Ot(s.metaLine);n.push({view:"\u5DF2\u5F52\u6863",title:s.title,status:i.status,owner:i.owner,scope:i.scope,created:s.title.match(/^(\d{8})-/)?.[1]??"",updated:"",completed:s.completed,depends:[],file:j(e,r)})}}return n}function jt(e){return e.split("+").map(t=>t.trim()).filter(Boolean)}function Mt(e,t){if(e===void 0)return!0;let n=Array.isArray(e)?e:[e],r=jt(t);return n.some(o=>r.includes(o))}function Ie(e,t){return e===void 0?!0:Array.isArray(e)?e.includes(t):e===t}function It(e,t){if(!Ie(t.owner,e.owner)||!Mt(t.scope,e.scope)||!Ie(t.status,e.status))return!1;if(t.date||t.since||t.until){let n=t.date?x(t.date):x(t.since||""),r=t.date?x(t.date):x(t.until||"");if(!n&&!r||!(e.view==="\u5DF2\u5F52\u6863"?[x(e.completed)]:[x(e.created),x(e.updated)].filter(Boolean)).some(i=>i&&(!n||i>=n)&&(!r||i<=r)))return!1}return!0}function Ye(e){return e.view==="\u5DF2\u5F52\u6863"?x(e.completed):x(e.created||e.updated||e.completed)}function Be(e){let t=e.view==="\u5DF2\u5F52\u6863"?e.completed:e.completed||e.updated||e.created,n=x(t);if(!n)return"";let r=t.match(/(\d{1,2}):(\d{2})/),o=r?.[1]??"",s=r?.[2]??"";return n.replace(/-/g,"")+(r?`${o.padStart(2,"0")}${s}`:"0000")}function ze(e){let t=new Map(M.map((n,r)=>[n,r]));return[...e].sort((n,r)=>{let o=t.get(n.status)??M.length,s=t.get(r.status)??M.length;return o!==s?o-s:Be(r).localeCompare(Be(n))})}function Ue(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 ue(e=".tasks",t="active",n={}){let r=[];(t==="active"||t==="all")&&r.push(...Ne(e)),(t==="archived"||t==="all")&&r.push(...We(e)),r=r.filter(s=>It(s,n));let o=ze(r);return{rows:o,summary:Ue(o)}}function _t(e=".tasks"){let t=Dt(e,"active");return R(t).map(n=>{let r=Bt(n,"utf8"),o=E(r),s=ee(r)||Pe(n,".md");return{file:n,name:Pe(n,".md"),date:B(n),title:s,frontmatter:o,body:I(r).trim()}})}function Nt(e=".tasks",t=!0){Ve(e,"active",{},t)}function Ve(e=".tasks",t="active",n={},r=!0){let{rows:o,summary:s}=ue(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){let u=Object.values(n).some(m=>Array.isArray(m)?m.length>0:!!m);console.log(u?"\u65E0\u5339\u914D\u4EFB\u52A1":t==="archived"?"\u5F53\u524D\u65E0\u5DF2\u5F52\u6863\u4EFB\u52A1":t==="all"?"\u5F53\u524D\u65E0\u4EFB\u52A1":"\u5F53\u524D\u65E0\u5F85\u5B8C\u6210\u4EFB\u52A1");return}let c={};for(let u of o)(c[u.status]||=[]).push(u);let a=Object.keys(c).filter(u=>!M.includes(u)).sort();for(let u of[...M,...a]){let m=c[u]||[];if(m.length!==0){console.log(`\u3010${u}\u3011${m.length} \u9879`);for(let p of m){let f=t==="all"?`${p.view} `:"";console.log(` ${Ye(p)} ${f}${(p.owner||"\u672A\u6807\u6CE8").padEnd(8)} ${C(p.title,r)}\uFF08${p.scope||"-"}\uFF09`)}console.log("")}}Wt(s)}function Wt(e){let t=M.filter(o=>e.byStatus[o]),n=Object.keys(e.byStatus).filter(o=>!M.includes(o)),r=Object.keys(e.byOwner).sort((o,s)=>(e.byOwner[s]??0)-(e.byOwner[o]??0));if(console.log(`\u5171 ${e.total} \u4E2A\u4EFB\u52A1`),t.length>0||n.length>0){let o=t.map(s=>`${s} ${e.byStatus[s]}`);n.length>0&&o.push(`\u5176\u4ED6 ${n.reduce((s,i)=>s+(e.byStatus[i]??0),0)}`),console.log(`\u6309\u72B6\u6001\uFF1A${o.join("\u3000")}`)}r.length>0&&console.log(`\u6309\u8D1F\u8D23\u4EBA\uFF1A${r.map(o=>`${o} ${e.byOwner[o]}`).join("\u3000")}`)}import{mkdirSync as Vt}from"fs";import{dirname as Jt}from"path";import{createRequire as Gt}from"module";import{writeFileSync as Yt,renameSync as zt}from"fs";import{dirname as Ut,join as Pt}from"path";function F(e,t){let n=Pt(Ut(e),`.tmp-${process.pid}-${Date.now().toString(36)}`);Yt(n,t),zt(n,e)}var Ht=Gt(import.meta.url);function pe(e){Vt(Jt(e),{recursive:!0})}var ne=[{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?x(e.created):""},{label:"\u66F4\u65B0\u65E5\u671F",value:e=>e.updated?x(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}],Zt=[{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?x(e.created):""},{label:"\u66F4\u65B0\u65E5\u671F",value:e=>e.updated?x(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}],qt=[{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 Xt(e){return/[",\n\r]/.test(e)?`"${e.replace(/"/g,'""')}"`:e}function Je(e,t=!0){let n=ne.map(o=>o.label).join(","),r=e.map(o=>ne.map(s=>{let i=s.label==="\u4EFB\u52A1\u540D"?C(s.value(o),t):s.value(o);return Xt(i)}).join(",")).join(`\r
14
14
  `);return`\uFEFF${n}${r?`\r
15
- ${r}`:""}`}function Je(e,t,n=!0){let r=e.map(o=>({view:o.view==="\u5DF2\u5F52\u6863"?"archived":"active",title:C(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({schemaVersion:1,summary:t,items:r},null,2)}async function Zt(e,t,n=!0){let r=Ut("exceljs"),o=new r.Workbook,s=e.filter(a=>a.view==="\u5F85\u5B8C\u6210"),i=e.filter(a=>a.view==="\u5DF2\u5F52\u6863"),c=(a,d,u)=>{a.columns=d.map(h=>({header:h.label,key:h.label,width:Math.max(h.label.length+4,14)})),a.getRow(1).font={bold:!0};for(let h of u)a.addRow(d.map($=>$.label==="\u4EFB\u52A1\u540D"?C($.value(h),n):$.value(h)))},l=o.addWorksheet("\u5F85\u5B8C\u6210");c(l,Vt,s);let p=o.addWorksheet("\u5DF2\u5F52\u6863");c(p,Jt,i);let f=o.addWorksheet("\u6C47\u603B");f.columns=[{header:"\u7C7B\u522B",key:"k",width:10},{header:"\u6570\u503C",key:"v",width:12}];let m=(a,d)=>{f.addRow([a,""]).font={bold:!0};for(let[u,h]of Object.entries(d).sort(($,R)=>R[1]-$[1]))f.addRow([u,h])};f.addRow(["\u4EFB\u52A1\u603B\u6570",t.total]).font={bold:!0},m("\u6309\u72B6\u6001",t.byStatus),m("\u6309\u8D1F\u8D23\u4EBA",t.byOwner),f.addRow([]);let g=f.addRow(ne.map(a=>a.label));g.font={bold:!0};for(let a of e)f.addRow(ne.map(d=>d.label==="\u4EFB\u52A1\u540D"?C(d.value(a),n):d.value(a)));return Buffer.from(await o.xlsx.writeBuffer())}async function Ht(e,t,n,r=!0){let o=e.split(".").pop()?.toLowerCase();if(o==="csv")pe(e),F(e,Ve(t,r));else if(o==="json")pe(e),F(e,Je(t,n,r));else if(o==="xlsx")pe(e),F(e,await Zt(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 ue,existsSync as me,mkdirSync as He}from"fs";import{join as q}from"path";import{createRequire as Qt}from"module";import{openSync as qt,unlinkSync as Pe,statSync as Gt,closeSync as Xt}from"fs";import{join as Ze}from"path";var Kt=600*1e3;function U(e,t=Kt){let n=Ze(e,".archive.lock");for(let r=0;r<2;r++)try{return qt(n,"wx")}catch{try{let o=Gt(n);if(Date.now()-o.mtimeMs<=t)return null;Pe(n)}catch{return null}}return null}function V(e,t){Xt(t);try{Pe(Ze(e,".archive.lock"))}catch{}}var en=Qt(import.meta.url),qe={\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:""};function Ge(e,t={}){let n=new Map;return e.forEach((r,o)=>{let s=String(r??"").trim().toLowerCase();if(!s)return;let i;t[s]!==void 0&&(i=t[s]),i===void 0&&(i=qe[s]),i!==""&&i&&!n.has(i)&&n.set(i,o)}),n}function tn(e){let t=[],n=e.replace(/^\uFEFF/,"").replace(/\r\n/g,`
15
+ ${r}`:""}`}function Ge(e,t,n=!0){let r=e.map(o=>({view:o.view==="\u5DF2\u5F52\u6863"?"archived":"active",title:C(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({schemaVersion:1,summary:t,items:r},null,2)}async function Kt(e,t,n=!0){let r=Ht("exceljs"),o=new r.Workbook,s=e.filter(l=>l.view==="\u5F85\u5B8C\u6210"),i=e.filter(l=>l.view==="\u5DF2\u5F52\u6863"),c=(l,g,d)=>{l.columns=g.map(h=>({header:h.label,key:h.label,width:Math.max(h.label.length+4,14)})),l.getRow(1).font={bold:!0};for(let h of d)l.addRow(g.map(b=>b.label==="\u4EFB\u52A1\u540D"?C(b.value(h),n):b.value(h)))},a=o.addWorksheet("\u5F85\u5B8C\u6210");c(a,Zt,s);let u=o.addWorksheet("\u5DF2\u5F52\u6863");c(u,qt,i);let m=o.addWorksheet("\u6C47\u603B");m.columns=[{header:"\u7C7B\u522B",key:"k",width:10},{header:"\u6570\u503C",key:"v",width:12}];let p=(l,g)=>{m.addRow([l,""]).font={bold:!0};for(let[d,h]of Object.entries(g).sort((b,T)=>T[1]-b[1]))m.addRow([d,h])};m.addRow(["\u4EFB\u52A1\u603B\u6570",t.total]).font={bold:!0},p("\u6309\u72B6\u6001",t.byStatus),p("\u6309\u8D1F\u8D23\u4EBA",t.byOwner),m.addRow([]);let f=m.addRow(ne.map(l=>l.label));f.font={bold:!0};for(let l of e)m.addRow(ne.map(g=>g.label==="\u4EFB\u52A1\u540D"?C(g.value(l),n):g.value(l)));return Buffer.from(await o.xlsx.writeBuffer())}async function Qt(e,t,n,r=!0){let o=e.split(".").pop()?.toLowerCase();if(o==="csv")pe(e),F(e,Je(t,r));else if(o==="json")pe(e),F(e,Ge(t,n,r));else if(o==="xlsx")pe(e),F(e,await Kt(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 de,existsSync as fe,mkdirSync as qe}from"fs";import{join as Z}from"path";import{createRequire as on}from"module";import{openSync as en,unlinkSync as He,statSync as tn,closeSync as nn}from"fs";import{join as Ze}from"path";var rn=600*1e3;function U(e,t=rn){let n=Ze(e,".archive.lock");for(let r=0;r<2;r++)try{return en(n,"wx")}catch{try{let o=tn(n);if(Date.now()-o.mtimeMs<=t)return null;He(n)}catch{return null}}return null}function P(e,t){nn(t);try{He(Ze(e,".archive.lock"))}catch{}}var sn=on(import.meta.url),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:""};function Ke(e,t={}){let n=new Map;return e.forEach((r,o)=>{let s=String(r??"").trim().toLowerCase();if(!s)return;let i;t[s]!==void 0&&(i=t[s]),i===void 0&&(i=Xe[s]),i!==""&&i&&!n.has(i)&&n.set(i,o)}),n}function cn(e){let t=[],n=e.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 c=n[i];s?c==='"'?n[i+1]==='"'?(o+='"',i++):s=!1:o+=c:c==='"'?s=!0:c===","?(r.push(o),o=""):c===`
18
- `?(r.push(o),t.push(r),r=[],o=""):o+=c}return(o!==""||r.length>0)&&(r.push(o),t.push(r)),t.filter(i=>i.length>1||(i[0]||"").trim()!=="")}function nn(e,t){let n=tn(e);if(n.length===0)return[];let r=Ge(n[0]??[],t),o=[];for(let s=1;s<n.length;s++){let i={},c=n[s]??[];for(let[l,p]of r)i[l]=(c[p]??"").trim();(i.title||Object.keys(i).length>0)&&o.push(i)}return o}function rn(e,t){let n=[];for(let r=1;r<=(e.rowCount||0);r++){let o=e.getRow(r),s=[];for(let c=1;c<=(o.cellCount||0);c++)s.push(o.getCell(c).text??"");if(s.every(c=>c.trim()===""))continue;let i=Ge(s,t);if(i.has("title")){for(let c=r+1;c<=e.rowCount;c++){let l=e.getRow(c),p={},f=!0;for(let[m,g]of i){let a=(l.getCell(g+1).text??"").trim();a&&(f=!1),p[m]=a}!f&&(p.title||Object.keys(p).length>0)&&n.push(p)}break}}return n}async function on(e,t){let n=en("exceljs"),r=new n.Workbook;await r.xlsx.readFile(e);let o=[];for(let s of r.worksheets)s.name.includes("\u6C47\u603B")||o.push(...rn(s,t));return o}function sn(e,t){let n=JSON.parse(e);if(!Array.isArray(n)&&typeof n.schemaVersion=="number"){let s=n.schemaVersion;s>1&&console.warn(`\u26A0\uFE0F \u5BFC\u5165 JSON \u6765\u81EA\u66F4\u9AD8 schema \u7248\u672C v${s}\uFF0C\u5B57\u6BB5\u89E3\u6790\u53EF\u80FD\u4E0D\u5B8C\u6574`)}let 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[c,l]of Object.entries(s)){let p=c.trim().toLowerCase(),f;t[p]!==void 0&&(f=t[p]),f===void 0&&(f=qe[p]),f&&(Array.isArray(l)?i[f]=l.join(","):l!=null&&(i[f]=String(l)))}o.push(i)}return o}function cn(e){let t=e.trim().replace(/[\\/:*?"<>|]/g," ").replace(/\s+/g," "),n=t.length>24;return{slug:t.slice(0,24).trim().replace(/\s+/g,"-")||"\u4EFB\u52A1",truncated:n}}function an(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(([p,f])=>`${p}=${f}`).join(" ")}\uFF09`),{ok:!1};let o=(e.status||"").trim()||"\u5F85\u529E";Z.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=e.completed?.trim()?v(e.completed.trim()):"";s&&!N.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=(e.owner||"").trim()||t.owner||"";i=i.replace(/\s+/g,"");let c=(e.scope||"").trim()||t.scope||"-";e.scope&&/[、,,()()]/.test(e.scope.trim())&&n.push(`\u4EFB\u52A1\u300C${r}\u300D\u8303\u56F4\u300C${e.scope.trim()}\u300D\u542B\u987F\u53F7/\u9017\u53F7/\u62EC\u53F7\uFF0C\u5C06\u6309\u5355\u503C\u5199\u5165\uFF1B\u591A\u503C\u8BF7\u7528\u534A\u89D2\u52A0\u53F7\uFF08\u5982 toolkit+lxgl-web\uFF09\uFF0C\u62EC\u53F7\u6CE8\u91CA\u8BF7\u79FB\u5165\u6B63\u6587`);let l=(e.depends||"").split(/[,,;;]/).map(p=>p.trim()).filter(Boolean);return{ok:!0,t:{title:r,status:o,owner:i||"\u672A\u6807\u6CE8",scope:c,created:je(e.created||""),completed:s,depends:l,body:e.body?.trim()||""}}}function ln(e,t,n,r){let o=t.created||ae(),s=q(e,"active",o.slice(0,6)),{slug:i,truncated:c}=cn(t.title);c&&r.push(`\u4EFB\u52A1\u300C${t.title}\u300D\u6807\u9898\u8FC7\u957F\uFF0C\u6587\u4EF6\u540D\u5DF2\u622A\u65AD`);let l=`${o}-${t.owner}-${i}`,p=1,f=q(s,`${l}.md`);for(;me(f);)f=q(s,`${l}-${p++}.md`);let g=["---",`owner: ${t.owner}`,`status: ${t.status}`,`created: ${o}`,`updated: ${ae()}`,`completed: ${t.completed?`'${t.completed}'`:"''"}`,`depends_on: ${JSON.stringify(t.depends)}`,`scope: ${t.scope}`,"---","",`# ${t.title}`].join(`
18
+ `?(r.push(o),t.push(r),r=[],o=""):o+=c}return(o!==""||r.length>0)&&(r.push(o),t.push(r)),t.filter(i=>i.length>1||(i[0]||"").trim()!=="")}function an(e,t){let n=cn(e);if(n.length===0)return[];let r=Ke(n[0]??[],t),o=[];for(let s=1;s<n.length;s++){let i={},c=n[s]??[];for(let[a,u]of r)i[a]=(c[u]??"").trim();(i.title||Object.keys(i).length>0)&&o.push(i)}return o}function ln(e,t){let n=[];for(let r=1;r<=(e.rowCount||0);r++){let o=e.getRow(r),s=[];for(let c=1;c<=(o.cellCount||0);c++)s.push(o.getCell(c).text??"");if(s.every(c=>c.trim()===""))continue;let i=Ke(s,t);if(i.has("title")){for(let c=r+1;c<=e.rowCount;c++){let a=e.getRow(c),u={},m=!0;for(let[p,f]of i){let l=(a.getCell(f+1).text??"").trim();l&&(m=!1),u[p]=l}!m&&(u.title||Object.keys(u).length>0)&&n.push(u)}break}}return n}async function un(e,t){let n=sn("exceljs"),r=new n.Workbook;await r.xlsx.readFile(e);let o=[];for(let s of r.worksheets)s.name.includes("\u6C47\u603B")||o.push(...ln(s,t));return o}function pn(e,t){let n=JSON.parse(e);if(!Array.isArray(n)&&typeof n.schemaVersion=="number"){let s=n.schemaVersion;s>1&&console.warn(`\u26A0\uFE0F \u5BFC\u5165 JSON \u6765\u81EA\u66F4\u9AD8 schema \u7248\u672C v${s}\uFF0C\u5B57\u6BB5\u89E3\u6790\u53EF\u80FD\u4E0D\u5B8C\u6574`)}let 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[c,a]of Object.entries(s)){let u=c.trim().toLowerCase(),m;t[u]!==void 0&&(m=t[u]),m===void 0&&(m=Xe[u]),m&&(Array.isArray(a)?i[m]=a.join(","):a!=null&&(i[m]=String(a)))}o.push(i)}return o}function dn(e){let t=e.trim().replace(/[\\/:*?"<>|]/g," ").replace(/\s+/g," "),n=t.length>24;return{slug:t.slice(0,24).trim().replace(/\s+/g,"-")||"\u4EFB\u52A1",truncated:n}}function fn(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(([u,m])=>`${u}=${m}`).join(" ")}\uFF09`),{ok:!1};let o=(e.status||"").trim()||"\u5F85\u529E";G.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=e.completed?.trim()?$(e.completed.trim()):"";s&&!N.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=(e.owner||"").trim()||t.owner||"";i=i.replace(/\s+/g,"");let c=(e.scope||"").trim()||t.scope||"-";e.scope&&/[、,,()()]/.test(e.scope.trim())&&n.push(`\u4EFB\u52A1\u300C${r}\u300D\u8303\u56F4\u300C${e.scope.trim()}\u300D\u542B\u987F\u53F7/\u9017\u53F7/\u62EC\u53F7\uFF0C\u5C06\u6309\u5355\u503C\u5199\u5165\uFF1B\u591A\u503C\u8BF7\u7528\u534A\u89D2\u52A0\u53F7\uFF08\u5982 toolkit+lxgl-web\uFF09\uFF0C\u62EC\u53F7\u6CE8\u91CA\u8BF7\u79FB\u5165\u6B63\u6587`);let a=(e.depends||"").split(/[,,;;]/).map(u=>u.trim()).filter(Boolean);return{ok:!0,t:{title:r,status:o,owner:i||"\u672A\u6807\u6CE8",scope:c,created:je(e.created||""),completed:s,depends:a,body:e.body?.trim()||""}}}function mn(e,t,n,r){let o=t.created||le(),s=Z(e,"active",o.slice(0,6)),{slug:i,truncated:c}=dn(t.title);c&&r.push(`\u4EFB\u52A1\u300C${t.title}\u300D\u6807\u9898\u8FC7\u957F\uFF0C\u6587\u4EF6\u540D\u5DF2\u622A\u65AD`);let a=`${o}-${t.owner}-${i}`,u=1,m=Z(s,`${a}.md`);for(;fe(m);)m=Z(s,`${a}-${u++}.md`);let f=["---",`owner: ${t.owner}`,`status: ${t.status}`,`created: ${o}`,`updated: ${le()}`,`completed: ${t.completed?`'${t.completed}'`:"''"}`,`depends_on: ${JSON.stringify(t.depends)}`,`scope: ${t.scope}`,"---","",`# ${t.title}`].join(`
19
19
  `)+(t.body?`
20
20
 
21
21
  ${t.body}
22
22
  `:`
23
- `);return n||(He(s,{recursive:!0}),F(f,g)),f}function pn(e,t,n,r){let o=t.completed||"",s=o?x(o):"";if(!s)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 i=s.replace(/-/g,""),c=q(e,"archive",i.slice(0,6)),l=q(c,`${i}.md`),p=`> \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}`,f=`# ${t.title}${t.body?`
23
+ `);return n||(qe(s,{recursive:!0}),F(m,f)),m}function gn(e,t,n,r){let o=t.completed||"",s=o?x(o):"";if(!s)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 i=s.replace(/-/g,""),c=Z(e,"archive",i.slice(0,6)),a=Z(c,`${i}.md`),u=`> \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}`,m=`# ${t.title}${t.body?`
24
24
 
25
- ${t.body}`:""}`,m={title:t.title,metaLine:p,completed:o,body:f};if(n)return l;He(c,{recursive:!0});let g=`# ${i} \u5F52\u6863
25
+ ${t.body}`:""}`,p={title:t.title,metaLine:u,completed:o,body:m};if(n)return a;qe(c,{recursive:!0});let f=`# ${i} \u5F52\u6863
26
26
 
27
27
  > \u672C\u6587\u4EF6\u7531 \`toolkit tasks import --target archive\` \u81EA\u52A8\u751F\u6210\u3002
28
- `,a=[];if(me(l)){let u=A(ue(l,"utf8"));u.header&&(g=u.header),a=u.blocks}a.push(m),a.sort((u,h)=>v(h.completed).localeCompare(v(u.completed)));let d=a.map(u=>`## ${u.title}
28
+ `,l=[];if(fe(a)){let d=A(de(a,"utf8"));d.header&&(f=d.header),l=d.blocks}l.push(p),l.sort((d,h)=>$(h.completed).localeCompare($(d.completed)));let g=l.map(d=>`## ${d.title}
29
29
 
30
- ${u.metaLine}
30
+ ${d.metaLine}
31
31
 
32
- ${u.body}`);return F(l,`${g}
32
+ ${d.body}`);return F(a,`${f}
33
33
 
34
- ${d.join(`
34
+ ${g.join(`
35
35
 
36
36
  ---
37
37
 
38
38
  `)}
39
- `),l}async function un(e,t=".tasks",n={}){let r=!!n.dryRun,o=[],s=Object.fromEntries(Object.entries(n.importColumns??{}).map(([a,d])=>[String(a).trim().toLowerCase(),String(d)])),i=e.split(".").pop()?.toLowerCase(),c;if(i==="csv")c=nn(ue(e,"utf8"),s);else if(i==="xlsx")c=await on(e,s);else if(i==="json")c=sn(ue(e,"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(c.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,p=0,f=n.target??"active",m=null;if(!r&&me(t)&&(m=U(t),m===null)){let a="\u68C0\u6D4B\u5230\u5199\u5165\u9501 .archive.lock\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5199\u5165\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7";return console.warn(`\u26A0\uFE0F ${a}`),{created:0,skipped:c.length,warnings:[...o,a],dryRun:r}}try{for(let a of c){let d=an(a,n,o);if(!d.ok){p++;continue}let u=d.t;if(f==="archive"){let h=pn(t,u,r,o);if(!h){p++;continue}console.log(`${r?"[\u9884\u6F14] \u5C06\u5199\u5165\u5F52\u6863":"\u5DF2\u5199\u5165\u5F52\u6863"} \u2192 ${M(t,h)}`)}else{let h=ln(t,u,r,o);console.log(`${r?"[\u9884\u6F14] \u5C06\u521B\u5EFA":"\u5DF2\u521B\u5EFA"} \u2192 ${M(t,h)}`)}l++}}finally{if(m!==null)try{V(t,m)}catch{}}for(let a of o)console.warn(`\u26A0\uFE0F ${a}`);return console.log(`${r?"\u9884\u6F14\u53EF\u5BFC\u5165":"\u5DF2\u5BFC\u5165"} ${l} \u4E2A\u4EFB\u52A1\uFF0C\u8DF3\u8FC7 ${p} \u884C`),{created:l,skipped:p,warnings:o,dryRun:r}}import{readFileSync as fe,mkdirSync as mn,unlinkSync as dn,existsSync as fn,readdirSync as gn,rmdirSync as hn}from"fs";import{join as re,basename as de,dirname as Ke,resolve as Xe,sep as kn}from"path";function oe(e,t){let n=Xe(e),r=Xe(t);for(;n!==r&&n.startsWith(r+kn);){try{if(gn(n).length>0)break;hn(n)}catch{break}n=Ke(n)}}function wn(e){let t=fe(e,"utf8"),{blocks:n}=A(t);return n.map(r=>({block:z(r),completed:r.completed}))}function bn(e=".tasks",t=!0,n={}){let{dryRun:r=!1,warn:o=!0}=n,s=re(e,"active"),i=re(e,"archive"),c=[],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:c};let p=[],f=[];for(let a of l){let d=fe(a,"utf8").replace(/\r\n?/g,`
40
- `),u=j(d);if(!N.includes(u.status))continue;let h=v(u.completed||"");if(!h){f.push(de(a,".md")),console.log(`\u8DF3\u8FC7 ${de(a,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}p.push({file:a,name:de(a,".md"),owner:u.owner||"\u672A\u6807\u6CE8",status:u.status||"\u672A\u6807\u6CE8",scope:u.scope||"-",completed:h,body:D(d).trim()})}if(p.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:f,warnings:c};if(o)for(let a of p){let d=a.completed.replace(/-/g,"").slice(0,8),u=I(a.file);u&&d!==u&&c.push(`\u4EFB\u52A1\u300C${a.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${a.completed} \u4E0E\u521B\u5EFA\u65E5 ${u} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`),new Date(a.completed.replace(" ","T")).getTime()>Date.now()+6e4?c.push(`\u4EFB\u52A1\u300C${a.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${a.completed} \u665A\u4E8E\u5F53\u524D\u7CFB\u7EDF\u65F6\u95F4\uFF0C\u7591\u4F3C\u65F6\u95F4\u6E90\u9519\u8BEF\uFF0C\u8BF7\u6838\u5B9E\u540E\u518D\u5F52\u6863`):a.completed.endsWith(" 00:00")&&c.push(`\u4EFB\u52A1\u300C${a.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${a.completed} \u6070\u4E3A\u96F6\u70B9\u6574\uFF0C\u7591\u4F3C\u53EA\u586B\u4E86\u65E5\u671F\u88AB\u8865\u96F6\uFF0C\u8BF7\u6838\u5B9E\u540E\u518D\u5F52\u6863`)}let m={};for(let a of p){let d=a.completed.replace(/-/g,"").slice(0,8);(m[d]||=[]).push(a)}let g=null;if(!r&&(g=U(e),g===null)){let a="\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 ${a}`),{archived:0,skipped:f,warnings:[...c,a]}}try{let a=0,d=[];for(let[u,h]of Object.entries(m)){let $=re(i,u.slice(0,6)),R=re($,`${u}.md`),_=fn(R)?fe(R,"utf8"):"",Q=`# ${u} \u5F52\u6863
39
+ `),a}async function hn(e,t=".tasks",n={}){let r=!!n.dryRun,o=[],s=Object.fromEntries(Object.entries(n.importColumns??{}).map(([l,g])=>[String(l).trim().toLowerCase(),String(g)])),i=e.split(".").pop()?.toLowerCase(),c;if(i==="csv")c=an(de(e,"utf8"),s);else if(i==="xlsx")c=await un(e,s);else if(i==="json")c=pn(de(e,"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(c.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 a=0,u=0,m=n.target??"active",p=null;if(!r&&fe(t)&&(p=U(t),p===null)){let l="\u68C0\u6D4B\u5230\u5199\u5165\u9501 .archive.lock\uFF0C\u53EF\u80FD\u6709\u5E76\u53D1\u5199\u5165\u6B63\u5728\u8FDB\u884C\uFF0C\u672C\u6B21\u5DF2\u8DF3\u8FC7";return console.warn(`\u26A0\uFE0F ${l}`),{created:0,skipped:c.length,warnings:[...o,l],dryRun:r}}try{for(let l of c){let g=fn(l,n,o);if(!g.ok){u++;continue}let d=g.t;if(m==="archive"){let h=gn(t,d,r,o);if(!h){u++;continue}console.log(`${r?"[\u9884\u6F14] \u5C06\u5199\u5165\u5F52\u6863":"\u5DF2\u5199\u5165\u5F52\u6863"} \u2192 ${j(t,h)}`)}else{let h=mn(t,d,r,o);console.log(`${r?"[\u9884\u6F14] \u5C06\u521B\u5EFA":"\u5DF2\u521B\u5EFA"} \u2192 ${j(t,h)}`)}a++}}finally{if(p!==null)try{P(t,p)}catch{}}for(let l of o)console.warn(`\u26A0\uFE0F ${l}`);return console.log(`${r?"\u9884\u6F14\u53EF\u5BFC\u5165":"\u5DF2\u5BFC\u5165"} ${a} \u4E2A\u4EFB\u52A1\uFF0C\u8DF3\u8FC7 ${u} \u884C`),{created:a,skipped:u,warnings:o,dryRun:r}}import{readFileSync as ge,mkdirSync as kn,unlinkSync as bn,existsSync as wn,readdirSync as yn,rmdirSync as vn}from"fs";import{join as re,basename as me,dirname as et,resolve as Qe,sep as $n}from"path";function oe(e,t){let n=Qe(e),r=Qe(t);for(;n!==r&&n.startsWith(r+$n);){try{if(yn(n).length>0)break;vn(n)}catch{break}n=et(n)}}function xn(e){let t=ge(e,"utf8"),{blocks:n}=A(t);return n.map(r=>({block:Y(r),completed:r.completed}))}function Sn(e=".tasks",t=!0,n={}){let{dryRun:r=!1,warn:o=!0}=n,s=re(e,"active"),i=re(e,"archive"),c=[],a=R(s);if(a.length===0)return console.log("\u5F53\u524D\u65E0\u6D3B\u8DC3\u4EFB\u52A1\uFF0C\u65E0\u9700\u5F52\u6863"),{archived:0,skipped:[],warnings:c};let u=[],m=[];for(let l of a){let g=ge(l,"utf8").replace(/\r\n?/g,`
40
+ `),d=E(g);if(!N.includes(d.status))continue;let h=$(d.completed||"");if(!h){m.push(me(l,".md")),console.log(`\u8DF3\u8FC7 ${me(l,".md")}\uFF1A\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`);continue}u.push({file:l,name:me(l,".md"),owner:d.owner||"\u672A\u6807\u6CE8",status:d.status||"\u672A\u6807\u6CE8",scope:d.scope||"-",completed:h,body:I(g).trim()})}if(u.length===0)return console.log("\u672C\u6B21\u65E0\u53EF\u5F52\u6863\u4EFB\u52A1"),{archived:0,skipped:m,warnings:c};if(o)for(let l of u){let g=l.completed.replace(/-/g,"").slice(0,8),d=B(l.file);d&&g!==d&&c.push(`\u4EFB\u52A1\u300C${l.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${l.completed} \u4E0E\u521B\u5EFA\u65E5 ${d} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u786E\u8BA4 completed \u662F\u5426\u586B\u9519`),new Date(l.completed.replace(" ","T")).getTime()>Date.now()+6e4?c.push(`\u4EFB\u52A1\u300C${l.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${l.completed} \u665A\u4E8E\u5F53\u524D\u7CFB\u7EDF\u65F6\u95F4\uFF0C\u7591\u4F3C\u65F6\u95F4\u6E90\u9519\u8BEF\uFF0C\u8BF7\u6838\u5B9E\u540E\u518D\u5F52\u6863`):l.completed.endsWith(" 00:00")&&c.push(`\u4EFB\u52A1\u300C${l.name}\u300D\u5B8C\u6210\u65F6\u95F4 ${l.completed} \u6070\u4E3A\u96F6\u70B9\u6574\uFF0C\u7591\u4F3C\u53EA\u586B\u4E86\u65E5\u671F\u88AB\u8865\u96F6\uFF0C\u8BF7\u6838\u5B9E\u540E\u518D\u5F52\u6863`)}let p={};for(let l of u){let g=l.completed.replace(/-/g,"").slice(0,8);(p[g]||=[]).push(l)}let f=null;if(!r&&(f=U(e),f===null)){let l="\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 ${l}`),{archived:0,skipped:m,warnings:[...c,l]}}try{let l=0,g=[];for(let[d,h]of Object.entries(p)){let b=re(i,d.slice(0,6)),T=re(b,`${d}.md`),_=wn(T)?ge(T,"utf8"):"",Q=`# ${d} \u5F52\u6863
41
41
 
42
- > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002`,O=[];if(_){let w=A(_);w.header&&(Q=w.header);for(let T of w.blocks)O.push({block:z(T),completed:T.completed})}if(o){let w=new Set(O.map(T=>T.block.match(/^## (.+)/)?.[1]??""));for(let T of h)w.has(T.name)&&c.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${T.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}O.push(...h.map(w=>({block:`## ${w.name}
42
+ > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002`,O=[];if(_){let w=A(_);w.header&&(Q=w.header);for(let S of w.blocks)O.push({block:Y(S),completed:S.completed})}if(o){let w=new Set(O.map(S=>S.block.match(/^## (.+)/)?.[1]??""));for(let S of h)w.has(S.name)&&c.push(`\u5F52\u6863\u6587\u4EF6\u5DF2\u5B58\u5728\u540C\u540D\u4EFB\u52A1\u300C${S.name}\u300D\uFF0C\u7591\u4F3C\u91CD\u590D\u5F52\u6863`)}O.push(...h.map(w=>({block:`## ${w.name}
43
43
 
44
44
  > \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}
45
45
 
46
- ${C(w.body,t)}`,completed:w.completed})));for(let w of O)w.completed=v(w.completed);if(O.sort((w,T)=>T.completed.localeCompare(w.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${h.length} \u4E2A\u4EFB\u52A1 \u2192 ${u}.md`);for(let w of h)console.log(`[\u9884\u6F14] - ${w.name}`);continue}try{mn($,{recursive:!0});let w=_.includes(`\r
46
+ ${C(w.body,t)}`,completed:w.completed})));for(let w of O)w.completed=$(w.completed);if(O.sort((w,S)=>S.completed.localeCompare(w.completed)),r){console.log(`[\u9884\u6F14] \u5C06\u5F52\u6863 ${h.length} \u4E2A\u4EFB\u52A1 \u2192 ${d}.md`);for(let w of h)console.log(`[\u9884\u6F14] - ${w.name}`);continue}try{kn(b,{recursive:!0});let w=_.includes(`\r
47
47
  `)?`\r
48
48
  `:`
49
- `;F(R,`${Q}
49
+ `;F(T,`${Q}
50
50
 
51
- ${O.map(P=>P.block).join(`
51
+ ${O.map(J=>J.block).join(`
52
52
 
53
53
  ---
54
54
 
55
55
  `)}
56
- `.replace(/\n/g,w));for(let P of h)dn(P.file);let T=h[0];T&&oe(Ke(T.file),e),console.log(`\u5DF2\u5F52\u6863 ${h.length} \u4E2A\u4EFB\u52A1 \u2192 ${u}.md`),a+=h.length}catch(w){d.push(`${u}.md\uFF1A${w.message}`)}}for(let u of c)console.warn(`\u26A0\uFE0F ${u}`);if(d.length>0){console.error(`\u5F52\u6863\u5931\u8D25 ${d.length} \u4E2A\u65E5\u671F\u6587\u4EF6\uFF08active \u672A\u5220\u9664\uFF0C\u53EF\u91CD\u8BD5\uFF09\uFF1A`);for(let u of d)console.error(` - ${u}`)}return console.log(r?`[\u9884\u6F14] \u5171 ${p.length} \u4E2A\u4EFB\u52A1\u53EF\u5F52\u6863\uFF08\u672A\u843D\u76D8\uFF09`:`\u5171\u5F52\u6863 ${a} \u4E2A\u4EFB\u52A1${d.length>0?`\uFF0C\u5931\u8D25 ${d.length} \u4E2A`:""}`),{archived:r?p.length:a,skipped:f,warnings:c}}finally{if(g!==null)try{V(e,g)}catch{}}}import{readFileSync as ge,statSync as yn,readdirSync as Qe,existsSync as $n}from"fs";import{join as he,basename as G,dirname as vn}from"path";var xn=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,Tn=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/,Sn=/^\d{4}-\d{1,2}-\d{1,2}[T\s]\d{1,2}:\d{2}(?::\d{2})?$/,Rn=/^\d{8}-[^-]+-.+\.md$/;function et(e){let t=e.match(/^(\d{4})-?(\d{1,2})-?(\d{1,2})/);if(!t)return!1;let[,n,r,o]=t;if(!n||!r||!o)return!1;let s=+n,i=+r,c=+o;if(i<1||i>12||c<1||c>31)return!1;let l=new Date(Date.UTC(s,i-1,c));return l.getUTCFullYear()===s&&l.getUTCMonth()===i-1&&l.getUTCDate()===c}function nt(e){let t=[],n=G(e),r=ge(e,"utf8").replace(/^\uFEFF/,"");if(!ce.test(r))return t.push({level:"error",file:n,message:"\u7F3A\u5C11 frontmatter"}),t;let s=j(r);if(s.status?Z.includes(s.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${s.status}\u300D\uFF0C\u5E94\u4E3A ${Z.join(" / ")}`}):t.push({level:"error",file:n,message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),N.includes(s.status)&&!s.completed&&t.push({level:"error",file:n,message:`status \u4E3A\u300C${s.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),s.completed){let m=s.completed.trim();if(!Tn.test(m))t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`});else{let g=m.match(/^\d{4}-\d{1,2}-\d{1,2}/)?.[0]??m;et(g)?Sn.test(m)?new Date(m.replace(" ","T")).getTime()>Date.now()+6e4?t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u665A\u4E8E\u5F53\u524D\u7CFB\u7EDF\u65F6\u95F4\uFF0C\u7591\u4F3C\u65F6\u95F4\u6E90\u9519\u8BEF\uFF0C\u8BF7\u5F53\u573A\u53D6\u7CFB\u7EDF\u65F6\u95F4\u6838\u5B9E`}):/(?:[T\s]00:00(?::00)?)$/.test(m)&&t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u6070\u4E3A\u96F6\u70B9\u6574\uFF0C\u7591\u4F3C\u53EA\u586B\u4E86\u65E5\u671F\u88AB\u8865\u96F6\uFF0C\u8BF7\u6838\u5B9E\u5B9E\u9645\u5B8C\u6210\u65F6\u95F4`}):t.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`}):t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u65E5\u671F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u6838\u5BF9`})}}s.owner||t.push({level:"warn",file:n,message:"\u7F3A\u5C11 owner \u8D1F\u8D23\u4EBA\u5B57\u6BB5"}),s.created?/^\d{8}$/.test(s.created.trim())?et(s.created.trim())||t.push({level:"warn",file:n,message:`created\u300C${s.created}\u300D\u65E5\u671F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u6838\u5BF9`}):t.push({level:"warn",file:n,message:`created\u300C${s.created}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYYMMDD`}):t.push({level:"warn",file:n,message:"\u7F3A\u5C11 created \u521B\u5EFA\u65E5\u671F\u5B57\u6BB5"});let i=n.match(/^(\d{8})-/);if(Rn.test(n)?s.created&&/^\d{8}$/.test(s.created.trim())&&i&&s.created.trim()!==i[1]&&t.push({level:"warn",file:n,message:`\u6587\u4EF6\u540D\u65E5\u671F ${i[1]} \u4E0E created ${s.created.trim()} \u4E0D\u4E00\u81F4`}):t.push({level:"warn",file:n,message:"\u6587\u4EF6\u540D\u4E0D\u7B26\u5408\u89C4\u8303 {YYYYMMDD}-{\u8D1F\u8D23\u4EBA}-{\u7B80\u8FF0}.md"}),s.scope){let m=s.scope.trim();/[、,,]/.test(m)&&t.push({level:"warn",file:n,message:`scope\u300C${s.scope}\u300D\u542B\u987F\u53F7/\u9017\u53F7\u7591\u4F3C\u591A\u503C\u5206\u9694\uFF0C\u591A\u503C\u8BF7\u6539\u7528\u534A\u89D2\u52A0\u53F7\u8FDE\u63A5\uFF08\u5982 scope: toolkit+lxgl-web\uFF09`}),/[()()]/.test(m)&&t.push({level:"warn",file:n,message:`scope\u300C${s.scope}\u300D\u542B\u62EC\u53F7\u7591\u4F3C\u6CE8\u91CA\u6027\u6587\u5B57\uFF0C\u8BF4\u660E\u8BF7\u79FB\u5165\u6B63\u6587`})}let c=be(D(r)),p=Y("check")?.pendingMarkers!==!1?c.match(xn):null;return p&&t.push({level:"warn",file:n,message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${p[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),Y("check")?.includeCheckbox!==!1&&/^[-*]\s*\[ \]\s/m.test(c)&&t.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"}),t}function An(e){let t=[];if(!$n(e))return t;for(let n of Qe(e,{withFileTypes:!0}))if(!(n.name==="active"||n.name==="archive")){if(n.isFile())n.name.endsWith(".md")&&/^\d{8}-/.test(n.name)&&t.push(n.name);else if(n.isDirectory())for(let r of Qe(he(e,n.name)))r.endsWith(".md")&&/^\d{8}-/.test(r)&&t.push(`${n.name}/${r}`)}return t}function Cn(e=".tasks"){let t=he(e,"active"),n=S(t),r=[];for(let c of n)r.push(...nt(c)),vn(c)===t&&r.push({level:"warn",file:G(c),message:"active \u4EFB\u52A1\u5E94\u653E\u5165 {YYYYMM} \u6708\u4EFD\u5B50\u76EE\u5F55\uFF08\u5F53\u524D\u76F4\u653E active \u6839\u76EE\u5F55\uFF09"});for(let c of An(e))r.push({level:"warn",file:c,message:"\u4EFB\u52A1\u6587\u4EF6\u6E38\u79BB\u4E8E active/ \u4E4B\u5916\uFF0Ctasks/check/archive \u5747\u4E0D\u4F1A\u8BFB\u53D6\uFF0C\u5E94\u79FB\u5165 active/{YYYYMM}/ \u6708\u4EFD\u5B50\u76EE\u5F55"});let o=new Map;for(let c of n){let l=G(c,".md"),p=o.get(l);p?p.push(c):o.set(l,[c])}for(let[c,l]of o)l.length>1&&r.push({level:"warn",file:c,message:`\u5B58\u5728 ${l.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});r.push(...Ln(n,e));let s=r.filter(c=>c.level==="error").length,i=r.length-s;return{issues:r,errorCount:s,warnCount:i}}var tt=new Map;function Fn(e){let t=yn(e),n=tt.get(e);if(n&&n.mtimeMs===t.mtimeMs)return n.titles;let r=[];try{for(let o of A(ge(e,"utf8")).blocks)o.title&&!r.includes(o.title)&&r.push(o.title)}catch{}return tt.set(e,{mtimeMs:t.mtimeMs,titles:r}),r}function Ln(e,t){let n=[],r=new Set(e.map(g=>G(g,".md"))),o=new Map,s=g=>g.trim().replace(/\.md$/,"").trim(),i=new Map;for(let g of S(he(t,"archive")))for(let a of Fn(g))i.has(a)||i.set(a,M(t,g));for(let g of e){let a=G(g,".md"),d=ge(g,"utf8"),u=j(d),h=te(u.depends_on).map(s);o.set(a,h);for(let $ of h)if(!r.has($)){let R=i.get($);n.push({level:"warn",file:a,message:R?`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${$}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u5DF2\u5F52\u6863\u4E8E ${R}\uFF0C\u65E0\u9700\u518D\u4F9D\u8D56\uFF09`:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${$}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}}let c=0,l=1,p=2,f=new Map,m=(g,a)=>{f.set(g,l);for(let d of o.get(g)??[]){if(!r.has(d))continue;let u=f.get(d)??c;if(u===l)return[...a,d];if(u===c){let h=m(d,[...a,d]);if(h)return h}}return f.set(g,p),null};for(let g of o.keys())if((f.get(g)??c)===c){let a=m(g,[g]);if(a){n.push({level:"warn",file:g,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${a.join(" \u2192 ")}`});break}}return n}import{readFileSync as se,unlinkSync as jn,existsSync as ie,mkdirSync as rt,renameSync as On}from"fs";import{join as J,basename as K,dirname as X}from"path";var Mn=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function ot(e){return Mn.every(t=>e.includes(t))}function En(e){if(!/[、,,]/.test(e))return null;let t=e.split(/[、,,]/).map(n=>n.trim()).filter(Boolean);return t.length>0?t.join("+"):null}function Dn(e,t){return e.replace(/(范围[::])[^ ]*/,`$1${t}`)}function In(e=".tasks"){let t=J(e,"archive"),n=S(t),r=[];for(let o of n){let s=K(o),i=s.replace(/\.md$/,""),c=se(o,"utf8"),{blocks:l}=A(c),p=K(X(o)),f=s.replace(/\.md$/,"");p&&f&&p!==f.slice(0,6)&&r.push({file:s,message:`\u5F52\u6863\u6587\u4EF6\u4F4D\u4E8E ${p} \u6708\u4EFD\u76EE\u5F55\uFF0C\u4E0E\u6587\u4EF6\u540D\u65E5\u671F ${f.slice(0,6)} \u4E0D\u4E00\u81F4`,fixable:!1});for(let m of Fe(c))r.push({file:s,message:`\u7591\u4F3C\u4EFB\u52A1\u5757\u300C${m}\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 m=1;m<l.length;m++){let g=l[m-1],a=l[m];if(!g||!a)continue;let d=v(g.completed),u=v(a.completed);if(d&&u&&d<u){r.push({file:s,message:"\u4EFB\u52A1\u5757\u672A\u6309\u5B8C\u6210\u65F6\u95F4\u964D\u5E8F\u6392\u5217",fixable:!0});break}}for(let m of l){if(m.metaLine?ot(m.metaLine)||r.push({file:s,message:`\u5757\u300C${m.title}\u300D\u5143\u6570\u636E\u884C\u4E0D\u5B8C\u6574\uFF08\u7F3A\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4\u4E4B\u4E00\uFF09`,fixable:!!m.completed}):r.push({file:s,message:`\u5757\u300C${m.title}\u300D\u7F3A\u5C11\u5143\u6570\u636E\u884C\uFF08\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4/\u5B8C\u6210\u65F6\u95F4\uFF09`,fixable:!!m.completed}),m.metaLine){let d=B(m.metaLine);d.scope&&/[、,,]/.test(d.scope)&&r.push({file:s,message:`\u5757\u300C${m.title}\u300D\u8303\u56F4\u300C${d.scope}\u300D\u542B\u987F\u53F7/\u9017\u53F7\u7591\u4F3C\u591A\u503C\u5206\u9694\uFF0C\u53EF --fix \u5F52\u4E00\u4E3A\u534A\u89D2\u52A0\u53F7`,fixable:!0}),d.scope&&/[()()]/.test(d.scope)&&r.push({file:s,message:`\u5757\u300C${m.title}\u300D\u8303\u56F4\u300C${d.scope}\u300D\u542B\u62EC\u53F7\u7591\u4F3C\u6CE8\u91CA\uFF0C\u5220\u7559\u9700\u4EBA\u5DE5\u786E\u8BA4`,fixable:!1})}let g=v(m.completed),a=g.replace(/-/g,"").slice(0,8);a&&i&&a!==i&&r.push({file:s,message:`\u5757\u300C${m.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${g} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${i} \u4E0D\u4E00\u81F4`,fixable:!1}),/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/.test(g)&&new Date(g.replace(" ","T")).getTime()>Date.now()+6e4?r.push({file:s,message:`\u5757\u300C${m.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${g} \u665A\u4E8E\u5F53\u524D\u7CFB\u7EDF\u65F6\u95F4\uFF0C\u7591\u4F3C\u65F6\u95F4\u6E90\u9519\u8BEF\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\uFF09`,fixable:!1}):g.endsWith(" 00:00")&&r.push({file:s,message:`\u5757\u300C${m.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${g} \u6070\u4E3A\u96F6\u70B9\u6574\uFF0C\u7591\u4F3C\u53EA\u586B\u4E86\u65E5\u671F\u88AB\u8865\u96F6\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\uFF09`,fixable:!1})}}return r}function Bn(e,t,n){let r=J(e,"archive",n.slice(0,6)),o=J(r,`${n}.md`);rt(r,{recursive:!0});let s=`# ${n} \u5F52\u6863
56
+ `.replace(/\n/g,w));for(let J of h)bn(J.file);let S=h[0];S&&oe(et(S.file),e),console.log(`\u5DF2\u5F52\u6863 ${h.length} \u4E2A\u4EFB\u52A1 \u2192 ${d}.md`),l+=h.length}catch(w){g.push(`${d}.md\uFF1A${w.message}`)}}for(let d of c)console.warn(`\u26A0\uFE0F ${d}`);if(g.length>0){console.error(`\u5F52\u6863\u5931\u8D25 ${g.length} \u4E2A\u65E5\u671F\u6587\u4EF6\uFF08active \u672A\u5220\u9664\uFF0C\u53EF\u91CD\u8BD5\uFF09\uFF1A`);for(let d of g)console.error(` - ${d}`)}return console.log(r?`[\u9884\u6F14] \u5171 ${u.length} \u4E2A\u4EFB\u52A1\u53EF\u5F52\u6863\uFF08\u672A\u843D\u76D8\uFF09`:`\u5171\u5F52\u6863 ${l} \u4E2A\u4EFB\u52A1${g.length>0?`\uFF0C\u5931\u8D25 ${g.length} \u4E2A`:""}`),{archived:r?u.length:l,skipped:m,warnings:c}}finally{if(f!==null)try{P(e,f)}catch{}}}import{readFileSync as he,statSync as Tn,readdirSync as tt,existsSync as Rn}from"fs";import{join as ke,basename as q,dirname as An}from"path";var Cn=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,Fn=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/,Ln=/^\d{4}-\d{1,2}-\d{1,2}[T\s]\d{1,2}:\d{2}(?::\d{2})?$/,En=/^\d{8}-[^-]+-.+\.md$/;function nt(e){let t=e.match(/^(\d{4})-?(\d{1,2})-?(\d{1,2})/);if(!t)return!1;let[,n,r,o]=t;if(!n||!r||!o)return!1;let s=+n,i=+r,c=+o;if(i<1||i>12||c<1||c>31)return!1;let a=new Date(Date.UTC(s,i-1,c));return a.getUTCFullYear()===s&&a.getUTCMonth()===i-1&&a.getUTCDate()===c}function ot(e){let t=[],n=q(e),r=he(e,"utf8").replace(/^\uFEFF/,"");if(!ae.test(r))return t.push({level:"error",file:n,message:"\u7F3A\u5C11 frontmatter"}),t;let s=E(r);if(s.status?G.includes(s.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${s.status}\u300D\uFF0C\u5E94\u4E3A ${G.join(" / ")}`}):t.push({level:"error",file:n,message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),N.includes(s.status)&&!s.completed&&t.push({level:"error",file:n,message:`status \u4E3A\u300C${s.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),s.completed){let p=s.completed.trim();if(!Fn.test(p))t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`});else{let f=p.match(/^\d{4}-\d{1,2}-\d{1,2}/)?.[0]??p;nt(f)?Ln.test(p)?new Date(p.replace(" ","T")).getTime()>Date.now()+6e4?t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u665A\u4E8E\u5F53\u524D\u7CFB\u7EDF\u65F6\u95F4\uFF0C\u7591\u4F3C\u65F6\u95F4\u6E90\u9519\u8BEF\uFF0C\u8BF7\u5F53\u573A\u53D6\u7CFB\u7EDF\u65F6\u95F4\u6838\u5B9E`}):/(?:[T\s]00:00(?::00)?)$/.test(p)&&t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u6070\u4E3A\u96F6\u70B9\u6574\uFF0C\u7591\u4F3C\u53EA\u586B\u4E86\u65E5\u671F\u88AB\u8865\u96F6\uFF0C\u8BF7\u6838\u5B9E\u5B9E\u9645\u5B8C\u6210\u65F6\u95F4`}):t.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`}):t.push({level:"warn",file:n,message:`completed\u300C${s.completed}\u300D\u65E5\u671F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u6838\u5BF9`})}}s.owner||t.push({level:"warn",file:n,message:"\u7F3A\u5C11 owner \u8D1F\u8D23\u4EBA\u5B57\u6BB5"}),s.created?/^\d{8}$/.test(s.created.trim())?nt(s.created.trim())||t.push({level:"warn",file:n,message:`created\u300C${s.created}\u300D\u65E5\u671F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u6838\u5BF9`}):t.push({level:"warn",file:n,message:`created\u300C${s.created}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYYMMDD`}):t.push({level:"warn",file:n,message:"\u7F3A\u5C11 created \u521B\u5EFA\u65E5\u671F\u5B57\u6BB5"});let i=n.match(/^(\d{8})-/);if(En.test(n)?s.created&&/^\d{8}$/.test(s.created.trim())&&i&&s.created.trim()!==i[1]&&t.push({level:"warn",file:n,message:`\u6587\u4EF6\u540D\u65E5\u671F ${i[1]} \u4E0E created ${s.created.trim()} \u4E0D\u4E00\u81F4`}):t.push({level:"warn",file:n,message:"\u6587\u4EF6\u540D\u4E0D\u7B26\u5408\u89C4\u8303 {YYYYMMDD}-{\u8D1F\u8D23\u4EBA}-{\u7B80\u8FF0}.md"}),s.scope){let p=s.scope.trim();/[、,,]/.test(p)&&t.push({level:"warn",file:n,message:`scope\u300C${s.scope}\u300D\u542B\u987F\u53F7/\u9017\u53F7\u7591\u4F3C\u591A\u503C\u5206\u9694\uFF0C\u591A\u503C\u8BF7\u6539\u7528\u534A\u89D2\u52A0\u53F7\u8FDE\u63A5\uFF08\u5982 scope: toolkit+lxgl-web\uFF09`}),/[()()]/.test(p)&&t.push({level:"warn",file:n,message:`scope\u300C${s.scope}\u300D\u542B\u62EC\u53F7\u7591\u4F3C\u6CE8\u91CA\u6027\u6587\u5B57\uFF0C\u8BF4\u660E\u8BF7\u79FB\u5165\u6B63\u6587`})}let c=ve(I(r)),u=W("check")?.pendingMarkers!==!1?c.match(Cn):null;return u&&t.push({level:"warn",file:n,message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${u[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),W("check")?.includeCheckbox!==!1&&/^[-*]\s*\[ \]\s/m.test(c)&&t.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"}),t}function On(e){let t=[];if(!Rn(e))return t;for(let n of tt(e,{withFileTypes:!0}))if(!(n.name==="active"||n.name==="archive")){if(n.isFile())n.name.endsWith(".md")&&/^\d{8}-/.test(n.name)&&t.push(n.name);else if(n.isDirectory())for(let r of tt(ke(e,n.name)))r.endsWith(".md")&&/^\d{8}-/.test(r)&&t.push(`${n.name}/${r}`)}return t}function jn(e=".tasks"){let t=ke(e,"active"),n=R(t),r=[];for(let c of n)r.push(...ot(c)),An(c)===t&&r.push({level:"warn",file:q(c),message:"active \u4EFB\u52A1\u5E94\u653E\u5165 {YYYYMM} \u6708\u4EFD\u5B50\u76EE\u5F55\uFF08\u5F53\u524D\u76F4\u653E active \u6839\u76EE\u5F55\uFF09"});for(let c of On(e))r.push({level:"warn",file:c,message:"\u4EFB\u52A1\u6587\u4EF6\u6E38\u79BB\u4E8E active/ \u4E4B\u5916\uFF0Ctasks/check/archive \u5747\u4E0D\u4F1A\u8BFB\u53D6\uFF0C\u5E94\u79FB\u5165 active/{YYYYMM}/ \u6708\u4EFD\u5B50\u76EE\u5F55"});let o=new Map;for(let c of n){let a=q(c,".md"),u=o.get(a);u?u.push(c):o.set(a,[c])}for(let[c,a]of o)a.length>1&&r.push({level:"warn",file:c,message:`\u5B58\u5728 ${a.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});r.push(...In(n,e));let s=r.filter(c=>c.level==="error").length,i=r.length-s;return{issues:r,errorCount:s,warnCount:i}}var rt=new Map;function Mn(e){let t=Tn(e),n=rt.get(e);if(n&&n.mtimeMs===t.mtimeMs)return n.titles;let r=[];try{for(let o of A(he(e,"utf8")).blocks)o.title&&!r.includes(o.title)&&r.push(o.title)}catch{}return rt.set(e,{mtimeMs:t.mtimeMs,titles:r}),r}function In(e,t){let n=[],r=new Set(e.map(f=>q(f,".md"))),o=new Map,s=f=>f.trim().replace(/\.md$/,"").trim(),i=new Map;for(let f of R(ke(t,"archive")))for(let l of Mn(f))i.has(l)||i.set(l,j(t,f));for(let f of e){let l=q(f,".md"),g=he(f,"utf8"),d=E(g),h=te(d.depends_on).map(s);o.set(l,h);for(let b of h)if(!r.has(b)){let T=i.get(b);n.push({level:"warn",file:l,message:T?`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${b}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u5DF2\u5F52\u6863\u4E8E ${T}\uFF0C\u65E0\u9700\u518D\u4F9D\u8D56\uFF09`:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${b}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}}let c=0,a=1,u=2,m=new Map,p=(f,l)=>{m.set(f,a);for(let g of o.get(f)??[]){if(!r.has(g))continue;let d=m.get(g)??c;if(d===a)return[...l,g];if(d===c){let h=p(g,[...l,g]);if(h)return h}}return m.set(f,u),null};for(let f of o.keys())if((m.get(f)??c)===c){let l=p(f,[f]);if(l){n.push({level:"warn",file:f,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${l.join(" \u2192 ")}`});break}}return n}import{readFileSync as se,unlinkSync as Bn,existsSync as ie,mkdirSync as st,renameSync as Dn}from"fs";import{join as V,basename as K,dirname as X}from"path";var _n=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function it(e){return _n.every(t=>e.includes(t))}function Nn(e){if(!/[、,,]/.test(e))return null;let t=e.split(/[、,,]/).map(n=>n.trim()).filter(Boolean);return t.length>0?t.join("+"):null}function Wn(e,t){return e.replace(/(范围[::])[^ ]*/,`$1${t}`)}function Yn(e=".tasks"){let t=V(e,"archive"),n=R(t),r=[];for(let o of n){let s=K(o),i=s.replace(/\.md$/,""),c=se(o,"utf8"),{blocks:a}=A(c),u=K(X(o)),m=s.replace(/\.md$/,"");u&&m&&u!==m.slice(0,6)&&r.push({file:s,message:`\u5F52\u6863\u6587\u4EF6\u4F4D\u4E8E ${u} \u6708\u4EFD\u76EE\u5F55\uFF0C\u4E0E\u6587\u4EF6\u540D\u65E5\u671F ${m.slice(0,6)} \u4E0D\u4E00\u81F4`,fixable:!1});for(let p of Ee(c))r.push({file:s,message:`\u7591\u4F3C\u4EFB\u52A1\u5757\u300C${p}\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 p=1;p<a.length;p++){let f=a[p-1],l=a[p];if(!f||!l)continue;let g=$(f.completed),d=$(l.completed);if(g&&d&&g<d){r.push({file:s,message:"\u4EFB\u52A1\u5757\u672A\u6309\u5B8C\u6210\u65F6\u95F4\u964D\u5E8F\u6392\u5217",fixable:!0});break}}for(let p of a){if(p.metaLine?it(p.metaLine)||r.push({file:s,message:`\u5757\u300C${p.title}\u300D\u5143\u6570\u636E\u884C\u4E0D\u5B8C\u6574\uFF08\u7F3A\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4\u4E4B\u4E00\uFF09`,fixable:!!p.completed}):r.push({file:s,message:`\u5757\u300C${p.title}\u300D\u7F3A\u5C11\u5143\u6570\u636E\u884C\uFF08\u8D1F\u8D23\u4EBA/\u72B6\u6001/\u8303\u56F4/\u5B8C\u6210\u65F6\u95F4\uFF09`,fixable:!!p.completed}),p.metaLine){let g=D(p.metaLine);g.scope&&/[、,,]/.test(g.scope)&&r.push({file:s,message:`\u5757\u300C${p.title}\u300D\u8303\u56F4\u300C${g.scope}\u300D\u542B\u987F\u53F7/\u9017\u53F7\u7591\u4F3C\u591A\u503C\u5206\u9694\uFF0C\u53EF --fix \u5F52\u4E00\u4E3A\u534A\u89D2\u52A0\u53F7`,fixable:!0}),g.scope&&/[()()]/.test(g.scope)&&r.push({file:s,message:`\u5757\u300C${p.title}\u300D\u8303\u56F4\u300C${g.scope}\u300D\u542B\u62EC\u53F7\u7591\u4F3C\u6CE8\u91CA\uFF0C\u5220\u7559\u9700\u4EBA\u5DE5\u786E\u8BA4`,fixable:!1})}let f=$(p.completed),l=f.replace(/-/g,"").slice(0,8);l&&i&&l!==i&&r.push({file:s,message:`\u5757\u300C${p.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${f} \u4E0E\u5F52\u6863\u6587\u4EF6\u65E5\u671F ${i} \u4E0D\u4E00\u81F4`,fixable:!1}),/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/.test(f)&&new Date(f.replace(" ","T")).getTime()>Date.now()+6e4?r.push({file:s,message:`\u5757\u300C${p.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${f} \u665A\u4E8E\u5F53\u524D\u7CFB\u7EDF\u65F6\u95F4\uFF0C\u7591\u4F3C\u65F6\u95F4\u6E90\u9519\u8BEF\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\uFF09`,fixable:!1}):f.endsWith(" 00:00")&&r.push({file:s,message:`\u5757\u300C${p.title}\u300D\u5B8C\u6210\u65F6\u95F4 ${f} \u6070\u4E3A\u96F6\u70B9\u6574\uFF0C\u7591\u4F3C\u53EA\u586B\u4E86\u65E5\u671F\u88AB\u8865\u96F6\uFF08\u9700\u4EBA\u5DE5\u786E\u8BA4\uFF09`,fixable:!1})}}return r}function zn(e,t,n){let r=V(e,"archive",n.slice(0,6)),o=V(r,`${n}.md`);st(r,{recursive:!0});let s=`# ${n} \u5F52\u6863
57
57
 
58
- > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002`,i=[];if(ie(o)){let p=A(se(o,"utf8"));p.header&&(s=p.header),i.push(...p.blocks)}i.some(p=>p.title===t.title)&&console.warn(`\u26A0\uFE0F \u76EE\u6807 ${n}.md \u5DF2\u5B58\u5728\u540C\u540D\u5757\u300C${t.title}\u300D\uFF0C\u8FC1\u79FB\u5C06\u4EA7\u751F\u91CD\u590D`),i.push(t),i.sort((p,f)=>v(f.completed).localeCompare(v(p.completed)));let c=ie(o)&&se(o,"utf8").includes(`\r
58
+ > \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002`,i=[];if(ie(o)){let u=A(se(o,"utf8"));u.header&&(s=u.header),i.push(...u.blocks)}i.some(u=>u.title===t.title)&&console.warn(`\u26A0\uFE0F \u76EE\u6807 ${n}.md \u5DF2\u5B58\u5728\u540C\u540D\u5757\u300C${t.title}\u300D\uFF0C\u8FC1\u79FB\u5C06\u4EA7\u751F\u91CD\u590D`),i.push(t),i.sort((u,m)=>$(m.completed).localeCompare($(u.completed)));let c=ie(o)&&se(o,"utf8").includes(`\r
59
59
  `)?`\r
60
60
  `:`
61
- `,l=`${s}
61
+ `,a=`${s}
62
62
 
63
- ${i.map(z).join(`
63
+ ${i.map(Y).join(`
64
64
 
65
65
  ---
66
66
 
67
67
  `)}
68
- `.replace(/\n/g,c);F(o,l),console.log(` \u5757\u300C${t.title}\u300D\u8FC1\u79FB \u2192 ${n}.md`)}function _n(e=".tasks"){let t=J(e,"archive"),n=S(t),r=[],o=0,s=null;if(s=U(e),s===null)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 i of n){let c=i,l=K(c),p=l.replace(/\.md$/,""),f=K(X(c)),m=/^\d{8}$/.test(p)?p.slice(0,6):"";if(m&&f!==m){let k=J(t,m,l);ie(k)?console.warn(`\u26A0\uFE0F ${l}\uFF1A\u76EE\u6807\u6708\u4EFD\u76EE\u5F55 ${m} \u5DF2\u5B58\u5728\u540C\u540D\u6587\u4EF6\uFF0C\u672A\u81EA\u52A8\u79FB\u52A8\uFF08\u9700\u4EBA\u5DE5\u5904\u7406\uFF09`):(rt(J(t,m),{recursive:!0}),On(c,k),c=k,oe(X(i),t))}let g=se(c,"utf8"),{header:a,blocks:d}=A(g),u=[],h=c!==i;c!==i&&(u.push(`\u79FB\u52A8\u81F3 ${K(X(c))} \u6708\u4EFD\u76EE\u5F55`),o++);for(let k of d)k.completed&&(!k.metaLine||!ot(k.metaLine))&&(k.metaLine=Ce(k.title,k.completed,k.metaLine),u.push(`\u8865\u5143\u6570\u636E\u300C${k.title}\u300D`),h=!0,o++);for(let k of d){if(!k.metaLine)continue;let L=B(k.metaLine);if(!L.scope)continue;let we=En(L.scope);we&&(k.metaLine=Dn(k.metaLine,we),u.push(`\u8303\u56F4\u5206\u9694\u5F52\u4E00\u300C${k.title}\u300D`),h=!0,o++),/[()()]/.test(L.scope)&&r.push({file:l,message:`\u5757\u300C${k.title}\u300D\u8303\u56F4\u300C${L.scope}\u300D\u542B\u62EC\u53F7\u7591\u4F3C\u6CE8\u91CA\uFF0C\u5220\u7559\u9700\u4EBA\u5DE5\u786E\u8BA4`,fixable:!1})}let $=[],R=0;for(let k of d){let L=k.completed?v(k.completed).replace(/-/g,"").slice(0,8):"";L&&L!==p?(Bn(e,k,L),R++,h=!0):$.push(k)}R>0&&(u.push(`\u8FC1\u79FB ${R} \u4E2A\u6F02\u79FB\u5757`),o+=R);let _=$.filter(k=>k.completed),Q=$.filter(k=>!k.completed),O=[..._].sort((k,L)=>v(L.completed).localeCompare(v(k.completed)));JSON.stringify(O.map(k=>k.title))!==JSON.stringify(_.map(k=>k.title))&&($.splice(0,$.length,...O,...Q),u.push("\u964D\u5E8F\u91CD\u6392"),o++,h=!0);let T=/^---\s*\r?\n\r?\n---/m.test(g);T&&(u.push("\u6E05\u7406\u5197\u4F59\u5206\u9694\u7B26"),o++);let P=g.includes(`\r
68
+ `.replace(/\n/g,c);F(o,a),console.log(` \u5757\u300C${t.title}\u300D\u8FC1\u79FB \u2192 ${n}.md`)}function Un(e=".tasks"){let t=V(e,"archive"),n=R(t),r=[],o=0,s=null;if(s=U(e),s===null)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 i of n){let c=i,a=K(c),u=a.replace(/\.md$/,""),m=K(X(c)),p=/^\d{8}$/.test(u)?u.slice(0,6):"";if(p&&m!==p){let k=V(t,p,a);ie(k)?console.warn(`\u26A0\uFE0F ${a}\uFF1A\u76EE\u6807\u6708\u4EFD\u76EE\u5F55 ${p} \u5DF2\u5B58\u5728\u540C\u540D\u6587\u4EF6\uFF0C\u672A\u81EA\u52A8\u79FB\u52A8\uFF08\u9700\u4EBA\u5DE5\u5904\u7406\uFF09`):(st(V(t,p),{recursive:!0}),Dn(c,k),c=k,oe(X(i),t))}let f=se(c,"utf8"),{header:l,blocks:g}=A(f),d=[],h=c!==i;c!==i&&(d.push(`\u79FB\u52A8\u81F3 ${K(X(c))} \u6708\u4EFD\u76EE\u5F55`),o++);for(let k of g)k.completed&&(!k.metaLine||!it(k.metaLine))&&(k.metaLine=Le(k.title,k.completed,k.metaLine),d.push(`\u8865\u5143\u6570\u636E\u300C${k.title}\u300D`),h=!0,o++);for(let k of g){if(!k.metaLine)continue;let L=D(k.metaLine);if(!L.scope)continue;let ye=Nn(L.scope);ye&&(k.metaLine=Wn(k.metaLine,ye),d.push(`\u8303\u56F4\u5206\u9694\u5F52\u4E00\u300C${k.title}\u300D`),h=!0,o++),/[()()]/.test(L.scope)&&r.push({file:a,message:`\u5757\u300C${k.title}\u300D\u8303\u56F4\u300C${L.scope}\u300D\u542B\u62EC\u53F7\u7591\u4F3C\u6CE8\u91CA\uFF0C\u5220\u7559\u9700\u4EBA\u5DE5\u786E\u8BA4`,fixable:!1})}let b=[],T=0;for(let k of g){let L=k.completed?$(k.completed).replace(/-/g,"").slice(0,8):"";L&&L!==u?(zn(e,k,L),T++,h=!0):b.push(k)}T>0&&(d.push(`\u8FC1\u79FB ${T} \u4E2A\u6F02\u79FB\u5757`),o+=T);let _=b.filter(k=>k.completed),Q=b.filter(k=>!k.completed),O=[..._].sort((k,L)=>$(L.completed).localeCompare($(k.completed)));JSON.stringify(O.map(k=>k.title))!==JSON.stringify(_.map(k=>k.title))&&(b.splice(0,b.length,...O,...Q),d.push("\u964D\u5E8F\u91CD\u6392"),o++,h=!0);let S=/^---\s*\r?\n\r?\n---/m.test(f);S&&(d.push("\u6E05\u7406\u5197\u4F59\u5206\u9694\u7B26"),o++);let J=f.includes(`\r
69
69
  `)?`\r
70
70
  `:`
71
- `;if(d.length>0&&$.length===0)ie(c)&&jn(c),oe(X(c),t),u.push("\u5220\u9664\u7A7A\u5F52\u6863\u6587\u4EF6"),h=!0;else if(h||T){let k=((a?a+`
71
+ `;if(g.length>0&&b.length===0)ie(c)&&Bn(c),oe(X(c),t),d.push("\u5220\u9664\u7A7A\u5F52\u6863\u6587\u4EF6"),h=!0;else if(h||S){let k=((l?l+`
72
72
 
73
- `:"")+$.map(z).join(`
73
+ `:"")+b.map(Y).join(`
74
74
 
75
75
  ---
76
76
 
77
77
  `)+`
78
- `).replace(/\n/g,P);F(c,k)}u.length>0&&console.log(` ${l}: ${u.join("\u3001")}`)}return{issues:r,fixed:o}}finally{if(s!==null)try{V(e,s)}catch{}}}var Zo={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"}},Ho="zh";import{readdirSync as Nn}from"fs";import{join as st}from"path";function ke(e){let t=[],n=new Set(["node_modules",".git","dist","coverage"]),r=o=>{let s;try{s=Nn(o,{withFileTypes:!0})}catch{return}for(let i of s)if(i.isDirectory()){if(n.has(i.name))continue;r(st(o,i.name))}else i.name==="CHANGELOG.md"&&t.push(st(o,i.name))};return r(e),t}import{readFileSync as Yn,writeFileSync as zn}from"fs";function Wn(){return Oe()}function it(e,t,n,r=!0){let o=Yn(e,"utf8"),s=o.includes(`\r
78
+ `).replace(/\n/g,J);F(c,k)}d.length>0&&console.log(` ${a}: ${d.join("\u3001")}`)}return{issues:r,fixed:o}}finally{if(s!==null)try{P(e,s)}catch{}}}var ct={breaking:["\u91CD\u5927\uFF1A","Breaking:"],added:["\u65B0\u589E\uFF1A","Added:"],changed:["\u4FEE\u6539\uFF1A","Changed:"],improved:["\u4F18\u5316\uFF1A","Improved:"],fixed:["\u4FEE\u590D\uFF1A","Fixed:"],docs:["\u6587\u6863\uFF1A","Docs:"],removed:["\u6E05\u7406\uFF1A","Removed:"],deps:[],other:[]},at={zh:{groups:[{slot:"breaking",title:"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4"},{slot:"added",title:"### \u2728 \u65B0\u589E\u529F\u80FD"},{slot:"changed",title:"### \u{1F527} \u529F\u80FD\u8C03\u6574"},{slot:"improved",title:"### \u26A1 \u4F18\u5316\u6539\u8FDB"},{slot:"fixed",title:"### \u{1F41B} \u95EE\u9898\u4FEE\u590D"},{slot:"docs",title:"### \u{1F4DD} \u6587\u6863\u66F4\u65B0"},{slot:"removed",title:"### \u{1F9F9} \u6E05\u7406\u79FB\u9664"},{slot:"deps",title:"### \u{1F517} \u4F9D\u8D56\u53D8\u66F4"},{slot:"other",title:"### \u{1F4E6} \u5176\u4ED6\u53D8\u66F4"}],replacements:{"### \u91CD\u5927\u53D8\u66F4":"### \u{1F6A8} \u91CD\u5927\u53D8\u66F4","### \u65B0\u589E\u529F\u80FD":"### \u2728 \u65B0\u589E\u529F\u80FD","### \u8865\u4E01\u4FEE\u590D":"### \u{1F41B} \u8865\u4E01\u4FEE\u590D","- Updated dependencies":"- \u66F4\u65B0\u4F9D\u8D56"},deps:"- \u66F4\u65B0\u4F9D\u8D56",released:"\u53D1\u5E03"},en:{groups:[{slot:"breaking",title:"### \u{1F6A8} Breaking Changes"},{slot:"added",title:"### \u2728 Added"},{slot:"changed",title:"### \u{1F527} Changed"},{slot:"improved",title:"### \u26A1 Improved"},{slot:"fixed",title:"### \u{1F41B} Fixed"},{slot:"docs",title:"### \u{1F4DD} Docs"},{slot:"removed",title:"### \u{1F9F9} Removed"},{slot:"deps",title:"### \u{1F517} Dependency Updates"},{slot:"other",title:"### \u{1F4E6} Other"}],replacements:{},deps:"- Updated dependencies",released:"released"}},ls="zh";import{readdirSync as Pn}from"fs";import{join as lt}from"path";function be(e){let t=[],n=new Set(["node_modules",".git","dist","coverage"]),r=o=>{let s;try{s=Pn(o,{withFileTypes:!0})}catch{return}for(let i of s)if(i.isDirectory()){if(n.has(i.name))continue;r(lt(o,i.name))}else i.name==="CHANGELOG.md"&&t.push(lt(o,i.name))};return r(e),t}import{readFileSync as Vn,writeFileSync as Jn}from"fs";var ce=/^## \d+\.\d+\.\d+/,we={"### Major Changes":"breaking","### Minor Changes":"added","### Patch Changes":"other","### Dependent Changes":"deps"},Gn="- Updated dependencies",Hn=Object.values(at).map(e=>e.released);function Zn(){return Me()}function pt(e,t,n,r=!0){let o=Vn(e,"utf8"),s=o.includes(`\r
79
79
  `)?`\r
80
80
  `:`
81
81
  `,i=o.replace(/\r\n/g,`
82
- `),c=i;for(let[d,u]of Object.entries(n.replacements))c=c.replaceAll(d,u);c=c.replace(/^- [0-9a-f]{7}: /gm,"- ");let l=c.split(`
83
- `);for(let d=0;d<l.length;d++)if(/^- - .+/.test(l[d]??"")){l[d]=(l[d]??"").replace(/^- - /,"- ");for(let u=d+1;u<l.length&&/^ {2}- /.test(l[u]??"");u++)l[u]=(l[u]??"").slice(2)}for(c=l.join(`
84
- `);c.includes(`${n.deps}
82
+ `),c=or(tr(i),n);for(let[d,h]of Object.entries(n.replacements))c=c.replaceAll(d,h);for(;c.includes(`${n.deps}
85
83
  ${n.deps}`);)c=c.replace(`${n.deps}
86
- ${n.deps}`,n.deps);for(;;){let d=c.replace(/^- (.+)\n- \1$/gm,"- $1");if(d===c)break;c=d}let p=c.split(`
87
- `),f=[],m=0;for(;m<p.length;){let d=p[m]??"";if(/^## \d+\.\d+\.\d+/.test(d)){let u=m+1;for(;u<p.length&&(p[u]??"").trim()==="";)u++;let h=p[u]??"";if(h.startsWith("> ")&&/^> \d{4}-\d{2}-\d{2} (?:发布|released)$/.test(h.trim())){f.push(d,"",h),m=u+1;continue}f.push(d,"",`> ${t} ${n.released}`,""),m=u;continue}f.push(d),m++}let g=f.join(`
88
- `),a=C(g,r);return a!==i?(zn(e,a.replace(/\n/g,s),"utf8"),!0):!1}function Un(e,t,n,r=!0){let o=[];for(let s of ke(e))it(s,t,n,r)&&o.push(s);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let s of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${s}`);return o}export{Z as ALL_STATUSES,Ho as DEFAULT_LANG,N as DONE_STATUSES,bn as archiveTasks,ze as buildSummary,In as checkArchive,ke as collectChangelogs,I as dateFromFileName,Ht as exportTasks,_n as fixArchive,it as formatChangelog,Un as formatChangelogs,Y as getConfigSection,un as importTasks,Zo as languages,Be as listActiveTasks,_e as listArchivedTasks,S as listTaskFiles,Mt as listTasks,Te as loadToolkitConfig,Wn as localDate,v as normalizeCompleted,Ye as orderRows,wn as parseArchiveTasks,Se as parseBool,j as parseFrontmatter,Ue as printTaskBoard,Et as printTasks,le as queryTasks,C as redactText,wt as resetToolkitConfigCache,Re as resolveEnabled,D as stripFrontmatter,Ve as toCSV,Je as toJSON,nt as validateTaskFile,Cn as validateTasks};
84
+ ${n.deps}`,n.deps);for(;;){let d=c.replace(/^- (.+)\n- \1$/gm,"- $1");if(d===c)break;c=d}let a=c.split(`
85
+ `),u=[],m=[n.released,...Hn].map(Xn),p=new RegExp(`^> \\d{4}-\\d{2}-\\d{2} (?:${m.join("|")})$`),f=0;for(;f<a.length;){let d=a[f]??"";if(ce.test(d)){let h=f+1;for(;h<a.length&&(a[h]??"").trim()==="";)h++;let b=a[h]??"";if(b.startsWith("> ")&&p.test(b.trim())){u.push(d,"",b),f=h+1;continue}u.push(d,"",`> ${t} ${n.released}`,""),f=h;continue}u.push(d),f++}let l=u.join(`
86
+ `),g=C(l,r);return g!==i?(Jn(e,g.replace(/\n/g,s),"utf8"),!0):!1}function qn(e,t,n,r=!0){let o=[];for(let s of be(e))pt(s,t,n,r)&&o.push(s);if(o.length===0)console.log("\u65E0 CHANGELOG \u9700\u8981\u66F4\u65B0");else for(let s of o)console.log(`changelog \u5DF2\u66F4\u65B0\uFF1A${s}`);return o}function Xn(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Kn(e){let t=[];for(let n of e)for(let r of n.prefixes??[])t.push([n.slot,r]);return t}function Qn(e,t){if(e.startsWith(Gn))return"deps";let n=e.slice(2);for(let[r,o]of Object.entries(ct))if(o.some(s=>n.startsWith(s)))return r;for(let[r,o]of t)if(n.startsWith(o))return r;return null}function er(e){for(let t of e){if(t.startsWith("- "))return!1;if(t.trim()!=="")return!0}return!1}function tr(e){let t=e.replace(/\r\n/g,`
87
+ `);t=t.replace(/^- [0-9a-f]{7}: /gm,"- ");let n=t.split(`
88
+ `);for(let r=0;r<n.length;r++)if(/^- - .+/.test(n[r]??"")){n[r]=(n[r]??"").replace(/^- - /,"- ");for(let o=r+1;o<n.length&&/^ {2}- /.test(n[o]??"");o++)n[o]=(n[o]??"").slice(2)}return n.join(`
89
+ `)}function nr(e){let t=[],n=[],r=0;for(;r<e.length&&!ce.test(e[r]??"");)t.push(e[r++]??"");for(;r<e.length;){let o=r,s=[];for(;r<e.length&&!(e[r]??"").startsWith("### ")&&!(s.length>0&&ce.test(e[r]??""));)s.push(e[r++]??"");let i=[];for(;r<e.length&&(e[r]??"").startsWith("### ");){let c=e[r++]??"",a=[];for(;r<e.length&&!(e[r]??"").startsWith("### ")&&!ce.test(e[r]??"");)a.push(e[r++]??"");for(;a.length>0&&(a[a.length-1]??"").trim()==="";)a.pop();i.push({title:c,body:a})}n.push({lines:e.slice(o,r),header:s,sections:i})}return{lead:t,blocks:n}}function rr(e,t){let n=e.sections.filter(a=>we[a.title]!==void 0);if(n.length===0||n.some(a=>er(a.body)))return e.lines;let r=new Set(t.map(a=>a.slot)),o=Kn(t),s=new Map;for(let a of n){let u=we[a.title];for(let m of ir(a.body)){let p=Qn(m[0]??"",o)??u,f=s.get(p);f?f.push(m):s.set(p,[m])}}for(let a of s.keys())if(!r.has(a))return e.lines;let i=[...e.header];for(;i.length>0&&(i[i.length-1]??"").trim()==="";)i.pop();let c=[...i,""];for(let a of t){let u=s.get(a.slot);u&&c.push(...ut({title:a.title,body:sr(u)}))}for(let a of e.sections)we[a.title]===void 0&&c.push(...ut(a));return c}function or(e,t){let n=t.groups;if(!n||n.length===0)return e;let{lead:r,blocks:o}=nr(e.split(`
90
+ `)),s=[...r];for(let i of o)s.push(...rr(i,n));return s.join(`
91
+ `)}function sr(e){let t=[];for(let n of e)t.push(...n);return t}function ut(e){return[e.title,"",...e.body,""]}function ir(e){let t=[];for(let n of e){if(n.startsWith("- ")){t.push([n]);continue}t[t.length-1]?.push(n)}for(let n of t)for(;n.length>1&&(n[n.length-1]??"").trim()==="";)n.pop();return t}export{G as ALL_STATUSES,ls as DEFAULT_LANG,N as DONE_STATUSES,ct as SLOT_PREFIXES,Sn as archiveTasks,Ue as buildSummary,Yn as checkArchive,be as collectChangelogs,B as dateFromFileName,Qt as exportTasks,Un as fixArchive,pt as formatChangelog,qn as formatChangelogs,W as getConfigSection,hn as importTasks,at as languages,Ne as listActiveTasks,We as listArchivedTasks,R as listTaskFiles,_t as listTasks,Re as loadToolkitConfig,Zn as localDate,$ as normalizeCompleted,ze as orderRows,xn as parseArchiveTasks,Ae as parseBool,E as parseFrontmatter,Ve as printTaskBoard,Nt as printTasks,ue as queryTasks,C as redactText,xt as resetToolkitConfigCache,Ce as resolveEnabled,I as stripFrontmatter,Je as toCSV,Ge as toJSON,ot as validateTaskFile,jn as validateTasks};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fxri/toolkit",
3
- "version": "1.9.0",
3
+ "version": "1.9.2",
4
4
  "description": "专为多人 + AI 跨项目协作打造:任务管理 + 多语言 CHANGELOG。",
5
5
  "license": "MIT",
6
6
  "author": {
package/skills/README.md CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ### 方式一:内置命令(推荐,技能随包分发)
18
18
 
19
- 安装了 CLI 后,技能取自包内 `skills/`,与 CLI 同版本,**不需要第二条供应链、不需要访问 GitHub**:
19
+ 安装了 CLI 后,技能取自包内 `skills/`,随包同源分发(与 CLI 同一发布批次;技能内容版本独立编号,看的是各 SKILL.md 自己的版本),**不需要第二条供应链、不需要访问 GitHub**:
20
20
 
21
21
  ```bash
22
22
  pnpm add -g @fxri/toolkit # 1. 装 CLI(npm 用户 npm i -g @fxri/toolkit)
@@ -65,7 +65,16 @@ pnpm dlx skills add fxri-toolkit --global # npm 用户把 pnpm dlx 换成
65
65
  - 支持自定义 rules 的工具(如 Trae):链接 SKILL.md 为规则
66
66
  - 通用兜底:在项目根 `AGENTS.md` 中引用本目录路径
67
67
 
68
- 复制副本以 frontmatter `metadata.version` 判断是否需要同步上游(`metadata.source` 指向本仓库)。
68
+ 复制副本以 frontmatter `metadata.version` 判断是否需要同步上游(`metadata.source` 指向本仓库)。
69
+
70
+ ## 版本声明与一致性
71
+
72
+ 每个 SKILL.md 的版本写两处,须保持一致:
73
+
74
+ - frontmatter `metadata.version`:机器读取位,`toolkit skills status` / `skills install` 打印的真源版本取自这里
75
+ - **正文首部**的 `> 本技能版本 x.y.z(随 @fxri/toolkit 同批分发)`:进上下文的自证位——agent 加载技能正文即见到它,被问版本时报这个值(不读磁盘、不跑 CLI),与 `toolkit skills status` 的磁盘基准值一比对,就能判断当前会话上下文是否已过期
76
+
77
+ 两处不一致会误导版本比对,故内容变更时同步递增、发布前逐项核对(见下方核对清单)。
69
78
 
70
79
  ## 与其他 skills 共存
71
80
 
@@ -80,7 +89,7 @@ pnpm dlx skills add fxri-toolkit --global # npm 用户把 pnpm dlx 换成
80
89
 
81
90
  - [ ] name:kebab-case、与目录名一致、≤64 字符
82
91
  - [ ] description:≤1024 字符,含做什么 + 何时用 + 正向触发词 + 反向排除
83
- - [ ] metadata.version:内容变更即递增
92
+ - [ ] metadata.version:内容变更即递增,且与正文首部版本声明一致
84
93
  - [ ] 主干 SKILL.md < 200 行,细节下沉 `references/`,可复制资产放 `assets/`
85
94
  - [ ] 引用的 references / assets 相对路径有效
86
95
  - [ ] 技能用途描述已同步 docs/guide 技能表与本文「技能列表」表(含版本标注)
@@ -3,13 +3,15 @@ name: fxri-plan-to-task
3
3
  description: 将已确认的实施方案落盘为标准任务文件并跟踪至归档:动手前建档评估(查 active/archive 判同主题)、按模板建档、状态机更新、四级时间源取证、自查校验、任务级规范沉淀与手工归档。当用户确认方案后表达「开始落地/登记记录」的意图,或即将动手改仓库文件时使用——含建档、任务登记、落盘、归档、任务校验等说法及其口语近义表达(如按这个做吧、记一下、建个任务跟踪)均触发。不用于方案未确认的对话、会话收尾整场沉淀(fxri-session-recap 模式一)、与任务记录无关的普通 TODO、issue 管理或日常提交信息撰写。
4
4
  license: MIT
5
5
  metadata:
6
- version: "1.1.3"
6
+ version: "1.1.4"
7
7
  author: fxri
8
8
  source: https://github.com/fxri-net/toolkit
9
9
  ---
10
10
 
11
11
  # 方案落盘:任务建档与归档
12
12
 
13
+ > 本技能版本 1.1.4(随 @fxri/toolkit 同批分发)。被问版本时即报此值——不读磁盘、不跑 CLI:报出的值就是本会话上下文里已加载内容的版本,可与 `toolkit skills status` 打印的磁盘基准值对照,不一致即说明会话上下文已过期,开新会话即可。
14
+
13
15
  ## 何时使用
14
16
 
15
17
  - 用户确认实施方案后,表达开始落地/登记记录的意图(语义触发,不要求字面一致):建档 / 任务登记 / 落盘 / 归档 / 任务校验 / 按这个做吧 / 记一下 / 建个任务跟踪
@@ -1,13 +1,13 @@
1
- ---
2
- owner: <负责人 git 用户名>
3
- status: 待办
4
- created: <创建日 YYYYMMDD>
5
- updated: <创建日 YYYYMMDD,随每次修改同步>
6
- completed: ''
7
- depends_on: []
8
- scope: <影响范围>
9
- ---
10
-
11
- # 任务标题
12
-
13
- (方案正文:背景、实施方案、影响范围、验证方式)
1
+ ---
2
+ owner: <负责人 git 用户名>
3
+ status: 待办
4
+ created: <创建日 YYYYMMDD>
5
+ updated: <创建日 YYYYMMDD,随每次修改同步>
6
+ completed: ''
7
+ depends_on: []
8
+ scope: <影响范围>
9
+ ---
10
+
11
+ # 任务标题
12
+
13
+ (方案正文:背景、实施方案、影响范围、验证方式)
@@ -42,12 +42,12 @@ scope: app # 影响范围;多值以半角加号分隔(toolkit+lxg
42
42
  ---
43
43
  ```
44
44
 
45
- - `已完成` / `已放弃` 为终结态:进入时必须补 `completed`(真实收工时间)。⚠️ `completed` 按**四级时间源**取证,禁止凭记忆估算、取对话时间或做时区换算:
46
- 1. **当场打点**(首选):任务完成时立即执行命令取真实时间(Windows `Get-Date -Format "yyyy-MM-dd HH:mm"`,macOS/Linux `date "+%Y-%m-%d %H:%M"`)
47
- 2. **聊天记录准确时间戳**:用户贴过的日志/终端输出时间戳、用户口述的确定时刻
48
- 3. **任务改动 git 提交时间**:`git log --format="%h %ci" <file>` 按提交时间取证
49
- 4. **系统当前时间兜底**:前三级皆不可得时当场取时,并在正文标注「时间为收尾补记」
50
-
45
+ - `已完成` / `已放弃` 为终结态:进入时必须补 `completed`(真实收工时间)。⚠️ `completed` 按**四级时间源**取证,禁止凭记忆估算、取对话时间或做时区换算:
46
+ 1. **当场打点**(首选):任务完成时立即执行命令取真实时间(Windows `Get-Date -Format "yyyy-MM-dd HH:mm"`,macOS/Linux `date "+%Y-%m-%d %H:%M"`)
47
+ 2. **聊天记录准确时间戳**:用户贴过的日志/终端输出时间戳、用户口述的确定时刻
48
+ 3. **任务改动 git 提交时间**:`git log --format="%h %ci" <file>` 按提交时间取证
49
+ 4. **系统当前时间兜底**:前三级皆不可得时当场取时,并在正文标注「时间为收尾补记」
50
+
51
51
  工具对「完成时间晚于当前系统时间」会告警(时间源错误的典型症状);完成时间恰为零点整(如 `2026-09-05 00:00`,只填日期被自动补零的典型特征)亦会告警,需人工核实。归档块完成时间早于归档动作时间属正常(补档/历史修正场景),迁移由 `normalize --fix` 自动完成
52
52
  - 正文以 `# 任务标题` 开头;游离待办子项必须拆为独立任务文件
53
53
 
@@ -79,22 +79,22 @@ scope: app # 影响范围;多值以半角加号分隔(toolkit+lxg
79
79
 
80
80
  ## 5. 自查清单(校验)
81
81
 
82
- - [ ] frontmatter 存在且七字段齐全
83
- - [ ] status 为五枚举之一;终结态已填 completed
84
- - [ ] completed 为 `YYYY-MM-DD HH:mm` 且日期真实存在,且不晚于当前系统时间(时间按四级时间源取证:当场打点 / 聊天记录时间戳 / git 提交时间 / 兜底标注补记,非估算)
85
- - [ ] created 为 YYYYMMDD 且等于文件名日期前缀
86
- - [ ] 文件名符合 `{YYYYMMDD}-{用户名}-{任务简述}.md`
87
- - [ ] 任务文件放在 `active/{YYYYMM}/` 月份子目录,不直放 active 根目录
88
- - [ ] `.tasks/` 下无游离于 active/ 之外的任务文件(直放 `.tasks` 根目录或漏建 active/ 层的 `{YYYYMM}/` 均不会被校验与归档;`conventions.md` 属规范文件不受此限)
89
- - [ ] active 内无跨文件同名任务
90
- - [ ] depends_on 目标存在且无循环依赖
91
- - [ ] 正文无「待实施 / 待核对 / 待评估 / TODO」等游离标记与未勾选的 `- [ ]`
92
- - [ ] 归档后已做任务级规范沉淀检查(有可升格候选则经用户确认写入 conventions.md,无则跳过)
93
- - [ ] 若按项目约定提交代码:确认 `.tasks/` 全部改动(本次归档文件 + conventions.md 变更 + active 剩余任务)已纳入 git 提交范围,与代码变更同批提交
94
-
95
- ## 6. 协作约定
96
-
97
- - 任务区是多写者共享区:先查后写,同一需求共用一个任务文件;建档与执行时遵守 `.tasks/conventions.md`(存在时)中的项目规范
98
- - **动手前置建档评估**:涉及仓库文件改动的任务,动手前先查 active/archive 判同主题(完整判别表见 SKILL.md 工作流第 1 步);active 有同主题则更新原文件,archive 有同主题且无增量则不重复建档
99
- - **归档任务不可变**:已归档块是终结记录(唯一键 + 完成时间已固定),不向其追加新内容;延续/扩展需求走新任务并标注来源链
82
+ - [ ] frontmatter 存在且七字段齐全
83
+ - [ ] status 为五枚举之一;终结态已填 completed
84
+ - [ ] completed 为 `YYYY-MM-DD HH:mm` 且日期真实存在,且不晚于当前系统时间(时间按四级时间源取证:当场打点 / 聊天记录时间戳 / git 提交时间 / 兜底标注补记,非估算)
85
+ - [ ] created 为 YYYYMMDD 且等于文件名日期前缀
86
+ - [ ] 文件名符合 `{YYYYMMDD}-{用户名}-{任务简述}.md`
87
+ - [ ] 任务文件放在 `active/{YYYYMM}/` 月份子目录,不直放 active 根目录
88
+ - [ ] `.tasks/` 下无游离于 active/ 之外的任务文件(直放 `.tasks` 根目录或漏建 active/ 层的 `{YYYYMM}/` 均不会被校验与归档;`conventions.md` 属规范文件不受此限)
89
+ - [ ] active 内无跨文件同名任务
90
+ - [ ] depends_on 目标存在且无循环依赖
91
+ - [ ] 正文无「待实施 / 待核对 / 待评估 / TODO」等游离标记与未勾选的 `- [ ]`
92
+ - [ ] 归档后已做任务级规范沉淀检查(有可升格候选则经用户确认写入 conventions.md,无则跳过)
93
+ - [ ] 若按项目约定提交代码:确认 `.tasks/` 全部改动(本次归档文件 + conventions.md 变更 + active 剩余任务)已纳入 git 提交范围,与代码变更同批提交
94
+
95
+ ## 6. 协作约定
96
+
97
+ - 任务区是多写者共享区:先查后写,同一需求共用一个任务文件;建档与执行时遵守 `.tasks/conventions.md`(存在时)中的项目规范
98
+ - **动手前置建档评估**:涉及仓库文件改动的任务,动手前先查 active/archive 判同主题(完整判别表见 SKILL.md 工作流第 1 步);active 有同主题则更新原文件,archive 有同主题且无增量则不重复建档
99
+ - **归档任务不可变**:已归档块是终结记录(唯一键 + 完成时间已固定),不向其追加新内容;延续/扩展需求走新任务并标注来源链
100
100
  - 强制约束到**沉淀**为止:归档 + 规范沉淀即流程终点;提交、发版、推送不是必经步骤,是否执行取决于用户的全局 / 个人 / 项目规则;若提交代码,先归档与沉淀、后 git commit,任务记录(归档文件 + conventions.md)与代码变更落在同一提交