@fxri/toolkit 1.12.4 → 1.12.5

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.cjs CHANGED
@@ -62,7 +62,7 @@ ${Tt(Xe)}
62
62
  ${Vo}
63
63
 
64
64
  ${Tt(Je)}
65
- `;var Ie=require("fs"),It=require("path");var Ze=require("fs"),Lt=require("path");var Ko=/^\s*(`{3,}|~{3,})/;function Go(e){let t=Ko.exec(e)?.[1];return t?{char:t.charAt(0),len:t.length}:null}function Xo(e){return/^\s*/.exec(e)?.[0]??""}function Jo(e){return e.replace(/^(:?)-+(:?)$/,"$1---$2")}function Zo(e){if(!ue(e))return e;let t=ee(e),n=Ce(e)?t.map(Jo):t;return`${Xo(e)}| ${n.join(" | ")} |`}function qe(e){let t=e.map(()=>!0),n=null;for(let r=0;r<e.length;r++){let o=Go(e[r]??"");if(n===null){o&&(n=o,t[r]=!1);continue}t[r]=!1,o&&o.char===n.char&&o.len>=n.len&&(n=null)}return t}function Vn(e){let t=e.split(/\r?\n/),n=qe(t),r=[];for(let o=0;o<t.length;o++){if(!n[o])continue;let s=t[o]??"";ue(s)&&Zo(s)!==s&&r.push(o+1)}return r}function Kn(e){if(!(0,Ze.existsSync)(e))return[];let t=[],n=r=>{for(let o of(0,Ze.readdirSync)(r,{withFileTypes:!0})){let s=(0,Lt.join)(r,o.name);o.isDirectory()?n(s):o.isFile()&&o.name.endsWith(".md")&&t.push(s)}};return n(e),t.sort()}var qo=/^[-*]\s+(?:\*\*)?确立来源/,Qo=/本次起入表|新立条目:|条文全文落/;function Gn(e,t){return e.length===t.length&&t.every((n,r)=>e[r]===n)}function Qe(e){return e.map(t=>`\u300C${t}\u300D`).join("")}function es(e){return Gn(e.header,Ge)?[]:[{file:e.indexFile,message:`${te} \u7D22\u5F15\u8868\u5217\u96C6\u5408\u504F\u79BB v3 \u89C4\u8303\uFF1A\u5E94\u6070\u4E3A ${Qe(Ge)}\uFF0C\u5B9E\u4E3A ${Qe(e.header)}\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`}]}function ts(e){let t=[],n=[[z,e.historyFile,Xe,Se],[Ae,e.retiredFile,Je,wt]];for(let[r,o,s,i]of n){if(!(0,Ie.existsSync)(o))continue;let l=xe(R(o).split(/\r?\n/),i);!l||Gn(l.header,s)||t.push({file:o,line:l.headerLine+1,message:`${r} \u8868\u5934\u504F\u79BB v3 \u89C4\u8303\uFF1A\u5E94\u6070\u4E3A ${Qe(s)}\uFF0C\u5B9E\u4E3A ${Qe(l.header)}\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`})}return t}function ns(e){let t=[],n=[...At(e),e.historyFile,e.retiredFile];for(let r of n){if(!(0,Ie.existsSync)(r))continue;let o=R(r).split(/\r?\n/),s=qe(o),i=o.map((p,m)=>s[m]?p:""),l=Pn(i),c=l[0];if(c===void 0)continue;let f=l.length>1?`\uFF08\u53E6\u6709 ${l.length-1} \u5904\uFF09`:"";t.push({file:r,line:c.line,message:`${(0,It.basename)(r)} \u7B2C ${c.line} \u884C\u8868\u5934\u4E0E\u5206\u9694\u884C\u5217\u6570\u4E0D\u4E00\u81F4\uFF08\u8868\u5934 ${c.headerCols} \u5217 / \u5206\u9694\u884C ${c.sepCols} \u5217\uFF09${f}\uFF1A\u8BF7\u6309 conventions-spec \u5F52\u4E00`})}return t}function rs(e){let t=[],n=At(e).filter(r=>r!==e.indexFile);for(let r of n){if(!(0,Ie.existsSync)(r))continue;let o=R(r).split(/\r?\n/),s=qe(o),i=[];o.forEach((f,p)=>{s[p]&&qo.test(f)&&i.push(p+1)});let l=i[0];if(l===void 0)continue;let c=i.length>1?`\uFF08\u53E6\u6709 ${i.length-1} \u5904\uFF09`:"";t.push({file:r,line:l,message:`${(0,It.basename)(r)} \u7B2C ${l} \u884C\u6B8B\u7559\u300C\u786E\u7ACB\u6765\u6E90\u300D\u5B50\u9879${c}\uFF1A\u6765\u6E90\u7531\u7D22\u5F15\u884C\u4E0E history.md / retired.md \u627F\u8F7D\uFF0C\u5206\u518C\u5185\u4E0D\u91CD\u590D\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`})}return t}function os(e){if(!(0,Ie.existsSync)(e.historyFile))return[];let t=xe(R(e.historyFile).split(/\r?\n/),Se);if(!t)return[];let n=zn(t.header,$t);if(n<0)return[];let r=[];t.rows.forEach((i,l)=>{let c=t.rowLines[l];c!==void 0&&Qo.test(i[n]??"")&&r.push(c+1)});let o=r[0];if(o===void 0)return[];let s=r.length>1?`\uFF08\u53E6\u6709 ${r.length-1} \u5904\uFF09`:"";return[{file:e.historyFile,line:o,message:`${z} \u7B2C ${o} \u884C\u300C\u4FEE\u8BA2\u5185\u5BB9\u300D\u5217\u542B\u7981\u7528\u8BED\u6599${s}\uFF1A\u4E0D\u5F97\u5199\u81EA\u6307\u5957\u8BDD\uFF08\u5982\u300C\uFF08\u672C\u6B21\u8D77\u5165\u8868\uFF09\u300D\u300C\u65B0\u7ACB\u6761\u76EE\uFF1A\u300D\uFF09\u6216\u91CD\u590D\u7D22\u5F15\u5217\u7684\u6761\u6587\u53BB\u5411\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \xA73.2 \u5F52\u4E00`}]}function Xn(e){if(!e.hasIndex)return[];let t=[];return e.form==="v3"&&t.push(...es(e),...ts(e),...rs(e),...os(e)),t.push(...ns(e)),t}var Jn=require("fs"),_t=require("path");var ss="toolkit-conventions",is="SKILL.md",cs=[".agents/skills",".trae/skills",".trae-cn/skills",".cursor/skills",".claude/skills"];function Zn(e){let t=[];for(let n of cs){let r=`${n}/${ss}`,o=`${r}/${is}`;(0,Jn.existsSync)((0,_t.join)(e,o))&&t.push({dir:r,file:o,version:Wn(R((0,_t.join)(e,o)))})}return t}function qn(e){let[t]=e;if(!t)return null;let n=o=>o.version===null?"\u65E0":`v${o.version}`;if(e.length===1)return{file:t.file,message:`\u5165\u53E3\u58F3\u6807\u8BB0 ${n(t)}\uFF0C\u4E0E\u5F53\u524D toolkit \u7684 v${ye} \u4E0D\u4E00\u81F4\uFF1A\u91CD\u8DD1 toolkit init \u53EF\u8865\u9F50`};let r=e.map(o=>`${o.file}\uFF08\u6807\u8BB0 ${n(o)}\uFF09`).join("\u3001");return{file:t.file,message:`\u5165\u53E3\u58F3\u6807\u8BB0\u4E0E\u5F53\u524D toolkit \u7684 v${ye} \u4E0D\u4E00\u81F4\uFF0C\u5171 ${e.length} \u5904\uFF1A${r}\uFF1B\u91CD\u8DD1 toolkit init \u53EF\u4E00\u6B21\u6027\u8865\u9F50`}}function Qn(e){let[t]=e;if(!t)return null;if(e.length===1)return{file:t.file,message:`\u5165\u53E3\u58F3 ${t.file} \u88AB gitignore \u8986\u76D6\uFF1A\u4E0D\u4F1A\u968F git \u5206\u53D1\uFF0C\u8BF7\u628A\u8BE5\u8DEF\u5F84\u4ECE\u5FFD\u7565\u89C4\u5219\u4E2D\u6392\u9664`};let n=e.map(r=>r.file).join("\u3001");return{file:t.file,message:`\u5165\u53E3\u58F3\u88AB gitignore \u8986\u76D6\uFF0C\u5171 ${e.length} \u5904\uFF1A${n}\uFF1B\u4E0D\u4F1A\u968F git \u5206\u53D1\uFF0C\u8BF7\u628A\u76F8\u5E94\u8DEF\u5F84\u4ECE\u5FFD\u7565\u89C4\u5219\u4E2D\u6392\u9664`}}var er=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,ls=/^[-*]\s*\[ \]\s/m,as=/^[-*]\s*\[ \]/,us=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/,fs=/^\d{4}-\d{1,2}-\d{1,2}[T\s]\d{1,2}:\d{2}(?::\d{2})?$/,ds=/^\d{8}-[^-]+-.+\.md$/;function tr(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,l=+o;if(i<1||i>12||l<1||l>31)return!1;let c=new Date(Date.UTC(s,i-1,l));return c.getUTCFullYear()===s&&c.getUTCMonth()===i-1&&c.getUTCDate()===l}function Y(e,t,n){for(let r=0;r<t;r++)if((e[r]??"").trimStart().startsWith(`${n}:`))return r+1;return 1}function nr(e,t,n){let r=!1;for(let o=t;o<e.length;o++){let s=e[o]??"";if(!r&&/^# /.test(s)){r=!0;continue}if(n.test(s))return o+1}return t+1}function ps(e,t){let n=[];t.startsWith("\uFEFF")&&n.push({level:"warn",file:e,line:1,message:"\u6587\u4EF6\u542B UTF-8 BOM\uFF0C\u5EFA\u8BAE\u53BB\u9664\uFF08\u90E8\u5206\u89E3\u6790\u5DE5\u5177\u4F1A\u5F02\u5E38\uFF09"});let o=t.split(/\r?\n/).findIndex(i=>/[ \t]+$/.test(i));o>=0&&n.push({level:"warn",file:e,line:o+1,message:"\u884C\u5C3E\u6709\u591A\u4F59\u7A7A\u767D\uFF08\u7A7A\u683C\u6216\u5236\u8868\u7B26\uFF09\uFF0C\u5EFA\u8BAE\u53BB\u9664"});let s=-1;for(let i=0;i<t.length;i++)if(t[i]===`
65
+ `;var Ie=require("fs"),It=require("path");var Ze=require("fs"),Lt=require("path");var Ko=/^\s*(`{3,}|~{3,})/;function Go(e){let t=Ko.exec(e)?.[1];return t?{char:t.charAt(0),len:t.length}:null}function Xo(e){return/^\s*/.exec(e)?.[0]??""}function Jo(e){return e.replace(/^(:?)-+(:?)$/,"$1---$2")}function Zo(e){if(!ue(e))return e;let t=ee(e),n=Ce(e)?t.map(Jo):t;return`${Xo(e)}| ${n.join(" | ")} |`}function qe(e){let t=e.map(()=>!0),n=null;for(let r=0;r<e.length;r++){let o=Go(e[r]??"");if(n===null){o&&(n=o,t[r]=!1);continue}t[r]=!1,o&&o.char===n.char&&o.len>=n.len&&(n=null)}return t}function Vn(e){let t=e.split(/\r?\n/),n=qe(t),r=[];for(let o=0;o<t.length;o++){if(!n[o])continue;let s=t[o]??"";ue(s)&&Zo(s)!==s&&r.push(o+1)}return r}function Kn(e){if(!(0,Ze.existsSync)(e))return[];let t=[],n=r=>{for(let o of(0,Ze.readdirSync)(r,{withFileTypes:!0})){let s=(0,Lt.join)(r,o.name);o.isDirectory()?n(s):o.isFile()&&o.name.endsWith(".md")&&t.push(s)}};return n(e),t.sort()}var qo=/^[-*]\s+(?:\*\*)?确立来源/,Qo=/本次起入表|新立条目:|条文全文落/;function Gn(e,t){return e.length===t.length&&t.every((n,r)=>e[r]===n)}function Qe(e){return e.map(t=>`\u300C${t}\u300D`).join("")}function es(e){return Gn(e.header,Ge)?[]:[{file:e.indexFile,message:`${te} \u7D22\u5F15\u8868\u5217\u96C6\u5408\u504F\u79BB v3 \u89C4\u8303\uFF1A\u5E94\u6070\u4E3A ${Qe(Ge)}\uFF0C\u5B9E\u4E3A ${Qe(e.header)}\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`}]}function ts(e){let t=[],n=[[z,e.historyFile,Xe,Se],[Ae,e.retiredFile,Je,wt]];for(let[r,o,s,i]of n){if(!(0,Ie.existsSync)(o))continue;let l=xe(R(o).split(/\r?\n/),i);!l||Gn(l.header,s)||t.push({file:o,line:l.headerLine+1,message:`${r} \u8868\u5934\u504F\u79BB v3 \u89C4\u8303\uFF1A\u5E94\u6070\u4E3A ${Qe(s)}\uFF0C\u5B9E\u4E3A ${Qe(l.header)}\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`})}return t}function ns(e){let t=[],n=[...At(e),e.historyFile,e.retiredFile];for(let r of n){if(!(0,Ie.existsSync)(r))continue;let o=R(r).split(/\r?\n/),s=qe(o),i=o.map((p,m)=>s[m]?p:""),l=Pn(i),c=l[0];if(c===void 0)continue;let f=l.length>1?`\uFF08\u53E6\u6709 ${l.length-1} \u5904\uFF09`:"";t.push({file:r,line:c.line,message:`${(0,It.basename)(r)} \u7B2C ${c.line} \u884C\u8868\u5934\u4E0E\u5206\u9694\u884C\u5217\u6570\u4E0D\u4E00\u81F4\uFF08\u8868\u5934 ${c.headerCols} \u5217 / \u5206\u9694\u884C ${c.sepCols} \u5217\uFF09${f}\uFF1A\u8BF7\u6309 conventions-spec \u5F52\u4E00`})}return t}function rs(e){let t=[],n=At(e).filter(r=>r!==e.indexFile);for(let r of n){if(!(0,Ie.existsSync)(r))continue;let o=R(r).split(/\r?\n/),s=qe(o),i=[];o.forEach((f,p)=>{s[p]&&qo.test(f)&&i.push(p+1)});let l=i[0];if(l===void 0)continue;let c=i.length>1?`\uFF08\u53E6\u6709 ${i.length-1} \u5904\uFF09`:"";t.push({file:r,line:l,message:`${(0,It.basename)(r)} \u7B2C ${l} \u884C\u6B8B\u7559\u300C\u786E\u7ACB\u6765\u6E90\u300D\u5B50\u9879${c}\uFF1A\u6765\u6E90\u7531\u7D22\u5F15\u884C\u4E0E history.md / retired.md \u627F\u8F7D\uFF0C\u5206\u518C\u5185\u4E0D\u91CD\u590D\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`})}return t}function os(e){if(!(0,Ie.existsSync)(e.historyFile))return[];let t=xe(R(e.historyFile).split(/\r?\n/),Se);if(!t)return[];let n=zn(t.header,$t);if(n<0)return[];let r=[];t.rows.forEach((i,l)=>{let c=t.rowLines[l];c!==void 0&&Qo.test(i[n]??"")&&r.push(c+1)});let o=r[0];if(o===void 0)return[];let s=r.length>1?`\uFF08\u53E6\u6709 ${r.length-1} \u5904\uFF09`:"";return[{file:e.historyFile,line:o,message:`${z} \u7B2C ${o} \u884C\u300C\u4FEE\u8BA2\u5185\u5BB9\u300D\u5217\u542B\u7981\u7528\u8BED\u6599${s}\uFF1A\u4E0D\u5F97\u5199\u81EA\u6307\u5957\u8BDD\uFF08\u5982\u300C\uFF08\u672C\u6B21\u8D77\u5165\u8868\uFF09\u300D\u300C\u65B0\u7ACB\u6761\u76EE\uFF1A\u300D\uFF09\u6216\u91CD\u590D\u7D22\u5F15\u5217\u7684\u6761\u6587\u53BB\u5411\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \xA73.2 \u5F52\u4E00`}]}function Xn(e){if(!e.hasIndex)return[];let t=[];return e.form==="v3"&&t.push(...es(e),...ts(e),...rs(e),...os(e)),t.push(...ns(e)),t}var Jn=require("fs"),_t=require("path");var ss="toolkit-conventions",is="SKILL.md",cs=[".agents/skills",".trae/skills",".claude/skills","agent/skills",".augment/skills",".codebuddy/skills",".continue/skills",".crush/skills",".devin/skills",".goose/skills",".grok/skills",".hermes/skills",".iflow/skills",".junie/skills",".kiro/skills",".openhands/skills",".qwen/skills",".roo/skills",".windsurf/skills"];function Zn(e){let t=[];for(let n of cs){let r=`${n}/${ss}`,o=`${r}/${is}`;(0,Jn.existsSync)((0,_t.join)(e,o))&&t.push({dir:r,file:o,version:Wn(R((0,_t.join)(e,o)))})}return t}function qn(e){let[t]=e;if(!t)return null;let n=o=>o.version===null?"\u65E0":`v${o.version}`;if(e.length===1)return{file:t.file,message:`\u5165\u53E3\u58F3\u6807\u8BB0 ${n(t)}\uFF0C\u4E0E\u5F53\u524D toolkit \u7684 v${ye} \u4E0D\u4E00\u81F4\uFF1A\u91CD\u8DD1 toolkit init \u53EF\u8865\u9F50`};let r=e.map(o=>`${o.file}\uFF08\u6807\u8BB0 ${n(o)}\uFF09`).join("\u3001");return{file:t.file,message:`\u5165\u53E3\u58F3\u6807\u8BB0\u4E0E\u5F53\u524D toolkit \u7684 v${ye} \u4E0D\u4E00\u81F4\uFF0C\u5171 ${e.length} \u5904\uFF1A${r}\uFF1B\u91CD\u8DD1 toolkit init \u53EF\u4E00\u6B21\u6027\u8865\u9F50`}}function Qn(e){let[t]=e;if(!t)return null;if(e.length===1)return{file:t.file,message:`\u5165\u53E3\u58F3 ${t.file} \u88AB gitignore \u8986\u76D6\uFF1A\u4E0D\u4F1A\u968F git \u5206\u53D1\uFF0C\u8BF7\u628A\u8BE5\u8DEF\u5F84\u4ECE\u5FFD\u7565\u89C4\u5219\u4E2D\u6392\u9664`};let n=e.map(r=>r.file).join("\u3001");return{file:t.file,message:`\u5165\u53E3\u58F3\u88AB gitignore \u8986\u76D6\uFF0C\u5171 ${e.length} \u5904\uFF1A${n}\uFF1B\u4E0D\u4F1A\u968F git \u5206\u53D1\uFF0C\u8BF7\u628A\u76F8\u5E94\u8DEF\u5F84\u4ECE\u5FFD\u7565\u89C4\u5219\u4E2D\u6392\u9664`}}var er=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,ls=/^[-*]\s*\[ \]\s/m,as=/^[-*]\s*\[ \]/,us=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/,fs=/^\d{4}-\d{1,2}-\d{1,2}[T\s]\d{1,2}:\d{2}(?::\d{2})?$/,ds=/^\d{8}-[^-]+-.+\.md$/;function tr(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,l=+o;if(i<1||i>12||l<1||l>31)return!1;let c=new Date(Date.UTC(s,i-1,l));return c.getUTCFullYear()===s&&c.getUTCMonth()===i-1&&c.getUTCDate()===l}function Y(e,t,n){for(let r=0;r<t;r++)if((e[r]??"").trimStart().startsWith(`${n}:`))return r+1;return 1}function nr(e,t,n){let r=!1;for(let o=t;o<e.length;o++){let s=e[o]??"";if(!r&&/^# /.test(s)){r=!0;continue}if(n.test(s))return o+1}return t+1}function ps(e,t){let n=[];t.startsWith("\uFEFF")&&n.push({level:"warn",file:e,line:1,message:"\u6587\u4EF6\u542B UTF-8 BOM\uFF0C\u5EFA\u8BAE\u53BB\u9664\uFF08\u90E8\u5206\u89E3\u6790\u5DE5\u5177\u4F1A\u5F02\u5E38\uFF09"});let o=t.split(/\r?\n/).findIndex(i=>/[ \t]+$/.test(i));o>=0&&n.push({level:"warn",file:e,line:o+1,message:"\u884C\u5C3E\u6709\u591A\u4F59\u7A7A\u767D\uFF08\u7A7A\u683C\u6216\u5236\u8868\u7B26\uFF09\uFF0C\u5EFA\u8BAE\u53BB\u9664"});let s=-1;for(let i=0;i<t.length;i++)if(t[i]===`
66
66
  `&&(i===0||t[i-1]!=="\r")){s=i;break}return s>=0&&t.includes(`\r
67
67
  `)&&n.push({level:"warn",file:e,line:t.slice(0,s).split(`
68
68
  `).length,message:"\u6362\u884C\u7B26\u6DF7\u7528\uFF08\u540C\u6587\u4EF6\u540C\u65F6\u542B CRLF \u4E0E LF\uFF09\uFF0C\u5EFA\u8BAE\u7EDF\u4E00\u4E3A LF"}),n}function Ft(e){let t=[],n=(0,j.basename)(e),r=(0,V.readFileSync)(e,"utf8");t.push(...ps(n,r));let o=W(r),s=o.split(/\r?\n/),i=Fe.exec(o)?.[0].split(/\r?\n/).length??0;if(!Fe.test(o))return t.push({level:"error",file:n,line:1,message:"\u7F3A\u5C11 frontmatter"}),t;let c=Oe(o);for(let a of Object.keys(c))Re.includes(a)||t.push({level:"warn",file:n,line:Y(s,i,a),message:`frontmatter \u542B\u672A\u77E5\u5B57\u6BB5\u300C${a}\u300D\uFF0C\u672C\u5DE5\u5177\u4E0D\u8BFB\u53D6\uFF08\u5F52\u6863\u4E0E\u5F52\u4E00\u5316\u4E0D\u4F1A\u4FDD\u7559\uFF0C\u8BF7\u81EA\u884C\u7EF4\u62A4\uFF09`});if(c.status?de.includes(c.status)||t.push({level:"error",file:n,line:Y(s,i,"status"),message:`status \u975E\u6CD5\u503C\u300C${c.status}\u300D\uFF0C\u5E94\u4E3A ${de.join(" / ")}`}):t.push({level:"error",file:n,line:Y(s,i,"status"),message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),ne.includes(c.status)&&!c.completed&&t.push({level:"error",file:n,line:Y(s,i,"completed"),message:`status \u4E3A\u300C${c.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),c.completed){let a=c.completed.trim(),d=Y(s,i,"completed");if(!us.test(a))t.push({level:"warn",file:n,line:d,message:`completed\u300C${c.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`});else{let g=a.match(/^\d{4}-\d{1,2}-\d{1,2}/)?.[0]??a;tr(g)?fs.test(a)?he(a)?t.push({level:"warn",file:n,line:d,message:`completed\u300C${c.completed}\u300D\u665A\u4E8E\u5F53\u524D\u7CFB\u7EDF\u65F6\u95F4 ${ge} \u5C0F\u65F6\u4EE5\u4E0A\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(a)&&t.push({level:"warn",file:n,line:d,message:`completed\u300C${c.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,line:d,message:`completed\u300C${c.completed}\u300D\u5EFA\u8BAE\u8865\u5168\u4E3A\u5B8C\u6574\u65F6\u95F4 YYYY-MM-DD HH:mm`}):t.push({level:"warn",file:n,line:d,message:`completed\u300C${c.completed}\u300D\u65E5\u671F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u6838\u5BF9`})}}c.owner||t.push({level:"warn",file:n,line:Y(s,i,"owner"),message:"\u7F3A\u5C11 owner \u8D1F\u8D23\u4EBA\u5B57\u6BB5"}),c.created?/^\d{8}$/.test(c.created.trim())?tr(c.created.trim())||t.push({level:"warn",file:n,line:Y(s,i,"created"),message:`created\u300C${c.created}\u300D\u65E5\u671F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u6838\u5BF9`}):t.push({level:"warn",file:n,line:Y(s,i,"created"),message:`created\u300C${c.created}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYYMMDD`}):t.push({level:"warn",file:n,line:Y(s,i,"created"),message:"\u7F3A\u5C11 created \u521B\u5EFA\u65E5\u671F\u5B57\u6BB5"}),c.updated&&c.created&&/^\d{8}$/.test(c.updated.trim())&&/^\d{8}$/.test(c.created.trim())&&c.updated.trim()<c.created.trim()&&t.push({level:"error",file:n,line:Y(s,i,"updated"),message:`updated ${c.updated.trim()} \u65E9\u4E8E created ${c.created.trim()}\uFF0C\u65F6\u95F4\u7EBF\u77DB\u76FE`});let f=n.match(/^(\d{8})-/);if(ds.test(n)?c.created&&/^\d{8}$/.test(c.created.trim())&&f&&c.created.trim()!==f[1]&&t.push({level:"warn",file:n,message:`\u6587\u4EF6\u540D\u65E5\u671F ${f[1]} \u4E0E created ${c.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"}),c.scope){let a=c.scope.trim(),d=Y(s,i,"scope");/[、,,]/.test(a)&&t.push({level:"warn",file:n,line:d,message:`scope\u300C${c.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: web+server\uFF09`}),/[/\\]/.test(a)&&t.push({level:"warn",file:n,line:d,message:`scope\u300C${c.scope}\u300D\u542B\u8DEF\u5F84\u5206\u9694\u7B26\uFF0C\u591A\u503C\u8BF7\u6539\u7528\u534A\u89D2\u52A0\u53F7\u8FDE\u63A5\uFF08\u5982 scope: web+server\uFF09\uFF0C\u7AEF\u540D\u672C\u8EAB\u4E0D\u5F97\u542B\u5206\u9694\u7B26`}),/[()()]/.test(a)&&t.push({level:"warn",file:n,line:d,message:`scope\u300C${c.scope}\u300D\u542B\u62EC\u53F7\u7591\u4F3C\u6CE8\u91CA\u6027\u6587\u5B57\uFF0C\u8BF4\u660E\u8BF7\u79FB\u5165\u6B63\u6587`})}let p=Yt(Z(o)),h=se("check")?.pendingMarkers!==!1?p.match(er):null;return h&&t.push({level:"warn",file:n,line:nr(s,i,er),message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${h[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),se("check")?.includeCheckbox!==!1&&ls.test(p)&&t.push({level:"warn",file:n,line:nr(s,i,as),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 ms(e){let t=[];if(!(0,V.existsSync)(e))return t;for(let n of(0,V.readdirSync)(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(0,V.readdirSync)((0,j.join)(e,n.name)))r.endsWith(".md")&&/^\d{8}-/.test(r)&&t.push(`${n.name}/${r}`)}return t}function gs(e){let t=rn(e);if(!t)return[];let n=F(e,t),r=zt(t,e);return r.state==="not-a-repo"||r.state==="outside-repo"?[]:r.state==="unavailable"?[{level:"warn",file:n,message:`\u672C\u5730\u914D\u7F6E\u6587\u4EF6\u5FFD\u7565\u5224\u5B9A\u4E0D\u53EF\u7528\uFF08${r.detail??"\u672A\u77E5\u539F\u56E0"}\uFF09\uFF0C\u8BF7\u6838\u5B9E git \u73AF\u5883`}]:r.state==="tracked"?[{level:"warn",file:n,message:`\u672C\u5730\u914D\u7F6E\u6587\u4EF6\u5DF2\u88AB\u5FFD\u7565\u89C4\u5219\u8986\u76D6\u4F46\u4ECD\u88AB git \u8DDF\u8E2A\uFF08\u7591\u4F3C\u5386\u53F2 git add -f\uFF09\uFF1A\u6267\u884C git rm --cached ${n} \u540E\u624D\u4F1A\u771F\u6B63\u4E0D\u5165\u5E93`}]:r.state==="ignored"?[]:[{level:"warn",file:n,message:"\u672C\u5730\u914D\u7F6E\u6587\u4EF6\u672A\u88AB gitignore \u8986\u76D6\uFF0C\u53EF\u80FD\u968F git \u63D0\u4EA4\u6CC4\u9732\u4E2A\u4EBA\u914D\u7F6E\uFF1A\u91CD\u8DD1 toolkit init \u53EF\u81EA\u52A8\u8865\u5199\u5FFD\u7565\u884C"}]}function hs(e,t){let n=[],r=Ct(e);r.hasLegacy&&n.push({level:"warn",file:Ke,message:r.hasDir?"\u65E7\u5355\u6587\u4EF6\u89C4\u8303\u8F7D\u4F53\u5DF2\u88AB conventions/ \u76EE\u5F55\u5F62\u6001\u53D6\u4EE3\uFF0C\u5EFA\u8BAE\u6E05\u7406\uFF08\u4E24\u8005\u5E76\u5B58\u65F6\u4EE5\u76EE\u5F55\u5F62\u6001\u4E3A\u51C6\uFF09":"\u65E7\u5355\u6587\u4EF6\u89C4\u8303\u8F7D\u4F53\uFF0C\u5EFA\u8BAE\u8FC1\u79FB\u4E3A conventions/ \u76EE\u5F55\u5F62\u6001\uFF08index.md \u4F5C\u552F\u4E00\u5165\u53E3 + common.md / \u7AEF\u5206\u518C\u6309\u9700\u521B\u5EFA\uFF09"}),r.hasDir&&!r.hasIndex&&n.push({level:"warn",file:`conventions/${te}`,message:"\u89C4\u8303\u8F7D\u4F53\u7F3A index.md\uFF08\u552F\u4E00\u5165\u53E3\u4E0E\u552F\u4E00\u6743\u5A01\uFF09\uFF0C\u8BF7\u8865\u9F50"}),r.form==="abnormal"&&n.push({level:"warn",file:`conventions/${te}`,message:r.markerVersion===Le?`\u89C4\u8303\u8F7D\u4F53\u6807\u4E3A v${Le} \u4F46\u7F3A ${z} \u6216\u7D22\u5F15\u8868\u9996\u5217\u975E ${fe}\uFF0C\u8BF7\u8865\u9F50\u6216\u6267\u884C toolkit conventions upgrade`:`\u89C4\u8303\u8F7D\u4F53\u5B58\u5728 ${z} \u4F46\u7D22\u5F15\u8868\u9996\u5217\u4ECD\u975E ${fe}\uFF08\u5F62\u6001\u5F02\u5E38\uFF09\uFF0C\u8BF7\u4EBA\u5DE5\u786E\u8BA4`}),n.push(...bs(e,r));let o=Zn(t),s=Pt(t,o.map(l=>l.file)),i=[qn(o.filter(l=>l.version!==ye)),Qn(o.filter(l=>s.has(l.file)))];for(let l of i)l&&n.push({level:"warn",file:l.file,message:l.message});return n.push(...gs(t)),n}function bs(e,t){return Xn(t).map(n=>({level:"warn",file:F(e,n.file),...n.line===void 0?{}:{line:n.line},message:n.message}))}var rr=6;function ks(e){let t=[];for(let n of Kn(e)){let r=Vn(R(n));if(r.length===0)continue;let o=r.slice(0,rr).join("\u3001");t.push({level:"warn",file:F(e,n),line:r[0],message:`\u8868\u683C\u5B58\u5728\u5217\u5BF9\u9F50\u586B\u5145\uFF08\u504F\u79BB\u7D27\u51D1\u5F62\u6001\uFF09${r.length} \u884C\uFF08\u7B2C ${o}${r.length>rr?" \u2026":""} \u884C\uFF09\uFF1A\u6267\u884C toolkit conventions format \u5F52\u4E00`})}return t}function ys(e){if(Ct(e).form!=="v3")return[];let t=(0,j.join)(e,Ve,z);if(!(0,V.existsSync)(t))return[];let n=xe(R(t).split(/\r?\n/),Se);if(!n)return[];let r=n.rowLines.filter((o,s)=>!Un((n.rows[s]??[])[0]??""));return r.length===0?[]:[{level:"warn",file:F(e,t),line:(r[0]??0)+1,message:`\u6F14\u8FDB\u8BB0\u5F55\u6709 ${r.length} \u884C\u9996\u5217\u4E0D\u662F\u7A33\u5B9A ID\uFF08\u5E94\u8BB0\u884C\u5185\u4EE3\u7801\u5305\u88F9\u7684 C-<n>\uFF09\uFF1A\u8BF7\u4EBA\u5DE5\u6838\u5BF9\u8865\u5F55\uFF08\u5386\u53F2\u884C\u53EA\u8FFD\u52A0\uFF0C\u4E0D\u81EA\u52A8\u6539\u5199\uFF09`}]}function sr(e=".tasks",t=process.cwd()){let n=(0,j.join)(e,"active"),r=L(n),o=[];for(let c of r)o.push(...Ft(c)),(0,j.dirname)(c)===n&&o.push({level:"warn",file:(0,j.basename)(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 ms(e))o.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"});o.push(...hs(e,t)),o.push(...ks(e)),o.push(...ys(e));for(let c of ze(e))o.push({level:"warn",file:c.file,message:c.message});let s=new Map;for(let c of r){let f=(0,j.basename)(c,".md"),p=s.get(f);p?p.push(c):s.set(f,[c])}for(let[c,f]of s)f.length>1&&o.push({level:"warn",file:c,message:`\u5B58\u5728 ${f.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});o.push(...Ss(r,e));let i=o.filter(c=>c.level==="error").length,l=o.length-i;return{issues:o,errorCount:i,warnCount:l}}var or=new Map;function xs(e){let t=(0,V.statSync)(e),n=or.get(e);if(n&&n.mtimeMs===t.mtimeMs)return n.titles;let r=[],o=new Set;try{for(let s of N(R(e)).blocks)s.title&&!o.has(s.title)&&(o.add(s.title),r.push(s.title))}catch{}return or.set(e,{mtimeMs:t.mtimeMs,titles:r}),r}function Ss(e,t){let n=[],r=new Set(e.map(u=>(0,j.basename)(u,".md"))),o=new Map,s=u=>u.trim().replace(/\.md$/,"").trim();for(let u of e){let a=(0,j.basename)(u,".md"),d=R(u),g=Oe(d);o.set(a,je(g.depends_on).map(s))}if(![...o.values()].some(u=>u.length>0))return n;let i=null,l=u=>{if(!i){i=new Map;for(let a of L((0,j.join)(t,"archive")))for(let d of xs(a))i.has(d)||i.set(d,F(t,a))}return i.get(u)};for(let[u,a]of o)for(let d of a)if(!r.has(d)){let g=l(d);n.push({level:"warn",file:u,message:g?`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${d}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u5DF2\u5F52\u6863\u4E8E ${g}\uFF0C\u65E0\u9700\u518D\u4F9D\u8D56\uFF09`:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${d}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}let c=0,f=1,p=2,m=new Map,h=(u,a)=>{m.set(u,f);for(let d of o.get(u)??[]){if(!r.has(d))continue;let g=m.get(d)??c;if(g===f)return[...a,d];if(g===c){let k=h(d,[...a,d]);if(k)return k}}return m.set(u,p),null};for(let u of o.keys())if((m.get(u)??c)===c){let a=h(u,[u]);if(a){n.push({level:"warn",file:u,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${a.join(" \u2192 ")}`});break}}return n}var Ot={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:["\u4F9D\u8D56\uFF1A"],other:[]},Nt={"### \u{1F41B} \u8865\u4E01\u4FEE\u590D":"fixed"},et={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} \u95EE\u9898\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"}},Rs="zh";function vs(e,t,n){let r=e[t];return r?{lang:r}:{lang:e[n]??et[n],unknown:t}}var ir=require("fs"),Dt=require("path");function tt(e){let t=[],n=new Set(["node_modules",".git","dist","coverage"]),r=o=>{let s;try{s=(0,ir.readdirSync)(o,{withFileTypes:!0})}catch{return}for(let i of s)if(i.isDirectory()){if(n.has(i.name))continue;r((0,Dt.join)(o,i.name))}else i.name==="CHANGELOG.md"&&t.push((0,Dt.join)(o,i.name))};return r(e),t}var _e=require("fs");var nt=/^## \d+\.\d+\.\d+/,Mt={"### Major Changes":"breaking","### Minor Changes":"added","### Patch Changes":"other","### Dependent Changes":"deps"},$s="- Updated dependencies",ws=Object.values(et).map(e=>e.released);function ar(){return mn()}function jt(e,t,n,r=!0,o=!1){let s=(0,_e.readFileSync)(e,"utf8"),i=s.includes(`\r
package/dist/index.js CHANGED
@@ -62,7 +62,7 @@ ${lt(Me)}
62
62
  ${gs}
63
63
 
64
64
  ${lt(je)}
65
- `;import{existsSync as Ye}from"fs";import{basename as Tn}from"path";import{existsSync as hs,readdirSync as bs}from"fs";import{join as ks,relative as Yl}from"path";var ys=/^\s*(`{3,}|~{3,})/;function xs(e){let t=ys.exec(e)?.[1];return t?{char:t.charAt(0),len:t.length}:null}function Ss(e){return/^\s*/.exec(e)?.[0]??""}function Rs(e){return e.replace(/^(:?)-+(:?)$/,"$1---$2")}function vs(e){if(!X(e))return e;let t=U(e),n=be(e)?t.map(Rs):t;return`${Ss(e)}| ${n.join(" | ")} |`}function Be(e){let t=e.map(()=>!0),n=null;for(let r=0;r<e.length;r++){let o=xs(e[r]??"");if(n===null){o&&(n=o,t[r]=!1);continue}t[r]=!1,o&&o.char===n.char&&o.len>=n.len&&(n=null)}return t}function wn(e){let t=e.split(/\r?\n/),n=Be(t),r=[];for(let o=0;o<t.length;o++){if(!n[o])continue;let s=t[o]??"";X(s)&&vs(s)!==s&&r.push(o+1)}return r}function En(e){if(!hs(e))return[];let t=[],n=r=>{for(let o of bs(r,{withFileTypes:!0})){let s=ks(r,o.name);o.isDirectory()?n(s):o.isFile()&&o.name.endsWith(".md")&&t.push(s)}};return n(e),t.sort()}var $s=/^[-*]\s+(?:\*\*)?确立来源/,ws=/本次起入表|新立条目:|条文全文落/;function Cn(e,t){return e.length===t.length&&t.every((n,r)=>e[r]===n)}function He(e){return e.map(t=>`\u300C${t}\u300D`).join("")}function Es(e){return Cn(e.header,De)?[]:[{file:e.indexFile,message:`${W} \u7D22\u5F15\u8868\u5217\u96C6\u5408\u504F\u79BB v3 \u89C4\u8303\uFF1A\u5E94\u6070\u4E3A ${He(De)}\uFF0C\u5B9E\u4E3A ${He(e.header)}\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`}]}function Ts(e){let t=[],n=[[j,e.historyFile,Me,fe],[ke,e.retiredFile,je,it]];for(let[r,o,s,i]of n){if(!Ye(o))continue;let l=ue(v(o).split(/\r?\n/),i);!l||Cn(l.header,s)||t.push({file:o,line:l.headerLine+1,message:`${r} \u8868\u5934\u504F\u79BB v3 \u89C4\u8303\uFF1A\u5E94\u6070\u4E3A ${He(s)}\uFF0C\u5B9E\u4E3A ${He(l.header)}\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`})}return t}function Cs(e){let t=[],n=[...ut(e),e.historyFile,e.retiredFile];for(let r of n){if(!Ye(r))continue;let o=v(r).split(/\r?\n/),s=Be(o),i=o.map((p,m)=>s[m]?p:""),l=vn(i),c=l[0];if(c===void 0)continue;let f=l.length>1?`\uFF08\u53E6\u6709 ${l.length-1} \u5904\uFF09`:"";t.push({file:r,line:c.line,message:`${Tn(r)} \u7B2C ${c.line} \u884C\u8868\u5934\u4E0E\u5206\u9694\u884C\u5217\u6570\u4E0D\u4E00\u81F4\uFF08\u8868\u5934 ${c.headerCols} \u5217 / \u5206\u9694\u884C ${c.sepCols} \u5217\uFF09${f}\uFF1A\u8BF7\u6309 conventions-spec \u5F52\u4E00`})}return t}function As(e){let t=[],n=ut(e).filter(r=>r!==e.indexFile);for(let r of n){if(!Ye(r))continue;let o=v(r).split(/\r?\n/),s=Be(o),i=[];o.forEach((f,p)=>{s[p]&&$s.test(f)&&i.push(p+1)});let l=i[0];if(l===void 0)continue;let c=i.length>1?`\uFF08\u53E6\u6709 ${i.length-1} \u5904\uFF09`:"";t.push({file:r,line:l,message:`${Tn(r)} \u7B2C ${l} \u884C\u6B8B\u7559\u300C\u786E\u7ACB\u6765\u6E90\u300D\u5B50\u9879${c}\uFF1A\u6765\u6E90\u7531\u7D22\u5F15\u884C\u4E0E history.md / retired.md \u627F\u8F7D\uFF0C\u5206\u518C\u5185\u4E0D\u91CD\u590D\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`})}return t}function Ls(e){if(!Ye(e.historyFile))return[];let t=ue(v(e.historyFile).split(/\r?\n/),fe);if(!t)return[];let n=$n(t.header,st);if(n<0)return[];let r=[];t.rows.forEach((i,l)=>{let c=t.rowLines[l];c!==void 0&&ws.test(i[n]??"")&&r.push(c+1)});let o=r[0];if(o===void 0)return[];let s=r.length>1?`\uFF08\u53E6\u6709 ${r.length-1} \u5904\uFF09`:"";return[{file:e.historyFile,line:o,message:`${j} \u7B2C ${o} \u884C\u300C\u4FEE\u8BA2\u5185\u5BB9\u300D\u5217\u542B\u7981\u7528\u8BED\u6599${s}\uFF1A\u4E0D\u5F97\u5199\u81EA\u6307\u5957\u8BDD\uFF08\u5982\u300C\uFF08\u672C\u6B21\u8D77\u5165\u8868\uFF09\u300D\u300C\u65B0\u7ACB\u6761\u76EE\uFF1A\u300D\uFF09\u6216\u91CD\u590D\u7D22\u5F15\u5217\u7684\u6761\u6587\u53BB\u5411\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \xA73.2 \u5F52\u4E00`}]}function An(e){if(!e.hasIndex)return[];let t=[];return e.form==="v3"&&t.push(...Es(e),...Ts(e),...As(e),...Ls(e)),t.push(...Cs(e)),t}import{existsSync as Is}from"fs";import{join as Ln}from"path";var Fs="toolkit-conventions",_s="SKILL.md",Os=[".agents/skills",".trae/skills",".trae-cn/skills",".cursor/skills",".claude/skills"];function In(e){let t=[];for(let n of Os){let r=`${n}/${Fs}`,o=`${r}/${_s}`;Is(Ln(e,o))&&t.push({dir:r,file:o,version:Rn(v(Ln(e,o)))})}return t}function Fn(e){let[t]=e;if(!t)return null;let n=o=>o.version===null?"\u65E0":`v${o.version}`;if(e.length===1)return{file:t.file,message:`\u5165\u53E3\u58F3\u6807\u8BB0 ${n(t)}\uFF0C\u4E0E\u5F53\u524D toolkit \u7684 v${ae} \u4E0D\u4E00\u81F4\uFF1A\u91CD\u8DD1 toolkit init \u53EF\u8865\u9F50`};let r=e.map(o=>`${o.file}\uFF08\u6807\u8BB0 ${n(o)}\uFF09`).join("\u3001");return{file:t.file,message:`\u5165\u53E3\u58F3\u6807\u8BB0\u4E0E\u5F53\u524D toolkit \u7684 v${ae} \u4E0D\u4E00\u81F4\uFF0C\u5171 ${e.length} \u5904\uFF1A${r}\uFF1B\u91CD\u8DD1 toolkit init \u53EF\u4E00\u6B21\u6027\u8865\u9F50`}}function _n(e){let[t]=e;if(!t)return null;if(e.length===1)return{file:t.file,message:`\u5165\u53E3\u58F3 ${t.file} \u88AB gitignore \u8986\u76D6\uFF1A\u4E0D\u4F1A\u968F git \u5206\u53D1\uFF0C\u8BF7\u628A\u8BE5\u8DEF\u5F84\u4ECE\u5FFD\u7565\u89C4\u5219\u4E2D\u6392\u9664`};let n=e.map(r=>r.file).join("\u3001");return{file:t.file,message:`\u5165\u53E3\u58F3\u88AB gitignore \u8986\u76D6\uFF0C\u5171 ${e.length} \u5904\uFF1A${n}\uFF1B\u4E0D\u4F1A\u968F git \u5206\u53D1\uFF0C\u8BF7\u628A\u76F8\u5E94\u8DEF\u5F84\u4ECE\u5FFD\u7565\u89C4\u5219\u4E2D\u6392\u9664`}}var Nn=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,js=/^[-*]\s*\[ \]\s/m,Bs=/^[-*]\s*\[ \]/,Hs=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/,Ys=/^\d{4}-\d{1,2}-\d{1,2}[T\s]\d{1,2}:\d{2}(?::\d{2})?$/,Us=/^\d{8}-[^-]+-.+\.md$/;function Dn(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,l=+o;if(i<1||i>12||l<1||l>31)return!1;let c=new Date(Date.UTC(s,i-1,l));return c.getUTCFullYear()===s&&c.getUTCMonth()===i-1&&c.getUTCDate()===l}function N(e,t,n){for(let r=0;r<t;r++)if((e[r]??"").trimStart().startsWith(`${n}:`))return r+1;return 1}function Mn(e,t,n){let r=!1;for(let o=t;o<e.length;o++){let s=e[o]??"";if(!r&&/^# /.test(s)){r=!0;continue}if(n.test(s))return o+1}return t+1}function Ws(e,t){let n=[];t.startsWith("\uFEFF")&&n.push({level:"warn",file:e,line:1,message:"\u6587\u4EF6\u542B UTF-8 BOM\uFF0C\u5EFA\u8BAE\u53BB\u9664\uFF08\u90E8\u5206\u89E3\u6790\u5DE5\u5177\u4F1A\u5F02\u5E38\uFF09"});let o=t.split(/\r?\n/).findIndex(i=>/[ \t]+$/.test(i));o>=0&&n.push({level:"warn",file:e,line:o+1,message:"\u884C\u5C3E\u6709\u591A\u4F59\u7A7A\u767D\uFF08\u7A7A\u683C\u6216\u5236\u8868\u7B26\uFF09\uFF0C\u5EFA\u8BAE\u53BB\u9664"});let s=-1;for(let i=0;i<t.length;i++)if(t[i]===`
65
+ `;import{existsSync as Ye}from"fs";import{basename as Tn}from"path";import{existsSync as hs,readdirSync as bs}from"fs";import{join as ks,relative as Yl}from"path";var ys=/^\s*(`{3,}|~{3,})/;function xs(e){let t=ys.exec(e)?.[1];return t?{char:t.charAt(0),len:t.length}:null}function Ss(e){return/^\s*/.exec(e)?.[0]??""}function Rs(e){return e.replace(/^(:?)-+(:?)$/,"$1---$2")}function vs(e){if(!X(e))return e;let t=U(e),n=be(e)?t.map(Rs):t;return`${Ss(e)}| ${n.join(" | ")} |`}function Be(e){let t=e.map(()=>!0),n=null;for(let r=0;r<e.length;r++){let o=xs(e[r]??"");if(n===null){o&&(n=o,t[r]=!1);continue}t[r]=!1,o&&o.char===n.char&&o.len>=n.len&&(n=null)}return t}function wn(e){let t=e.split(/\r?\n/),n=Be(t),r=[];for(let o=0;o<t.length;o++){if(!n[o])continue;let s=t[o]??"";X(s)&&vs(s)!==s&&r.push(o+1)}return r}function En(e){if(!hs(e))return[];let t=[],n=r=>{for(let o of bs(r,{withFileTypes:!0})){let s=ks(r,o.name);o.isDirectory()?n(s):o.isFile()&&o.name.endsWith(".md")&&t.push(s)}};return n(e),t.sort()}var $s=/^[-*]\s+(?:\*\*)?确立来源/,ws=/本次起入表|新立条目:|条文全文落/;function Cn(e,t){return e.length===t.length&&t.every((n,r)=>e[r]===n)}function He(e){return e.map(t=>`\u300C${t}\u300D`).join("")}function Es(e){return Cn(e.header,De)?[]:[{file:e.indexFile,message:`${W} \u7D22\u5F15\u8868\u5217\u96C6\u5408\u504F\u79BB v3 \u89C4\u8303\uFF1A\u5E94\u6070\u4E3A ${He(De)}\uFF0C\u5B9E\u4E3A ${He(e.header)}\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`}]}function Ts(e){let t=[],n=[[j,e.historyFile,Me,fe],[ke,e.retiredFile,je,it]];for(let[r,o,s,i]of n){if(!Ye(o))continue;let l=ue(v(o).split(/\r?\n/),i);!l||Cn(l.header,s)||t.push({file:o,line:l.headerLine+1,message:`${r} \u8868\u5934\u504F\u79BB v3 \u89C4\u8303\uFF1A\u5E94\u6070\u4E3A ${He(s)}\uFF0C\u5B9E\u4E3A ${He(l.header)}\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`})}return t}function Cs(e){let t=[],n=[...ut(e),e.historyFile,e.retiredFile];for(let r of n){if(!Ye(r))continue;let o=v(r).split(/\r?\n/),s=Be(o),i=o.map((p,m)=>s[m]?p:""),l=vn(i),c=l[0];if(c===void 0)continue;let f=l.length>1?`\uFF08\u53E6\u6709 ${l.length-1} \u5904\uFF09`:"";t.push({file:r,line:c.line,message:`${Tn(r)} \u7B2C ${c.line} \u884C\u8868\u5934\u4E0E\u5206\u9694\u884C\u5217\u6570\u4E0D\u4E00\u81F4\uFF08\u8868\u5934 ${c.headerCols} \u5217 / \u5206\u9694\u884C ${c.sepCols} \u5217\uFF09${f}\uFF1A\u8BF7\u6309 conventions-spec \u5F52\u4E00`})}return t}function As(e){let t=[],n=ut(e).filter(r=>r!==e.indexFile);for(let r of n){if(!Ye(r))continue;let o=v(r).split(/\r?\n/),s=Be(o),i=[];o.forEach((f,p)=>{s[p]&&$s.test(f)&&i.push(p+1)});let l=i[0];if(l===void 0)continue;let c=i.length>1?`\uFF08\u53E6\u6709 ${i.length-1} \u5904\uFF09`:"";t.push({file:r,line:l,message:`${Tn(r)} \u7B2C ${l} \u884C\u6B8B\u7559\u300C\u786E\u7ACB\u6765\u6E90\u300D\u5B50\u9879${c}\uFF1A\u6765\u6E90\u7531\u7D22\u5F15\u884C\u4E0E history.md / retired.md \u627F\u8F7D\uFF0C\u5206\u518C\u5185\u4E0D\u91CD\u590D\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \u5F52\u4E00`})}return t}function Ls(e){if(!Ye(e.historyFile))return[];let t=ue(v(e.historyFile).split(/\r?\n/),fe);if(!t)return[];let n=$n(t.header,st);if(n<0)return[];let r=[];t.rows.forEach((i,l)=>{let c=t.rowLines[l];c!==void 0&&ws.test(i[n]??"")&&r.push(c+1)});let o=r[0];if(o===void 0)return[];let s=r.length>1?`\uFF08\u53E6\u6709 ${r.length-1} \u5904\uFF09`:"";return[{file:e.historyFile,line:o,message:`${j} \u7B2C ${o} \u884C\u300C\u4FEE\u8BA2\u5185\u5BB9\u300D\u5217\u542B\u7981\u7528\u8BED\u6599${s}\uFF1A\u4E0D\u5F97\u5199\u81EA\u6307\u5957\u8BDD\uFF08\u5982\u300C\uFF08\u672C\u6B21\u8D77\u5165\u8868\uFF09\u300D\u300C\u65B0\u7ACB\u6761\u76EE\uFF1A\u300D\uFF09\u6216\u91CD\u590D\u7D22\u5F15\u5217\u7684\u6761\u6587\u53BB\u5411\uFF1B\u8BF7\u4EBA\u5DE5\u786E\u8BA4\u540E\u6309 conventions-spec \xA73.2 \u5F52\u4E00`}]}function An(e){if(!e.hasIndex)return[];let t=[];return e.form==="v3"&&t.push(...Es(e),...Ts(e),...As(e),...Ls(e)),t.push(...Cs(e)),t}import{existsSync as Is}from"fs";import{join as Ln}from"path";var Fs="toolkit-conventions",_s="SKILL.md",Os=[".agents/skills",".trae/skills",".claude/skills","agent/skills",".augment/skills",".codebuddy/skills",".continue/skills",".crush/skills",".devin/skills",".goose/skills",".grok/skills",".hermes/skills",".iflow/skills",".junie/skills",".kiro/skills",".openhands/skills",".qwen/skills",".roo/skills",".windsurf/skills"];function In(e){let t=[];for(let n of Os){let r=`${n}/${Fs}`,o=`${r}/${_s}`;Is(Ln(e,o))&&t.push({dir:r,file:o,version:Rn(v(Ln(e,o)))})}return t}function Fn(e){let[t]=e;if(!t)return null;let n=o=>o.version===null?"\u65E0":`v${o.version}`;if(e.length===1)return{file:t.file,message:`\u5165\u53E3\u58F3\u6807\u8BB0 ${n(t)}\uFF0C\u4E0E\u5F53\u524D toolkit \u7684 v${ae} \u4E0D\u4E00\u81F4\uFF1A\u91CD\u8DD1 toolkit init \u53EF\u8865\u9F50`};let r=e.map(o=>`${o.file}\uFF08\u6807\u8BB0 ${n(o)}\uFF09`).join("\u3001");return{file:t.file,message:`\u5165\u53E3\u58F3\u6807\u8BB0\u4E0E\u5F53\u524D toolkit \u7684 v${ae} \u4E0D\u4E00\u81F4\uFF0C\u5171 ${e.length} \u5904\uFF1A${r}\uFF1B\u91CD\u8DD1 toolkit init \u53EF\u4E00\u6B21\u6027\u8865\u9F50`}}function _n(e){let[t]=e;if(!t)return null;if(e.length===1)return{file:t.file,message:`\u5165\u53E3\u58F3 ${t.file} \u88AB gitignore \u8986\u76D6\uFF1A\u4E0D\u4F1A\u968F git \u5206\u53D1\uFF0C\u8BF7\u628A\u8BE5\u8DEF\u5F84\u4ECE\u5FFD\u7565\u89C4\u5219\u4E2D\u6392\u9664`};let n=e.map(r=>r.file).join("\u3001");return{file:t.file,message:`\u5165\u53E3\u58F3\u88AB gitignore \u8986\u76D6\uFF0C\u5171 ${e.length} \u5904\uFF1A${n}\uFF1B\u4E0D\u4F1A\u968F git \u5206\u53D1\uFF0C\u8BF7\u628A\u76F8\u5E94\u8DEF\u5F84\u4ECE\u5FFD\u7565\u89C4\u5219\u4E2D\u6392\u9664`}}var Nn=/待办|待实施|待核对|待确认|待开始|待评估|待排期|待做|TODO/,js=/^[-*]\s*\[ \]\s/m,Bs=/^[-*]\s*\[ \]/,Hs=/^\d{4}-\d{1,2}-\d{1,2}(?:[T\s]\d{1,2}:\d{2}(?::\d{2})?)?$/,Ys=/^\d{4}-\d{1,2}-\d{1,2}[T\s]\d{1,2}:\d{2}(?::\d{2})?$/,Us=/^\d{8}-[^-]+-.+\.md$/;function Dn(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,l=+o;if(i<1||i>12||l<1||l>31)return!1;let c=new Date(Date.UTC(s,i-1,l));return c.getUTCFullYear()===s&&c.getUTCMonth()===i-1&&c.getUTCDate()===l}function N(e,t,n){for(let r=0;r<t;r++)if((e[r]??"").trimStart().startsWith(`${n}:`))return r+1;return 1}function Mn(e,t,n){let r=!1;for(let o=t;o<e.length;o++){let s=e[o]??"";if(!r&&/^# /.test(s)){r=!0;continue}if(n.test(s))return o+1}return t+1}function Ws(e,t){let n=[];t.startsWith("\uFEFF")&&n.push({level:"warn",file:e,line:1,message:"\u6587\u4EF6\u542B UTF-8 BOM\uFF0C\u5EFA\u8BAE\u53BB\u9664\uFF08\u90E8\u5206\u89E3\u6790\u5DE5\u5177\u4F1A\u5F02\u5E38\uFF09"});let o=t.split(/\r?\n/).findIndex(i=>/[ \t]+$/.test(i));o>=0&&n.push({level:"warn",file:e,line:o+1,message:"\u884C\u5C3E\u6709\u591A\u4F59\u7A7A\u767D\uFF08\u7A7A\u683C\u6216\u5236\u8868\u7B26\uFF09\uFF0C\u5EFA\u8BAE\u53BB\u9664"});let s=-1;for(let i=0;i<t.length;i++)if(t[i]===`
66
66
  `&&(i===0||t[i-1]!=="\r")){s=i;break}return s>=0&&t.includes(`\r
67
67
  `)&&n.push({level:"warn",file:e,line:t.slice(0,s).split(`
68
68
  `).length,message:"\u6362\u884C\u7B26\u6DF7\u7528\uFF08\u540C\u6587\u4EF6\u540C\u65F6\u542B CRLF \u4E0E LF\uFF09\uFF0C\u5EFA\u8BAE\u7EDF\u4E00\u4E3A LF"}),n}function Yn(e){let t=[],n=xe(e),r=Ds(e,"utf8");t.push(...Ws(n,r));let o=M(r),s=o.split(/\r?\n/),i=Re.exec(o)?.[0].split(/\r?\n/).length??0;if(!Re.test(o))return t.push({level:"error",file:n,line:1,message:"\u7F3A\u5C11 frontmatter"}),t;let c=ve(o);for(let a of Object.keys(c))Se.includes(a)||t.push({level:"warn",file:n,line:N(s,i,a),message:`frontmatter \u542B\u672A\u77E5\u5B57\u6BB5\u300C${a}\u300D\uFF0C\u672C\u5DE5\u5177\u4E0D\u8BFB\u53D6\uFF08\u5F52\u6863\u4E0E\u5F52\u4E00\u5316\u4E0D\u4F1A\u4FDD\u7559\uFF0C\u8BF7\u81EA\u884C\u7EF4\u62A4\uFF09`});if(c.status?de.includes(c.status)||t.push({level:"error",file:n,line:N(s,i,"status"),message:`status \u975E\u6CD5\u503C\u300C${c.status}\u300D\uFF0C\u5E94\u4E3A ${de.join(" / ")}`}):t.push({level:"error",file:n,line:N(s,i,"status"),message:"frontmatter \u7F3A\u5C11 status \u5B57\u6BB5"}),Z.includes(c.status)&&!c.completed&&t.push({level:"error",file:n,line:N(s,i,"completed"),message:`status \u4E3A\u300C${c.status}\u300D\u4F46\u7F3A\u5C11 completed \u5B8C\u6210\u65F6\u95F4`}),c.completed){let a=c.completed.trim(),d=N(s,i,"completed");if(!Hs.test(a))t.push({level:"warn",file:n,line:d,message:`completed\u300C${c.completed}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYY-MM-DD HH:mm`});else{let g=a.match(/^\d{4}-\d{1,2}-\d{1,2}/)?.[0]??a;Dn(g)?Ys.test(a)?ne(a)?t.push({level:"warn",file:n,line:d,message:`completed\u300C${c.completed}\u300D\u665A\u4E8E\u5F53\u524D\u7CFB\u7EDF\u65F6\u95F4 ${te} \u5C0F\u65F6\u4EE5\u4E0A\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(a)&&t.push({level:"warn",file:n,line:d,message:`completed\u300C${c.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,line:d,message:`completed\u300C${c.completed}\u300D\u5EFA\u8BAE\u8865\u5168\u4E3A\u5B8C\u6574\u65F6\u95F4 YYYY-MM-DD HH:mm`}):t.push({level:"warn",file:n,line:d,message:`completed\u300C${c.completed}\u300D\u65E5\u671F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u6838\u5BF9`})}}c.owner||t.push({level:"warn",file:n,line:N(s,i,"owner"),message:"\u7F3A\u5C11 owner \u8D1F\u8D23\u4EBA\u5B57\u6BB5"}),c.created?/^\d{8}$/.test(c.created.trim())?Dn(c.created.trim())||t.push({level:"warn",file:n,line:N(s,i,"created"),message:`created\u300C${c.created}\u300D\u65E5\u671F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u6838\u5BF9`}):t.push({level:"warn",file:n,line:N(s,i,"created"),message:`created\u300C${c.created}\u300D\u683C\u5F0F\u975E\u6CD5\uFF0C\u5E94\u4E3A YYYYMMDD`}):t.push({level:"warn",file:n,line:N(s,i,"created"),message:"\u7F3A\u5C11 created \u521B\u5EFA\u65E5\u671F\u5B57\u6BB5"}),c.updated&&c.created&&/^\d{8}$/.test(c.updated.trim())&&/^\d{8}$/.test(c.created.trim())&&c.updated.trim()<c.created.trim()&&t.push({level:"error",file:n,line:N(s,i,"updated"),message:`updated ${c.updated.trim()} \u65E9\u4E8E created ${c.created.trim()}\uFF0C\u65F6\u95F4\u7EBF\u77DB\u76FE`});let f=n.match(/^(\d{8})-/);if(Us.test(n)?c.created&&/^\d{8}$/.test(c.created.trim())&&f&&c.created.trim()!==f[1]&&t.push({level:"warn",file:n,message:`\u6587\u4EF6\u540D\u65E5\u671F ${f[1]} \u4E0E created ${c.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"}),c.scope){let a=c.scope.trim(),d=N(s,i,"scope");/[、,,]/.test(a)&&t.push({level:"warn",file:n,line:d,message:`scope\u300C${c.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: web+server\uFF09`}),/[/\\]/.test(a)&&t.push({level:"warn",file:n,line:d,message:`scope\u300C${c.scope}\u300D\u542B\u8DEF\u5F84\u5206\u9694\u7B26\uFF0C\u591A\u503C\u8BF7\u6539\u7528\u534A\u89D2\u52A0\u53F7\u8FDE\u63A5\uFF08\u5982 scope: web+server\uFF09\uFF0C\u7AEF\u540D\u672C\u8EAB\u4E0D\u5F97\u542B\u5206\u9694\u7B26`}),/[()()]/.test(a)&&t.push({level:"warn",file:n,line:d,message:`scope\u300C${c.scope}\u300D\u542B\u62EC\u53F7\u7591\u4F3C\u6CE8\u91CA\u6027\u6587\u5B57\uFF0C\u8BF4\u660E\u8BF7\u79FB\u5165\u6B63\u6587`})}let p=gt(z(o)),h=Q("check")?.pendingMarkers!==!1?p.match(Nn):null;return h&&t.push({level:"warn",file:n,line:Mn(s,i,Nn),message:`\u6B63\u6587\u542B\u672A\u95ED\u5408\u5F85\u529E\u6807\u8BB0\u300C${h[0]}\u300D\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u72EC\u7ACB active \u4EFB\u52A1\u6216\u660E\u786E\u95ED\u73AF`}),Q("check")?.includeCheckbox!==!1&&js.test(p)&&t.push({level:"warn",file:n,line:Mn(s,i,Bs),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 Ps(e){let t=[];if(!Hn(e))return t;for(let n of On(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 On(Ue(e,n.name)))r.endsWith(".md")&&/^\d{8}-/.test(r)&&t.push(`${n.name}/${r}`)}return t}function zs(e){let t=Lt(e);if(!t)return[];let n=I(e,t),r=xt(t,e);return r.state==="not-a-repo"||r.state==="outside-repo"?[]:r.state==="unavailable"?[{level:"warn",file:n,message:`\u672C\u5730\u914D\u7F6E\u6587\u4EF6\u5FFD\u7565\u5224\u5B9A\u4E0D\u53EF\u7528\uFF08${r.detail??"\u672A\u77E5\u539F\u56E0"}\uFF09\uFF0C\u8BF7\u6838\u5B9E git \u73AF\u5883`}]:r.state==="tracked"?[{level:"warn",file:n,message:`\u672C\u5730\u914D\u7F6E\u6587\u4EF6\u5DF2\u88AB\u5FFD\u7565\u89C4\u5219\u8986\u76D6\u4F46\u4ECD\u88AB git \u8DDF\u8E2A\uFF08\u7591\u4F3C\u5386\u53F2 git add -f\uFF09\uFF1A\u6267\u884C git rm --cached ${n} \u540E\u624D\u4F1A\u771F\u6B63\u4E0D\u5165\u5E93`}]:r.state==="ignored"?[]:[{level:"warn",file:n,message:"\u672C\u5730\u914D\u7F6E\u6587\u4EF6\u672A\u88AB gitignore \u8986\u76D6\uFF0C\u53EF\u80FD\u968F git \u63D0\u4EA4\u6CC4\u9732\u4E2A\u4EBA\u914D\u7F6E\uFF1A\u91CD\u8DD1 toolkit init \u53EF\u81EA\u52A8\u8865\u5199\u5FFD\u7565\u884C"}]}function Vs(e,t){let n=[],r=at(e);r.hasLegacy&&n.push({level:"warn",file:Ne,message:r.hasDir?"\u65E7\u5355\u6587\u4EF6\u89C4\u8303\u8F7D\u4F53\u5DF2\u88AB conventions/ \u76EE\u5F55\u5F62\u6001\u53D6\u4EE3\uFF0C\u5EFA\u8BAE\u6E05\u7406\uFF08\u4E24\u8005\u5E76\u5B58\u65F6\u4EE5\u76EE\u5F55\u5F62\u6001\u4E3A\u51C6\uFF09":"\u65E7\u5355\u6587\u4EF6\u89C4\u8303\u8F7D\u4F53\uFF0C\u5EFA\u8BAE\u8FC1\u79FB\u4E3A conventions/ \u76EE\u5F55\u5F62\u6001\uFF08index.md \u4F5C\u552F\u4E00\u5165\u53E3 + common.md / \u7AEF\u5206\u518C\u6309\u9700\u521B\u5EFA\uFF09"}),r.hasDir&&!r.hasIndex&&n.push({level:"warn",file:`conventions/${W}`,message:"\u89C4\u8303\u8F7D\u4F53\u7F3A index.md\uFF08\u552F\u4E00\u5165\u53E3\u4E0E\u552F\u4E00\u6743\u5A01\uFF09\uFF0C\u8BF7\u8865\u9F50"}),r.form==="abnormal"&&n.push({level:"warn",file:`conventions/${W}`,message:r.markerVersion===ye?`\u89C4\u8303\u8F7D\u4F53\u6807\u4E3A v${ye} \u4F46\u7F3A ${j} \u6216\u7D22\u5F15\u8868\u9996\u5217\u975E ${J}\uFF0C\u8BF7\u8865\u9F50\u6216\u6267\u884C toolkit conventions upgrade`:`\u89C4\u8303\u8F7D\u4F53\u5B58\u5728 ${j} \u4F46\u7D22\u5F15\u8868\u9996\u5217\u4ECD\u975E ${J}\uFF08\u5F62\u6001\u5F02\u5E38\uFF09\uFF0C\u8BF7\u4EBA\u5DE5\u786E\u8BA4`}),n.push(...Ks(e,r));let o=In(t),s=yt(t,o.map(l=>l.file)),i=[Fn(o.filter(l=>l.version!==ae)),_n(o.filter(l=>s.has(l.file)))];for(let l of i)l&&n.push({level:"warn",file:l.file,message:l.message});return n.push(...zs(t)),n}function Ks(e,t){return An(t).map(n=>({level:"warn",file:I(e,n.file),...n.line===void 0?{}:{line:n.line},message:n.message}))}var jn=6;function Gs(e){let t=[];for(let n of En(e)){let r=wn(v(n));if(r.length===0)continue;let o=r.slice(0,jn).join("\u3001");t.push({level:"warn",file:I(e,n),line:r[0],message:`\u8868\u683C\u5B58\u5728\u5217\u5BF9\u9F50\u586B\u5145\uFF08\u504F\u79BB\u7D27\u51D1\u5F62\u6001\uFF09${r.length} \u884C\uFF08\u7B2C ${o}${r.length>jn?" \u2026":""} \u884C\uFF09\uFF1A\u6267\u884C toolkit conventions format \u5F52\u4E00`})}return t}function Xs(e){if(at(e).form!=="v3")return[];let t=Ue(e,Oe,j);if(!Hn(t))return[];let n=ue(v(t).split(/\r?\n/),fe);if(!n)return[];let r=n.rowLines.filter((o,s)=>!Sn((n.rows[s]??[])[0]??""));return r.length===0?[]:[{level:"warn",file:I(e,t),line:(r[0]??0)+1,message:`\u6F14\u8FDB\u8BB0\u5F55\u6709 ${r.length} \u884C\u9996\u5217\u4E0D\u662F\u7A33\u5B9A ID\uFF08\u5E94\u8BB0\u884C\u5185\u4EE3\u7801\u5305\u88F9\u7684 C-<n>\uFF09\uFF1A\u8BF7\u4EBA\u5DE5\u6838\u5BF9\u8865\u5F55\uFF08\u5386\u53F2\u884C\u53EA\u8FFD\u52A0\uFF0C\u4E0D\u81EA\u52A8\u6539\u5199\uFF09`}]}function Js(e=".tasks",t=process.cwd()){let n=Ue(e,"active"),r=A(n),o=[];for(let c of r)o.push(...Yn(c)),Ms(c)===n&&o.push({level:"warn",file:xe(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 Ps(e))o.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"});o.push(...Vs(e,t)),o.push(...Gs(e)),o.push(...Xs(e));for(let c of ot(e))o.push({level:"warn",file:c.file,message:c.message});let s=new Map;for(let c of r){let f=xe(c,".md"),p=s.get(f);p?p.push(c):s.set(f,[c])}for(let[c,f]of s)f.length>1&&o.push({level:"warn",file:c,message:`\u5B58\u5728 ${f.length} \u4E2A\u540C\u540D\u4EFB\u52A1\u6587\u4EF6\uFF0C\u7591\u4F3C\u91CD\u590D\u5EFA\u6863`});o.push(...qs(r,e));let i=o.filter(c=>c.level==="error").length,l=o.length-i;return{issues:o,errorCount:i,warnCount:l}}var Bn=new Map;function Zs(e){let t=Ns(e),n=Bn.get(e);if(n&&n.mtimeMs===t.mtimeMs)return n.titles;let r=[],o=new Set;try{for(let s of F(v(e)).blocks)s.title&&!o.has(s.title)&&(o.add(s.title),r.push(s.title))}catch{}return Bn.set(e,{mtimeMs:t.mtimeMs,titles:r}),r}function qs(e,t){let n=[],r=new Set(e.map(u=>xe(u,".md"))),o=new Map,s=u=>u.trim().replace(/\.md$/,"").trim();for(let u of e){let a=xe(u,".md"),d=v(u),g=ve(d);o.set(a,Te(g.depends_on).map(s))}if(![...o.values()].some(u=>u.length>0))return n;let i=null,l=u=>{if(!i){i=new Map;for(let a of A(Ue(t,"archive")))for(let d of Zs(a))i.has(d)||i.set(d,I(t,a))}return i.get(u)};for(let[u,a]of o)for(let d of a)if(!r.has(d)){let g=l(d);n.push({level:"warn",file:u,message:g?`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${d}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u5DF2\u5F52\u6863\u4E8E ${g}\uFF0C\u65E0\u9700\u518D\u4F9D\u8D56\uFF09`:`\u4F9D\u8D56\u7684\u4EFB\u52A1\u300C${d}\u300D\u4E0D\u5728 active \u4E2D\uFF08\u53EF\u80FD\u5DF2\u5F52\u6863\u6216\u6587\u4EF6\u540D\u62FC\u5199\u9519\u8BEF\uFF09`})}let c=0,f=1,p=2,m=new Map,h=(u,a)=>{m.set(u,f);for(let d of o.get(u)??[]){if(!r.has(d))continue;let g=m.get(d)??c;if(g===f)return[...a,d];if(g===c){let k=h(d,[...a,d]);if(k)return k}}return m.set(u,p),null};for(let u of o.keys())if((m.get(u)??c)===c){let a=h(u,[u]);if(a){n.push({level:"warn",file:u,message:`depends_on \u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56\uFF1A${a.join(" \u2192 ")}`});break}}return n}var Un={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:["\u4F9D\u8D56\uFF1A"],other:[]},Wn={"### \u{1F41B} \u8865\u4E01\u4FEE\u590D":"fixed"},ft={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} \u95EE\u9898\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"}},wa="zh";function Ea(e,t,n){let r=e[t];return r?{lang:r}:{lang:e[n]??ft[n],unknown:t}}import{readdirSync as Qs}from"fs";import{join as Pn}from"path";function dt(e){let t=[],n=new Set(["node_modules",".git","dist","coverage"]),r=o=>{let s;try{s=Qs(o,{withFileTypes:!0})}catch{return}for(let i of s)if(i.isDirectory()){if(n.has(i.name))continue;r(Pn(o,i.name))}else i.name==="CHANGELOG.md"&&t.push(Pn(o,i.name))};return r(e),t}import{readFileSync as ei,readdirSync as Oa,writeFileSync as ti}from"fs";var We=/^## \d+\.\d+\.\d+/,pt={"### Major Changes":"breaking","### Minor Changes":"added","### Patch Changes":"other","### Dependent Changes":"deps"},ni="- Updated dependencies",ri=Object.values(ft).map(e=>e.released);function oi(){return Ut()}function Kn(e,t,n,r=!0,o=!1){let s=ei(e,"utf8"),i=s.includes(`\r
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fxri/toolkit",
3
- "version": "1.12.4",
3
+ "version": "1.12.5",
4
4
  "description": "专为多人 + AI 跨项目协作打造:任务管理 + 多语言 CHANGELOG。",
5
5
  "license": "MIT",
6
6
  "author": {
package/skills/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  | 技能 | 版本 | 用途 |
10
10
  | --- | --- | --- |
11
- | [fxri-plan-to-task](./fxri-plan-to-task/SKILL.md) | 1.9.2 | 方案落盘:任务分解与纯展示计划表 → 逐仓逐任务建档 → 校验 → 归档 → 任务级规范沉淀(能力终点);规范载体迁移与升级 |
11
+ | [fxri-plan-to-task](./fxri-plan-to-task/SKILL.md) | 1.9.3 | 方案落盘:任务分解与纯展示计划表 → 逐仓逐任务建档 → 校验 → 归档 → 任务级规范沉淀(能力终点);规范载体迁移与升级 |
12
12
  | [fxri-release-changelog](./fxri-release-changelog/SKILL.md) | 1.2.1 | changesets 发版与多语言 CHANGELOG 维护 |
13
13
  | [fxri-session-recap](./fxri-session-recap/SKILL.md) | 1.6.0 | 会话收尾全量沉淀 + 规范沉淀 / 新会话三层恢复 / 历史任务时间批量修正 |
14
14
 
@@ -24,16 +24,16 @@
24
24
  pnpm add -g @fxri/toolkit # 1. 装 CLI(npm 用户 npm i -g @fxri/toolkit)
25
25
  toolkit skills install # 2. 把包内技能装到各 agent 的全局技能目录
26
26
  # --scope project 换项目面:真源落 <仓库根>/.agents/skills/、其余候选目录落入口薄壳
27
- toolkit skills status # 查现场状态(悬空 / 指向其他版本 / 副本漂移 / 缺失 / 同名冲突;--scope project 查项目面)
27
+ toolkit skills status # 查现场状态(悬空 / 指向其他版本 / 副本漂移 / 缺失 / 同名冲突;历史落点残留单列提示;--scope project 查项目面)
28
28
  # 前四类重跑 toolkit skills install 补齐,同名冲突需 toolkit skills install --force 覆盖
29
29
  toolkit skills remove # 卸载本包装的产物(只清自己装的,不碰用户自装技能;--scope project 清项目面)
30
30
  ```
31
31
 
32
32
  - 真源唯一:技能取自已装 CLI 包内的 `skills/`;软链锚在 pnpm 稳定入口,升级 CLI 后自动指向新版(副本形式需重跑 `toolkit skills install`)
33
- - 目标三层:主目标 `~/.agents/skills/`(多家 agent 共读)→ 内置表内**已安装**的各 agent 全局技能目录 → `--dir <path>` 兜底(可多次指定,给表外 agent 用)
33
+ - 目标三层:主目标 `~/.agents/skills/`(多家 agent 共读:Cline、Codex、Dexto、Kimi Code CLI、Loaf、Pi、Sarvam Code、Warp、Zed、DeepSeek Harness)→ 内置表内**已安装**的各 agent 全局技能目录 → `--dir <path>` 兜底(可多次指定,给表外 agent 用;只在当次安装时写入,技能增删后不会自动同步,需带相同 `--dir` 重跑 `toolkit skills install`);共读 agent 的全局目录即主目标本身,写一次即全部覆盖,`toolkit skills status` 单列「经 canonical 共读的 agent」;升级前的 Codex / Pi 历史落点(`~/.codex/skills`、`~/.pi/agent/skills`)若仍有本包登记,`toolkit skills status` 会单列「历史落点残留」提示清理(只提示、不自动删除)
34
34
  - 默认软链(锚在 pnpm 稳定入口,升级不失效);链接创建失败自动降级为副本并打印 ⚠️(如无权限建链);`--copy` 强制副本、`--dry-run` 预演、`--force` 覆盖同名非本包产物(不改本包已登记副本的形态)
35
35
  - 产物记录在状态文件 `~/.agents/.toolkit-skills.json`;卸载 CLI 前先跑 `toolkit skills remove`,避免留下悬空链接(清理后目标目录若已空会一并回收)
36
- - **项目面(`--scope project`)**:`--scope` 缺省时按 CLI 安装位置自动判定(项目内装 CLI → 项目面)。真源落 `<仓库根>/.agents/skills/`(完整副本),其余**已存在**的候选目录(`.trae/skills/`、`.trae-cn/skills/`、`.cursor/skills/`、`.claude/skills/`)各放每个技能一份入口薄壳指向真源;产物记录在 `<仓库根>/.toolkit/state.json`(与真源、薄壳一并入库)。`toolkit init` 会写入 `prepare` 刷新钩子,`pnpm install` 时自动补齐/刷新,队友 clone 即用;`--copy` 仅全局面生效,项目面恒为副本
36
+ - **项目面(`--scope project`)**:`--scope` 缺省时按 CLI 安装位置自动判定(项目内装 CLI → 项目面)。真源落 `<仓库根>/.agents/skills/`(完整副本),其余**已存在**的候选目录(`.trae/skills/`、`.claude/skills/`、`agent/skills/`(eve)、`.augment/skills/`、`.codebuddy/skills/`、`.continue/skills/`、`.crush/skills/`、`.devin/skills/`、`.goose/skills/`、`.grok/skills/`、`.hermes/skills/`、`.iflow/skills/`、`.junie/skills/`、`.kiro/skills/`、`.openhands/skills/`、`.qwen/skills/`、`.roo/skills/`、`.windsurf/skills/`)各放每个技能一份入口薄壳指向真源;产物记录在 `<仓库根>/.toolkit/state.json`(与真源、薄壳一并入库)。`toolkit init` 会写入 `prepare` 刷新钩子,`pnpm install` 时自动补齐/刷新,队友 clone 即用;`--copy` 仅全局面生效,项目面恒为副本
37
37
 
38
38
  ### 方式二:上游安装器 `npx skills`(需锁定文件或覆盖表外 agent 时)
39
39
 
@@ -3,14 +3,14 @@ name: fxri-plan-to-task
3
3
  description: 将已确认的实施方案分解为可独立交付的任务并给出计划表,再落盘为标准任务文件并跟踪至归档:建档评估(查 active/archive 判同主题)、按模板建档、状态机更新、四级时间源取证、自查、任务级规范沉淀与归档。方案确认后表达「开始落地/登记记录」的意图,或即将改仓库文件时使用——含任务分解、建档、任务登记、落盘、归档、任务校验、规范载体迁移与升级(conventions 单文件升目录、v1 / v2 升 v3)等说法及口语近义表达(如按这个做吧、记一下、建个任务跟踪)均触发。不用于方案未确认的对话、会话收尾整场沉淀(fxri-session-recap 模式一)、与任务记录无关的普通 TODO、issue 管理或日常提交信息撰写。
4
4
  license: MIT
5
5
  metadata:
6
- version: "1.9.2"
6
+ version: "1.9.3"
7
7
  author: fxri
8
8
  source: https://github.com/fxri-net/toolkit
9
9
  ---
10
10
 
11
11
  # 方案落盘:任务建档与归档
12
12
 
13
- > 本技能版本 1.9.2(随 @fxri/toolkit 同批分发)。被问版本时即报此值(不读磁盘、不跑 CLI);与 `toolkit skills status` 的磁盘值不一致即说明会话上下文已过期,开新会话即可。
13
+ > 本技能版本 1.9.3(随 @fxri/toolkit 同批分发)。被问版本时即报此值(不读磁盘、不跑 CLI);与 `toolkit skills status` 的磁盘值不一致即说明会话上下文已过期,开新会话即可。
14
14
 
15
15
  ## 何时使用
16
16
 
@@ -46,7 +46,7 @@
46
46
 
47
47
  > **元原则**:载体新增的任何字段、文件、表格,须能证明它**不进常驻读面**,方允许引入——常驻面每多一列、每多一行,都由全体任务平摊成本,而归档面只在小概率的审计 / 恢复场景被读到。
48
48
 
49
- 载体可另配套**入口壳(一阶触发面)**:在**已存在的**项目级技能目录(`.agents/skills/`、`.trae/skills/`、`.trae-cn/skills/`、`.cursor/skills/`、`.claude/skills/`;多 agent 混用团队多个并存时**每处各写一份**、互不覆盖,一个都不存在时回落 `.agents/skills/`)下生成 `toolkit-conventions/SKILL.md`,目录名与 frontmatter `name` 同名(Agent Skills 标准要求)。壳只作入口、不承载条文,正文指回任务区 `conventions/index.md`;由 `toolkit init` 幂等生成(可安全删除,重跑补回;已存在壳按标记版本分流——标记不旧于当前版本保持不变,落后或无标记就地更新为当前版本),只在已有目录内落盘、不为使用者未安装的 agent 凭空建目录,本包源仓库自身不生成。壳标记版本**独立于载体版本**演进——当前为 `v2`,机制引入时即从 `v2` 起,从未有过 `v1` 壳(区别于载体「无标记即 v1」)。壳首部为 frontmatter,故其形态标记 `<!-- toolkit-conventions-entry: v2 -->` 退居其后、须全文件扫描(区别于载体标记只看首行);壳标记与当前 toolkit 不一致、或被 `.gitignore` 覆盖时,`toolkit conventions status` 与 `toolkit tasks check` 软告警——标记不一致可重跑 `toolkit init` 就地更新为当前版本;同类告警在多落点并存时**合并为一条**并内联全部落点路径(仓库根相对路径),不按壳逐条重复。体检只扫上述 5 个内置候选目录(`findEntryShells`):用户手工把壳拷到未收录目录(如 `.windsurf/skills`)不参与体检。⚠️ 同一批候选目录还承载**项目面技能薄壳**(`toolkit skills install --scope project` 在真源 `<仓库根>/.agents/skills/` 之外的其他已存在候选目录生成 `fxri-*` 薄壳),与 `toolkit-conventions/` 入口壳**不同名并存、互不覆盖**;两者机制独立——入口壳由 `toolkit init` 生成、技能薄壳由技能分发生成。
49
+ 载体可另配套**入口壳(一阶触发面)**:在**已存在的**项目级技能目录(`.agents/skills/`、`.trae/skills/`、`.claude/skills/`、`agent/skills/`(eve)、`.augment/skills/`、`.codebuddy/skills/`、`.continue/skills/`、`.crush/skills/`、`.devin/skills/`、`.goose/skills/`、`.grok/skills/`、`.hermes/skills/`、`.iflow/skills/`、`.junie/skills/`、`.kiro/skills/`、`.openhands/skills/`、`.qwen/skills/`、`.roo/skills/`、`.windsurf/skills/` 共 19 个内置候选;多 agent 混用团队多个并存时**每处各写一份**、互不覆盖,一个都不存在时回落 `.agents/skills/`)下生成 `toolkit-conventions/SKILL.md`,目录名与 frontmatter `name` 同名(Agent Skills 标准要求)。壳只作入口、不承载条文,正文指回任务区 `conventions/index.md`;由 `toolkit init` 幂等生成(可安全删除,重跑补回;已存在壳按标记版本分流——标记不旧于当前版本保持不变,落后或无标记就地更新为当前版本),只在已有目录内落盘、不为使用者未安装的 agent 凭空建目录,本包源仓库自身不生成。壳标记版本**独立于载体版本**演进——当前为 `v2`,机制引入时即从 `v2` 起,从未有过 `v1` 壳(区别于载体「无标记即 v1」)。壳首部为 frontmatter,故其形态标记 `<!-- toolkit-conventions-entry: v2 -->` 退居其后、须全文件扫描(区别于载体标记只看首行);壳标记与当前 toolkit 不一致、或被 `.gitignore` 覆盖时,`toolkit conventions status` 与 `toolkit tasks check` 软告警——标记不一致可重跑 `toolkit init` 就地更新为当前版本;同类告警在多落点并存时**合并为一条**并内联全部落点路径(仓库根相对路径),不按壳逐条重复。体检只扫上述 19 个内置候选目录(`findEntryShells`):用户手工把壳拷到未收录目录(如 `.bob/skills`)不参与体检。⚠️ 同一批候选目录还承载**项目面技能薄壳**(`toolkit skills install --scope project` 在真源 `<仓库根>/.agents/skills/` 之外的其他已存在候选目录生成 `fxri-*` 薄壳),与 `toolkit-conventions/` 入口壳**不同名并存、互不覆盖**;两者机制独立——入口壳由 `toolkit init` 生成、技能薄壳由技能分发生成。
50
50
 
51
51
  规范触发面共三层,**任一层可用即可触达**:① 全局技能 `fxri-plan-to-task`(随包分发到各 agent 全局技能目录,其工作流第 1 步即要求读 `conventions/index.md`)——**不依赖项目内任何文件、恒在兜底**;② 上述项目级入口壳(用户不主动发问也能被 agent 读到);③ `AGENTS.md` 指针块(仅在文件已存在时幂等追加,不存在不新建,跳过时提示仍有第 1 层可触达)。三层同时缺席的唯一情形:装包后未跑 `toolkit skills install`(或 agent 不加载全局技能),且项目既无 `AGENTS.md` 又未跑 `toolkit init`——`init` 检测到尚未安装全局技能时会在「下一步」中补一行 `toolkit skills install` 指引(已安装则不重复提示),把这一情形收敛为「用户忽略了 `init` 的提示」。
52
52