@fxri/toolkit 1.10.4 → 1.10.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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # 方弦工具集
2
2
 
3
+ ## 1.10.5
4
+
5
+ > 2026-09-21 发布
6
+
7
+ ### 🐛 问题修复
8
+
9
+ - 技能软链锚点在 pnpm 全局布局下解析失效,升级后链接仍会悬空
10
+
11
+ - 稳定入口解析原以「`.pnpm` 所在层目录名为 `node_modules`」为判据,该条件只在项目内安装时成立;pnpm 全局安装下 `.pnpm` 与 `node_modules` 并列(同在 `<pnpm 全局>/<global 段>/` 内),判据恒假 → 解析不出候选而静默回落含版本段的包实体路径,1.10.4 声称的悬空修复对全局安装实际未生效
12
+ - 改为按目录名判定并补齐 `node_modules` 层:项目内取 `<项目>/node_modules/@fxri/toolkit`,全局取 `<pnpm 全局>/<global 段>/node_modules/@fxri/toolkit`,两种布局都锚在 pnpm 稳定入口(升级时由 pnpm 重写该入口)
13
+ - 1.10.4 的发布描述与全局安装实际行为不符,建议直接升级至本版,勿停留在 1.10.4
14
+
3
15
  ## 1.10.4
4
16
 
5
17
  > 2026-09-21 发布
