@fxri/toolkit 1.8.2 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/README.md +5 -2
- package/SPEC.md +3 -3
- package/dist/cli.cjs +48 -47
- package/dist/cli.js +46 -45
- package/dist/index.cjs +30 -30
- package/dist/index.js +30 -30
- package/package.json +1 -1
- package/skills/README.md +28 -10
- package/skills/fxri-plan-to-task/SKILL.md +1 -1
- package/skills/fxri-plan-to-task/references/task-spec.md +1 -1
- package/skills/fxri-release-changelog/SKILL.md +3 -2
- package/skills/fxri-session-recap/SKILL.md +1 -0
package/dist/index.js
CHANGED
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
var
|
|
2
|
-
`))}import{existsSync as
|
|
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
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(`
|
|
4
4
|
`).trim().split(`
|
|
5
|
-
`),
|
|
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
|
|
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}
|
|
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
|
|
13
|
-
`),o.length===0){let
|
|
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
|
|
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
|
|
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,`
|
|
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
|
|
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(`
|
|
19
19
|
`)+(t.body?`
|
|
20
20
|
|
|
21
21
|
${t.body}
|
|
22
22
|
`:`
|
|
23
|
-
`);return n||(
|
|
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?`
|
|
24
24
|
|
|
25
|
-
${t.body}`:""}`,
|
|
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
|
|
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(
|
|
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}
|
|
29
29
|
|
|
30
30
|
${u.metaLine}
|
|
31
31
|
|
|
32
32
|
${u.body}`);return F(l,`${g}
|
|
33
33
|
|
|
34
|
-
${
|
|
34
|
+
${d.join(`
|
|
35
35
|
|
|
36
36
|
---
|
|
37
37
|
|
|
38
38
|
`)}
|
|
39
|
-
`),l}async function
|
|
40
|
-
`),u=j(
|
|
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
|
|
41
41
|
|
|
42
|
-
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002`,
|
|
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}
|
|
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
|
|
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
|
|
47
47
|
`)?`\r
|
|
48
48
|
`:`
|
|
49
|
-
`;F(R,`${
|
|
49
|
+
`;F(R,`${Q}
|
|
50
50
|
|
|
51
|
-
${
|
|
51
|
+
${O.map(P=>P.block).join(`
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
55
55
|
`)}
|
|
56
|
-
`.replace(/\n/g,w));for(let J of h)ln(J.file);let T=h[0];T&&oe(Xe(T.file),e),console.log(`\u5DF2\u5F52\u6863 ${h.length} \u4E2A\u4EFB\u52A1 \u2192 ${u}.md`),a+=h.length}catch(w){m.push(`${u}.md\uFF1A${w.message}`)}}for(let u of c)console.warn(`\u26A0\uFE0F ${u}`);if(m.length>0){console.error(`\u5F52\u6863\u5931\u8D25 ${m.length} \u4E2A\u65E5\u671F\u6587\u4EF6\uFF08active \u672A\u5220\u9664\uFF0C\u53EF\u91CD\u8BD5\uFF09\uFF1A`);for(let u of m)console.error(` - ${u}`)}return console.log(r?`[\u9884\u6F14] \u5171 ${d.length} \u4E2A\u4EFB\u52A1\u53EF\u5F52\u6863\uFF08\u672A\u843D\u76D8\uFF09`:`\u5171\u5F52\u6863 ${a} \u4E2A\u4EFB\u52A1${m.length>0?`\uFF0C\u5931\u8D25 ${m.length} \u4E2A`:""}`),{archived:r?d.length:a,skipped:f,warnings:c}}finally{if(g!==null)try{W(e,g)}catch{}}}import{readFileSync as he,statSync as hn,readdirSync as Ke,existsSync as kn}from"fs";import{join as ke,basename as H,dirname as wn}from"path";var bn=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,yn=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/,vn=/^\d{4}-\d{1,2}-\d{1,2}[T\s]\d{1,2}:\d{2}(?::\d{2})?$/,$n=/^\d{8}-[^-]+-.+\.md$/;function Qe(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 tt(e){let t=[],n=H(e),r=he(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?V.includes(s.status)||t.push({level:"error",file:n,message:`status \u975E\u6CD5\u503C\u300C${s.status}\u300D\uFF0C\u5E94\u4E3A ${V.join(" / ")}`}):t.push({level:"error",file:n,message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),_.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(!yn.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 g=p.match(/^\d{4}-\d{1,2}-\d{1,2}/)?.[0]??p;Qe(g)?vn.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())?Qe(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})-/);$n.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"});let c=be(E(r)),d=B("check")?.pendingMarkers!==!1?c.match(bn):null;return d&&t.push({level:"warn",file:n,message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${d[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),B("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 xn(e){let t=[];if(!kn(e))return t;for(let n of Ke(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 Ke(ke(e,n.name)))r.endsWith(".md")&&/^\d{8}-/.test(r)&&t.push(`${n.name}/${r}`)}return t}function Tn(e=".tasks"){let t=ke(e,"active"),n=S(t),r=[];for(let c of n)r.push(...tt(c)),wn(c)===t&&r.push({level:"warn",file:H(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 xn(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=H(c,".md"),d=o.get(l);d?d.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(...Rn(n,e));let s=r.filter(c=>c.level==="error").length,i=r.length-s;return{issues:r,errorCount:s,warnCount:i}}var et=new Map;function Sn(e){let t=hn(e),n=et.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 et.set(e,{mtimeMs:t.mtimeMs,titles:r}),r}function Rn(e,t){let n=[],r=new Set(e.map(g=>H(g,".md"))),o=new Map,s=g=>g.trim().replace(/\.md$/,"").trim(),i=new Map;for(let g of S(ke(t,"archive")))for(let a of Sn(g))i.has(a)||i.set(a,O(t,g));for(let g of e){let a=H(g,".md"),m=he(g,"utf8"),u=j(m),h=te(u.depends_on).map(s);o.set(a,h);for(let v of h)if(!r.has(v)){let R=i.get(v);n.push({level:"warn",file:a,message:R?`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${v}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u5DF2\u5F52\u6863\u4E8E ${R}\uFF0C\u65E0\u9700\u518D\u4F9D\u8D56\uFF09`:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${v}\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,d=2,f=new Map,p=(g,a)=>{f.set(g,l);for(let m of o.get(g)??[]){if(!r.has(m))continue;let u=f.get(m)??c;if(u===l)return[...a,m];if(u===c){let h=p(m,[...a,m]);if(h)return h}}return f.set(g,d),null};for(let g of o.keys())if((f.get(g)??c)===c){let a=p(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 An,existsSync as ie,mkdirSync as nt,renameSync as Cn}from"fs";import{join as U,basename as X,dirname as G}from"path";var Fn=["\u8D1F\u8D23\u4EBA","\u72B6\u6001","\u8303\u56F4","\u5B8C\u6210\u65F6\u95F4"];function rt(e){return Fn.every(t=>e.includes(t))}function jn(e=".tasks"){let t=U(e,"archive"),n=S(t),r=[];for(let o of n){let s=X(o),i=s.replace(/\.md$/,""),c=se(o,"utf8"),{blocks:l}=A(c),d=X(G(o)),f=s.replace(/\.md$/,"");d&&f&&d!==f.slice(0,6)&&r.push({file:s,message:`\u5F52\u6863\u6587\u4EF6\u4F4D\u4E8E ${d} \u6708\u4EFD\u76EE\u5F55\uFF0C\u4E0E\u6587\u4EF6\u540D\u65E5\u671F ${f.slice(0,6)} \u4E0D\u4E00\u81F4`,fixable:!1});for(let p of Fe(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<l.length;p++){let g=l[p-1],a=l[p];if(!g||!a)continue;let m=$(g.completed),u=$(a.completed);if(m&&u&&m<u){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 l){p.metaLine?rt(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});let g=$(p.completed),a=g.replace(/-/g,"").slice(0,8);a&&i&&a!==i&&r.push({file:s,message:`\u5757\u300C${p.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${p.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${p.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 Ln(e,t,n){let r=U(e,"archive",n.slice(0,6)),o=U(r,`${n}.md`);nt(r,{recursive:!0});let s=`# ${n} \u5F52\u6863
|
|
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
|
|
57
57
|
|
|
58
|
-
> \u672C\u6587\u4EF6\u7531 \`toolkit tasks archive\` \u81EA\u52A8\u751F\u6210\u3002`,i=[];if(ie(o)){let
|
|
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
|
|
59
59
|
`)?`\r
|
|
60
60
|
`:`
|
|
61
61
|
`,l=`${s}
|
|
62
62
|
|
|
63
|
-
${i.map(
|
|
63
|
+
${i.map(z).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
|
|
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
|
|
69
69
|
`)?`\r
|
|
70
70
|
`:`
|
|
71
|
-
`;if(
|
|
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+`
|
|
72
72
|
|
|
73
|
-
`:"")
|
|
73
|
+
`:"")+$.map(z).join(`
|
|
74
74
|
|
|
75
75
|
---
|
|
76
76
|
|
|
77
77
|
`)+`
|
|
78
|
-
`).replace(/\n/g,
|
|
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
|
|
79
79
|
`)?`\r
|
|
80
80
|
`:`
|
|
81
81
|
`,i=o.replace(/\r\n/g,`
|
|
82
|
-
`),c=i;for(let[
|
|
83
|
-
`);for(let
|
|
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
84
|
`);c.includes(`${n.deps}
|
|
85
85
|
${n.deps}`);)c=c.replace(`${n.deps}
|
|
86
|
-
${n.deps}`,n.deps);for(;;){let
|
|
87
|
-
`),f=[],
|
|
88
|
-
`),a=C(g,r);return a!==i?(
|
|
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};
|
package/package.json
CHANGED
package/skills/README.md
CHANGED
|
@@ -14,33 +14,51 @@
|
|
|
14
14
|
|
|
15
15
|
## 安装
|
|
16
16
|
|
|
17
|
-
###
|
|
17
|
+
### 方式一:内置命令(推荐,技能随包分发)
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
安装了 CLI 后,技能取自包内 `skills/`,与 CLI 同版本,**不需要第二条供应链、不需要访问 GitHub**:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm add -g @fxri/toolkit # 1. 装 CLI(npm 用户 npm i -g @fxri/toolkit)
|
|
23
|
+
toolkit skills install # 2. 把包内技能装到各 agent 的全局技能目录
|
|
24
|
+
toolkit skills status # 查现场状态(悬空 / 指向错误 / 副本漂移 / 缺失 / 同名冲突)
|
|
25
|
+
# 前四类重跑 toolkit skills install 补齐,同名冲突需 toolkit skills install --force 覆盖
|
|
26
|
+
toolkit skills remove # 卸载本包装的产物(只清自己装的,不碰用户自装技能)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- 真源唯一:技能取自已装 CLI 包内的 `skills/`,升级 CLI 后重跑 `toolkit skills install` 即同步
|
|
30
|
+
- 目标三层:主目标 `~/.agents/skills/`(多家 agent 共读)→ 内置表内**已安装**的各 agent 全局技能目录 → `--dir <path>` 兜底(可多次指定,给表外 agent 用)
|
|
31
|
+
- 默认软链到真源(升级自动跟随);链接创建失败自动降级为副本并打印 ⚠️(如无权限建链);`--copy` 强制副本、`--dry-run` 预演、`--force` 覆盖同名非本包产物
|
|
32
|
+
- 产物记录在状态文件 `~/.agents/.toolkit-skills.json`;卸载 CLI 前先跑 `toolkit skills remove`,避免留下悬空链接
|
|
33
|
+
|
|
34
|
+
### 方式二:上游安装器 `npx skills`(需锁定文件或覆盖表外 agent 时)
|
|
35
|
+
|
|
36
|
+
本仓库遵循 Agent Skills 开放标准,兼容 [vercel-labs/skills](https://github.com/vercel-labs/skills) 安装器(自动识别本机 agent、写锁定文件;技能从 GitHub 拉取):
|
|
20
37
|
|
|
21
38
|
```bash
|
|
22
39
|
pnpm dlx skills add fxri-net/toolkit # pnpm 用户(官方命令为 npx skills)
|
|
23
40
|
pnpm dlx skills add fxri-net/toolkit --skill fxri-plan-to-task # 只装单个技能
|
|
24
41
|
pnpm dlx skills list / update / remove # 查看 / 升级 / 卸载
|
|
25
|
-
# npm 用户把上述 pnpm dlx 换成 npx
|
|
26
|
-
# npx skills add fxri-net/toolkit / npx skills add fxri-net/toolkit --skill fxri-plan-to-task / npx skills list / update / remove
|
|
42
|
+
# npm 用户把上述 pnpm dlx 换成 npx 即可
|
|
27
43
|
```
|
|
28
44
|
|
|
29
|
-
- 项目级安装默认写 `.agents/skills/` 并对各 agent
|
|
30
|
-
-
|
|
45
|
+
- 项目级安装默认写 `.agents/skills/` 并对各 agent 目录建立符号链接;团队项目把生成的 `skills-lock.json` 提交进仓库以对齐版本;单人多项目加 `-g` 全局安装
|
|
46
|
+
- 内置命令已覆盖的场景优先用方式一:方式二的技能走 GitHub、CLI 走 npm,两条供应链易出现版本漂移
|
|
47
|
+
- ⚠️ 两条路径不要混用:上游安装器把技能落成**实体副本**,且不在本包状态文件 `~/.agents/.toolkit-skills.json` 的登记内,内置命令会把它判为「同名非本包产物」——混用后 `toolkit skills status` 报「同名冲突」,且再跑一次 `pnpm dlx skills update -g` 会把 `~/.agents/skills/` 重写回实体副本,冲突复发
|
|
48
|
+
- 已用方式二装过、想换回方式一:`toolkit skills install --force` 一键接管同名旧副本,详见 [FAQ](https://fxri-net.github.io/toolkit/faq)
|
|
31
49
|
|
|
32
|
-
|
|
50
|
+
#### GitHub 拉取受限时(国内网络 / 内网)
|
|
33
51
|
|
|
34
|
-
skills
|
|
52
|
+
`npx skills` 只认 GitHub 源与本地路径;GitHub 不稳时改从 [Gitee 镜像](https://gitee.com/fxri/toolkit)(同源同步)克隆后走本地路径源:
|
|
35
53
|
|
|
36
54
|
```bash
|
|
37
55
|
git clone https://gitee.com/fxri/toolkit fxri-toolkit
|
|
38
56
|
pnpm dlx skills add fxri-toolkit --global # npm 用户把 pnpm dlx 换成 npx
|
|
39
57
|
```
|
|
40
58
|
|
|
41
|
-
|
|
59
|
+
完全离线场景:先用 `pnpm pack @fxri/toolkit` 打出 tgz 拷进内网 `pnpm add -g <tgz>` 离线装 CLI,再 `toolkit skills install`(技能随包分发,全程不碰 GitHub);详见 [FAQ · 内网或离线环境怎么装](https://fxri-net.github.io/toolkit/faq)。
|
|
42
60
|
|
|
43
|
-
###
|
|
61
|
+
### 方式三:手工复制 / 软链
|
|
44
62
|
|
|
45
63
|
- 已安装 `@fxri/toolkit` 的项目可直接使用包内自带的技能目录:`node_modules/@fxri/toolkit/skills/`,复制或软链到 agent 的 skills 目录即可
|
|
46
64
|
- 复制或软链技能目录到 agent 的 skills 目录(如 Claude Code 的 `.claude/skills/`)
|
|
@@ -3,7 +3,7 @@ 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.
|
|
6
|
+
version: "1.1.3"
|
|
7
7
|
author: fxri
|
|
8
8
|
source: https://github.com/fxri-net/toolkit
|
|
9
9
|
---
|
|
@@ -38,7 +38,7 @@ created: 20260902 # 创建日 YYYYMMDD,须等于文件名日期前缀
|
|
|
38
38
|
updated: 20260902 # 最近更新日 YYYYMMDD
|
|
39
39
|
completed: '' # 完成时间 YYYY-MM-DD HH:mm;仅终结态必填
|
|
40
40
|
depends_on: [] # 依赖的任务文件名(可带 .md),目标必须存在且不得成环
|
|
41
|
-
scope: app #
|
|
41
|
+
scope: app # 影响范围;多值以半角加号分隔(toolkit+lxgl-web),标签内不使用加号;顿号/逗号列表属误写会触发 check 软告警,中文列表请改用加号
|
|
42
42
|
---
|
|
43
43
|
```
|
|
44
44
|
|
|
@@ -3,7 +3,7 @@ name: fxri-release-changelog
|
|
|
3
3
|
description: 基于 changesets 的发版与多语言 CHANGELOG 维护流程:创建变更集、消费发版、把分组标题与条目转为项目语言风格、清理变更集、打标签发布;无 changesets 的项目提供同格式手工模式。当用户表达发版或记录变更意图——含创建变更集、changeset、发版、version、CHANGELOG 格式化等说法及其口语近义表达(如发一版、出个版本、记一下这次改动、生成更新日志)时使用。⚠️ 注意区分:用户说「提交个版本 / 先提交一版 / commit」通常指 git 提交当前改动(走任务收尾后提交),**不是发版**。不用于日常 commit message 撰写、git 提交操作或与发版无关的文档修改。
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: "1.0.
|
|
6
|
+
version: "1.0.7"
|
|
7
7
|
author: fxri
|
|
8
8
|
source: https://github.com/fxri-net/toolkit
|
|
9
9
|
---
|
|
@@ -55,4 +55,5 @@ metadata:
|
|
|
55
55
|
- `toolkit changelog`:创建变更集(等价 changeset)
|
|
56
56
|
- `toolkit changelog version`:发版并自动做中文分组标题格式化
|
|
57
57
|
- `toolkit changelog format`:仅格式化既有 CHANGELOG
|
|
58
|
-
- `toolkit changelog --lang <语言> …`:切换输出语言(内置 zh / en,其余可配置扩展)
|
|
58
|
+
- `toolkit changelog --lang <语言> …`:切换输出语言(内置 zh / en,其余可配置扩展)
|
|
59
|
+
- `toolkit skills install` / `toolkit skills status`:把本包 fxri-* 技能分发到各 agent 全局技能目录 / 查看链接与副本现场(技能与 CLI 同源同版本)
|