package/dist/cli.cjs CHANGED
@@ -94,7 +94,7 @@ ${n.deps}`,n.deps);for(;;){let k=c.replace(/^- (.+)\n- \1$/gm,"- $1");if(k===c)b
94
94
  `)?`\r
95
95
  `:`
96
96
  `,o=n.endsWith(`
97
- `)||n===""?n:n+r;$(t,o+$n.replace(/\n/g,r).replace(/^\r?\n/,""))}function Rn(e){return JSON.stringify({schemaVersion:1,...e},null,2)}function ie(e){return e&&e!=="json"?(console.error(`\u26A0\uFE0F \u4E0D\u652F\u6301\u7684\u8F93\u51FA\u683C\u5F0F\u300C${e}\u300D\uFF0C\u4EC5\u652F\u6301 json`),process.exitCode=1,!1):!0}var b=require("fs"),h=require("path"),Cn=require("url");var mt="@fxri/toolkit",pt="SKILL.md",W=".agents/skills",En="canonical\uFF08\u591A\u5BB6 agent \u5171\u8BFB\uFF09",$o=".toolkit-skills.json",Ln=[{name:"aider-desk",label:"AiderDesk",dir:".aider-desk/skills"},{name:"amp",label:"Amp",dir:".config/agents/skills",detect:[".config/amp"]},{name:"antigravity",label:"Antigravity",dir:".gemini/antigravity/skills"},{name:"antigravity-cli",label:"Antigravity CLI",dir:".gemini/antigravity-cli/skills"},{name:"astrbot",label:"AstrBot",dir:".astrbot/data/skills",detect:[".astrbot"]},{name:"autohand-code",label:"Autohand Code CLI",dir:".autohand/skills"},{name:"augment",label:"Augment",dir:".augment/skills"},{name:"bob",label:"IBM Bob",dir:".bob/skills"},{name:"claude-code",label:"Claude Code",dir:".claude/skills"},{name:"openclaw",label:"OpenClaw",dir:".openclaw/skills",detect:[".openclaw",".clawdbot",".moltbot"]},{name:"cline",label:"Cline",dir:W,detect:[".cline"]},{name:"codearts-agent",label:"CodeArts Agent",dir:".codeartsdoer/skills"},{name:"codebuddy",label:"CodeBuddy",dir:".codebuddy/skills"},{name:"codemaker",label:"Codemaker",dir:".codemaker/skills"},{name:"codestudio",label:"Code Studio",dir:".codestudio/skills"},{name:"codex",label:"Codex",dir:".codex/skills",detect:[".codex","/etc/codex"]},{name:"command-code",label:"Command Code",dir:".commandcode/skills"},{name:"continue",label:"Continue",dir:".continue/skills"},{name:"cortex",label:"Cortex Code",dir:".snowflake/cortex/skills"},{name:"crush",label:"Crush",dir:".config/crush/skills"},{name:"cursor",label:"Cursor",dir:".cursor/skills"},{name:"deepagents",label:"Deep Agents",dir:".deepagents/agent/skills",detect:[".deepagents"]},{name:"devin",label:"Devin for Terminal",dir:".config/devin/skills"},{name:"dexto",label:"Dexto",dir:W,detect:[".dexto"]},{name:"droid",label:"Droid",dir:".factory/skills"},{name:"firebender",label:"Firebender",dir:".firebender/skills"},{name:"forgecode",label:"ForgeCode",dir:".forge/skills"},{name:"fx",label:"fx",dir:".fx/skills"},{name:"gemini-cli",label:"Gemini CLI",dir:".gemini/skills"},{name:"github-copilot",label:"GitHub Copilot",dir:".copilot/skills"},{name:"goose",label:"Goose",dir:".config/goose/skills"},{name:"grok",label:"Grok Build",dir:".grok/skills"},{name:"hermes-agent",label:"Hermes Agent",dir:".hermes/skills"},{name:"inference-sh",label:"inference.sh",dir:".inferencesh/skills"},{name:"jazz",label:"Jazz",dir:".jazz/skills"},{name:"junie",label:"Junie",dir:".junie/skills"},{name:"iflow-cli",label:"iFlow CLI",dir:".iflow/skills"},{name:"kilo",label:"Kilo Code",dir:".kilo/skills",detect:[".kilo",".kilocode"]},{name:"kimchi",label:"Kimchi",dir:".config/kimchi/harness/skills",detect:[".config/kimchi"]},{name:"kimi-code-cli",label:"Kimi Code CLI",dir:W,detect:[".kimi-code",".kimi"]},{name:"kiro-cli",label:"Kiro CLI",dir:".kiro/skills"},{name:"kode",label:"Kode",dir:".kode/skills"},{name:"lingma",label:"Lingma",dir:".lingma/skills"},{name:"loaf",label:"Loaf",dir:W,detect:[".loaf"]},{name:"mcpjam",label:"MCPJam",dir:".mcpjam/skills"},{name:"minimax-code",label:"MiniMax Code",dir:".minimax/skills",detect:[".minimax","/Applications/MiniMax Code.app"]},{name:"mistral-vibe",label:"Mistral Vibe",dir:".vibe/skills"},{name:"moxby",label:"Moxby",dir:".moxby/skills"},{name:"mux",label:"Mux",dir:".mux/skills"},{name:"opencode",label:"OpenCode",dir:".config/opencode/skills"},{name:"openhands",label:"OpenHands",dir:".openhands/skills"},{name:"ona",label:"Ona",dir:".ona/skills"},{name:"pi",label:"Pi",dir:".pi/agent/skills"},{name:"posit-assistant",label:"Posit Assistant",dir:".posit/assistant/skills",detect:[".posit/assistant",".positai"]},{name:"qoder",label:"Qoder",dir:".qoder/skills"},{name:"qoder-cn",label:"Qoder CN",dir:".qoder-cn/skills"},{name:"qwen-code",label:"Qwen Code",dir:".qwen/skills"},{name:"replit",label:"Replit",dir:".config/agents/skills"},{name:"reasonix",label:"Reasonix",dir:".reasonix/skills"},{name:"rovodev",label:"Rovo Dev",dir:".rovodev/skills"},{name:"roo",label:"Roo Code",dir:".roo/skills"},{name:"sarvam-code",label:"Sarvam Code",dir:W,detect:[".sarvam"]},{name:"tabnine-cli",label:"Tabnine CLI",dir:".tabnine/agent/skills",detect:[".tabnine"]},{name:"terramind",label:"Terramind",dir:".terramind/skills"},{name:"tinycloud",label:"Tinycloud",dir:".tinycloud/skills"},{name:"trae",label:"Trae",dir:".trae/skills"},{name:"trae-cn",label:"Trae CN",dir:".trae-cn/skills"},{name:"warp",label:"Warp",dir:W,detect:[".warp"]},{name:"windsurf",label:"Windsurf",dir:".codeium/windsurf/skills"},{name:"zed",label:"Zed",dir:W,detect:[".config/zed"]},{name:"zcode",label:"ZCode",dir:".zcode/skills",detect:[".zcode","/Applications/ZCode.app"]},{name:"zencoder",label:"Zencoder",dir:".zencoder/skills"},{name:"zenflow",label:"Zenflow",dir:".zencoder/skills"},{name:"neovate",label:"Neovate",dir:".neovate/skills"},{name:"pochi",label:"Pochi",dir:".pochi/skills"},{name:"adal",label:"AdaL",dir:".adal/skills"},{name:"universal",label:"Universal",dir:".config/agents/skills"}],ft,Ye;function gt(){if(ft)return ft;let e=(0,h.dirname)((0,Cn.fileURLToPath)(S));for(;;){let t=(0,h.join)(e,"package.json");if((0,b.existsSync)(t))try{if(JSON.parse(R(t)).name===mt)return ft=e,e}catch{}let n=(0,h.dirname)(e);if(n===e)break;e=n}throw new Error(`\u672A\u80FD\u4ECE\u6A21\u5757\u4F4D\u7F6E\u5411\u4E0A\u5B9A\u4F4D ${mt} \u7684\u5305\u6839\u76EE\u5F55`)}function Z(){return(0,h.join)(gt(),"skills")}function ht(){return gt()}function To(e){let t=(0,h.resolve)(e);for(;;){let n=(0,h.dirname)(t);if(n===t)return"";if((0,h.basename)(n)===".pnpm"){let r=(0,h.dirname)(n);return(0,h.basename)(r)==="node_modules"?(0,h.join)(r,mt):""}t=n}}function Ro(){if(Ye)return Ye;let e=gt(),t="";try{let n=To(e);n&&(0,b.existsSync)(n)&&I((0,b.realpathSync)(n))===I((0,b.realpathSync)(e))&&(t=n)}catch{}return Ye=t||e,Ye}function We(){return(0,h.join)(Ro(),"skills")}function Ao(e){try{let n=R((0,h.join)(e,pt)).match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return"";let r=(n[1]??"").match(/^[ \t]+version:[ \t]*"?([^"\r\n]+?)"?[ \t]*$/m);return r?(r[1]??"").trim():""}catch{return""}}function Co(e){try{let n=R((0,h.join)(e,pt)).match(/^>[ \t]*本技能版本[ \t]*([^ \t((]+)/m);return n?(n[1]??"").trim():""}catch{return""}}function Eo(e){let t=[];for(let n of e){if(!n.version)continue;let r=Co(n.dir);r!==n.version&&t.push({name:n.name,frontmatter:n.version,body:r})}return t}function $e(){let e=Z();if(!(0,b.existsSync)(e))return[];let t=[];for(let n of(0,b.readdirSync)(e).sort()){let r=(0,h.join)(e,n);try{if(!(0,b.lstatSync)(r).isDirectory())continue}catch{continue}(0,b.existsSync)((0,h.join)(r,pt))&&t.push({name:n,dir:r,version:Ao(r)})}return t}function I(e){let t=(0,h.normalize)((0,h.resolve)(e));return process.platform==="win32"?t.toLowerCase():t}function Lo(e){let t=(0,h.normalize)(e);return/^[a-zA-Z]:[\\/]$/.test(t)?t:t.replace(/[\\/]+$/,"")||t}function Ke(e,t,n,r=!1,o=""){let s;if(n)s=n;else try{s=(0,b.lstatSync)(e)}catch{return"absent"}if(s.isSymbolicLink()){let i="";try{i=(0,b.readlinkSync)(e)}catch{return"dangling"}let a=Lo((0,h.isAbsolute)(i)?i:(0,h.resolve)((0,h.dirname)(e),i)),c=I(a);return c!==I(t)&&!(o&&c===I(o))?"wrong":r||(0,b.existsSync)(e)?"link-ok":"dangling"}return s.isDirectory()?"dir":"file"}function He(e,t){let n,r;try{n=(0,b.readdirSync)(e).sort(),r=(0,b.readdirSync)(t).sort()}catch{return!1}if(n.length!==r.length||n.some((o,s)=>o!==r[s]))return!1;for(let o of n){let s=(0,h.join)(e,o),i=(0,h.join)(t,o),a,c;try{a=(0,b.statSync)(s),c=(0,b.statSync)(i)}catch{return!1}if(a.isDirectory()!==c.isDirectory())return!1;if(a.isDirectory()){if(!He(s,i))return!1}else try{if(!(0,b.readFileSync)(s).equals((0,b.readFileSync)(i)))return!1}catch{return!1}}return!0}function Te(){return(0,h.join)(ae(),".agents",$o)}function Ge(){let e=Te();if(!(0,b.existsSync)(e))return null;try{let t=JSON.parse(R(e));return!t||!Array.isArray(t.targets)?null:t}catch{return null}}function In(e){let t=Te();(0,b.mkdirSync)((0,h.dirname)(t),{recursive:!0});let n={version:1,updatedAt:new Date().toISOString(),targets:e};$(t,`${JSON.stringify(n,null,2)}
97
+ `)||n===""?n:n+r;$(t,o+$n.replace(/\n/g,r).replace(/^\r?\n/,""))}function Rn(e){return JSON.stringify({schemaVersion:1,...e},null,2)}function ie(e){return e&&e!=="json"?(console.error(`\u26A0\uFE0F \u4E0D\u652F\u6301\u7684\u8F93\u51FA\u683C\u5F0F\u300C${e}\u300D\uFF0C\u4EC5\u652F\u6301 json`),process.exitCode=1,!1):!0}var b=require("fs"),h=require("path"),Cn=require("url");var mt="@fxri/toolkit",pt="SKILL.md",W=".agents/skills",En="canonical\uFF08\u591A\u5BB6 agent \u5171\u8BFB\uFF09",$o=".toolkit-skills.json",Ln=[{name:"aider-desk",label:"AiderDesk",dir:".aider-desk/skills"},{name:"amp",label:"Amp",dir:".config/agents/skills",detect:[".config/amp"]},{name:"antigravity",label:"Antigravity",dir:".gemini/antigravity/skills"},{name:"antigravity-cli",label:"Antigravity CLI",dir:".gemini/antigravity-cli/skills"},{name:"astrbot",label:"AstrBot",dir:".astrbot/data/skills",detect:[".astrbot"]},{name:"autohand-code",label:"Autohand Code CLI",dir:".autohand/skills"},{name:"augment",label:"Augment",dir:".augment/skills"},{name:"bob",label:"IBM Bob",dir:".bob/skills"},{name:"claude-code",label:"Claude Code",dir:".claude/skills"},{name:"openclaw",label:"OpenClaw",dir:".openclaw/skills",detect:[".openclaw",".clawdbot",".moltbot"]},{name:"cline",label:"Cline",dir:W,detect:[".cline"]},{name:"codearts-agent",label:"CodeArts Agent",dir:".codeartsdoer/skills"},{name:"codebuddy",label:"CodeBuddy",dir:".codebuddy/skills"},{name:"codemaker",label:"Codemaker",dir:".codemaker/skills"},{name:"codestudio",label:"Code Studio",dir:".codestudio/skills"},{name:"codex",label:"Codex",dir:".codex/skills",detect:[".codex","/etc/codex"]},{name:"command-code",label:"Command Code",dir:".commandcode/skills"},{name:"continue",label:"Continue",dir:".continue/skills"},{name:"cortex",label:"Cortex Code",dir:".snowflake/cortex/skills"},{name:"crush",label:"Crush",dir:".config/crush/skills"},{name:"cursor",label:"Cursor",dir:".cursor/skills"},{name:"deepagents",label:"Deep Agents",dir:".deepagents/agent/skills",detect:[".deepagents"]},{name:"devin",label:"Devin for Terminal",dir:".config/devin/skills"},{name:"dexto",label:"Dexto",dir:W,detect:[".dexto"]},{name:"droid",label:"Droid",dir:".factory/skills"},{name:"firebender",label:"Firebender",dir:".firebender/skills"},{name:"forgecode",label:"ForgeCode",dir:".forge/skills"},{name:"fx",label:"fx",dir:".fx/skills"},{name:"gemini-cli",label:"Gemini CLI",dir:".gemini/skills"},{name:"github-copilot",label:"GitHub Copilot",dir:".copilot/skills"},{name:"goose",label:"Goose",dir:".config/goose/skills"},{name:"grok",label:"Grok Build",dir:".grok/skills"},{name:"hermes-agent",label:"Hermes Agent",dir:".hermes/skills"},{name:"inference-sh",label:"inference.sh",dir:".inferencesh/skills"},{name:"jazz",label:"Jazz",dir:".jazz/skills"},{name:"junie",label:"Junie",dir:".junie/skills"},{name:"iflow-cli",label:"iFlow CLI",dir:".iflow/skills"},{name:"kilo",label:"Kilo Code",dir:".kilo/skills",detect:[".kilo",".kilocode"]},{name:"kimchi",label:"Kimchi",dir:".config/kimchi/harness/skills",detect:[".config/kimchi"]},{name:"kimi-code-cli",label:"Kimi Code CLI",dir:W,detect:[".kimi-code",".kimi"]},{name:"kiro-cli",label:"Kiro CLI",dir:".kiro/skills"},{name:"kode",label:"Kode",dir:".kode/skills"},{name:"lingma",label:"Lingma",dir:".lingma/skills"},{name:"loaf",label:"Loaf",dir:W,detect:[".loaf"]},{name:"mcpjam",label:"MCPJam",dir:".mcpjam/skills"},{name:"minimax-code",label:"MiniMax Code",dir:".minimax/skills",detect:[".minimax","/Applications/MiniMax Code.app"]},{name:"mistral-vibe",label:"Mistral Vibe",dir:".vibe/skills"},{name:"moxby",label:"Moxby",dir:".moxby/skills"},{name:"mux",label:"Mux",dir:".mux/skills"},{name:"opencode",label:"OpenCode",dir:".config/opencode/skills"},{name:"openhands",label:"OpenHands",dir:".openhands/skills"},{name:"ona",label:"Ona",dir:".ona/skills"},{name:"pi",label:"Pi",dir:".pi/agent/skills"},{name:"posit-assistant",label:"Posit Assistant",dir:".posit/assistant/skills",detect:[".posit/assistant",".positai"]},{name:"qoder",label:"Qoder",dir:".qoder/skills"},{name:"qoder-cn",label:"Qoder CN",dir:".qoder-cn/skills"},{name:"qwen-code",label:"Qwen Code",dir:".qwen/skills"},{name:"replit",label:"Replit",dir:".config/agents/skills"},{name:"reasonix",label:"Reasonix",dir:".reasonix/skills"},{name:"rovodev",label:"Rovo Dev",dir:".rovodev/skills"},{name:"roo",label:"Roo Code",dir:".roo/skills"},{name:"sarvam-code",label:"Sarvam Code",dir:W,detect:[".sarvam"]},{name:"tabnine-cli",label:"Tabnine CLI",dir:".tabnine/agent/skills",detect:[".tabnine"]},{name:"terramind",label:"Terramind",dir:".terramind/skills"},{name:"tinycloud",label:"Tinycloud",dir:".tinycloud/skills"},{name:"trae",label:"Trae",dir:".trae/skills"},{name:"trae-cn",label:"Trae CN",dir:".trae-cn/skills"},{name:"warp",label:"Warp",dir:W,detect:[".warp"]},{name:"windsurf",label:"Windsurf",dir:".codeium/windsurf/skills"},{name:"zed",label:"Zed",dir:W,detect:[".config/zed"]},{name:"zcode",label:"ZCode",dir:".zcode/skills",detect:[".zcode","/Applications/ZCode.app"]},{name:"zencoder",label:"Zencoder",dir:".zencoder/skills"},{name:"zenflow",label:"Zenflow",dir:".zencoder/skills"},{name:"neovate",label:"Neovate",dir:".neovate/skills"},{name:"pochi",label:"Pochi",dir:".pochi/skills"},{name:"adal",label:"AdaL",dir:".adal/skills"},{name:"universal",label:"Universal",dir:".config/agents/skills"}],ft,Ye;function gt(){if(ft)return ft;let e=(0,h.dirname)((0,Cn.fileURLToPath)(S));for(;;){let t=(0,h.join)(e,"package.json");if((0,b.existsSync)(t))try{if(JSON.parse(R(t)).name===mt)return ft=e,e}catch{}let n=(0,h.dirname)(e);if(n===e)break;e=n}throw new Error(`\u672A\u80FD\u4ECE\u6A21\u5757\u4F4D\u7F6E\u5411\u4E0A\u5B9A\u4F4D ${mt} \u7684\u5305\u6839\u76EE\u5F55`)}function Z(){return(0,h.join)(gt(),"skills")}function ht(){return gt()}function To(e){let t=(0,h.resolve)(e);for(;;){let n=(0,h.dirname)(t);if(n===t)return"";if((0,h.basename)(n)===".pnpm"){let r=(0,h.dirname)(n),o=(0,h.basename)(r)==="node_modules"?r:(0,h.join)(r,"node_modules");return(0,h.join)(o,mt)}t=n}}function Ro(){if(Ye)return Ye;let e=gt(),t="";try{let n=To(e);n&&(0,b.existsSync)(n)&&I((0,b.realpathSync)(n))===I((0,b.realpathSync)(e))&&(t=n)}catch{}return Ye=t||e,Ye}function We(){return(0,h.join)(Ro(),"skills")}function Ao(e){try{let n=R((0,h.join)(e,pt)).match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return"";let r=(n[1]??"").match(/^[ \t]+version:[ \t]*"?([^"\r\n]+?)"?[ \t]*$/m);return r?(r[1]??"").trim():""}catch{return""}}function Co(e){try{let n=R((0,h.join)(e,pt)).match(/^>[ \t]*本技能版本[ \t]*([^ \t((]+)/m);return n?(n[1]??"").trim():""}catch{return""}}function Eo(e){let t=[];for(let n of e){if(!n.version)continue;let r=Co(n.dir);r!==n.version&&t.push({name:n.name,frontmatter:n.version,body:r})}return t}function $e(){let e=Z();if(!(0,b.existsSync)(e))return[];let t=[];for(let n of(0,b.readdirSync)(e).sort()){let r=(0,h.join)(e,n);try{if(!(0,b.lstatSync)(r).isDirectory())continue}catch{continue}(0,b.existsSync)((0,h.join)(r,pt))&&t.push({name:n,dir:r,version:Ao(r)})}return t}function I(e){let t=(0,h.normalize)((0,h.resolve)(e));return process.platform==="win32"?t.toLowerCase():t}function Lo(e){let t=(0,h.normalize)(e);return/^[a-zA-Z]:[\\/]$/.test(t)?t:t.replace(/[\\/]+$/,"")||t}function Ke(e,t,n,r=!1,o=""){let s;if(n)s=n;else try{s=(0,b.lstatSync)(e)}catch{return"absent"}if(s.isSymbolicLink()){let i="";try{i=(0,b.readlinkSync)(e)}catch{return"dangling"}let a=Lo((0,h.isAbsolute)(i)?i:(0,h.resolve)((0,h.dirname)(e),i)),c=I(a);return c!==I(t)&&!(o&&c===I(o))?"wrong":r||(0,b.existsSync)(e)?"link-ok":"dangling"}return s.isDirectory()?"dir":"file"}function He(e,t){let n,r;try{n=(0,b.readdirSync)(e).sort(),r=(0,b.readdirSync)(t).sort()}catch{return!1}if(n.length!==r.length||n.some((o,s)=>o!==r[s]))return!1;for(let o of n){let s=(0,h.join)(e,o),i=(0,h.join)(t,o),a,c;try{a=(0,b.statSync)(s),c=(0,b.statSync)(i)}catch{return!1}if(a.isDirectory()!==c.isDirectory())return!1;if(a.isDirectory()){if(!He(s,i))return!1}else try{if(!(0,b.readFileSync)(s).equals((0,b.readFileSync)(i)))return!1}catch{return!1}}return!0}function Te(){return(0,h.join)(ae(),".agents",$o)}function Ge(){let e=Te();if(!(0,b.existsSync)(e))return null;try{let t=JSON.parse(R(e));return!t||!Array.isArray(t.targets)?null:t}catch{return null}}function In(e){let t=Te();(0,b.mkdirSync)((0,h.dirname)(t),{recursive:!0});let n={version:1,updatedAt:new Date().toISOString(),targets:e};$(t,`${JSON.stringify(n,null,2)}
98
98
  `)}function Fn(e=[]){let t=ae(),n=[],r=new Set,o=(s,i,a,c)=>{let d=(0,h.resolve)(s),u=I(d);r.has(u)||(r.add(u),n.push({dir:d,label:i,kind:a,available:c,dirExists:(0,b.existsSync)(d)}))};o((0,h.join)(t,W),En,"primary",!0);for(let s of Ln){let i=(0,h.join)(t,(0,h.dirname)(s.dir)),a=(0,b.existsSync)(i)||(s.detect??[]).some(c=>(0,b.existsSync)((0,h.isAbsolute)(c)?c:(0,h.join)(t,c)));o((0,h.join)(t,s.dir),s.label,"agent",a)}for(let s of e)o(s,"\u81EA\u5B9A\u4E49 --dir","custom",!0);return n}function Io(e){let t=I((0,h.resolve)(e));return t===I((0,h.join)(ae(),W))?En:Ln.find(r=>I((0,h.join)(ae(),r.dir))===t)?.label??null}function kt(e){(0,b.rmSync)(e,{recursive:!0,force:!0})}function An(e,t){(0,b.mkdirSync)((0,h.dirname)(t),{recursive:!0}),(0,b.cpSync)(e,t,{recursive:!0})}function Fo(e,t,n,r){if(r)return An(t,n),{mode:"copy"};try{return(0,b.mkdirSync)((0,h.dirname)(n),{recursive:!0}),(0,b.symlinkSync)(e,n,process.platform==="win32"?"junction":"dir"),{mode:"link"}}catch(o){return An(t,n),{mode:"copy",reason:o.message}}}function On(e={}){let t=$e(),n=Fn(e.dirs??[]),r=We(),o=Ge(),s=new Map;for(let d of o?.targets??[])s.set(I(d.dir),d);let i=[],a=[],c=[];for(let d of n){if(!d.available){a.push({dir:d.dir,label:d.label});continue}let u={dir:d.dir,label:d.label,kind:d.kind,created:[],updated:[],skipped:[],conflicts:[],failed:[],degraded:[],links:[],copies:[]};for(let m of t){let g=(0,h.join)(d.dir,m.name),l=(0,h.join)(r,m.name),f=Ke(g,l);if(f==="link-ok"){u.skipped.push(m.name),u.links.push(m.name);continue}if(f==="dir"&&!e.force){if(!(s.get(I(d.dir))?.copies.includes(m.name)??!1)){u.conflicts.push(m.name);continue}if(He(m.dir,g)){u.skipped.push(m.name),u.copies.push(m.name);continue}}if(f==="file"&&!e.force){u.conflicts.push(m.name);continue}if(e.dryRun){f==="absent"?u.created.push(m.name):u.updated.push(m.name),e.copy?u.copies.push(m.name):u.links.push(m.name);continue}try{f!=="absent"&&kt(g);let p=Fo(l,m.dir,g,!!e.copy);f==="absent"?u.created.push(m.name):u.updated.push(m.name),p.mode==="link"?u.links.push(m.name):(u.copies.push(m.name),p.reason&&u.degraded.push({name:m.name,reason:p.reason}))}catch(p){u.failed.push({name:m.name,reason:p.message})}}i.push(u),e.dryRun||c.push({dir:d.dir,updatedAt:new Date().toISOString(),links:u.links,copies:u.copies})}if(!e.dryRun){let d=new Set(i.map(g=>I(g.dir))),u=(o?.targets??[]).filter(g=>!d.has(I(g.dir))),m=[...c,...u].filter(g=>g.links.length>0||g.copies.length>0);m.length>0&&In(m)}return{source:Z(),skills:t.map(d=>d.name),targets:i,skippedTargets:a,stateFile:Te()}}function jn(e={}){let t=Ge(),n=Te();if(!t)return{stateFile:n,stateExists:!1,targets:[],stateRemoved:!1};let r=[],o=!1;for(let a of t.targets){let c={dir:a.dir,label:Io(a.dir),removed:[],missing:[],skippedForeign:[]},d=[...new Set([...a.links,...a.copies])];for(let u of d){let m=(0,h.join)(a.dir,u),g=(0,h.join)(Z(),u),l=Ke(m,g,void 0,!1,(0,h.join)(We(),u));if(l==="absent"){c.missing.push(u);continue}if(l==="wrong"){c.skippedForeign.push(u);continue}if(l==="file"){c.skippedForeign.push(u);continue}if(l==="dir"&&!He(g,m)){c.skippedForeign.push(u);continue}if(e.dryRun){c.removed.push(u);continue}try{kt(m),c.removed.push(u)}catch{o=!0,c.skippedForeign.push(u)}}r.push(c)}let s=r.every(a=>a.skippedForeign.length===0),i=!e.dryRun&&!o&&s;return i&&(0,b.rmSync)(n,{force:!0}),{stateFile:n,stateExists:!0,targets:r,stateRemoved:i}}function Mn(){let e=$e(),t=Fn([]),n=Ge(),r=new Map;for(let i of n?.targets??[])r.set(I(i.dir),i);let o=[],s=[];for(let i of t){let a=r.get(I(i.dir));if(!i.available&&i.kind==="agent"){s.push({dir:i.dir,label:i.label});continue}if(i.kind!=="primary"&&!i.dirExists&&!a)continue;let c=[...new Set([...e.map(m=>m.name),...a?[...a.links,...a.copies]:[]])].sort(),d=new Map(e.map(m=>[m.name,m.version])),u=[];for(let m of c){let g=(0,h.join)(Z(),m),l=(0,h.join)(i.dir,m),f=Ke(l,(0,h.join)(We(),m),void 0,!1,g),p;f==="link-ok"?p="link":f==="dangling"?p="dangling":f==="wrong"?p="wrong":f==="file"?p="conflict":f==="dir"?(0,b.existsSync)(g)&&He(g,l)?p="copy":p=a?.copies.includes(m)?"copy-drift":"conflict":p="missing",u.push({name:m,state:p,version:d.get(m)??""})}o.push({dir:i.dir,label:i.label,kind:i.kind,available:i.available,dirExists:i.dirExists,recorded:!!a,items:u})}return{source:Z(),skills:e.map(i=>i.name),skillVersions:Object.fromEntries(e.map(i=>[i.name,i.version])),versionMismatches:Eo(e),stateFile:Te(),stateExists:!!n,targets:o,pendingAgents:s}}function _n(){let e=D("skills");if(e?.autoLink===!1||process.env.CI)return 0;let t=Ge();if(!t)return 0;let n=Z(),r;try{r=new Set((0,b.readdirSync)(n).filter(d=>(0,b.existsSync)((0,h.join)(n,d))))}catch{return 0}let o=We(),s=e?.autoLinkReplaceForeign!==!1,i=process.platform==="win32"?"junction":"dir",a=0,c=[];for(let d of t.targets){let u;try{u=(0,b.readdirSync)(d.dir,{withFileTypes:!0})}catch{c.push(d);continue}let m=new Map(u.map(l=>[l.name,l])),g=d.links.filter(l=>{if(!r.has(l))return!1;let f=(0,h.join)(o,l),p=(0,h.join)(d.dir,l),k=m.get(l),v=k?Ke(p,f,k,!0):"absent";if(v==="link-ok"||!s&&(v==="dir"||v==="file"))return!0;try{return v!=="absent"&&kt(p),(0,b.symlinkSync)(f,p,i),a+=1,!0}catch{return!0}});c.push({...d,links:g,updatedAt:new Date().toISOString()})}return a>0&&In(c),a}var me=require("fs"),Bn=require("path"),bt=require("os"),Pn=require("child_process");var Oo="https://registry.npmjs.org/@fxri%2Ftoolkit/latest";async function Dn(){try{let e=await fetch(Oo,{signal:AbortSignal.timeout(1e3),headers:{accept:"application/vnd.npm.install-v1+json"}});if(!e.ok)return null;let t=await e.json();return typeof t.version=="string"?t.version:null}catch{return null}}function Nn(e,t){let n=i=>i.trim().replace(/^-/,"").split(/[.+-]/).map(a=>Number.parseInt(a,10)).map(a=>Number.isFinite(a)?a:0),r=n(e),o=n(t),s=Math.max(r.length,o.length);for(let i=0;i<s;i++){let a=r[i]??0,c=o[i]??0;if(a!==c)return a>c}return!1}var jo=1440*60*1e3,Mo=3600*1e3,_o="FX_NO_UPDATE_CHECK",yt="--fxri-update-check-worker";function Un(){return(0,Bn.join)((0,bt.tmpdir)(),".toolkit-update-check.json")}function Do(){let e=Un();try{if(!(0,me.existsSync)(e))return null;let t=JSON.parse(R(e)),n=typeof t.ts=="number"?t.ts:0,r=typeof t.latest=="string"?t.latest:"",o=t.ok===!0,s=o?jo:Mo;return Date.now()-n>=s?((0,me.rmSync)(e,{force:!0}),null):o&&!r?null:{ts:n,ok:o,latest:r}}catch{return null}}function No(e,t){try{let n=Un();(0,me.mkdirSync)((0,bt.tmpdir)(),{recursive:!0}),$(n,JSON.stringify({ts:Date.now(),ok:e,latest:t}))}catch{}}function Bo(){let e=process.env[_o];if(e!==void 0&&e!=="")return!["0","false","off","no"].includes(e.trim().toLowerCase());let t=Xe()?.updateCheck;return t&&typeof t=="object"?t.enabled===!1:!1}function zn(e){if(Bo())return;let t=Do();if(t){t.ok&&Nn(t.latest,e)&&Uo(t.latest,e);return}Po()}function Po(){let e=process.argv[1];if(e)try{(0,Pn.spawn)(process.execPath,[e,yt],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}catch{}}async function Yn(){let e=await Dn().catch(()=>null);No(e!==null,e??"")}function Uo(e,t){console.error(`\u2B06\uFE0F \u53D1\u73B0\u65B0\u7248\u672C ${e}\uFF08\u5F53\u524D ${t}\uFF09\uFF1Apnpm add -g @fxri/toolkit \u5347\u7EA7\u540E\u8BF7\u5F00\u65B0\u4F1A\u8BDD\u52A0\u8F7D\u6700\u65B0 skills \u89C4\u5219\uFF1B\u672C\u5730\u6280\u80FD\u53EF\u7528 toolkit skills status \u68C0\u67E5\uFF08\u8F6F\u94FE\u81EA\u52A8\u8DDF\u968F\uFF0C\u526F\u672C\u5F62\u5F0F\u9700\u91CD\u8DD1 toolkit skills install\uFF09`)}var zo="\u663E\u793A\u5E2E\u52A9",Yo=["version","format"];function vt(e){e.helpOption("-h, --help",zo),e.configureHelp({subcommandTerm:t=>`${t.name()} ${t.usage()}`.replace(/\s+/g," ").trim()});for(let t of e.commands)vt(t)}function Wn(e){let[t]=e;return!t||!Yo.includes(t)?!1:e.slice(1).some(n=>n==="-h"||n==="--help")}var St="\u8FD0\u884C toolkit --help \u67E5\u770B\u53EF\u7528\u547D\u4EE4";function Kn(e){let t=/\n\(Did you mean (one of )?([^)]*?)\?\)$/.exec(e);if(!t)return"";let n=(t[2]??"").split(", ").join("\u3001");return t[1]?`\uFF08\u662F\u5426\u60F3\u8F93\u5165 ${n} \u4E4B\u4E00\uFF1F\uFF09`:`\uFF08\u662F\u5426\u60F3\u8F93\u5165 ${n}\uFF1F\uFF09`}function Hn(e){switch(e.code){case"commander.unknownCommand":{let t=/unknown command '([^']*)'/.exec(e.message)?.[1];return t?`\u26A0\uFE0F \u672A\u77E5\u547D\u4EE4\u300C${t}\u300D\u3002${Kn(e.message)}
99
99
  ${St}`:null}case"commander.unknownOption":{let t=/unknown option '([^']*)'/.exec(e.message)?.[1];return t?`\u26A0\uFE0F \u672A\u77E5\u9009\u9879\u300C${t}\u300D\u3002${Kn(e.message)}
100
100
  ${St}`:null}case"commander.excessArguments":{let t=/too many arguments(?: for '([^']*)')?\. Expected (\d+) arguments? but got (\d+)\./.exec(e.message);return t?`\u26A0\uFE0F ${t[1]?`\u547D\u4EE4\u300C${t[1]}\u300D`:"\u547D\u4EE4"}\u671F\u671B ${t[2]} \u4E2A\u53C2\u6570\uFF0C\u5B9E\u9645\u6536\u5230 ${t[3]} \u4E2A\u3002
package/dist/cli.js CHANGED
@@ -94,7 +94,7 @@ ${n.deps}`,n.deps);for(;;){let h=c.replace(/^- (.+)\n- \1$/gm,"- $1");if(h===c)b
94
94
  `)?`\r
95
95
  `:`
96
96
  `,o=n.endsWith(`
97
- `)||n===""?n:n+r;$(t,o+$n.replace(/\n/g,r).replace(/^\r?\n/,""))}function Rn(e){return JSON.stringify({schemaVersion:1,...e},null,2)}function J(e){return e&&e!=="json"?(console.error(`\u26A0\uFE0F \u4E0D\u652F\u6301\u7684\u8F93\u51FA\u683C\u5F0F\u300C${e}\u300D\uFF0C\u4EC5\u652F\u6301 json`),process.exitCode=1,!1):!0}import{cpSync as us,existsSync as j,lstatSync as In,mkdirSync as lt,readdirSync as he,readFileSync as An,readlinkSync as fs,realpathSync as Cn,rmSync as On,statSync as En,symlinkSync as jn}from"fs";import{basename as Ln,dirname as _,isAbsolute as Mn,join as w,normalize as Dn,resolve as ke}from"path";import{fileURLToPath as ms}from"url";var at="@fxri/toolkit",ct="SKILL.md",D=".agents/skills",_n="canonical\uFF08\u591A\u5BB6 agent \u5171\u8BFB\uFF09",ps=".toolkit-skills.json",Nn=[{name:"aider-desk",label:"AiderDesk",dir:".aider-desk/skills"},{name:"amp",label:"Amp",dir:".config/agents/skills",detect:[".config/amp"]},{name:"antigravity",label:"Antigravity",dir:".gemini/antigravity/skills"},{name:"antigravity-cli",label:"Antigravity CLI",dir:".gemini/antigravity-cli/skills"},{name:"astrbot",label:"AstrBot",dir:".astrbot/data/skills",detect:[".astrbot"]},{name:"autohand-code",label:"Autohand Code CLI",dir:".autohand/skills"},{name:"augment",label:"Augment",dir:".augment/skills"},{name:"bob",label:"IBM Bob",dir:".bob/skills"},{name:"claude-code",label:"Claude Code",dir:".claude/skills"},{name:"openclaw",label:"OpenClaw",dir:".openclaw/skills",detect:[".openclaw",".clawdbot",".moltbot"]},{name:"cline",label:"Cline",dir:D,detect:[".cline"]},{name:"codearts-agent",label:"CodeArts Agent",dir:".codeartsdoer/skills"},{name:"codebuddy",label:"CodeBuddy",dir:".codebuddy/skills"},{name:"codemaker",label:"Codemaker",dir:".codemaker/skills"},{name:"codestudio",label:"Code Studio",dir:".codestudio/skills"},{name:"codex",label:"Codex",dir:".codex/skills",detect:[".codex","/etc/codex"]},{name:"command-code",label:"Command Code",dir:".commandcode/skills"},{name:"continue",label:"Continue",dir:".continue/skills"},{name:"cortex",label:"Cortex Code",dir:".snowflake/cortex/skills"},{name:"crush",label:"Crush",dir:".config/crush/skills"},{name:"cursor",label:"Cursor",dir:".cursor/skills"},{name:"deepagents",label:"Deep Agents",dir:".deepagents/agent/skills",detect:[".deepagents"]},{name:"devin",label:"Devin for Terminal",dir:".config/devin/skills"},{name:"dexto",label:"Dexto",dir:D,detect:[".dexto"]},{name:"droid",label:"Droid",dir:".factory/skills"},{name:"firebender",label:"Firebender",dir:".firebender/skills"},{name:"forgecode",label:"ForgeCode",dir:".forge/skills"},{name:"fx",label:"fx",dir:".fx/skills"},{name:"gemini-cli",label:"Gemini CLI",dir:".gemini/skills"},{name:"github-copilot",label:"GitHub Copilot",dir:".copilot/skills"},{name:"goose",label:"Goose",dir:".config/goose/skills"},{name:"grok",label:"Grok Build",dir:".grok/skills"},{name:"hermes-agent",label:"Hermes Agent",dir:".hermes/skills"},{name:"inference-sh",label:"inference.sh",dir:".inferencesh/skills"},{name:"jazz",label:"Jazz",dir:".jazz/skills"},{name:"junie",label:"Junie",dir:".junie/skills"},{name:"iflow-cli",label:"iFlow CLI",dir:".iflow/skills"},{name:"kilo",label:"Kilo Code",dir:".kilo/skills",detect:[".kilo",".kilocode"]},{name:"kimchi",label:"Kimchi",dir:".config/kimchi/harness/skills",detect:[".config/kimchi"]},{name:"kimi-code-cli",label:"Kimi Code CLI",dir:D,detect:[".kimi-code",".kimi"]},{name:"kiro-cli",label:"Kiro CLI",dir:".kiro/skills"},{name:"kode",label:"Kode",dir:".kode/skills"},{name:"lingma",label:"Lingma",dir:".lingma/skills"},{name:"loaf",label:"Loaf",dir:D,detect:[".loaf"]},{name:"mcpjam",label:"MCPJam",dir:".mcpjam/skills"},{name:"minimax-code",label:"MiniMax Code",dir:".minimax/skills",detect:[".minimax","/Applications/MiniMax Code.app"]},{name:"mistral-vibe",label:"Mistral Vibe",dir:".vibe/skills"},{name:"moxby",label:"Moxby",dir:".moxby/skills"},{name:"mux",label:"Mux",dir:".mux/skills"},{name:"opencode",label:"OpenCode",dir:".config/opencode/skills"},{name:"openhands",label:"OpenHands",dir:".openhands/skills"},{name:"ona",label:"Ona",dir:".ona/skills"},{name:"pi",label:"Pi",dir:".pi/agent/skills"},{name:"posit-assistant",label:"Posit Assistant",dir:".posit/assistant/skills",detect:[".posit/assistant",".positai"]},{name:"qoder",label:"Qoder",dir:".qoder/skills"},{name:"qoder-cn",label:"Qoder CN",dir:".qoder-cn/skills"},{name:"qwen-code",label:"Qwen Code",dir:".qwen/skills"},{name:"replit",label:"Replit",dir:".config/agents/skills"},{name:"reasonix",label:"Reasonix",dir:".reasonix/skills"},{name:"rovodev",label:"Rovo Dev",dir:".rovodev/skills"},{name:"roo",label:"Roo Code",dir:".roo/skills"},{name:"sarvam-code",label:"Sarvam Code",dir:D,detect:[".sarvam"]},{name:"tabnine-cli",label:"Tabnine CLI",dir:".tabnine/agent/skills",detect:[".tabnine"]},{name:"terramind",label:"Terramind",dir:".terramind/skills"},{name:"tinycloud",label:"Tinycloud",dir:".tinycloud/skills"},{name:"trae",label:"Trae",dir:".trae/skills"},{name:"trae-cn",label:"Trae CN",dir:".trae-cn/skills"},{name:"warp",label:"Warp",dir:D,detect:[".warp"]},{name:"windsurf",label:"Windsurf",dir:".codeium/windsurf/skills"},{name:"zed",label:"Zed",dir:D,detect:[".config/zed"]},{name:"zcode",label:"ZCode",dir:".zcode/skills",detect:[".zcode","/Applications/ZCode.app"]},{name:"zencoder",label:"Zencoder",dir:".zencoder/skills"},{name:"zenflow",label:"Zenflow",dir:".zencoder/skills"},{name:"neovate",label:"Neovate",dir:".neovate/skills"},{name:"pochi",label:"Pochi",dir:".pochi/skills"},{name:"adal",label:"AdaL",dir:".adal/skills"},{name:"universal",label:"Universal",dir:".config/agents/skills"}],it,_e;function dt(){if(it)return it;let e=_(ms(import.meta.url));for(;;){let t=w(e,"package.json");if(j(t))try{if(JSON.parse(T(t)).name===at)return it=e,e}catch{}let n=_(e);if(n===e)break;e=n}throw new Error(`\u672A\u80FD\u4ECE\u6A21\u5757\u4F4D\u7F6E\u5411\u4E0A\u5B9A\u4F4D ${at} \u7684\u5305\u6839\u76EE\u5F55`)}function W(){return w(dt(),"skills")}function ut(){return dt()}function gs(e){let t=ke(e);for(;;){let n=_(t);if(n===t)return"";if(Ln(n)===".pnpm"){let r=_(n);return Ln(r)==="node_modules"?w(r,at):""}t=n}}function hs(){if(_e)return _e;let e=dt(),t="";try{let n=gs(e);n&&j(n)&&A(Cn(n))===A(Cn(e))&&(t=n)}catch{}return _e=t||e,_e}function Ne(){return w(hs(),"skills")}function ks(e){try{let n=T(w(e,ct)).match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return"";let r=(n[1]??"").match(/^[ \t]+version:[ \t]*"?([^"\r\n]+?)"?[ \t]*$/m);return r?(r[1]??"").trim():""}catch{return""}}function bs(e){try{let n=T(w(e,ct)).match(/^>[ \t]*本技能版本[ \t]*([^ \t((]+)/m);return n?(n[1]??"").trim():""}catch{return""}}function ys(e){let t=[];for(let n of e){if(!n.version)continue;let r=bs(n.dir);r!==n.version&&t.push({name:n.name,frontmatter:n.version,body:r})}return t}function be(){let e=W();if(!j(e))return[];let t=[];for(let n of he(e).sort()){let r=w(e,n);try{if(!In(r).isDirectory())continue}catch{continue}j(w(r,ct))&&t.push({name:n,dir:r,version:ks(r)})}return t}function A(e){let t=Dn(ke(e));return process.platform==="win32"?t.toLowerCase():t}function vs(e){let t=Dn(e);return/^[a-zA-Z]:[\\/]$/.test(t)?t:t.replace(/[\\/]+$/,"")||t}function Be(e,t,n,r=!1,o=""){let s;if(n)s=n;else try{s=In(e)}catch{return"absent"}if(s.isSymbolicLink()){let i="";try{i=fs(e)}catch{return"dangling"}let a=vs(Mn(i)?i:ke(_(e),i)),c=A(a);return c!==A(t)&&!(o&&c===A(o))?"wrong":r||j(e)?"link-ok":"dangling"}return s.isDirectory()?"dir":"file"}function Pe(e,t){let n,r;try{n=he(e).sort(),r=he(t).sort()}catch{return!1}if(n.length!==r.length||n.some((o,s)=>o!==r[s]))return!1;for(let o of n){let s=w(e,o),i=w(t,o),a,c;try{a=En(s),c=En(i)}catch{return!1}if(a.isDirectory()!==c.isDirectory())return!1;if(a.isDirectory()){if(!Pe(s,i))return!1}else try{if(!An(s).equals(An(i)))return!1}catch{return!1}}return!0}function ye(){return w(q(),".agents",ps)}function Ue(){let e=ye();if(!j(e))return null;try{let t=JSON.parse(T(e));return!t||!Array.isArray(t.targets)?null:t}catch{return null}}function Bn(e){let t=ye();lt(_(t),{recursive:!0});let n={version:1,updatedAt:new Date().toISOString(),targets:e};$(t,`${JSON.stringify(n,null,2)}
97
+ `)||n===""?n:n+r;$(t,o+$n.replace(/\n/g,r).replace(/^\r?\n/,""))}function Rn(e){return JSON.stringify({schemaVersion:1,...e},null,2)}function J(e){return e&&e!=="json"?(console.error(`\u26A0\uFE0F \u4E0D\u652F\u6301\u7684\u8F93\u51FA\u683C\u5F0F\u300C${e}\u300D\uFF0C\u4EC5\u652F\u6301 json`),process.exitCode=1,!1):!0}import{cpSync as us,existsSync as j,lstatSync as In,mkdirSync as lt,readdirSync as he,readFileSync as An,readlinkSync as fs,realpathSync as Cn,rmSync as On,statSync as En,symlinkSync as jn}from"fs";import{basename as Ln,dirname as _,isAbsolute as Mn,join as w,normalize as Dn,resolve as ke}from"path";import{fileURLToPath as ms}from"url";var at="@fxri/toolkit",ct="SKILL.md",D=".agents/skills",_n="canonical\uFF08\u591A\u5BB6 agent \u5171\u8BFB\uFF09",ps=".toolkit-skills.json",Nn=[{name:"aider-desk",label:"AiderDesk",dir:".aider-desk/skills"},{name:"amp",label:"Amp",dir:".config/agents/skills",detect:[".config/amp"]},{name:"antigravity",label:"Antigravity",dir:".gemini/antigravity/skills"},{name:"antigravity-cli",label:"Antigravity CLI",dir:".gemini/antigravity-cli/skills"},{name:"astrbot",label:"AstrBot",dir:".astrbot/data/skills",detect:[".astrbot"]},{name:"autohand-code",label:"Autohand Code CLI",dir:".autohand/skills"},{name:"augment",label:"Augment",dir:".augment/skills"},{name:"bob",label:"IBM Bob",dir:".bob/skills"},{name:"claude-code",label:"Claude Code",dir:".claude/skills"},{name:"openclaw",label:"OpenClaw",dir:".openclaw/skills",detect:[".openclaw",".clawdbot",".moltbot"]},{name:"cline",label:"Cline",dir:D,detect:[".cline"]},{name:"codearts-agent",label:"CodeArts Agent",dir:".codeartsdoer/skills"},{name:"codebuddy",label:"CodeBuddy",dir:".codebuddy/skills"},{name:"codemaker",label:"Codemaker",dir:".codemaker/skills"},{name:"codestudio",label:"Code Studio",dir:".codestudio/skills"},{name:"codex",label:"Codex",dir:".codex/skills",detect:[".codex","/etc/codex"]},{name:"command-code",label:"Command Code",dir:".commandcode/skills"},{name:"continue",label:"Continue",dir:".continue/skills"},{name:"cortex",label:"Cortex Code",dir:".snowflake/cortex/skills"},{name:"crush",label:"Crush",dir:".config/crush/skills"},{name:"cursor",label:"Cursor",dir:".cursor/skills"},{name:"deepagents",label:"Deep Agents",dir:".deepagents/agent/skills",detect:[".deepagents"]},{name:"devin",label:"Devin for Terminal",dir:".config/devin/skills"},{name:"dexto",label:"Dexto",dir:D,detect:[".dexto"]},{name:"droid",label:"Droid",dir:".factory/skills"},{name:"firebender",label:"Firebender",dir:".firebender/skills"},{name:"forgecode",label:"ForgeCode",dir:".forge/skills"},{name:"fx",label:"fx",dir:".fx/skills"},{name:"gemini-cli",label:"Gemini CLI",dir:".gemini/skills"},{name:"github-copilot",label:"GitHub Copilot",dir:".copilot/skills"},{name:"goose",label:"Goose",dir:".config/goose/skills"},{name:"grok",label:"Grok Build",dir:".grok/skills"},{name:"hermes-agent",label:"Hermes Agent",dir:".hermes/skills"},{name:"inference-sh",label:"inference.sh",dir:".inferencesh/skills"},{name:"jazz",label:"Jazz",dir:".jazz/skills"},{name:"junie",label:"Junie",dir:".junie/skills"},{name:"iflow-cli",label:"iFlow CLI",dir:".iflow/skills"},{name:"kilo",label:"Kilo Code",dir:".kilo/skills",detect:[".kilo",".kilocode"]},{name:"kimchi",label:"Kimchi",dir:".config/kimchi/harness/skills",detect:[".config/kimchi"]},{name:"kimi-code-cli",label:"Kimi Code CLI",dir:D,detect:[".kimi-code",".kimi"]},{name:"kiro-cli",label:"Kiro CLI",dir:".kiro/skills"},{name:"kode",label:"Kode",dir:".kode/skills"},{name:"lingma",label:"Lingma",dir:".lingma/skills"},{name:"loaf",label:"Loaf",dir:D,detect:[".loaf"]},{name:"mcpjam",label:"MCPJam",dir:".mcpjam/skills"},{name:"minimax-code",label:"MiniMax Code",dir:".minimax/skills",detect:[".minimax","/Applications/MiniMax Code.app"]},{name:"mistral-vibe",label:"Mistral Vibe",dir:".vibe/skills"},{name:"moxby",label:"Moxby",dir:".moxby/skills"},{name:"mux",label:"Mux",dir:".mux/skills"},{name:"opencode",label:"OpenCode",dir:".config/opencode/skills"},{name:"openhands",label:"OpenHands",dir:".openhands/skills"},{name:"ona",label:"Ona",dir:".ona/skills"},{name:"pi",label:"Pi",dir:".pi/agent/skills"},{name:"posit-assistant",label:"Posit Assistant",dir:".posit/assistant/skills",detect:[".posit/assistant",".positai"]},{name:"qoder",label:"Qoder",dir:".qoder/skills"},{name:"qoder-cn",label:"Qoder CN",dir:".qoder-cn/skills"},{name:"qwen-code",label:"Qwen Code",dir:".qwen/skills"},{name:"replit",label:"Replit",dir:".config/agents/skills"},{name:"reasonix",label:"Reasonix",dir:".reasonix/skills"},{name:"rovodev",label:"Rovo Dev",dir:".rovodev/skills"},{name:"roo",label:"Roo Code",dir:".roo/skills"},{name:"sarvam-code",label:"Sarvam Code",dir:D,detect:[".sarvam"]},{name:"tabnine-cli",label:"Tabnine CLI",dir:".tabnine/agent/skills",detect:[".tabnine"]},{name:"terramind",label:"Terramind",dir:".terramind/skills"},{name:"tinycloud",label:"Tinycloud",dir:".tinycloud/skills"},{name:"trae",label:"Trae",dir:".trae/skills"},{name:"trae-cn",label:"Trae CN",dir:".trae-cn/skills"},{name:"warp",label:"Warp",dir:D,detect:[".warp"]},{name:"windsurf",label:"Windsurf",dir:".codeium/windsurf/skills"},{name:"zed",label:"Zed",dir:D,detect:[".config/zed"]},{name:"zcode",label:"ZCode",dir:".zcode/skills",detect:[".zcode","/Applications/ZCode.app"]},{name:"zencoder",label:"Zencoder",dir:".zencoder/skills"},{name:"zenflow",label:"Zenflow",dir:".zencoder/skills"},{name:"neovate",label:"Neovate",dir:".neovate/skills"},{name:"pochi",label:"Pochi",dir:".pochi/skills"},{name:"adal",label:"AdaL",dir:".adal/skills"},{name:"universal",label:"Universal",dir:".config/agents/skills"}],it,_e;function dt(){if(it)return it;let e=_(ms(import.meta.url));for(;;){let t=w(e,"package.json");if(j(t))try{if(JSON.parse(T(t)).name===at)return it=e,e}catch{}let n=_(e);if(n===e)break;e=n}throw new Error(`\u672A\u80FD\u4ECE\u6A21\u5757\u4F4D\u7F6E\u5411\u4E0A\u5B9A\u4F4D ${at} \u7684\u5305\u6839\u76EE\u5F55`)}function W(){return w(dt(),"skills")}function ut(){return dt()}function gs(e){let t=ke(e);for(;;){let n=_(t);if(n===t)return"";if(Ln(n)===".pnpm"){let r=_(n),o=Ln(r)==="node_modules"?r:w(r,"node_modules");return w(o,at)}t=n}}function hs(){if(_e)return _e;let e=dt(),t="";try{let n=gs(e);n&&j(n)&&A(Cn(n))===A(Cn(e))&&(t=n)}catch{}return _e=t||e,_e}function Ne(){return w(hs(),"skills")}function ks(e){try{let n=T(w(e,ct)).match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!n)return"";let r=(n[1]??"").match(/^[ \t]+version:[ \t]*"?([^"\r\n]+?)"?[ \t]*$/m);return r?(r[1]??"").trim():""}catch{return""}}function bs(e){try{let n=T(w(e,ct)).match(/^>[ \t]*本技能版本[ \t]*([^ \t((]+)/m);return n?(n[1]??"").trim():""}catch{return""}}function ys(e){let t=[];for(let n of e){if(!n.version)continue;let r=bs(n.dir);r!==n.version&&t.push({name:n.name,frontmatter:n.version,body:r})}return t}function be(){let e=W();if(!j(e))return[];let t=[];for(let n of he(e).sort()){let r=w(e,n);try{if(!In(r).isDirectory())continue}catch{continue}j(w(r,ct))&&t.push({name:n,dir:r,version:ks(r)})}return t}function A(e){let t=Dn(ke(e));return process.platform==="win32"?t.toLowerCase():t}function vs(e){let t=Dn(e);return/^[a-zA-Z]:[\\/]$/.test(t)?t:t.replace(/[\\/]+$/,"")||t}function Be(e,t,n,r=!1,o=""){let s;if(n)s=n;else try{s=In(e)}catch{return"absent"}if(s.isSymbolicLink()){let i="";try{i=fs(e)}catch{return"dangling"}let a=vs(Mn(i)?i:ke(_(e),i)),c=A(a);return c!==A(t)&&!(o&&c===A(o))?"wrong":r||j(e)?"link-ok":"dangling"}return s.isDirectory()?"dir":"file"}function Pe(e,t){let n,r;try{n=he(e).sort(),r=he(t).sort()}catch{return!1}if(n.length!==r.length||n.some((o,s)=>o!==r[s]))return!1;for(let o of n){let s=w(e,o),i=w(t,o),a,c;try{a=En(s),c=En(i)}catch{return!1}if(a.isDirectory()!==c.isDirectory())return!1;if(a.isDirectory()){if(!Pe(s,i))return!1}else try{if(!An(s).equals(An(i)))return!1}catch{return!1}}return!0}function ye(){return w(q(),".agents",ps)}function Ue(){let e=ye();if(!j(e))return null;try{let t=JSON.parse(T(e));return!t||!Array.isArray(t.targets)?null:t}catch{return null}}function Bn(e){let t=ye();lt(_(t),{recursive:!0});let n={version:1,updatedAt:new Date().toISOString(),targets:e};$(t,`${JSON.stringify(n,null,2)}
98
98
  `)}function Pn(e=[]){let t=q(),n=[],r=new Set,o=(s,i,a,c)=>{let d=ke(s),u=A(d);r.has(u)||(r.add(u),n.push({dir:d,label:i,kind:a,available:c,dirExists:j(d)}))};o(w(t,D),_n,"primary",!0);for(let s of Nn){let i=w(t,_(s.dir)),a=j(i)||(s.detect??[]).some(c=>j(Mn(c)?c:w(t,c)));o(w(t,s.dir),s.label,"agent",a)}for(let s of e)o(s,"\u81EA\u5B9A\u4E49 --dir","custom",!0);return n}function ws(e){let t=A(ke(e));return t===A(w(q(),D))?_n:Nn.find(r=>A(w(q(),r.dir))===t)?.label??null}function ft(e){On(e,{recursive:!0,force:!0})}function Fn(e,t){lt(_(t),{recursive:!0}),us(e,t,{recursive:!0})}function Ss(e,t,n,r){if(r)return Fn(t,n),{mode:"copy"};try{return lt(_(n),{recursive:!0}),jn(e,n,process.platform==="win32"?"junction":"dir"),{mode:"link"}}catch(o){return Fn(t,n),{mode:"copy",reason:o.message}}}function Un(e={}){let t=be(),n=Pn(e.dirs??[]),r=Ne(),o=Ue(),s=new Map;for(let d of o?.targets??[])s.set(A(d.dir),d);let i=[],a=[],c=[];for(let d of n){if(!d.available){a.push({dir:d.dir,label:d.label});continue}let u={dir:d.dir,label:d.label,kind:d.kind,created:[],updated:[],skipped:[],conflicts:[],failed:[],degraded:[],links:[],copies:[]};for(let m of t){let g=w(d.dir,m.name),l=w(r,m.name),f=Be(g,l);if(f==="link-ok"){u.skipped.push(m.name),u.links.push(m.name);continue}if(f==="dir"&&!e.force){if(!(s.get(A(d.dir))?.copies.includes(m.name)??!1)){u.conflicts.push(m.name);continue}if(Pe(m.dir,g)){u.skipped.push(m.name),u.copies.push(m.name);continue}}if(f==="file"&&!e.force){u.conflicts.push(m.name);continue}if(e.dryRun){f==="absent"?u.created.push(m.name):u.updated.push(m.name),e.copy?u.copies.push(m.name):u.links.push(m.name);continue}try{f!=="absent"&&ft(g);let p=Ss(l,m.dir,g,!!e.copy);f==="absent"?u.created.push(m.name):u.updated.push(m.name),p.mode==="link"?u.links.push(m.name):(u.copies.push(m.name),p.reason&&u.degraded.push({name:m.name,reason:p.reason}))}catch(p){u.failed.push({name:m.name,reason:p.message})}}i.push(u),e.dryRun||c.push({dir:d.dir,updatedAt:new Date().toISOString(),links:u.links,copies:u.copies})}if(!e.dryRun){let d=new Set(i.map(g=>A(g.dir))),u=(o?.targets??[]).filter(g=>!d.has(A(g.dir))),m=[...c,...u].filter(g=>g.links.length>0||g.copies.length>0);m.length>0&&Bn(m)}return{source:W(),skills:t.map(d=>d.name),targets:i,skippedTargets:a,stateFile:ye()}}function zn(e={}){let t=Ue(),n=ye();if(!t)return{stateFile:n,stateExists:!1,targets:[],stateRemoved:!1};let r=[],o=!1;for(let a of t.targets){let c={dir:a.dir,label:ws(a.dir),removed:[],missing:[],skippedForeign:[]},d=[...new Set([...a.links,...a.copies])];for(let u of d){let m=w(a.dir,u),g=w(W(),u),l=Be(m,g,void 0,!1,w(Ne(),u));if(l==="absent"){c.missing.push(u);continue}if(l==="wrong"){c.skippedForeign.push(u);continue}if(l==="file"){c.skippedForeign.push(u);continue}if(l==="dir"&&!Pe(g,m)){c.skippedForeign.push(u);continue}if(e.dryRun){c.removed.push(u);continue}try{ft(m),c.removed.push(u)}catch{o=!0,c.skippedForeign.push(u)}}r.push(c)}let s=r.every(a=>a.skippedForeign.length===0),i=!e.dryRun&&!o&&s;return i&&On(n,{force:!0}),{stateFile:n,stateExists:!0,targets:r,stateRemoved:i}}function Yn(){let e=be(),t=Pn([]),n=Ue(),r=new Map;for(let i of n?.targets??[])r.set(A(i.dir),i);let o=[],s=[];for(let i of t){let a=r.get(A(i.dir));if(!i.available&&i.kind==="agent"){s.push({dir:i.dir,label:i.label});continue}if(i.kind!=="primary"&&!i.dirExists&&!a)continue;let c=[...new Set([...e.map(m=>m.name),...a?[...a.links,...a.copies]:[]])].sort(),d=new Map(e.map(m=>[m.name,m.version])),u=[];for(let m of c){let g=w(W(),m),l=w(i.dir,m),f=Be(l,w(Ne(),m),void 0,!1,g),p;f==="link-ok"?p="link":f==="dangling"?p="dangling":f==="wrong"?p="wrong":f==="file"?p="conflict":f==="dir"?j(g)&&Pe(g,l)?p="copy":p=a?.copies.includes(m)?"copy-drift":"conflict":p="missing",u.push({name:m,state:p,version:d.get(m)??""})}o.push({dir:i.dir,label:i.label,kind:i.kind,available:i.available,dirExists:i.dirExists,recorded:!!a,items:u})}return{source:W(),skills:e.map(i=>i.name),skillVersions:Object.fromEntries(e.map(i=>[i.name,i.version])),versionMismatches:ys(e),stateFile:ye(),stateExists:!!n,targets:o,pendingAgents:s}}function Wn(){let e=F("skills");if(e?.autoLink===!1||process.env.CI)return 0;let t=Ue();if(!t)return 0;let n=W(),r;try{r=new Set(he(n).filter(d=>j(w(n,d))))}catch{return 0}let o=Ne(),s=e?.autoLinkReplaceForeign!==!1,i=process.platform==="win32"?"junction":"dir",a=0,c=[];for(let d of t.targets){let u;try{u=he(d.dir,{withFileTypes:!0})}catch{c.push(d);continue}let m=new Map(u.map(l=>[l.name,l])),g=d.links.filter(l=>{if(!r.has(l))return!1;let f=w(o,l),p=w(d.dir,l),h=m.get(l),b=h?Be(p,f,h,!0):"absent";if(b==="link-ok"||!s&&(b==="dir"||b==="file"))return!0;try{return b!=="absent"&&ft(p),jn(f,p,i),a+=1,!0}catch{return!0}});c.push({...d,links:g,updatedAt:new Date().toISOString()})}return a>0&&Bn(c),a}import{existsSync as $s,mkdirSync as Ts,rmSync as Rs}from"fs";import{join as As}from"path";import{tmpdir as Gn}from"os";import{spawn as Cs}from"child_process";var xs="https://registry.npmjs.org/@fxri%2Ftoolkit/latest";async function Kn(){try{let e=await fetch(xs,{signal:AbortSignal.timeout(1e3),headers:{accept:"application/vnd.npm.install-v1+json"}});if(!e.ok)return null;let t=await e.json();return typeof t.version=="string"?t.version:null}catch{return null}}function Hn(e,t){let n=i=>i.trim().replace(/^-/,"").split(/[.+-]/).map(a=>Number.parseInt(a,10)).map(a=>Number.isFinite(a)?a:0),r=n(e),o=n(t),s=Math.max(r.length,o.length);for(let i=0;i<s;i++){let a=r[i]??0,c=o[i]??0;if(a!==c)return a>c}return!1}var Es=1440*60*1e3,Ls=3600*1e3,Fs="FX_NO_UPDATE_CHECK",mt="--fxri-update-check-worker";function Vn(){return As(Gn(),".toolkit-update-check.json")}function Is(){let e=Vn();try{if(!$s(e))return null;let t=JSON.parse(T(e)),n=typeof t.ts=="number"?t.ts:0,r=typeof t.latest=="string"?t.latest:"",o=t.ok===!0,s=o?Es:Ls;return Date.now()-n>=s?(Rs(e,{force:!0}),null):o&&!r?null:{ts:n,ok:o,latest:r}}catch{return null}}function Os(e,t){try{let n=Vn();Ts(Gn(),{recursive:!0}),$(n,JSON.stringify({ts:Date.now(),ok:e,latest:t}))}catch{}}function js(){let e=process.env[Fs];if(e!==void 0&&e!=="")return!["0","false","off","no"].includes(e.trim().toLowerCase());let t=Ke()?.updateCheck;return t&&typeof t=="object"?t.enabled===!1:!1}function Jn(e){if(js())return;let t=Is();if(t){t.ok&&Hn(t.latest,e)&&Ds(t.latest,e);return}Ms()}function Ms(){let e=process.argv[1];if(e)try{Cs(process.execPath,[e,mt],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}catch{}}async function qn(){let e=await Kn().catch(()=>null);Os(e!==null,e??"")}function Ds(e,t){console.error(`\u2B06\uFE0F \u53D1\u73B0\u65B0\u7248\u672C ${e}\uFF08\u5F53\u524D ${t}\uFF09\uFF1Apnpm add -g @fxri/toolkit \u5347\u7EA7\u540E\u8BF7\u5F00\u65B0\u4F1A\u8BDD\u52A0\u8F7D\u6700\u65B0 skills \u89C4\u5219\uFF1B\u672C\u5730\u6280\u80FD\u53EF\u7528 toolkit skills status \u68C0\u67E5\uFF08\u8F6F\u94FE\u81EA\u52A8\u8DDF\u968F\uFF0C\u526F\u672C\u5F62\u5F0F\u9700\u91CD\u8DD1 toolkit skills install\uFF09`)}var _s="\u663E\u793A\u5E2E\u52A9",Ns=["version","format"];function pt(e){e.helpOption("-h, --help",_s),e.configureHelp({subcommandTerm:t=>`${t.name()} ${t.usage()}`.replace(/\s+/g," ").trim()});for(let t of e.commands)pt(t)}function Zn(e){let[t]=e;return!t||!Ns.includes(t)?!1:e.slice(1).some(n=>n==="-h"||n==="--help")}var gt="\u8FD0\u884C toolkit --help \u67E5\u770B\u53EF\u7528\u547D\u4EE4";function Xn(e){let t=/\n\(Did you mean (one of )?([^)]*?)\?\)$/.exec(e);if(!t)return"";let n=(t[2]??"").split(", ").join("\u3001");return t[1]?`\uFF08\u662F\u5426\u60F3\u8F93\u5165 ${n} \u4E4B\u4E00\uFF1F\uFF09`:`\uFF08\u662F\u5426\u60F3\u8F93\u5165 ${n}\uFF1F\uFF09`}function Qn(e){switch(e.code){case"commander.unknownCommand":{let t=/unknown command '([^']*)'/.exec(e.message)?.[1];return t?`\u26A0\uFE0F \u672A\u77E5\u547D\u4EE4\u300C${t}\u300D\u3002${Xn(e.message)}
99
99
  ${gt}`:null}case"commander.unknownOption":{let t=/unknown option '([^']*)'/.exec(e.message)?.[1];return t?`\u26A0\uFE0F \u672A\u77E5\u9009\u9879\u300C${t}\u300D\u3002${Xn(e.message)}
100
100
  ${gt}`:null}case"commander.excessArguments":{let t=/too many arguments(?: for '([^']*)')?\. Expected (\d+) arguments? but got (\d+)\./.exec(e.message);return t?`\u26A0\uFE0F ${t[1]?`\u547D\u4EE4\u300C${t[1]}\u300D`:"\u547D\u4EE4"}\u671F\u671B ${t[2]} \u4E2A\u53C2\u6570\uFF0C\u5B9E\u9645\u6536\u5230 ${t[3]} \u4E2A\u3002
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fxri/toolkit",
3
- "version": "1.10.4",
3
+ "version": "1.10.5",
4
4
  "description": "专为多人 + AI 跨项目协作打造:任务管理 + 多语言 CHANGELOG。",
5
5
  "license": "MIT",
6
6
  "author": {