[{"data":1,"prerenderedAt":13470},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"category-articles-tw-ai-agents":421},[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346],{"path":5},"\u002Fde\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":7},"\u002Fde\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":9},"\u002Fde\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":11},"\u002Fde\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":13},"\u002Fde\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":15},"\u002Fde\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":17},"\u002Fde\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":19},"\u002Fde\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":21},"\u002Fde\u002Farticle\u002Fsetup-antigravity-2",{"path":23},"\u002Fde\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":25},"\u002Fde\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":27},"\u002Fde\u002Farticle\u002Fsync-obsidian-across-devices",{"path":29},"\u002Fde\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":31},"\u002Fde\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":33},"\u002Fde\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":35},"\u002Fde\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":37},"\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":39},"\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":41},"\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":43},"\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":45},"\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":47},"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":49},"\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":51},"\u002Fen\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":53},"\u002Fen\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":55},"\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":57},"\u002Fen\u002Farticle\u002Fsetup-antigravity-2",{"path":59},"\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":61},"\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":63},"\u002Fen\u002Farticle\u002Fsync-obsidian-across-devices",{"path":65},"\u002Fen\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":67},"\u002Fen\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":69},"\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":71},"\u002Fen\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":73},"\u002Fes\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":75},"\u002Fes\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":77},"\u002Fes\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":79},"\u002Fes\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":81},"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":83},"\u002Fes\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":85},"\u002Fes\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":87},"\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":89},"\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":91},"\u002Fes\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":93},"\u002Fes\u002Farticle\u002Fsetup-antigravity-2",{"path":95},"\u002Fes\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":97},"\u002Fes\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":99},"\u002Fes\u002Farticle\u002Fsync-obsidian-across-devices",{"path":101},"\u002Fes\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":103},"\u002Fes\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":105},"\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":107},"\u002Fes\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":109},"\u002Ffr\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":111},"\u002Ffr\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":113},"\u002Ffr\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":115},"\u002Ffr\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":117},"\u002Ffr\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":119},"\u002Ffr\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":121},"\u002Ffr\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":123},"\u002Ffr\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":125},"\u002Ffr\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":127},"\u002Ffr\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":129},"\u002Ffr\u002Farticle\u002Fsetup-antigravity-2",{"path":131},"\u002Ffr\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":133},"\u002Ffr\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":135},"\u002Ffr\u002Farticle\u002Fsync-obsidian-across-devices",{"path":137},"\u002Ffr\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":139},"\u002Ffr\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":141},"\u002Ffr\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":143},"\u002Ffr\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":145},"\u002Fid\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":147},"\u002Fid\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":149},"\u002Fid\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":151},"\u002Fid\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":153},"\u002Fid\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":155},"\u002Fid\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":157},"\u002Fid\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":159},"\u002Fid\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":161},"\u002Fid\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":163},"\u002Fid\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":165},"\u002Fid\u002Farticle\u002Fsetup-antigravity-2",{"path":167},"\u002Fid\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":169},"\u002Fid\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":171},"\u002Fid\u002Farticle\u002Fsync-obsidian-across-devices",{"path":173},"\u002Fid\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":175},"\u002Fid\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":177},"\u002Fid\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":179},"\u002Fid\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":181},"\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":183},"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":185},"\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":187},"\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":189},"\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":191},"\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":193},"\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":195},"\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":197},"\u002Fja\u002Farticle\u002Fsetup-antigravity-2",{"path":199},"\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":201},"\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":203},"\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices",{"path":205},"\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":207},"\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":209},"\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":211},"\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":213},"\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":215},"\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":217},"\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":219},"\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":221},"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":223},"\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":225},"\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":227},"\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":229},"\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":231},"\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":233},"\u002Fpt\u002Farticle\u002Fsetup-antigravity-2",{"path":235},"\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":237},"\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":239},"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices",{"path":241},"\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":243},"\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":245},"\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":247},"\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":249},"\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":251},"\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":253},"\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":255},"\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":257},"\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":259},"\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":261},"\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":263},"\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":265},"\u002Ftw\u002Farticle\u002Fsetup-antigravity-2",{"path":267},"\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":269},"\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":271},"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices",{"path":273},"\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":275},"\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":277},"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":279},"\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":281},"\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":283},"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":285},"\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":287},"\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":289},"\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":291},"\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":293},"\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":295},"\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":297},"\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":299},"\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":301},"\u002Fvi\u002Farticle\u002Fsetup-antigravity-2",{"path":303},"\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":305},"\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":307},"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices",{"path":309},"\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":311},"\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":313},"\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":315},"\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":317},"\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":319},"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":321},"\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":323},"\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":325},"\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":327},"\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":329},"\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":331},"\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":333},"\u002Fzh\u002Farticle\u002Fsetup-antigravity-2",{"path":335},"\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":337},"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":339},"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices",{"path":341},"\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":343},"\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":345},"\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":347},"\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417],{"title":350,"path":351,"stem":352},"AI Agent Skills: What They Are & How to Create Them","\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them","en\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"title":354,"path":355,"stem":356},"Bringing Buzz to DeepSeek Harness: Taught to Speak Nostr","\u002Farticle\u002Fbringing-buzz-to-deepseek-harness","en\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"title":358,"path":359,"stem":360},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":362,"path":363,"stem":364},"How to Expose Hermes Agent Privately with Cloudflare WARP","\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp","en\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"title":366,"path":367,"stem":368},"How AI Agent Skills Replace Nuxt App Scaffolding Scripts","\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts","en\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"title":370,"path":371,"stem":372},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":374,"path":375,"stem":376},"How to Deploy Hermes Agent on a Linux VPS","\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server","en\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"title":378,"path":379,"stem":380},"Self-Host Your Travel Itineraries with TREK and Docker","\u002Farticle\u002Fself-hosted-travel-planner-trek","en\u002Farticle\u002Fself-hosted-travel-planner-trek",{"title":382,"path":383,"stem":384},"Self-Host Block's Buzz: Shared AI Agent Workspace","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues","en\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"title":386,"path":387,"stem":388},"How to Self-Host a BitWarden Compatible Server Nodewarden","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":390,"path":391,"stem":392},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":394,"path":395,"stem":396},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":398,"path":399,"stem":400},"Switch Between Multiple Cloudflare WARP Orgs on Mac","\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac","en\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"title":402,"path":403,"stem":404},"How to Sync Obsidian Vaults Across Devices Securely","\u002Farticle\u002Fsync-obsidian-across-devices","en\u002Farticle\u002Fsync-obsidian-across-devices",{"title":406,"path":407,"stem":408},"Testing Claude Fable 5: A Financial Analysis Review","\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis","en\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"title":410,"path":411,"stem":412},"Guide to Browser and Scheduler in Antigravity 2","\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2","en\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"title":414,"path":415,"stem":416},"Build a Persistent AI Memory System on Cloudflare","\u002Farticle\u002Fuse-cloudflare-as-ai-memory","en\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"title":418,"path":419,"stem":420},"Antigravity 2 in Action: AI Agents, Skills, and MCP","\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2","en\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[422,1732,2643,4100,6264,8154,8741,9543,10074,10469,11104,11568,11780,12003,12342,13036],{"id":423,"title":424,"author":425,"body":426,"category":1686,"date":1690,"description":1691,"extension":1692,"image":1693,"imageAlt":1694,"isPublished":1077,"meta":1695,"minRead":1723,"navigation":1077,"path":251,"seo":1724,"stem":1726,"tags":1727,"updatedAt":1730,"__hash__":1731},"article\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness.md","為 DeepSeek Harness 接入 Buzz 協作平台：構建自託管 Nostr 訊息閘道的完整實踐","",{"type":427,"value":428,"toc":1670},"minimark",[429,437,462,470,473,478,483,528,531,592,596,603,884,887,891,896,902,906,920,924,935,989,996,1000,1003,1035,1038,1043,1094,1102,1108,1117,1123,1154,1168,1172,1181,1212,1234,1282,1289,1295,1301,1308,1314,1319,1327,1341,1347,1357,1398,1401,1407,1414,1420,1424,1427,1582,1585,1626,1630,1636,1640,1666],[430,431,432],"p",{},[433,434],"img",{"alt":435,"src":436},"DeepSeek Harness 訊息閘道連線至 Block Buzz 頻道的運作概觀","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-nostr-gateway-overview.webp",[430,438,439,440,450,451,456,457,461],{},"DeepSeek Harness（DSH）的官方外掛程式 ",[441,442,443],"strong",{},[444,445,449],"a",{"href":446,"rel":447},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway",[448],"nofollow","dsh-message-gateway","，能夠將 DeepSeek Harness 助理無縫延伸至 Discord、Telegram、WeChat 等多種主流即時通訊平台。該外掛程式倉庫已被 Fork 並進行了二次開發，旨在將 ",[441,452,453],{},[444,454,455],{"href":383},"自建 Block 旗下 Buzz 協作平台：輕鬆構建人類與 AI 智能體高效協同工作的全新共享工作空間"," 納入支援清單。Fork 後的開原始碼倉庫位於 GitHub：",[444,458,459],{"href":459,"rel":460},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway",[448]," 。",[463,464],"article-card",{"description":465,"image":466,"image-alt":467,"label":468,"min-read":469,"title":455,"to":383},"本教學將手把手帶您在 Ubuntu VPS 上部署自託管的 Block 旗下 Nostr 中繼 Buzz，並配置 Cloudflare DNS 安全網路。我們將幫助您搭建起一個安全性的共享工作空間，讓您的團隊成員與多個 AI 智能體（如 Claude、Kimi）能夠基於加密身份進行高效溝通、共享專案上下文並實現無縫協作。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FTW-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","一張高顏值的 16:9 科技質感卡片，具有深藍色 and 橙色色調，插圖展示如何在 Ubuntu VPS 上部署自託管的 Block 旗下 Buzz 協作中繼伺服器，其中包含一個帶有置中文字的毛玻璃微動質感面板。","前置準備指南","12",[430,471,472],{},"DSH 助理作為一個全功能成員加入 Buzz Nostr 中繼伺服器，既能接收私人訊息（DM），也能接收被 @mention 提及的頻道訊息，並透過與 Web UI 完全相同的獨立工作階段智能體管線輸出回應。",[474,475,477],"h2",{"id":476},"dsh-message-gateway-外掛架構剖析","dsh-message-gateway 外掛架構剖析",[430,479,480,482],{},[441,481,449],{}," 外掛的系統架構清晰劃分為主機端與用戶端兩大部分：",[484,485,486,518],"ul",{},[487,488,489,492,493,497,498,501,502,505,506,509,510,513,514,517],"li",{},[441,490,491],{},"主機端（Node 環境）","：",[494,495,496],"code",{},"gateway-store","（憑證與設定持久化儲存，位於 ",[494,499,500],{},"~\u002F.dsh\u002Fgateway.json","）、",[494,503,504],{},"platforms.ts","（支援平台定義與連線測試）、",[494,507,508],{},"routes.ts","（對外暴露的 ",[494,511,512],{},"\u002Fgateway\u002F*"," 路由端點）以及 ",[494,515,516],{},"bridge-manager.ts","（常駐閘道橋接器：負責按對話維護獨立 Agent 執行個體並統一管理串流回應推送）。",[487,519,520,523,524,527],{},[441,521,522],{},"用戶端（瀏覽器前端）","：側邊欄的「",[441,525,526],{},"Message platforms","」視覺化設定頁面，負責填寫金鑰參數、發起連線測試以及直觀監視閘道即時在線狀態。",[430,529,530],{},"為閘道接入一個全新通訊平台通常需要經歷以下三步：",[532,533,534,552,566],"ol",{},[487,535,536,539,540,543,544,547,548,551],{},[441,537,538],{},"實作 Bridge 橋接類別","：提供 ",[494,541,542],{},"start\u002Fstop\u002Fstatus"," 生命週期方法以及 ",[494,545,546],{},"onText(text, frame)"," 訊息回呼，結構規範與現有的 ",[494,549,550],{},"wecom-bridge.ts"," 完全一致。",[487,553,554,557,558,561,562,565],{},[441,555,556],{},"接入 bridge-manager 排程器","：複用既有的多工作階段排程管線（",[494,559,560],{},"ensureAgentForKey"," + ",[494,563,564],{},"pendingMap","），並將底層文字輸出串流掛載至該平台的專用回覆接收器。",[487,567,568,571,572,575,576,579,580,583,584,587,588,591],{},[441,569,570],{},"對接持久化儲存與設定路由","：在 ",[494,573,574],{},"\u002Fgateway\u002Fsave"," 與 ",[494,577,578],{},"\u002Fgateway\u002Fdelete"," 邏輯中實作：",[441,581,582],{},"儲存設定即自動啟動橋接服務，刪除設定則優雅停止橋接服務","，配合 ",[494,585,586],{},"autoStartXxx"," 狀態旗標確保 ",[494,589,590],{},"dsh web"," 守護行程開機自動重新連線。",[474,593,595],{"id":594},"buzz-閘道橋接實作nostr-協定標準與事件生命週期","Buzz 閘道橋接實作：Nostr 協定標準與事件生命週期",[430,597,598,599,602],{},"本次接入直接使用 ",[441,600,601],{},"DeepSeek Harness"," 自行編寫完成了完整的 Buzz 適配橋接器。底層嚴格遵循了如下 Nostr 協定規範標準：",[604,605,606,621],"table",{},[607,608,609],"thead",{},[610,611,612,618],"tr",{},[613,614,615],"th",{},[441,616,617],{},"維度 \u002F 階段",[613,619,620],{},"協定實作規範與技術細節",[622,623,624,646,664,691,709,734,759,781,795,809,828,845,859],"tbody",{},[610,625,626,632],{},[627,628,629],"td",{},[441,630,631],{},"底層傳輸（Transport）",[627,633,634,635,638,639,642,643],{},"單條經過 NIP-42 鑑權認證的 WebSocket 鏈路；預設中繼連線位址為 ",[494,636,637],{},"ws:\u002F\u002Flocalhost:3000","；輸入的 ",[494,640,641],{},"http(s):\u002F\u002F"," 會自動正規化為 ",[494,644,645],{},"ws(s):\u002F\u002F",[610,647,648,653],{},[627,649,650],{},[441,651,652],{},"鑑權認證（Auth）",[627,654,655,656,659,660,663],{},"AUTH 事件 ",[494,657,658],{},"kind 22242","，攜帶標籤 ",[494,661,662],{},"[[\"relay\", url], [\"challenge\", challenge]]","，內容為空字串，由 Agent 的私密金鑰完成簽章",[610,665,666,671],{},[627,667,668],{},[441,669,670],{},"訂閱機制（Subs）",[627,672,673,492,676,679,680,683,684,687,688],{},[441,674,675],{},"嚴格基於頻道隔離",[494,677,678],{},"REQ {\"kinds\":[9], \"#h\":[\u003Cuuid>]}"," — 每個頻道獨立建立一條訂閱。全域性的 ",[494,681,682],{},"kinds:[9]"," 雖能收到 EOSE 但絕不廣播推送；多值 ",[494,685,686],{},"#h"," 標籤過濾在協定中",[441,689,690],{},"無法正常分發",[610,692,693,698],{},[627,694,695],{},[441,696,697],{},"頻道探索（Discovery）",[627,699,700,701,704,705,708],{},"歷史中繼資料回溯查詢 ",[494,702,703],{},"REQ {kinds:[39000]}"," 擷取頻道詳情（其中 ",[494,706,707],{},"type == \"dm\""," 用於標記單聊私訊頻道）",[610,710,711,716],{},[627,712,713],{},[441,714,715],{},"成員異動訂閱",[627,717,718,719,722,723,725,726,729,730,733],{},"即時長連線訂閱 ",[494,720,721],{},"REQ {kinds:[44100,44101], \"#p\":[Agent 公鑰], since: now-60s}"," — 44100 為加入群組，44101 為被移除，均附帶 ",[494,724,430],{},"+",[494,727,728],{},"h","；成員關係變更時",[441,731,732],{},"無需重新連線","即可動態熱更新訂閱狀態",[610,735,736,741],{},[627,737,738],{},[441,739,740],{},"即時聊天事件",[627,742,743,746,747,750,751,754,755,758],{},[494,744,745],{},"kind 9"," 事件，攜帶 ",[494,748,749],{},"[\"h\", channel]"," 頻道標籤，可選附帶 ",[494,752,753],{},"[\"e\", replyTo]"," 回覆目標與 ",[494,756,757],{},"[\"p\", mention]"," 被提及者標籤",[610,760,761,766],{},[627,762,763],{},[441,764,765],{},"原位更新編輯",[627,767,768,771,772,575,774,777,778,780],{},[494,769,770],{},"kind 40003"," 事件，附帶 ",[494,773,728],{},[494,775,776],{},"e"," 目標標籤；內容完全替換；中繼伺服器單包上限 64 KB → 嚴控酬載 ≤ 60,000 B；超長回覆分塊處理 — 首塊用於原位編輯替換，超出部分作為回覆串討論串的 ",[494,779,745],{}," 訊息追加",[610,782,783,788],{},[627,784,785],{},[441,786,787],{},"CLOSED 異常訊框處理",[627,789,790,791,794],{},"鑑權未完成前收到 ",[494,792,793],{},"auth-required"," 屬於正常引導階段（完成 AUTH 後重新拉起訂閱）；鑑權完成後遇斷線 → 階梯式限次重試（最多 3 次，間隔 0\u002F1\u002F2 秒退避）；整鏈重連時全量重構上下文",[610,796,797,802],{},[627,798,799],{},[441,800,801],{},"中繼拉取上限",[627,803,804,805,808],{},"每次訂閱最多拉取 2000 條歷史事件，即使設定了 ",[494,806,807],{},"since"," 過濾參數，中繼伺服器仍按自最新向過去的時間倒序返回",[610,810,811,816],{},[627,812,813],{},[441,814,815],{},"訊息命中判定",[627,817,818,819,821,822,824,825,827],{},"僅當滿足以下任一條件時才啟動處理入站 ",[494,820,745],{},"：(a) ",[494,823,430],{}," 標籤明確包含自身公鑰，(b) 處於 DM 私訊頻道，(c) 回覆關聯的 ",[494,826,776],{}," 根事件為自身發出的訊息。自動過濾自身公鑰發送的內容（徹底杜絕迴圈）",[610,829,830,835],{},[627,831,832],{},[441,833,834],{},"出站 @ 提及",[627,836,837,838,841,842,844],{},"出站內容按純文字原樣發布 — 中繼伺服器端不對正文中的 ",[494,839,840],{},"@"," 符號進行預先驗證；",[494,843,430],{}," 標籤填入當前對話原作者以及至多 7 位其他被提及者的公鑰（單條上限 8 位）",[610,846,847,852],{},[627,848,849],{},[441,850,851],{},"私聊訊息（DM）",[627,853,854,855,858],{},"依賴中繼伺服器範圍內的明文受限頻道（中繼資料標註 ",[494,856,857],{},"type: \"dm\"","） — 當前橋接實作中未引入 NIP-04\u002F44 複雜非對稱端對端加密",[610,860,861,866],{},[627,862,863],{},[441,864,865],{},"媒體附件（入站）",[627,867,868,869,872,873,876,877,876,880,883],{},"NIP-92 ",[494,870,871],{},"imeta"," 規範（",[494,874,875],{},"url",", ",[494,878,879],{},"sha256",[494,881,882],{},"m","）→ 常規 HTTP(S) 串流下載，本地驗證 SHA-256 完整性，單檔限制 20 MB，每條訊息最多 4 張；出站圖片發布暫無官方中繼協定路徑，現階段不支援出站圖片",[430,885,886],{},"Buzz 適配閘道的啟動引導時序圖如下：",[433,888],{"src":889,"alt":890},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-bootstrap.webp","展示 Buzz 閘道引導連線與 NIP-42 協定身分鑑權流程的時序圖",[892,893,895],"h3",{"id":894},"基於-nostr-40003-事件原位編輯實現的即時串流輸出","基於 Nostr 40003 事件原位編輯實現的即時串流輸出",[430,897,898,899,492],{},"Nostr 協定缺乏原生鍵入中（Typing）狀態通知，且底層事件設計為嚴格只增不改。為了讓對話過程具備流暢的即時互動感，Buzz 適配閘道",[441,900,901],{},"透過原位編輯巧妙模擬了串流打字輸出",[433,903],{"src":904,"alt":905},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-reply.webp","基於 kind 40003 事件原位編輯模擬打字串流回應的邏輯流程圖",[484,907,908],{},[487,909,910],{},[911,912,913,914,916,917,919],"em",{},"閘道首先秒級發出一條 ",[494,915,745],{}," 預留位置訊息，隨後在 Agent 推理過程中按設定的節流閥值連續發射 ",[494,918,770],{}," 原位編輯事件逐步追加渲染內容，並在推理終點落定最終文字。這一設計思路與 Telegram、Discord 橋接器的實作方式一脈相承。",[892,921,923],{"id":922},"透過聊天指令打通-deepseek-harness-本地工作區","透過聊天指令打通 DeepSeek Harness 本地工作區",[430,925,926,927,930,931,934],{},"DSH Web 介面所支援的「工作區（Workspaces）」核心能力依賴於底層 ",[494,928,929],{},"@deepseek-ai\u002Fdsh-workspace"," 模組中的 ",[494,932,933],{},"workspaceRegistry"," 服務：",[936,937,941],"pre",{"className":938,"code":939,"language":940,"meta":425,"style":425},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const existing = await ctx.workspaceRegistry.resolveByPath(request.path);\n","typescript",[494,942,943],{"__ignoreMap":425},[944,945,948,952,956,960,964,967,970,972,974,978,981,983,986],"span",{"class":946,"line":947},"line",1,[944,949,951],{"class":950},"spNyl","const",[944,953,955],{"class":954},"sTEyZ"," existing ",[944,957,959],{"class":958},"sMK4o","=",[944,961,963],{"class":962},"s7zQu"," await",[944,965,966],{"class":954}," ctx",[944,968,969],{"class":958},".",[944,971,933],{"class":954},[944,973,969],{"class":958},[944,975,977],{"class":976},"s2Zo4","resolveByPath",[944,979,980],{"class":954},"(request",[944,982,969],{"class":958},[944,984,985],{"class":954},"path)",[944,987,988],{"class":958},";\n",[430,990,991,992,995],{},"Buzz 橋接器透過引入全新的聊天斜線指令 ",[494,993,994],{},"\u002Fworkspace \u003C目錄路徑>","，允許在群聊中直接向 DSH 註冊並綁定本地現存的資料夾。在此之後，該工作階段下的所有互動都將牢牢錨定在此目錄中，並能即時無縫同步在 DSH Web UI 端查看。",[433,997],{"src":998,"alt":999},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace.webp","透過閘道聊天指令動態註冊並綁定 DeepSeek Harness 本地工作區的架構示意圖",[430,1001,1002],{},"開發與使用過程中需重點明確的三大設計機制：",[484,1004,1005,1015,1025],{},[487,1006,1007,1010,1011,1014],{},[441,1008,1009],{},"變更目錄等同於開啟全新工作階段","：工作階段的工作目錄（",[494,1012,1013],{},"cwd","）在初始化生成 Session Header 時即完成寫入，後續在生命週期內不可直接原地竄改。",[487,1016,1017,1020,1021,1024],{},[441,1018,1019],{},"目標本地目錄必須預先存在","：底層 ",[494,1022,1023],{},"create"," 註冊函式會對路徑進行嚴格驗證，若路徑在主機上不存在將直接擲出例外狀況拒絕綁定。",[487,1026,1027,1030,1031,1034],{},[441,1028,1029],{},"高度安全敏感指令","：透過閘道衍生的工作階段均賦予 ",[441,1032,1033],{},"auto-approve","（自動核准命令執行）特權，擁有對目標資料夾直接進行讀寫和工具操作的完全存取權。",[474,1036,1037],{"id":1037},"安裝與設定全流程指南",[532,1039,1040],{},[487,1041,1042],{},"在終端機執行以下指令完成外掛程式下載與啟動：",[936,1044,1048],{"className":1045,"code":1046,"language":1047,"meta":425,"style":425},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dsh plugin --profile web add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n\n# Start DSH web\ndsh web\n","bash",[494,1049,1050,1072,1079,1086],{"__ignoreMap":425},[944,1051,1052,1056,1060,1063,1066,1069],{"class":946,"line":947},[944,1053,1055],{"class":1054},"sBMFI","dsh",[944,1057,1059],{"class":1058},"sfazB"," plugin",[944,1061,1062],{"class":1058}," --profile",[944,1064,1065],{"class":1058}," web",[944,1067,1068],{"class":1058}," add",[944,1070,1071],{"class":1058}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n",[944,1073,1075],{"class":946,"line":1074},2,[944,1076,1078],{"emptyLinePlaceholder":1077},true,"\n",[944,1080,1082],{"class":946,"line":1081},3,[944,1083,1085],{"class":1084},"sHwdD","# Start DSH web\n",[944,1087,1089,1091],{"class":946,"line":1088},4,[944,1090,1055],{"class":1054},[944,1092,1093],{"class":1058}," web\n",[532,1095,1096],{"start":1074},[487,1097,1098,1099,1101],{},"待 DSH Web 介面啟動並用瀏覽器開啟後，按一下介面側邊欄中的「",[441,1100,526],{},"」圖示：",[430,1103,1104],{},[433,1105],{"alt":1106,"src":1107},"DeepSeek Harness Web UI 側邊欄醒目提示的 Message platforms 設定功能表項目","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-message-platforms-sidebar-icon.webp",[532,1109,1110],{"start":1081},[487,1111,1112,1113,1116],{},"在左側平台清單中選擇「",[441,1114,1115],{},"Buzz","」：",[430,1118,1119],{},[433,1120],{"alt":1121,"src":1122},"DeepSeek Harness 訊息閘道內的 Buzz 協定參數與金鑰對設定面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-message-gateway-buzz-config-panel.webp",[532,1124,1125,1136,1147],{"start":1088},[487,1126,1127,1128,1131,1132,1135],{},"按一下「",[441,1129,1130],{},"Generate keypair","」按鈕即時生成全新的 Nostr 身分金鑰對。請務必將生成的 ",[494,1133,1134],{},"npub"," 公鑰妥善複製暫存，後續步驟將作為關鍵身分憑證。",[487,1137,1138,1139,1142,1143,1146],{},"準確填入您的 ",[441,1140,1141],{},"Relay URL","（中繼位址）以及需要監聽訂閱的 ",[441,1144,1145],{},"Channels","（允許存取的頻道 UUID 白名單清單）。",[487,1148,1149,1150,1153],{},"按一下底部的「",[441,1151,1152],{},"Save","」按鈕完成儲存。",[430,1155,1156,1157,1160,1161,1164,1165,1167],{},"表單提交後，系統將持久化儲存設定並",[441,1158,1159],{},"立即啟動 Buzz 閘道服務","。私密金鑰 ",[494,1162,1163],{},"nsec"," 作為最高機密憑證被自動保護，僅獨立存放在主機本地的 ",[494,1166,500],{}," 檔案中。",[892,1169,1171],{"id":1170},"將-dsh-智能體註冊至-buzz-nostr-中繼服務","將 DSH 智能體註冊至 Buzz Nostr 中繼服務",[430,1173,1174,1177,1178,1180],{},[441,1175,1176],{},"將 DSH 助理作為新成員註冊加入中繼伺服器","。此處公鑰填入上文所生成的 ",[494,1179,1134],{}," 字串：",[936,1182,1184],{"className":1045,"code":1183,"language":1047,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub123123123\n",[494,1185,1186],{"__ignoreMap":425},[944,1187,1188,1191,1194,1197,1200,1203,1206,1209],{"class":946,"line":947},[944,1189,1190],{"class":1054},"docker",[944,1192,1193],{"class":1058}," compose",[944,1195,1196],{"class":1058}," exec",[944,1198,1199],{"class":1058}," relay",[944,1201,1202],{"class":1058}," buzz-admin",[944,1204,1205],{"class":1058}," add-member",[944,1207,1208],{"class":1058}," --pubkey",[944,1210,1211],{"class":1058}," npub123123123\n",[430,1213,1214,1217,1218,1221,1222,1225,1226,1229,1230,1233],{},[441,1215,1216],{},"將 DSH 助理加入特定的溝通頻道","。僅加入中繼並不會讓助理自動出現在頻道成員清單中。需要透過 ",[494,1219,1220],{},"buzz-cli"," 進一步執行入群操作。注意此處 ",[494,1223,1224],{},"--pubkey"," 參數必須使用 ",[441,1227,1228],{},"HEX 16 進位公鑰","格式，而非 npub 格式（在上一步執行 ",[494,1231,1232],{},"buzz-admin add-member"," 時，終端機輸出中會印出對應的 HEX 公鑰）：",[936,1235,1237],{"className":1045,"code":1236,"language":1047,"meta":425,"style":425},"buzz channels add-member --channel \u003CCHANNEL_UUID> --pubkey \u003CAGENT_HEX> --role member\n",[494,1238,1239],{"__ignoreMap":425},[944,1240,1241,1244,1247,1249,1252,1255,1258,1261,1264,1266,1268,1271,1274,1276,1279],{"class":946,"line":947},[944,1242,1243],{"class":1054},"buzz",[944,1245,1246],{"class":1058}," channels",[944,1248,1205],{"class":1058},[944,1250,1251],{"class":1058}," --channel",[944,1253,1254],{"class":958}," \u003C",[944,1256,1257],{"class":1058},"CHANNEL_UUI",[944,1259,1260],{"class":954},"D",[944,1262,1263],{"class":958},">",[944,1265,1208],{"class":1058},[944,1267,1254],{"class":958},[944,1269,1270],{"class":1058},"AGENT_HE",[944,1272,1273],{"class":954},"X",[944,1275,1263],{"class":958},[944,1277,1278],{"class":1058}," --role",[944,1280,1281],{"class":1058}," member\n",[463,1283],{"description":1284,"image":466,"image-alt":467,"label":1285,"min-read":1286,"title":1287,"to":1288},"手把手教您安裝與設定 buzz-cli，以便在 Nostr 中繼伺服器上管理頻道、成員金鑰以及 AI 智能體的角色權限。","CLI 指南","5","如何安裝並使用 buzz-cli","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#install-buzz-cli",[430,1290,1291,1292,1294],{},"隨後可透過 ",[494,1293,1220],{}," 靈活更新 DSH 助理在 Nostr 中繼伺服器中的公開設定檔，設定更具識別度的暱稱：",[430,1296,1297],{},[433,1298],{"alt":1299,"src":1300},"使用 buzz-cli 命令列工具更新 DSH 助理在 Nostr 中繼伺服器上的公開個人資料","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-assistant-buzz-cli-profile-update.webp",[430,1302,1303,1304,1307],{},"在用戶端向 DSH 助理傳送一次 ",[441,1305,1306],{},"Wave","（Buzz 平台獨特的 DM 私訊打招呼動作）。助理隨後傳回回覆，代表閘道通訊已完全就緒：",[430,1309,1310],{},[433,1311],{"alt":1312,"src":1313},"在 Buzz 用戶端向 DeepSeek Harness 助理傳送 Wave 私訊進行連線性驗證","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-dm-wave-greeting-reply.webp",[430,1315,1316],{},[911,1317,1318],{},"向 DSH 助理傳送 Wave 私訊打招呼 — 橋接閘道正常秒級回應。",[892,1320,1322,1323,1326],{"id":1321},"透過-workspace-指令開啟本地工作區聯動","透過 ",[494,1324,1325],{},"\u002Fworkspace"," 指令開啟本地工作區聯動",[430,1328,1329,1330,1333,1334,1337,1338,1340],{},"由於 ",[494,1331,1332],{},"allowWorkspace"," 設定項目出於環境安全考量預設處於停用（",[494,1335,1336],{},"false","）狀態，未經設定直接向助理發送 ",[494,1339,1325],{}," 命令會被系統攔截拒絕：",[430,1342,1343],{},[433,1344],{"alt":1345,"src":1346},"在未開啟 allowWorkspace 權限時發送 \u002Fworkspace 命令被系統安全攔截的提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-rejected-error.webp",[430,1348,1349,1350,1353,1354,1356],{},"開啟設定檔 ",[494,1351,1352],{},"~\u002F.dsh\u002Fprofiles\u002Fweb\u002Fcordis.patch.yml"," 新增開關設定，隨後重新啟動 ",[494,1355,590],{}," 服務即可：",[936,1358,1362],{"className":1359,"code":1360,"language":1361,"meta":425,"style":425},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- id: ui-message-gateway\n  config:\n    allowWorkspace: true\n","yml",[494,1363,1364,1379,1387],{"__ignoreMap":425},[944,1365,1366,1369,1373,1376],{"class":946,"line":947},[944,1367,1368],{"class":958},"-",[944,1370,1372],{"class":1371},"swJcz"," id",[944,1374,1375],{"class":958},":",[944,1377,1378],{"class":1058}," ui-message-gateway\n",[944,1380,1381,1384],{"class":946,"line":1074},[944,1382,1383],{"class":1371},"  config",[944,1385,1386],{"class":958},":\n",[944,1388,1389,1392,1394],{"class":946,"line":1081},[944,1390,1391],{"class":1371},"    allowWorkspace",[944,1393,1375],{"class":958},[944,1395,1397],{"class":1396},"sfNiH"," true\n",[430,1399,1400],{},"設定生效並重新啟動後即可順利綁定：",[430,1402,1403],{},[433,1404],{"alt":1405,"src":1406},"在 Buzz 頻道成功執行 \u002Fworkspace 命令完成本地工作區綁定的確認訊息","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-success-confirmation.webp",[430,1408,1409,1410,1413],{},"實用提示：此命令預設假設工作區目錄名（例如截圖中的 ",[494,1411,1412],{},"TechVoyage","）直接位於當前使用者的個人主目錄之下；若目錄處於其他深層路徑，請務必傳入完整絕對路徑。透過 Buzz 頻道中註冊綁定好的新工作階段，也都會完全同步在 DeepSeek Harness Web 介面上顯示。",[430,1415,1416],{},[433,1417],{"alt":1418,"src":1419},"DeepSeek Harness Web UI 中展示從 Buzz 頻道自動同步關聯的活躍工作階段","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-synced-workspace-session.webp",[892,1421,1423],{"id":1422},"buzz-頻道支援的完整可用指令","Buzz 頻道支援的完整可用指令",[430,1425,1426],{},"其他平台支援的幾乎全部原生功能在 Buzz 中均可順暢運作：",[604,1428,1429,1439],{},[607,1430,1431],{},[610,1432,1433,1436],{},[613,1434,1435],{},"指令語法",[613,1437,1438],{},"功能說明",[622,1440,1441,1451,1461,1471,1481,1491,1501,1511,1521,1545,1565],{},[610,1442,1443,1448],{},[627,1444,1445],{},[494,1446,1447],{},"\u002Fworkspace \u003Cfolder>",[627,1449,1450],{},"將本地已存在的資料夾註冊綁定為當前對話專屬的工作區環境（受設定項目開關保護）",[610,1452,1453,1458],{},[627,1454,1455],{},[494,1456,1457],{},"\u002Fhelp",[627,1459,1460],{},"列印並列出所有支援的命令清單",[610,1462,1463,1468],{},[627,1464,1465],{},[494,1466,1467],{},"\u002Ftime",[627,1469,1470],{},"取得並輸出當前伺服器系統時間",[610,1472,1473,1478],{},[627,1474,1475],{},[494,1476,1477],{},"\u002Fnew",[627,1479,1480],{},"捨棄舊上下文，原地重設開啟全新工作階段",[610,1482,1483,1488],{},[627,1484,1485],{},[494,1486,1487],{},"\u002Fclear",[627,1489,1490],{},"清空當前上下文所有歷史對話串流",[610,1492,1493,1498],{},[627,1494,1495],{},[494,1496,1497],{},"\u002Fstatus",[627,1499,1500],{},"查看當前 Buzz 訊息橋接器的即時在線狀態",[610,1502,1503,1508],{},[627,1504,1505],{},[494,1506,1507],{},"\u002Fstats",[627,1509,1510],{},"查看當前系統活躍工作階段總量及所有接入平台（包含 Buzz）的橋接連線詳細狀態",[610,1512,1513,1518],{},[627,1514,1515],{},[494,1516,1517],{},"\u002Fcommands",[627,1519,1520],{},"輸出全量指令的底層規範與參數描述文件",[610,1522,1523,1528],{},[627,1524,1525],{},[494,1526,1527],{},"@path\u002Fto\u002Ffile",[627,1529,1530,1531,1533,1534,1536,1537,1540,1541,1544],{},"與 Web 端的 ",[494,1532,840],{}," 檔案提及功能完全一致：Agent 自動相對於工作區讀取檔案內容；單獨發送 ",[494,1535,840],{},"、",[494,1538,1539],{},"@前綴"," 或使用 ",[494,1542,1543],{},"\u002Ffiles \u003C前綴>"," 可傳回符合的檔案\u002F資料夾清單",[610,1546,1547,1552],{},[627,1548,1549],{},[494,1550,1551],{},"\u002Fmodel",[627,1553,1554,1557,1558,1560,1561,1564],{},[494,1555,1556],{},"[provider model effort]"," — 驗證有效後即時切換該工作階段的底層推理大型語言模型與思考深度；單獨輸入 ",[494,1559,1551],{}," 顯示支援的候選清單，",[494,1562,1563],{},"\u002Fmodel reset"," 恢復系統預設設定",[610,1566,1567,1572],{},[627,1568,1569],{},[494,1570,1571],{},"\u002Feffort",[627,1573,1574,1577,1578,1581],{},[494,1575,1576],{},"\u003Cid>"," 僅針對支援思考深度的模型調整 reasoning effort；",[494,1579,1580],{},"\u002Feffort reset"," 恢復預設推理深度設定",[892,1583,1584],{"id":1584},"核心安全架構總結",[484,1586,1587,1599,1613],{},[487,1588,1589,1592,1593,1595,1596,1598],{},[441,1590,1591],{},"私密金鑰資產隔離保護","：Agent 專屬的私密金鑰 ",[441,1594,1163],{}," 僅保存在主機的 ",[494,1597,500],{}," 中（0600 檔案唯讀權限，不可部分完成寫入機制） — 永遠不會透過 API 端點對外暴露，也不會印至日常除錯記錄中。",[487,1600,1601,1604,1605,1608,1609,1612],{},[441,1602,1603],{},"全鏈路加密簽章驗章","：每一個入站的 Nostr 事件在投遞給 Agent 執行之前，都會嚴密執行",[441,1606,1607],{},"密碼學數位簽章檢驗","（",[494,1610,1611],{},"verifyEvent","）、訊息防重送判重、自發自收迴圈過濾以及 @提及權限驗證。",[487,1614,1615,1618,1619,1621,1622,1625],{},[441,1616,1617],{},"本地工作區指令受限保護","：由於閘道工作階段預設開啟特權自動核准機制，",[494,1620,1325],{}," 目錄註冊能力預設處於停用狀態，必須由開發者在設定檔中明確開啟（",[494,1623,1624],{},"allowWorkspace: true","），嚴防非預期提權暴露敏感目錄。",[474,1627,1629],{"id":1628},"結語擁抱-buzz-去中心化人機協同時代","結語：擁抱 Buzz 去中心化人機協同時代",[430,1631,1632,1633,1635],{},"在將 Buzz 接入 ",[494,1634,449],{}," 的探索過程中，最大的技術挑戰在於嚴密契合 Nostr 協定的去中心化事件生命週期與事件約束規範。所幸外掛程式本身優秀的架構底座已經將多 Agent 工作階段管理與命令分發高度抽象，一旦建立起可靠的事件監聽與原位串流編輯鏈路，整個橋接閘道便能呈現出超預期的流暢度與生產級穩定性。",[474,1637,1639],{"id":1638},"參考文獻與資料","參考文獻與資料：",[484,1641,1642,1650,1658],{},[487,1643,1644,1649],{},[444,1645,1648],{"href":1646,"rel":1647},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture.md",[448],"dsh-message-gateway architecture guide"," — 官方閘道架構指南、擴充實踐與安全規範",[487,1651,1652,1657],{},[444,1653,1656],{"href":1654,"rel":1655},"https:\u002F\u002Fgithub.com\u002Fnbd-wtf\u002Fnostr-tools",[448],"nostr-tools"," — 底層呼叫的核心 Nostr JavaScript 用戶端程式庫",[487,1659,1660,1665],{},[444,1661,1664],{"href":1662,"rel":1663},"https:\u002F\u002Fgithub.com\u002Fbytedance\u002Fdeer-flow\u002Fblob\u002Fmain\u002Fbackend\u002Fdocs\u002FIM_CHANNEL_CONNECTIONS.md",[448],"deer-flow IM channel connections"," — 即時通訊平台多通道連線架構設計參考",[1667,1668,1669],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":425,"searchDepth":1074,"depth":1081,"links":1671},[1672,1673,1677,1684,1685],{"id":476,"depth":1074,"text":477},{"id":594,"depth":1074,"text":595,"children":1674},[1675,1676],{"id":894,"depth":1081,"text":895},{"id":922,"depth":1081,"text":923},{"id":1037,"depth":1074,"text":1037,"children":1678},[1679,1680,1682,1683],{"id":1170,"depth":1081,"text":1171},{"id":1321,"depth":1081,"text":1681},"透過 \u002Fworkspace 指令開啟本地工作區聯動",{"id":1422,"depth":1081,"text":1423},{"id":1584,"depth":1081,"text":1584},{"id":1628,"depth":1074,"text":1629},{"id":1638,"depth":1074,"text":1639},[1687,1688,1243,1689],"ai-agents","collaboration","deepseek-harness","2026-09-30","深入解析如何透過 Nostr 協定將 DeepSeek Harness 接入 Block Buzz 協作平台：手把手配置 NIP-42 鑑權認證、基於 40003 事件的原位串流編輯輸出、頻道獨立工作階段管理與本地工作區指令聯動，為開發團隊建構安全可控、開箱即用的人機協同智能體開發環境與全新工作流程。","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002FTW-Bringing-Buzz-to-DeepSeek-Harness.webp","一張高顏值的 16:9 科技質感卡片，具有深藍色與琥珀色調，插圖展示如何為 DeepSeek Harness 接入 Block Buzz 協作平台並構建自託管 Nostr 協定閘道，中央配有高對比度毛玻璃面板與精緻正體中文排版。",{"schemaOrg":1696,"robots":1721,"sitemap":1722},[1697,1699],{"@type":1698,"headline":424,"description":1691,"image":1693},"TechArticle",{"@type":1700,"name":424,"description":1691,"image":1693,"step":1701},"HowTo",[1702,1706,1709,1712,1715,1718],{"@type":1703,"name":1704,"text":1705},"HowToStep","階段一：安裝與啟動訊息閘道外掛程式","執行 dsh plugin add 命令安裝 dsh-message-gateway 並啟動 dsh web 服務。",{"@type":1703,"name":1707,"text":1708},"階段二：存取 Message platforms 設定中心","透過瀏覽器開啟 DSH Web 介面並巡覽至 Message platforms 功能表。",{"@type":1703,"name":1710,"text":1711},"階段三：設定 Buzz 橋接參數與產生金鑰對","即時產生 Nostr 身分金鑰對，準確填入 Relay URL 與訂閱頻道 UUID 清單。",{"@type":1703,"name":1713,"text":1714},"階段四：將智能體註冊加入 Buzz 中繼伺服器","使用 buzz-admin 命令列工具將 DSH 助理的 npub 公鑰加入中繼成員。",{"@type":1703,"name":1716,"text":1717},"階段五：將智能體加入指定的團隊頻道","使用 buzz-cli 命令列工具將 16 進位 HEX 公鑰加入頻道成員名單。",{"@type":1703,"name":1719,"text":1720},"階段六：開啟本地工作區綁定權限","在 cordis.patch.yml 中開啟 allowWorkspace 設定以允許目錄掛載指令。","index, follow",{"lastmod":1690},14,{"title":1725,"description":1691,"ogTitle":424,"ogDescription":1691,"twitterTitle":424,"twitterDescription":1691},"DeepSeek Harness Buzz 外掛開發：構建 Nostr 協定閘道與即時串流輸出的完整教學","tw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",[601,1115,1728,1729,449],"Nostr","AI智能體",null,"6tP_wMoFaCRxYZzuqtIt-fglvdLziQctY0T6KrEqia4",{"id":1733,"title":1734,"author":425,"body":1735,"category":2624,"date":2626,"description":2627,"extension":1692,"image":2628,"imageAlt":2629,"isPublished":1077,"meta":2630,"minRead":1948,"navigation":1077,"path":255,"seo":2635,"stem":2637,"tags":2638,"updatedAt":2634,"__hash__":2642},"article\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md","教學：使用 Cloudflare WARP 安全地將 Hermes Agent 暴露至私有網路",{"type":427,"value":1736,"toc":2606},[1737,1751,1761,1764,1767,1779,1782,1790,1793,1797,1847,1851,1988,1992,2025,2029,2032,2098,2101,2137,2140,2167,2171,2181,2185,2224,2313,2317,2322,2339,2348,2427,2432,2478,2482,2528,2543,2547,2590,2593,2603],[430,1738,1739,1740,1743,1744,575,1747,1750],{},"當我們希望透過筆記型電腦、平板或手機等其他設備存取 ",[441,1741,1742],{},"Hermes Agent","，同時又不想將其暴露在公共網際網路上時，這往往是一個普遍的挑戰。利用 ",[441,1745,1746],{},"Cloudflare WARP",[441,1748,1749],{},"Cloudflare Zero Trust","，您可以在無需打開任何防火牆入站連接埠的情況下，將其安全地暴露並在全球範圍內進行存取。",[430,1752,1753,1754,1757,1758,1760],{},"如果您之前已經閱讀並遵循了我們的指南 '",[444,1755,1756],{"href":375},"如何在 Linux VPS 上部署 Hermes Agent","'，那麼您應該大約擁有了一個全天候運行的 Hermes Agent。相比於設定傳統 VPN 帶來的繁瑣步驟，我們將使用 ",[441,1759,1746],{}," 用戶端，透過網際網路將 Hermes Agent 暴露到私有網路中。",[474,1762,1763],{"id":1763},"架構解析",[430,1765,1766],{},"此方案涉及的兩個核心組件：",[532,1768,1769,1774],{},[487,1770,1771,1773],{},[441,1772,1749],{},"：Cloudflare 的雲端儀表板，您可以在此定義路由規則和存取策略。",[487,1775,1776,1778],{},[441,1777,1746],{},"：安裝在您的設備（VPS、筆記型電腦、手機）上的用戶端應用程式。它能夠攔截發往私有網路的流量，並安全地進行路由。",[892,1780,1781],{"id":1781},"前置條件",[484,1783,1784,1787],{},[487,1785,1786],{},"一台已經運行 Hermes Agent 的 VPS（虛擬專屬伺服器）。",[487,1788,1789],{},"一個免費的 Cloudflare 帳號。",[474,1791,1792],{"id":1792},"詳細步驟指南",[892,1794,1796],{"id":1795},"第-1-步設定-cloudflare-zero-trust","第 1 步：設定 Cloudflare Zero Trust",[532,1798,1799,1808,1815,1826,1833,1840],{},[487,1800,1801,1802,1807],{},"登入您的 ",[444,1803,1806],{"href":1804,"rel":1805},"https:\u002F\u002Fdash.cloudflare.com\u002F",[448],"Cloudflare 儀表板 (Dashboard)","。",[487,1809,1810,1811],{},"點擊左側選單欄中的 'Zero Trust'。\n",[433,1812],{"alt":1813,"src":1814},"Cloudflare 儀表板左側側邊欄導覽選單中的 Zero Trust 選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[487,1816,1817,1818,1821,1822],{},"如果這是您第一次使用，系統會提示您選擇方案（免費版對本教學完全足夠）並為您的團隊命名（例如，",[494,1819,1820],{},"ai-team","）。\n",[433,1823],{"alt":1824,"src":1825},"首次設定 Cloudflare Zero Trust 帳戶並為團隊命名","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[487,1827,1828,1829],{},"點擊 'Access'，然后點擊 'Policies' 來建立存取策略，以定義誰有權限存取網路。\n",[433,1830],{"alt":1831,"src":1832},"Cloudflare Zero Trust Access 策略頁面，顯示新設定的存取規則","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[487,1834,1835,1836],{},"點击 'Create new policy'。\n",[433,1837],{"alt":1838,"src":1839},"Cloudflare Access policies page showing no policies added and a button to create a new policy.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.png",[487,1841,1842,1843],{},"選擇 'Emails' 並在 'Policy rules' 下方輸入您的電子郵件地址。\n",[433,1844],{"alt":1845,"src":1846},"Cloudflare Access policy rule configuration screen with an email address specified as the inclusion criteria.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-email.png",[892,1848,1850],{"id":1849},"第-2-步在-vps-上設定-cloudflare-warp-用戶端","第 2 步：在 VPS 上設定 Cloudflare WARP 用戶端",[532,1852,1853,1863,1869,1876,1879,1894,1897,1981],{},[487,1854,1855,1856,1859,1860,1807],{},"在 VPS 終端機中執行 ",[494,1857,1858],{},"sudo apt update"," 和 ",[494,1861,1862],{},"sudo apt install cloudflare-warp",[487,1864,1855,1865,1868],{},[494,1866,1867],{},"warp-cli registration new \u003CTEAM-NAME>","，該指令將輸出一個 URL。",[487,1870,1871,1872,1875],{},"複製輸出的 URL（其格式類似於 ",[494,1873,1874],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp","），並將其貼上到瀏覽器中進行認證。",[487,1877,1878],{},"由於前面的策略設定中使用了電子郵件認證，請輸入您的電子郵件以進行認證。",[487,1880,1881,1882,1885,1886,1889,1890,1893],{},"當瀏覽器中顯示 '",[441,1883,1884],{},"Success","' 頁面後，右鍵點擊藍色的 '",[441,1887,1888],{},"Open Cloudflare WARP","' 按鈕並選擇「",[441,1891,1892],{},"檢查 (Inspect)","」。",[487,1895,1896],{},"複製該按鈕連結中的長 Token 字串。",[487,1898,1855,1899,1902,1903,1906,1907],{},[494,1900,1901],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"","，將您的 VPS 連接到 Cloudflare Zero Trust。",[1904,1905],"br",{},"如果在 Ubuntu 26 上遇到 'Error: Failed to communicate with the WARP API'，請執行以下命令：",[936,1908,1910],{"className":1045,"code":1909,"language":1047,"meta":425,"style":425},"sudo systemctl restart warp-svc.service\n\n# Check status\nsudo systemctl status warp-svc.service\n\n# Run the warp-cli registration token again\nwarp-cli --accept-tos registration token   \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"\n",[494,1911,1912,1926,1930,1935,1946,1951,1957],{"__ignoreMap":425},[944,1913,1914,1917,1920,1923],{"class":946,"line":947},[944,1915,1916],{"class":1054},"sudo",[944,1918,1919],{"class":1058}," systemctl",[944,1921,1922],{"class":1058}," restart",[944,1924,1925],{"class":1058}," warp-svc.service\n",[944,1927,1928],{"class":946,"line":1074},[944,1929,1078],{"emptyLinePlaceholder":1077},[944,1931,1932],{"class":946,"line":1081},[944,1933,1934],{"class":1084},"# Check status\n",[944,1936,1937,1939,1941,1944],{"class":946,"line":1088},[944,1938,1916],{"class":1054},[944,1940,1919],{"class":1058},[944,1942,1943],{"class":1058}," status",[944,1945,1925],{"class":1058},[944,1947,1949],{"class":946,"line":1948},5,[944,1950,1078],{"emptyLinePlaceholder":1077},[944,1952,1954],{"class":946,"line":1953},6,[944,1955,1956],{"class":1084},"# Run the warp-cli registration token again\n",[944,1958,1960,1963,1966,1969,1972,1975,1978],{"class":946,"line":1959},7,[944,1961,1962],{"class":1054},"warp-cli",[944,1964,1965],{"class":1058}," --accept-tos",[944,1967,1968],{"class":1058}," registration",[944,1970,1971],{"class":1058}," token",[944,1973,1974],{"class":958},"   \"",[944,1976,1977],{"class":1058},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[944,1979,1980],{"class":958},"\"\n",[487,1982,1983,1984],{},"回到 Cloudflare Zero Trust 儀表板，點擊 'Devices'。您現在應該能看到您的 VPS 設備。\n",[433,1985],{"alt":1986,"src":1987},"Zero Trust 設備儀表板，確認 Linux VPS 已成功連線","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-devices-vps-connected.webp",[892,1989,1991],{"id":1990},"第-3-步設定流量路由","第 3 步：設定流量路由",[532,1993,1994,2001,2008,2015],{},[487,1995,1996,1997],{},"在 Devices 儀表板中點擊您 VPS 設備的設定檔。\n",[433,1998],{"alt":1999,"src":2000},"存取已登冊 VPS 設備的詳細資訊與分割通道設定","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[487,2002,2003,2004],{},"向下捲動至 'Split Tunnels' 部分。\n",[433,2005],{"alt":2006,"src":2007},"VPS 設備設定檔下的 Split Tunnels 分割通道區段","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-split-tunnels-section.webp",[487,2009,2010,2011],{},"點擊 'Manage' 按鈕，並按照下圖設定。如有需要請替換相應的 IP 位址。\n",[433,2012],{"alt":2013,"src":2014},"在 Cloudflare 設定中管理分割通道 IP 與主機名稱排除規則","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[487,2016,2017,2018,1859,2021,2024],{},"暴露 ",[494,2019,2020],{},"address",[494,2022,2023],{},"host"," 會將發往您服務的流量路由到該私有網路內。",[892,2026,2028],{"id":2027},"第-4-步設定-vps-防火牆","第 4 步：設定 VPS 防火牆",[430,2030,2031],{},"啟用防火牆，僅允許 '100.96.0.0\u002F12' 子網的流量通過，並阻擋其他所有公共入站存取。",[936,2033,2035],{"className":1045,"code":2034,"language":1047,"meta":425,"style":425},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[494,2036,2037,2050,2067,2081],{"__ignoreMap":425},[944,2038,2039,2041,2044,2047],{"class":946,"line":947},[944,2040,1916],{"class":1054},[944,2042,2043],{"class":1058}," ufw",[944,2045,2046],{"class":1058}," enable",[944,2048,2049],{"class":954}," \n",[944,2051,2052,2054,2056,2059,2062,2065],{"class":946,"line":1074},[944,2053,1916],{"class":1054},[944,2055,2043],{"class":1058},[944,2057,2058],{"class":1058}," default",[944,2060,2061],{"class":1058}," allow",[944,2063,2064],{"class":1058}," outgoing",[944,2066,2049],{"class":954},[944,2068,2069,2071,2073,2075,2078],{"class":946,"line":1081},[944,2070,1916],{"class":1054},[944,2072,2043],{"class":1058},[944,2074,2058],{"class":1058},[944,2076,2077],{"class":1058}," deny",[944,2079,2080],{"class":1058}," incoming\n",[944,2082,2083,2085,2087,2089,2092,2095],{"class":946,"line":1088},[944,2084,1916],{"class":1054},[944,2086,2043],{"class":1058},[944,2088,2061],{"class":1058},[944,2090,2091],{"class":1058}," in",[944,2093,2094],{"class":1058}," from",[944,2096,2097],{"class":1058}," 100.96.0.0\u002F12\n",[430,2099,2100],{},"允許回環網路 (loopback) 的流量，避免導致本地服務異常：",[936,2102,2104],{"className":1045,"code":2103,"language":1047,"meta":425,"style":425},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[494,2105,2106,2122],{"__ignoreMap":425},[944,2107,2108,2110,2112,2114,2116,2119],{"class":946,"line":947},[944,2109,1916],{"class":1054},[944,2111,2043],{"class":1058},[944,2113,2061],{"class":1058},[944,2115,2091],{"class":1058},[944,2117,2118],{"class":1058}," on",[944,2120,2121],{"class":1058}," lo\n",[944,2123,2124,2126,2128,2130,2133,2135],{"class":946,"line":1074},[944,2125,1916],{"class":1054},[944,2127,2043],{"class":1058},[944,2129,2061],{"class":1058},[944,2131,2132],{"class":1058}," out",[944,2134,2118],{"class":1058},[944,2136,2121],{"class":1058},[430,2138,2139],{},"重新載入防火牆規則並驗證狀態：",[936,2141,2143],{"className":1045,"code":2142,"language":1047,"meta":425,"style":425},"sudo ufw reload \nsudo ufw status verbose\n",[494,2144,2145,2156],{"__ignoreMap":425},[944,2146,2147,2149,2151,2154],{"class":946,"line":947},[944,2148,1916],{"class":1054},[944,2150,2043],{"class":1058},[944,2152,2153],{"class":1058}," reload",[944,2155,2049],{"class":954},[944,2157,2158,2160,2162,2164],{"class":946,"line":1074},[944,2159,1916],{"class":1054},[944,2161,2043],{"class":1058},[944,2163,1943],{"class":1058},[944,2165,2166],{"class":1058}," verbose\n",[892,2168,2170],{"id":2169},"第-5-步將-hermes-agent-暴露至私有網路","第 5 步：將 Hermes Agent 暴露至私有網路",[430,2172,2173,2174,2177,2178,1807],{},"我們將把 ",[441,2175,2176],{},"Hermes Agent Web Dashboard"," 暴露至私有網路，並使用預設的認證提供商 ",[441,2179,2180],{},"Nous Research",[2182,2183,2184],"h4",{"id":2184},"設定認證提供商",[532,2186,2187,2196,2203,2210,2217],{},[487,2188,2189,2190,2195],{},"前往 ",[444,2191,2194],{"href":2192,"rel":2193},"https:\u002F\u002Fportal.nousresearch.com",[448],"portal.nousresearch.com"," 註冊一個帳號。",[487,2197,2198,2199],{},"選擇 'Local Dashboards'。\n",[433,2200],{"alt":2201,"src":2202},"在 Nous Research 入口網站中選擇 Local Dashboards 本地儀表板選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-local-dashboards-selection.webp",[487,2204,2205,2206],{},"點擊 'Register Dashboard'。\n",[433,2207],{"alt":2208,"src":2209},"點擊 Register Dashboard 按鈕以建立新的儀表板項目","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[487,2211,2212,2213],{},"將 VPS 在私有網路中的 IP 位址填入 'Dashboard redirect URI' 並點擊 'Save'。\n",[433,2214],{"alt":2215,"src":2216},"在 Nous Research 入口網站中註冊私有網路 VPS IP 位址作為重新導向 URI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-redirect-uri.webp",[487,2218,2219,2220,2223],{},"複製 'OAuth client ID' 並將其貼上到您的 ",[494,2221,2222],{},"config.yaml"," 檔案中：",[936,2225,2229],{"className":2226,"code":2227,"language":2228,"meta":425,"style":425},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dashboard:\n  theme: default\n  show_token_analytics: false\n  oauth:\n    client_id: agent:cmq02x7ha0002jk0ba3kfnb\n    portal_url: https:\u002F\u002Fportal.nousresearch.com\n  basic_auth:\n    username: ''\n    password_hash: ''\n","yaml",[494,2230,2231,2238,2248,2258,2265,2275,2285,2292,2303],{"__ignoreMap":425},[944,2232,2233,2236],{"class":946,"line":947},[944,2234,2235],{"class":1371},"dashboard",[944,2237,1386],{"class":958},[944,2239,2240,2243,2245],{"class":946,"line":1074},[944,2241,2242],{"class":1371},"  theme",[944,2244,1375],{"class":958},[944,2246,2247],{"class":1058}," default\n",[944,2249,2250,2253,2255],{"class":946,"line":1081},[944,2251,2252],{"class":1371},"  show_token_analytics",[944,2254,1375],{"class":958},[944,2256,2257],{"class":1396}," false\n",[944,2259,2260,2263],{"class":946,"line":1088},[944,2261,2262],{"class":1371},"  oauth",[944,2264,1386],{"class":958},[944,2266,2267,2270,2272],{"class":946,"line":1948},[944,2268,2269],{"class":1371},"    client_id",[944,2271,1375],{"class":958},[944,2273,2274],{"class":1058}," agent:cmq02x7ha0002jk0ba3kfnb\n",[944,2276,2277,2280,2282],{"class":946,"line":1953},[944,2278,2279],{"class":1371},"    portal_url",[944,2281,1375],{"class":958},[944,2283,2284],{"class":1058}," https:\u002F\u002Fportal.nousresearch.com\n",[944,2286,2287,2290],{"class":946,"line":1959},[944,2288,2289],{"class":1371},"  basic_auth",[944,2291,1386],{"class":958},[944,2293,2295,2298,2300],{"class":946,"line":2294},8,[944,2296,2297],{"class":1371},"    username",[944,2299,1375],{"class":958},[944,2301,2302],{"class":958}," ''\n",[944,2304,2306,2309,2311],{"class":946,"line":2305},9,[944,2307,2308],{"class":1371},"    password_hash",[944,2310,1375],{"class":958},[944,2312,2302],{"class":958},[2182,2314,2316],{"id":2315},"使用-systemd-確保-hermes-dashboard-開機自啟","使用 Systemd 確保 Hermes Dashboard 開機自啟",[532,2318,2319],{},[487,2320,2321],{},"建立服務檔案：",[936,2323,2327],{"className":2324,"code":2325,"language":2326,"meta":425,"style":425},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[494,2328,2329],{"__ignoreMap":425},[944,2330,2331,2333,2336],{"class":946,"line":947},[944,2332,1916],{"class":1054},[944,2334,2335],{"class":1058}," nano",[944,2337,2338],{"class":1058}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[532,2340,2341],{"start":1074},[487,2342,2343,2344,2347],{},"貼上以下設定，確保 ",[494,2345,2346],{},"--host 0.0.0.0"," 包含在指令中：",[936,2349,2353],{"className":2350,"code":2351,"language":2352,"meta":425,"style":425},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Hermes Dashboard\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n","ini",[494,2354,2355,2360,2365,2370,2374,2379,2384,2389,2394,2399,2405,2411,2416,2422],{"__ignoreMap":425},[944,2356,2357],{"class":946,"line":947},[944,2358,2359],{},"[Unit]\n",[944,2361,2362],{"class":946,"line":1074},[944,2363,2364],{},"Description=Hermes Dashboard\n",[944,2366,2367],{"class":946,"line":1081},[944,2368,2369],{},"After=network.target\n",[944,2371,2372],{"class":946,"line":1088},[944,2373,1078],{"emptyLinePlaceholder":1077},[944,2375,2376],{"class":946,"line":1948},[944,2377,2378],{},"[Service]\n",[944,2380,2381],{"class":946,"line":1953},[944,2382,2383],{},"User=hermes\n",[944,2385,2386],{"class":946,"line":1959},[944,2387,2388],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[944,2390,2391],{"class":946,"line":2294},[944,2392,2393],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[944,2395,2396],{"class":946,"line":2305},[944,2397,2398],{},"Restart=always\n",[944,2400,2402],{"class":946,"line":2401},10,[944,2403,2404],{},"RestartSec=10\n",[944,2406,2408],{"class":946,"line":2407},11,[944,2409,2410],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[944,2412,2414],{"class":946,"line":2413},12,[944,2415,1078],{"emptyLinePlaceholder":1077},[944,2417,2419],{"class":946,"line":2418},13,[944,2420,2421],{},"[Install]\n",[944,2423,2424],{"class":946,"line":1723},[944,2425,2426],{},"WantedBy=multi-user.target\n",[532,2428,2429],{"start":1081},[487,2430,2431],{},"啟用並啟動服务：",[936,2433,2435],{"className":2324,"code":2434,"language":2326,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[494,2436,2437,2446,2457,2468],{"__ignoreMap":425},[944,2438,2439,2441,2443],{"class":946,"line":947},[944,2440,1916],{"class":1054},[944,2442,1919],{"class":1058},[944,2444,2445],{"class":1058}," daemon-reload\n",[944,2447,2448,2450,2452,2454],{"class":946,"line":1074},[944,2449,1916],{"class":1054},[944,2451,1919],{"class":1058},[944,2453,2046],{"class":1058},[944,2455,2456],{"class":1058}," hermes-dashboard\n",[944,2458,2459,2461,2463,2466],{"class":946,"line":1081},[944,2460,1916],{"class":1054},[944,2462,1919],{"class":1058},[944,2464,2465],{"class":1058}," start",[944,2467,2456],{"class":1058},[944,2469,2470,2472,2474,2476],{"class":946,"line":1088},[944,2471,1916],{"class":1054},[944,2473,1919],{"class":1058},[944,2475,1943],{"class":1058},[944,2477,2456],{"class":1058},[892,2479,2481],{"id":2480},"第-6-步在桌面上安裝-cloudflare-warp-用戶端","第 6 步：在桌面上安裝 Cloudflare WARP 用戶端",[532,2483,2484,2493,2496,2503,2510,2517],{},[487,2485,2486,2487,2492],{},"從 ",[444,2488,2491],{"href":2489,"rel":2490},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[448],"Cloudflare 官網"," 下載 Cloudflare WARP 用戶端。",[487,2494,2495],{},"安裝完成後打開並執行 Cloudflare WARP 用戶端。",[487,2497,2498,2499],{},"依提示登入。\n",[433,2500],{"alt":2501,"src":2502},"桌上型電腦上的 Cloudflare WARP 用戶端登入提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[487,2504,2505,2506],{},"登入成功後會顯示 'Success' 頁面。\n",[433,2507],{"alt":2508,"src":2509},"在桌上型電腦登入 Cloudflare Zero Trust 後的驗證成功網頁","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[487,2511,2512,2513],{},"此時 WARP 用戶端應顯示已連接至您的 Zero Trust 团队。\n",[433,2514],{"alt":2515,"src":2516},"桌面版 Cloudflare WARP 用戶端確認已連線至 Zero Trust 私有網路","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-client-connected.webp",[487,2518,2519,2520,2523,2524],{},"在瀏覽器中輸入您的私有 IP 位址（例如 ",[494,2521,2522],{},"100.96.0.3","），即可成功載入 Hermes Web Dashboard。\n",[433,2525],{"alt":2526,"src":2527},"在桌面瀏覽器中存取私有 Hermes Agent 網頁儀表板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[2529,2530,2531],"blockquote",{},[430,2532,2533,2536,2537,2542],{},[441,2534,2535],{},"macOS 用戶進階提示："," 如果您需要使用 WARP 用戶端存取多個 Cloudflare 帳號，請參閱我們的快速指南 ",[441,2538,2539],{},[444,2540,2541],{"href":399},"使用MDM設定檔在macOS上無縫切換與設定多個Cloudflare WARP零信任組織的完整教學指南","，實現帳號間的無縫切換。",[892,2544,2546],{"id":2545},"第-7-步在-ios-設備上安裝-cloudflare-warp-用戶端","第 7 步：在 iOS 設備上安裝 Cloudflare WARP 用戶端",[532,2548,2549,2555,2563,2571,2579],{},[487,2550,2551,2552,1807],{},"在 App Store 中安裝 ",[441,2553,2554],{},"Cloudflare One",[487,2556,2557,2558],{},"打開 Cloudflare One 應用程式並在提示時輸入您的團隊名稱。\n",[433,2559],{"alt":2560,"src":2561,"width":2562},"在 iOS 上的 Cloudflare One 應用程式中輸入 Cloudflare Zero Trust 團隊名稱","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-team-name-prompt.webp",239,[487,2564,2565,2566],{},"使用前面在策略規則中設定的同一個電子郵件地址進行登入。\n",[433,2567],{"alt":2568,"src":2569,"width":2570},"iOS 上的 Cloudflare Zero Trust 電子郵件驗證提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-email-login.webp",229,[487,2572,2573,2574],{},"連接成功後，介面應如下所示：\n",[433,2575],{"alt":2576,"src":2577,"width":2578},"iOS 行動設備上 Cloudflare One 應用程式顯示的已連線狀態","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-client-connected.webp",322,[487,2580,2581,2582,2584,2585],{},"在手機瀏覽器中輸入私有 IP ",[494,2583,2522],{}," 即可在行動設備上存取 Hermes Web Dashboard。\n",[433,2586],{"alt":2587,"src":2588,"width":2589},"在手機瀏覽器上存取 Hermes Agent 網頁儀表板介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[474,2591,2592],{"id":2592},"結語",[430,2594,2595,2596,2598,2599,2602],{},"藉助 ",[441,2597,1749],{}," 管理身分策略以及 ",[441,2600,2601],{},"WARP"," 用戶端透過加密隧道路由流量，您的 Hermes Agent 現在可以被您的設備在全球範圍內安全存取。該配置為構建並存取完全遠端、私有的 AI 基礎架構奠定了堅實而安全的根基。",[1667,2604,2605],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":425,"searchDepth":1074,"depth":1081,"links":2607},[2608,2611,2623],{"id":1763,"depth":1074,"text":1763,"children":2609},[2610],{"id":1781,"depth":1081,"text":1781},{"id":1792,"depth":1074,"text":1792,"children":2612},[2613,2614,2615,2616,2617,2621,2622],{"id":1795,"depth":1081,"text":1796},{"id":1849,"depth":1081,"text":1850},{"id":1990,"depth":1081,"text":1991},{"id":2027,"depth":1081,"text":2028},{"id":2169,"depth":1081,"text":2170,"children":2618},[2619,2620],{"id":2184,"depth":1088,"text":2184},{"id":2315,"depth":1088,"text":2316},{"id":2480,"depth":1081,"text":2481},{"id":2545,"depth":1081,"text":2546},{"id":2592,"depth":1074,"text":2592},[1687,2625],"security","2026-07-09","本文深入探討如何使用 Cloudflare WARP 與 Zero Trust 技術，在完全不需要開啟任何防火牆入站連接埠的情況下，安全地將您的 Hermes Agent 暴露到私有網路中，從而實現全球範圍內的安全存取。這為您構建專屬私有遠端 AI 基礎架構打下堅實基礎。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FTW-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","透過 Cloudflare Zero Trust 和 WARP 隧道安全地將 Hermes Agent 暴露至私有網路",{"schemaOrg":2631,"robots":1721,"sitemap":2633},[2632],{"@type":1700,"headline":1734,"description":2627,"name":1734,"image":2628},{"lastmod":2634},"2026-09-28",{"title":2636,"description":2627,"ogTitle":1734,"ogDescription":2627,"twitterTitle":1734,"twitterDescription":2627},"透過 Cloudflare Zero Trust 實現對 Hermes Agent 的安全存取","tw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[1746,2639,1742,2640,2641],"Zero Trust","私有網路","教學","HTGJ42xrWk07SDM4iYiDvZunbYRe0lOzZcsR2BGh8No",{"id":2644,"title":2645,"author":425,"body":2646,"category":4079,"date":4081,"description":4082,"extension":1692,"image":4083,"imageAlt":4084,"isPublished":1077,"meta":4085,"minRead":2294,"navigation":1077,"path":271,"seo":4092,"stem":4094,"tags":4095,"updatedAt":1730,"__hash__":4099},"article\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices.md","如何在多台裝置之間安全地同步 Obsidian 本地筆記庫",{"type":427,"value":2647,"toc":4057},[2648,2651,2656,2665,2674,2691,2696,2704,2708,2713,2727,2743,2746,2750,2753,2760,2765,2769,2773,2830,2838,2870,2874,2881,2887,2894,2956,2959,2976,2983,2995,2999,3003,3010,3015,3026,3047,3052,3065,3070,3075,3080,3095,3098,3103,3106,3111,3115,3120,3134,3138,3152,3162,3166,3171,3175,3182,3215,3219,3225,3367,3401,3407,3428,3439,3444,3448,3463,3534,3538,3543,3578,3709,3716,3722,3729,3735,3738,3744,3751,3766,3777,3784,3790,3801,3930,3936,3941,3944,3949,3952,3956,3962,3967,3973,3984,3994,3998,4009,4015,4021,4027,4031,4054],[430,2649,2650],{},"Obsidian 是一款本地優先的知識管理應用。每一個筆記在裝置上都是一個本地 Markdown 檔案，並完全處於您的掌控之中。然而，我們通常希望在筆記型電腦、手機和其他裝置上共享同一個本地筆記庫，或者希望在某些時候能夠透過網頁瀏覽器遠端存取它。",[433,2652],{"src":2653,"alt":2654,"style":2655},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-multi-device-sync-illustration.webp","跨多裝置同步的 Obsidian 本地筆記庫的插圖","max-width: 667px; width: 100%; height: auto;",[430,2657,2658,2659,2664],{},"市面上有許多針對 Obsidian 的同步方案，但在衝突處理、加密和數據自主權方面，它們或多或少都做出了一些妥協。",[444,2660,2663],{"href":2661,"rel":2662},"https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch",[448],"Synch"," 是一款開源應用，它可以在自建伺服器上實現具備端到端加密和衝突解決機制的 Obsidian 筆記庫同步。",[430,2666,2667,2668,2673],{},"雖然 Obsidian 的本地優先方案在絕大多數情况下都能完美運作，但在某些場景下，我們可能仍需要透過網頁瀏覽器遠端存取並編輯筆記。",[444,2669,2672],{"href":2670,"rel":2671},"https:\u002F\u002Fgithub.com\u002FNystik-gh\u002Fignis",[448],"Ignis"," 是一款開源應用，它能夠讓網頁瀏覽器中以接近原生的體驗執行 Obsidian，讓您能够直接讀取和編輯筆記庫。",[430,2675,2676,2677,2680,2681,1859,2683,2685,2686,2690],{},"在本文中，我們將在一台 ",[441,2678,2679],{},"VPS","（虛擬專用伺服器）上部署 ",[441,2682,2663],{},[441,2684,2672],{},"，並將它們安全地託管在 ",[441,2687,2688],{},[444,2689,1749],{"href":363}," 私有網路中，而無需將它們直接暴露在公網上。",[433,2692],{"src":2693,"alt":2694,"style":2695},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-sync-cloudflare-zero-trust-architecture.webp","使用 Cloudflare Zero Trust 安全網路同步 Obsidian 的架構圖","max-width: 671px; width: 100%; height: auto;",[463,2697],{"description":2698,"image":2699,"image-alt":2700,"label":2701,"min-read":2702,"title":2703,"to":363},"學習如何使用 Cloudflare WARP 和 Zero Trust 安全地在全網範圍內暴露和存取您的 Hermes Agent，而無需在防火牆上開啟任何入站連接埠。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FEN-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","使用 Cloudflare Zero Trust 和 WARP 隧道安全地將 Hermes Agent 暴露到私有網路中","相關指南","8","如何使用 Cloudflare WARP 私密地公開暴露 Hermes Agent",[474,2705,2707],{"id":2706},"使用-synch-安全同步-obsidian-筆記庫","使用 Synch 安全同步 Obsidian 筆記庫",[430,2709,2710,2712],{},[441,2711,2663],{}," 提供以下特性：",[484,2714,2715,2718,2721,2724],{},[487,2716,2717],{},"偵測到變更時立即即時同步您的筆記庫",[487,2719,2720],{},"並在上傳前對筆記庫資料進行端到端加密",[487,2722,2723],{},"支援從歷史版本記錄中進行復原",[487,2725,2726],{},"內建自動衝突解決機制",[430,2728,2729,2731,2732,2735,2736,2739,2740,2742],{},[441,2730,2663],{}," 會在您的本地裝置上生成一個隨機的 32 位元組",[441,2733,2734],{},"筆記庫金鑰","（Vault Key），該金鑰專門用於加密您的筆記庫資料。當您建立遠端筆記庫時，您需要設定一個",[441,2737,2738],{},"筆記庫密碼","。該密碼用於保護您的",[441,2741,2734],{},"，以便能夠將金鑰安全地儲存在伺服器上，並在其他裝置上進行解密。",[430,2744,2745],{},"筆記的衝突解決是在用戶端裝置上完成的，而不是在伺服器端。如果兩台裝置同時編輯同一個筆記，伺服器會保留最先到達的版本，並通知另一台裝置其本地版本已過期。隨後，該裝置會自動將伺服器上的最新版本與其本地變更進行合併，然後再將合併後的最終筆記上傳。",[892,2747,2749],{"id":2748},"在您的-vps-上部署-synch","在您的 VPS 上部署 Synch",[2182,2751,2752],{"id":2752},"建立網域名稱解析",[430,2754,2755,2756,2759],{},"在 Cloudflare 中建立一條 A 記錄，並將其代理狀態設定為",[441,2757,2758],{},"僅限 DNS","（繞過 Cloudflare CDN）。",[433,2761],{"src":2762,"alt":2763,"style":2764},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-synch-server.webp","在 Cloudflare 中為 Synch 同步伺服器設定 DNS A 記錄","max-width: 538px; width: 100%; height: auto;",[2182,2766,2768],{"id":2767},"在-ubuntu-上使用-docker-安裝-synch","在 Ubuntu 上使用 Docker 安裝 Synch",[2770,2771,2772],"h5",{"id":2772},"克隆倉庫",[936,2774,2776],{"className":1045,"code":2775,"language":1047,"meta":425,"style":425},"git clone https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git       \n        \n# Navigate to the API folder\ncd synch\u002Fapps\u002Fapi\n        \n# Copy the example environment file:\ncp .env.example .env\n",[494,2777,2778,2792,2797,2802,2810,2814,2819],{"__ignoreMap":425},[944,2779,2780,2783,2786,2789],{"class":946,"line":947},[944,2781,2782],{"class":1054},"git",[944,2784,2785],{"class":1058}," clone",[944,2787,2788],{"class":1058}," https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git",[944,2790,2791],{"class":954},"       \n",[944,2793,2794],{"class":946,"line":1074},[944,2795,2796],{"class":954},"        \n",[944,2798,2799],{"class":946,"line":1081},[944,2800,2801],{"class":1084},"# Navigate to the API folder\n",[944,2803,2804,2807],{"class":946,"line":1088},[944,2805,2806],{"class":976},"cd",[944,2808,2809],{"class":1058}," synch\u002Fapps\u002Fapi\n",[944,2811,2812],{"class":946,"line":1948},[944,2813,2796],{"class":954},[944,2815,2816],{"class":946,"line":1953},[944,2817,2818],{"class":1084},"# Copy the example environment file:\n",[944,2820,2821,2824,2827],{"class":946,"line":1959},[944,2822,2823],{"class":1054},"cp",[944,2825,2826],{"class":1058}," .env.example",[944,2828,2829],{"class":1058}," .env\n",[2770,2831,2833,2834,2837],{"id":2832},"編輯-env-變數","編輯 ",[494,2835,2836],{},".env"," 變數",[484,2839,2840,2846,2864],{},[487,2841,2842,2845],{},[494,2843,2844],{},"PUBLIC_URL=synch.pafor.me","：輸入您的 Synch 伺服器公网網域名稱（即在上一步中建立的網域名称）。",[487,2847,2848,1859,2851,2854,2855,2859,2860,2863],{},[494,2849,2850],{},"BETTER_AUTH_SECRET",[494,2852,2853],{},"SYNC_TOKEN_SECRET","：請使用此 ",[444,2856,2858],{"href":2857},"\u002Ftw\u002Ftools\u002Fsecret-key-hex","線上金鑰產生工具"," 或在終端機中執行兩次 ",[494,2861,2862],{},"openssl rand -hex 32"," 來產生高強度的隨機金鑰。",[487,2865,2866,2869],{},[494,2867,2868],{},"AUTH_ALLOWED_EMAILS","：允許註冊並建立帳號的電子信箱列表（用英文逗號分隔）。",[2770,2871,2873],{"id":2872},"将网域添加至-caddyfile","将网域添加至 Caddyfile",[430,2875,2876,2877,1807],{},"有關如何將 Cloudflare DNS 模組整合到 Caddy 中並使用 Docker 容器啟動的詳細設定方法，請參閱我們的 ",[444,2878,2880],{"href":2879},"\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#_4-enable-https-with-caddy","自建 Buzz 協作平台文章",[463,2882],{"description":2883,"image":2884,"image-alt":2885,"label":2886,"min-read":469,"title":455,"to":2879},"學習如何在 Docker 容器中設定 Caddy 反向代理，並利用 Cloudflare DNS Challenge 自動申請和管理 SSL\u002FTLS 憑證。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FEN-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","在自建工作區中設定帶有 Cloudflare DNS API 權杖的 Caddy，實現 SSL\u002FTLS 憑證的自動申請與管理","自建指南",[430,2888,2889,2890,2893],{},"在您的 Caddyfile 中添加 ",[494,2891,2892],{},"SYNCH_DOMAIN"," 設定，並將其反向代理指向 8787 連接埠（Synch 容器內部執行的連接埠）：",[936,2895,2899],{"className":2896,"code":2897,"language":2898,"meta":425,"style":425},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n\n{$SYNCH_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:8787\n}\n","json",[494,2900,2901,2906,2914,2918,2922,2936,2941,2952],{"__ignoreMap":425},[944,2902,2903],{"class":946,"line":947},[944,2904,2905],{"class":958},"{\n",[944,2907,2908,2911],{"class":946,"line":1074},[944,2909,2910],{"class":954},"  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN",[944,2912,2913],{"class":958},"}\n",[944,2915,2916],{"class":946,"line":1081},[944,2917,2913],{"class":954},[944,2919,2920],{"class":946,"line":1088},[944,2921,1078],{"emptyLinePlaceholder":1077},[944,2923,2924,2927,2930,2933],{"class":946,"line":1948},[944,2925,2926],{"class":958},"{",[944,2928,2929],{"class":954},"$SYNCH_DOMAIN",[944,2931,2932],{"class":958},"}",[944,2934,2935],{"class":958}," {\n",[944,2937,2938],{"class":946,"line":1953},[944,2939,2940],{"class":954},"  encode zstd gzip\n",[944,2942,2943,2946,2948],{"class":946,"line":1959},[944,2944,2945],{"class":954},"  reverse_proxy host.docker.internal",[944,2947,1375],{"class":958},[944,2949,2951],{"class":2950},"sbssI","8787\n",[944,2953,2954],{"class":946,"line":2294},[944,2955,2913],{"class":958},[430,2957,2958],{},"啟動容器：",[936,2960,2962],{"className":1045,"code":2961,"language":1047,"meta":425,"style":425},"docker compose up -d\n",[494,2963,2964],{"__ignoreMap":425},[944,2965,2966,2968,2970,2973],{"class":946,"line":947},[944,2967,1190],{"class":1054},[944,2969,1193],{"class":1058},[944,2971,2972],{"class":1058}," up",[944,2974,2975],{"class":1058}," -d\n",[430,2977,2978,2979,2982],{},"執行以下 ",[494,2980,2981],{},"curl"," 命令以驗證服務的可用性：",[936,2984,2986],{"className":1045,"code":2985,"language":1047,"meta":425,"style":425},"curl https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[494,2987,2988],{"__ignoreMap":425},[944,2989,2990,2992],{"class":946,"line":947},[944,2991,2981],{"class":1054},[944,2993,2994],{"class":1058}," https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[892,2996,2998],{"id":2997},"將-obsidian-用戶端連接至您的-synch-伺服器","將 Obsidian 用戶端連接至您的 Synch 伺服器",[2182,3000,3002],{"id":3001},"在-obsidian-中安裝-synch-插件","在 Obsidian 中安裝 Synch 插件",[430,3004,3005,3006,3009],{},"打開 Obsidian 的「設定」（Settings），導覽至「第三方外掛」（Community plugins），然后點擊 ",[441,3007,3008],{},"「瀏覽」（Browse）"," 按鈕：",[433,3011],{"src":3012,"alt":3013,"style":3014},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-community-plugins-browse.webp","在 Obsidian 設定中瀏覽第三方社群外掛","max-width: 523px; width: 100%; height: auto;",[430,3016,3017,3018,3021,3022],{},"搜尋並安裝 ",[441,3019,3020],{},"'Synchrun'"," 外掛：\n",[433,3023],{"src":3024,"alt":3025,"style":2764},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-install-synchrun-plugin.webp","在 Obsidian 中安裝 Synchrun 同步外掛",[430,3027,3028,3029,3031,3032,3035,3036,3039,3040,3043,3044,1807],{},"安裝完成後，打開 ",[441,3030,3020],{}," 外掛設定，並啟用 ",[441,3033,3034],{},"「使用自建伺服器」（Use a self-hosted server）","。隨後，在 ",[441,3037,3038],{},"「伺服器 URL」（Server URL）"," 欄位中輸入 ",[494,3041,3042],{},"https:\u002F\u002Fsynch.pafor.me","，並點擊 ",[441,3045,3046],{},"「儲存」（Save）",[433,3048],{"src":3049,"alt":3050,"style":3051},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-plugin-settings-self-hosted.webp","在 Synchrun 外掛設定中配置您的自建伺服器 URL","max-width: 525px; width: 100%; height: auto;",[430,3053,3054,3055,3058,3059,3061,3062,3064],{},"點擊 ",[441,3056,3057],{},"「在當前裝置上登入」（Sign in on this device）"," 按鈕。接著，使用您在 ",[494,3060,2836],{}," 中 ",[494,3063,2868],{}," 列表中指定的信箱地址進行註冊，註冊成功後您将看到以下授權頁面：",[433,3066],{"src":3067,"alt":3068,"style":3069},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-account-authorization-page.webp","Synchrun 外掛的帳號授權登入頁面","max-width: 494px; width: 100%; height: auto;",[430,3071,3054,3072,3009],{},[441,3073,3074],{},"「允許 Obsidian 登入」（Allow Obsidian sign-in）",[433,3076],{"src":3077,"alt":3078,"style":3079},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-allow-obsidian-signin.webp","允許 Obsidian 透過 Synch 登入","max-width: 498px; width: 100%; height: auto;",[430,3081,3054,3082,3085,3086,3089,3090],{},[441,3083,3084],{},"「返回 Obsidian」（Return to Obsidian）"," 按鈕，隨後點擊 ",[441,3087,3088],{},"「建立筆記庫」（Create vault）","：\n",[433,3091],{"src":3092,"alt":3093,"style":3094},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-create-remote-vault.webp","在 Synchrun 中建立新的遠端同步筆記庫","max-width: 496px; width: 100%; height: auto;",[430,3096,3097],{},"輸入您自訂的筆記庫名稱與高強度密碼來建立遠端筆記庫。",[433,3099],{"src":3100,"alt":3101,"style":3102},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-vault-password-setup.webp","為 Obsidian 遠端筆記庫設定高強度安全密碼","max-width: 500px; width: 100%; height: auto;",[430,3104,3105],{},"同步過程將立即開始，根據您的筆記庫檔案大小，這可能會需要一些時間。同步完成後，介面將顯示您所使用的總儲存空間。",[433,3107],{"src":3108,"alt":3109,"style":3110},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-sync-completed-storage.webp","Synchrun 同步完成並顯示所使用的總儲存空間","max-width: 508px; width: 100%; height: auto;",[474,3112,3114],{"id":3113},"使用-ignis-實現基於瀏覽器的-obsidian-存取","使用 Ignis 實現基於瀏覽器的 Obsidian 存取",[430,3116,3117,3119],{},[441,3118,2672],{}," 透過將 Obsidian 的 Electron API 替換為 Web API，使得 Obsidian 的 JavaScript 程式碼能够直接在標準網頁瀏覽器中執行。您所有的 Markdown 筆記和附件都將直接儲存在託管伺服器的本地檔案系統中。",[430,3121,3122,3123,3128,3129,1807],{},"不過，相比於獨立執行的 Obsidian 桌面用戶端，網頁端還存在一些局限性。由於瀏覽器沙箱環境的限制，某些依賴於 Electron 或 Node.js 特有 API 的功能或第三方外掛將無法正常運作。詳情請參閱 Ignis 官方文件中的 ",[444,3124,3127],{"href":3125,"rel":3126},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Flimitations\u002F",[448],"局限性說明"," 以及 ",[444,3130,3133],{"href":3131,"rel":3132},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Fplugin-compatibility\u002F",[448],"外掛相容性列表",[892,3135,3137],{"id":3136},"部署-ignis","部署 Ignis",[430,3139,3140,3141,3143,3144,3147,3148,3151],{},"我們將使用 Docker 在 VPS 上安裝 ",[441,3142,2672],{},"，並將其對應掛載到本地的 ",[494,3145,3146],{},".\u002Fvaults"," 資料夾中。隨後，我們將在伺服器上透過 ",[441,3149,3150],{},"Synch CLI"," 命令列用戶端將該本地目錄與我們之前設定的遠端同步筆記庫進行即時同步。",[430,3153,1329,3154,3156,3157,3161],{},[441,3155,2672],{}," 本身沒有內建的身份驗證機制，為了確保隱私，我們必須將其安全地隱藏在 ",[441,3158,3159],{},[444,3160,1749],{"href":363}," 私有網路中。",[2182,3163,3165],{"id":3164},"建立-dns-記錄","建立 DNS 記錄",[433,3167],{"src":3168,"alt":3169,"style":3170},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-ignis.webp","在 Cloudflare 中為 Ignis 網頁端設定 DNS A 記錄","max-width: 552px; width: 100%; height: auto;",[2182,3172,3174],{"id":3173},"將網域添加至-caddyfile","將網域添加至 Caddyfile",[430,3176,3177,3178,3181],{},"在您的 Caddyfile 中以相同的方式為 ",[494,3179,3180],{},"obsidian.pafor.me"," 設定反向代理：",[936,3183,3185],{"className":2896,"code":3184,"language":2898,"meta":425,"style":425},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[494,3186,3187,3198,3202,3211],{"__ignoreMap":425},[944,3188,3189,3191,3194,3196],{"class":946,"line":947},[944,3190,2926],{"class":958},[944,3192,3193],{"class":954},"$OBSIDIAN_DOMAIN",[944,3195,2932],{"class":958},[944,3197,2935],{"class":958},[944,3199,3200],{"class":946,"line":1074},[944,3201,2940],{"class":954},[944,3203,3204,3206,3208],{"class":946,"line":1081},[944,3205,2945],{"class":954},[944,3207,1375],{"class":958},[944,3209,3210],{"class":2950},"9898\n",[944,3212,3213],{"class":946,"line":1088},[944,3214,2913],{"class":958},[2182,3216,3218],{"id":3217},"使用-docker-啟動-ignis","使用 Docker 啟動 Ignis",[430,3220,3221,3222,492],{},"在 VPS 上將以下 Docker Compose 設定儲存為 ",[494,3223,3224],{},"ignis-docker-compose.yml",[936,3226,3228],{"className":1359,"code":3227,"language":1361,"meta":425,"style":425},"services:\n  ignis:\n    image: nobbe\u002Fignis:latest\n    ports:\n      - \"9898:8080\"\n    environment:\n      # match these to your host user (run: id)\n      - PUID=1000\n      - PGID=1000\n      - WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n    volumes:\n      - .\u002Fvaults:\u002Fvaults\n      - .\u002Fdata:\u002Fapp\u002Fdata\n      - obsidian-app:\u002Fapp\u002Fobsidian-app\n    restart: unless-stopped\n\nvolumes:\n  obsidian-app:\n",[494,3229,3230,3237,3244,3254,3261,3274,3281,3286,3293,3300,3307,3314,3321,3328,3335,3346,3351,3359],{"__ignoreMap":425},[944,3231,3232,3235],{"class":946,"line":947},[944,3233,3234],{"class":1371},"services",[944,3236,1386],{"class":958},[944,3238,3239,3242],{"class":946,"line":1074},[944,3240,3241],{"class":1371},"  ignis",[944,3243,1386],{"class":958},[944,3245,3246,3249,3251],{"class":946,"line":1081},[944,3247,3248],{"class":1371},"    image",[944,3250,1375],{"class":958},[944,3252,3253],{"class":1058}," nobbe\u002Fignis:latest\n",[944,3255,3256,3259],{"class":946,"line":1088},[944,3257,3258],{"class":1371},"    ports",[944,3260,1386],{"class":958},[944,3262,3263,3266,3269,3272],{"class":946,"line":1948},[944,3264,3265],{"class":958},"      -",[944,3267,3268],{"class":958}," \"",[944,3270,3271],{"class":1058},"9898:8080",[944,3273,1980],{"class":958},[944,3275,3276,3279],{"class":946,"line":1953},[944,3277,3278],{"class":1371},"    environment",[944,3280,1386],{"class":958},[944,3282,3283],{"class":946,"line":1959},[944,3284,3285],{"class":1084},"      # match these to your host user (run: id)\n",[944,3287,3288,3290],{"class":946,"line":2294},[944,3289,3265],{"class":958},[944,3291,3292],{"class":1058}," PUID=1000\n",[944,3294,3295,3297],{"class":946,"line":2305},[944,3296,3265],{"class":958},[944,3298,3299],{"class":1058}," PGID=1000\n",[944,3301,3302,3304],{"class":946,"line":2401},[944,3303,3265],{"class":958},[944,3305,3306],{"class":1058}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[944,3308,3309,3312],{"class":946,"line":2407},[944,3310,3311],{"class":1371},"    volumes",[944,3313,1386],{"class":958},[944,3315,3316,3318],{"class":946,"line":2413},[944,3317,3265],{"class":958},[944,3319,3320],{"class":1058}," .\u002Fvaults:\u002Fvaults\n",[944,3322,3323,3325],{"class":946,"line":2418},[944,3324,3265],{"class":958},[944,3326,3327],{"class":1058}," .\u002Fdata:\u002Fapp\u002Fdata\n",[944,3329,3330,3332],{"class":946,"line":1723},[944,3331,3265],{"class":958},[944,3333,3334],{"class":1058}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[944,3336,3338,3341,3343],{"class":946,"line":3337},15,[944,3339,3340],{"class":1371},"    restart",[944,3342,1375],{"class":958},[944,3344,3345],{"class":1058}," unless-stopped\n",[944,3347,3349],{"class":946,"line":3348},16,[944,3350,1078],{"emptyLinePlaceholder":1077},[944,3352,3354,3357],{"class":946,"line":3353},17,[944,3355,3356],{"class":1371},"volumes",[944,3358,1386],{"class":958},[944,3360,3362,3365],{"class":946,"line":3361},18,[944,3363,3364],{"class":1371},"  obsidian-app",[944,3366,1386],{"class":958},[484,3368,3369,3380,3394],{},[487,3370,3371,3372,3375,3376,3379],{},"在主機端使用 ",[494,3373,3374],{},"9898"," 連接埠，因為 ",[494,3377,3378],{},"8080"," 是一個非常常用且容易衝突的連接埠。",[487,3381,3382,3383,3386,3387,1859,3390,3393],{},"在您的 VPS 上執行 ",[494,3384,3385],{},"id"," 命令，獲取目前主機使用者的 ",[494,3388,3389],{},"UID",[494,3391,3392],{},"GID","，並將其填寫到設定檔中，以確保檔案系統具備正確的讀寫權限。",[487,3395,3396,3397,3400],{},"設定 ",[494,3398,3399],{},"WS_ORIGINS","，僅允許來自您指定網域的 WebSocket 連線，提高安全性。",[430,3402,3403,3404,3406],{},"啟動 ",[441,3405,2672],{}," 容器：",[936,3408,3410],{"className":1045,"code":3409,"language":1047,"meta":425,"style":425},"docker compose -f ignis-docker-compose.yml up -d\n",[494,3411,3412],{"__ignoreMap":425},[944,3413,3414,3416,3418,3421,3424,3426],{"class":946,"line":947},[944,3415,1190],{"class":1054},[944,3417,1193],{"class":1058},[944,3419,3420],{"class":1058}," -f",[944,3422,3423],{"class":1058}," ignis-docker-compose.yml",[944,3425,2972],{"class":1058},[944,3427,2975],{"class":1058},[430,3429,3430,3431,3434,3435,3438],{},"當您在網頁瀏覽器中存取您的網域名稱時，將會彈出 ",[441,3432,3433],{},"'Vault Manager'","（筆記庫管理器）。由於此時資料夾為空，它不會顯示任何本地筆記庫。在下一節中，我們將設定 ",[441,3436,3437],{},"'Synch CLI'","，從我們之前設定的遠端同步伺服器中拉取筆記。",[433,3440],{"src":3441,"alt":3442,"style":3443},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-vault-manager-empty.webp","Ignis 網頁用戶端中當前為空的筆記庫管理器","max-width: 466px; width: 100%; height: auto;",[2182,3445,3447],{"id":3446},"解決-docker-帶來的防火牆失效問題","解決 Docker 帶來的防火牆失效問題",[430,3449,3450,3451,3454,3455,3458,3459,3462],{},"預設情況下，Docker 會自動在系統底層插入自己的 DNAT 與 FORWARD 鏈規則，直接將外部公網流量轉發至作用中的容器連接埠。這會完全繞過 Ubuntu 預設的 UFW 或 iptables ",[494,3452,3453],{},"INPUT"," 鏈防火牆保護。為了阻止外部未經授權的存取並保持容器的絕對私有，我們需要手動將以下規則新增至 ",[494,3456,3457],{},"iptables"," 中的 ",[494,3460,3461],{},"DOCKER-USER"," 鏈：",[936,3464,3466],{"className":1045,"code":3465,"language":1047,"meta":425,"style":425},"# 阻斷所有外部公網流量的直接存取\nsudo iptables -I DOCKER-USER -i ext_if -j DROP \n\n# 僅允許來自您的 Cloudflare WARP 用戶端私有 IP 的存取流量\nsudo iptables -I DOCKER-USER -i ext_if -s 100.96.0.10 -j ACCEPT\n",[494,3467,3468,3473,3500,3504,3509],{"__ignoreMap":425},[944,3469,3470],{"class":946,"line":947},[944,3471,3472],{"class":1084},"# 阻斷所有外部公網流量的直接存取\n",[944,3474,3475,3477,3480,3483,3486,3489,3492,3495,3498],{"class":946,"line":1074},[944,3476,1916],{"class":1054},[944,3478,3479],{"class":1058}," iptables",[944,3481,3482],{"class":1058}," -I",[944,3484,3485],{"class":1058}," DOCKER-USER",[944,3487,3488],{"class":1058}," -i",[944,3490,3491],{"class":1058}," ext_if",[944,3493,3494],{"class":1058}," -j",[944,3496,3497],{"class":1058}," DROP",[944,3499,2049],{"class":954},[944,3501,3502],{"class":946,"line":1081},[944,3503,1078],{"emptyLinePlaceholder":1077},[944,3505,3506],{"class":946,"line":1088},[944,3507,3508],{"class":1084},"# 僅允許來自您的 Cloudflare WARP 用戶端私有 IP 的存取流量\n",[944,3510,3511,3513,3515,3517,3519,3521,3523,3526,3529,3531],{"class":946,"line":1948},[944,3512,1916],{"class":1054},[944,3514,3479],{"class":1058},[944,3516,3482],{"class":1058},[944,3518,3485],{"class":1058},[944,3520,3488],{"class":1058},[944,3522,3491],{"class":1058},[944,3524,3525],{"class":1058}," -s",[944,3527,3528],{"class":2950}," 100.96.0.10",[944,3530,3494],{"class":1058},[944,3532,3533],{"class":1058}," ACCEPT\n",[2182,3535,3537],{"id":3536},"設定-synch-cli-命令列同步工具","設定 Synch CLI 命令列同步工具",[430,3539,3540,3542],{},[441,3541,3150],{}," 是一款無介面的命令列工具，即使在没有安裝 Obsidian 桌面應用的遠端伺服器上，它也能讓本地目錄與遠端筆記庫进行即時同步。",[430,3544,3545,3546,3549,3550,3552,3553,3556,3557,3128,3560,1536,3563,1859,3566,3569,3570,3573,3574,3577],{},"從您之前克隆的 ",[494,3547,3548],{},"synch"," 倉庫源碼中建置 ",[441,3551,3150],{},"。建置過程需要 ",[441,3554,3555],{},"Node.js >= 22.5","（因為 CLI 依賴於 ",[494,3558,3559],{},"node:sqlite",[494,3561,3562],{},"fetch",[494,3564,3565],{},"WebSocket",[494,3567,3568],{},"WebCrypto"," 等全域瀏覽器原生 API）和 ",[441,3571,3572],{},"pnpm","（由於整個倉庫是一個使用了 ",[494,3575,3576],{},"pnpm@10.33.0"," 版本管理器的 pnpm 工作區）：",[936,3579,3581],{"className":1045,"code":3580,"language":1047,"meta":425,"style":425},"# Check versions\nnode --version   # must be >= 22.5\npnpm --version\n\n# In the repos root\npnpm install\n\n# Build the CLI bundle\npnpm -C apps\u002Fcli build\n\n# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\nchmod +x apps\u002Fcli\u002Fdist\u002Fsynch.js\nln -sf \"$PWD\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js\" \"$HOME\u002F.local\u002Fbin\u002Fsynch\"\n\n# Verification\nsynch --help\n",[494,3582,3583,3588,3599,3606,3610,3615,3622,3626,3631,3644,3648,3653,3664,3693,3697,3702],{"__ignoreMap":425},[944,3584,3585],{"class":946,"line":947},[944,3586,3587],{"class":1084},"# Check versions\n",[944,3589,3590,3593,3596],{"class":946,"line":1074},[944,3591,3592],{"class":1054},"node",[944,3594,3595],{"class":1058}," --version",[944,3597,3598],{"class":1084},"   # must be >= 22.5\n",[944,3600,3601,3603],{"class":946,"line":1081},[944,3602,3572],{"class":1054},[944,3604,3605],{"class":1058}," --version\n",[944,3607,3608],{"class":946,"line":1088},[944,3609,1078],{"emptyLinePlaceholder":1077},[944,3611,3612],{"class":946,"line":1948},[944,3613,3614],{"class":1084},"# In the repos root\n",[944,3616,3617,3619],{"class":946,"line":1953},[944,3618,3572],{"class":1054},[944,3620,3621],{"class":1058}," install\n",[944,3623,3624],{"class":946,"line":1959},[944,3625,1078],{"emptyLinePlaceholder":1077},[944,3627,3628],{"class":946,"line":2294},[944,3629,3630],{"class":1084},"# Build the CLI bundle\n",[944,3632,3633,3635,3638,3641],{"class":946,"line":2305},[944,3634,3572],{"class":1054},[944,3636,3637],{"class":1058}," -C",[944,3639,3640],{"class":1058}," apps\u002Fcli",[944,3642,3643],{"class":1058}," build\n",[944,3645,3646],{"class":946,"line":2401},[944,3647,1078],{"emptyLinePlaceholder":1077},[944,3649,3650],{"class":946,"line":2407},[944,3651,3652],{"class":1084},"# After a successful build you have `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Make it executable and put it on your PATH\n",[944,3654,3655,3658,3661],{"class":946,"line":2413},[944,3656,3657],{"class":1054},"chmod",[944,3659,3660],{"class":1058}," +x",[944,3662,3663],{"class":1058}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[944,3665,3666,3669,3672,3674,3677,3680,3683,3685,3688,3691],{"class":946,"line":2418},[944,3667,3668],{"class":1054},"ln",[944,3670,3671],{"class":1058}," -sf",[944,3673,3268],{"class":958},[944,3675,3676],{"class":954},"$PWD",[944,3678,3679],{"class":1058},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[944,3681,3682],{"class":958},"\"",[944,3684,3268],{"class":958},[944,3686,3687],{"class":954},"$HOME",[944,3689,3690],{"class":1058},"\u002F.local\u002Fbin\u002Fsynch",[944,3692,1980],{"class":958},[944,3694,3695],{"class":946,"line":1723},[944,3696,1078],{"emptyLinePlaceholder":1077},[944,3698,3699],{"class":946,"line":3337},[944,3700,3701],{"class":1084},"# Verification\n",[944,3703,3704,3706],{"class":946,"line":3348},[944,3705,3548],{"class":1054},[944,3707,3708],{"class":1058}," --help\n",[430,3710,3711,3712,3715],{},"由於 Synch CLI 執行在与您的 Synch 遠端同步伺服端相同的 VPS 上，它能够直接自動連線至本地的 API 服務連接埠。如果您將它們部署在不同的伺服器上，請執行 ",[494,3713,3714],{},"synch login --api-url \u003Cremote-synch-api-url>"," 来手動定義您的遠端目標 API 端點。",[430,3717,3718],{},[433,3719],{"alt":3720,"src":3721},"在終端機中輸入自訂 API URL 執行 synch login 登入指令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-api-url-terminal.webp",[430,3723,3724,3725,3728],{},"在您的 VPS 終端機中執行 ",[494,3726,3727],{},"synch login"," 命令，您將獲得一個用於身份驗證的登入 URL：",[430,3730,3731],{},[433,3732],{"alt":3733,"src":3734},"終端機輸出顯示的 Synch CLI 認證 URL","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-auth-url-terminal.webp",[430,3736,3737],{},"使用與您在 Obsidian 桌面端 Synchrun 插件中註冊的相同信箱地址，透過該網頁連結進行登入授權。",[430,3739,3740],{},[433,3741],{"alt":3742,"src":3743},"Synch CLI 授權網頁端登入成功","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-web-login-success.webp",[430,3745,3746,3747,3750],{},"執行 ",[494,3748,3749],{},"synch vault connect --vault ~\u002Fvaults\u002F\u003Cvaultname> --vault-id asadqe-7b29-4677-fsad-234asdafasd"," 來將您 VPS 上的本地筆記庫目錄與遠端自建伺服器上的筆記庫進行關聯：",[430,3752,3753,3754,3757,3758,3761,3762,3765],{},"您可以透過打開桌面端 Obsidian 中的 ",[441,3755,3756],{},"Synchrun"," 外掛設定，點擊 ",[441,3759,3760],{},"「管理遠端筆記庫」（Manage remote vaults）"," 來找到您的遠端筆記庫 ID。該操作會打開一個網頁並列出您所有的遠端筆記庫，每個庫旁邊都附帶有一個 GUID 格式的唯一識別碼（例如：",[494,3763,3764],{},"123e4567-e89b-12d3-a456-426614174000","）：",[430,3767,3768,3773],{},[433,3769],{"src":3770,"alt":3771,"style":3772},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-manage-remote-vaults.webp","在 Synchrun 外掛中管理遠端筆記庫","max-width: 582px; width: 100%; height: auto;",[433,3774],{"alt":3775,"src":3776},"在 Synchrun 中定位唯一的遠端筆記庫 ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-remote-vault-id.webp",[430,3778,3779,3780,3783],{},"在提示時輸入您的筆記庫密碼以確立關聯。關聯成功後，執行 ",[494,3781,3782],{},"synch sync --vault ~\u002Fvaults\u002F\u003Cvault-name>"," 來進行您的首次全量同步。首次同步根據您的檔案大小，可能會耗費一些時間。",[430,3785,3786],{},[433,3787],{"alt":3788,"src":3789},"Synch CLI 中顯示首次拉取同步筆記庫的進度","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-cli-initial-sync-progress.webp",[430,3791,3792,3793,3796,3797,3800],{},"為了讓同步全自動進行，我們可以設定並啟用一個 ",[494,3794,3795],{},"systemd"," 系統守護服務，在背景持續執行 ",[494,3798,3799],{},"synch watch"," 監聽檔案變化，以確保 VPS 上的筆記在系統開機時即可實現毫秒級自動同步：",[936,3802,3804],{"className":1045,"code":3803,"language":1047,"meta":425,"style":425},"sudo tee \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service \u003C\u003C'EOF'\n[Unit]\nDescription=Synch vault watcher\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=\u003Cusername>\nExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\nWorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\nEnvironment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\nEnvironment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\nEOF\nsudo systemctl daemon-reload\nsudo systemctl enable --now synch-watch.service\n",[494,3805,3806,3822,3826,3831,3836,3841,3845,3849,3854,3859,3864,3869,3874,3879,3883,3888,3892,3896,3900,3906,3915],{"__ignoreMap":425},[944,3807,3808,3810,3813,3816,3819],{"class":946,"line":947},[944,3809,1916],{"class":1054},[944,3811,3812],{"class":1058}," tee",[944,3814,3815],{"class":1058}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[944,3817,3818],{"class":958}," \u003C\u003C",[944,3820,3821],{"class":958},"'EOF'\n",[944,3823,3824],{"class":946,"line":1074},[944,3825,2359],{"class":1058},[944,3827,3828],{"class":946,"line":1081},[944,3829,3830],{"class":1058},"Description=Synch vault watcher\n",[944,3832,3833],{"class":946,"line":1088},[944,3834,3835],{"class":1058},"After=network-online.target\n",[944,3837,3838],{"class":946,"line":1948},[944,3839,3840],{"class":1058},"Wants=network-online.target\n",[944,3842,3843],{"class":946,"line":1953},[944,3844,1078],{"emptyLinePlaceholder":1077},[944,3846,3847],{"class":946,"line":1959},[944,3848,2378],{"class":1058},[944,3850,3851],{"class":946,"line":2294},[944,3852,3853],{"class":1058},"Type=simple\n",[944,3855,3856],{"class":946,"line":2305},[944,3857,3858],{"class":1058},"User=\u003Cusername>\n",[944,3860,3861],{"class":946,"line":2401},[944,3862,3863],{"class":1058},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[944,3865,3866],{"class":946,"line":2407},[944,3867,3868],{"class":1058},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[944,3870,3871],{"class":946,"line":2413},[944,3872,3873],{"class":1058},"Environment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\n",[944,3875,3876],{"class":946,"line":2418},[944,3877,3878],{"class":1058},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[944,3880,3881],{"class":946,"line":1723},[944,3882,2398],{"class":1058},[944,3884,3885],{"class":946,"line":3337},[944,3886,3887],{"class":1058},"RestartSec=5\n",[944,3889,3890],{"class":946,"line":3348},[944,3891,1078],{"emptyLinePlaceholder":1077},[944,3893,3894],{"class":946,"line":3353},[944,3895,2421],{"class":1058},[944,3897,3898],{"class":946,"line":3361},[944,3899,2426],{"class":1058},[944,3901,3903],{"class":946,"line":3902},19,[944,3904,3905],{"class":958},"EOF\n",[944,3907,3909,3911,3913],{"class":946,"line":3908},20,[944,3910,1916],{"class":1054},[944,3912,1919],{"class":1058},[944,3914,2445],{"class":1058},[944,3916,3918,3920,3922,3924,3927],{"class":946,"line":3917},21,[944,3919,1916],{"class":1054},[944,3921,1919],{"class":1058},[944,3923,2046],{"class":1058},[944,3925,3926],{"class":1058}," --now",[944,3928,3929],{"class":1058}," synch-watch.service\n",[430,3931,3932,3933,3935],{},"現在，在瀏覽器中打開 ",[494,3934,3180],{},"，您會發現其使用者介面和排版版面與桌面端原生 App 幾乎完全一致：",[433,3937],{"src":3938,"alt":3939,"style":3940},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-web-interface-desktop-view.webp","在桌面端顯示 Obsidian 筆記庫的 Ignis 網頁介面","max-width: 593px; width: 100%; height: auto;",[430,3942,3943],{},"點擊左下角的設定圖示可以發現，除了需要手動重新安裝第三方社群外掛外，幾乎所有的 Obsidian 核心設定與功能均已完美保留：",[433,3945],{"src":3946,"alt":3947,"style":3948},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-settings-community-plugins.webp","Ignis 網頁介面中的社群第三方外掛設定","max-width: 597px; width: 100%; height: auto;",[430,3950,3951],{},"為了測試整個同步閉環，您可以透過 Ignis 網頁端直接新增一篇筆記：",[433,3953],{"src":3954,"alt":3955,"style":3948},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-create-new-note-web.webp","透過 Ignis 網頁介面新增一篇 Markdown 筆記",[430,3957,3958,3959,3961],{},"該筆記會立即被同步回您的 Obsidian 桌面用戶端。需要注意的是，空白資料夾不會在 ",[441,3960,2672],{}," 網頁端中顯示。",[433,3963],{"src":3964,"alt":3965,"style":3966},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-desktop-synced-note.webp","新建立的筆記已成功同步到本地 Obsidian 桌面用戶端","max-width: 502px; width: 100%; height: auto;",[430,3968,3969,3970,3972],{},"在行動端手機瀏覽器上存取 ",[494,3971,3180],{}," 的實際效果：",[430,3974,3975,3980],{},[433,3976],{"src":3977,"alt":3978,"style":3979},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-sidebar.webp","在行動端手機瀏覽器上存取 Ignis 網頁用戶端的側邊欄選單","max-width: 269px; width: 100%; height: auto;",[433,3981],{"src":3982,"alt":3983,"style":3979},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-editor.webp","在行動端手機瀏覽器上存取 Ignis 網頁用戶端的 Markdown 編輯器",[430,3985,3986,3987,3989,3990,3993],{},"當您在 ",[441,3988,2672],{}," 網頁端中刪除筆記時，它們會被安全地移至本地筆記庫的 ",[494,3991,3992],{},"~\u002Fvaults\u002F\u003Cvault-name>\u002F.trash"," 垃圾桶資料夾中，以防誤刪。",[474,3995,3997],{"id":3996},"自建-obsidian-同步服務的一些結語","自建 Obsidian 同步服務的一些結語",[430,3999,4000,4001,575,4003,4005,4006,4008],{},"透過將 ",[441,4002,2663],{},[441,4004,2672],{}," 結合，您可以使用完全處於自己掌控之下的 VPS 伺服器硬體，無縫地實現 Obsidian 筆記庫的多端同步與網頁端存取。而將這些服務整體託管於 ",[441,4007,1749],{}," 私有網路之中，又為您提供了極致的安全物理邊界，從根本上阻断了公網暴露帶來的安全隱患。",[430,4010,4011,4012,4014],{},"當然，",[441,4013,2672],{}," 的初衷並不是為了完全替代本地的 Obsidian 桌面用戶端。相反，它更像是一個極其便利的臨時橋梁，供您在沒有攜帶主力電腦時，能夠隨時隨地透過任意瀏覽器快速存取和編輯自己的筆記。對於日常高強度的寫作與重度筆記庫管理，本地原生用戶端仍然是更加舒適、高效的選擇。",[430,4016,4017,4018,4020],{},"由於 Synch 採用了堅固的端到端加密機制，您的遠端筆記庫密碼必須具備足夠強的複雜度以抵禦暴力破解攻擊。同時，請務必牢記該密碼，因為同步伺服端不會儲存任何未加密的",[441,4019,2734],{},"。一旦遺忘該密碼，您的全部筆記資料將徹底無法復原。此外，由於所有資料均保存在您的自建 VPS 上，您需要自行承擔並妥善做好伺服器的主機安全防護、以及自動快照與備份管理。",[430,4022,4023,4024,4026],{},"儘管 ",[441,4025,2663],{}," 內建了加密歷史版本管理和已刪除檔案復原機制，能為您規避絕大多數意外資料遺失，但為了萬一失，我們依然強烈建議您在第三方實體介質上定期保留一份獨立的 Obsidian 筆記庫離線備份。",[474,4028,4030],{"id":4029},"references","References",[484,4032,4033,4040,4047],{},[487,4034,4035],{},[444,4036,4039],{"href":4037,"rel":4038},"https:\u002F\u002Fsynch.run\u002Fself-hosting-docker\u002F",[448],"Synch Deploy with Docker Compose",[487,4041,4042],{},[444,4043,4046],{"href":4044,"rel":4045},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fserver\u002Fdeploy\u002F",[448],"Ignis Deploy with Docker",[487,4048,4049],{},[444,4050,4053],{"href":4051,"rel":4052},"https:\u002F\u002Fsynch.run\u002Fblog\u002Fencryption-and-decryption\u002F",[448],"How does end-to-end encryption work in Synch?",[1667,4055,4056],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":425,"searchDepth":1074,"depth":1081,"links":4058},[4059,4068,4077,4078],{"id":2706,"depth":1074,"text":2707,"children":4060},[4061,4065],{"id":2748,"depth":1081,"text":2749,"children":4062},[4063,4064],{"id":2752,"depth":1088,"text":2752},{"id":2767,"depth":1088,"text":2768},{"id":2997,"depth":1081,"text":2998,"children":4066},[4067],{"id":3001,"depth":1088,"text":3002},{"id":3113,"depth":1074,"text":3114,"children":4069},[4070],{"id":3136,"depth":1081,"text":3137,"children":4071},[4072,4073,4074,4075,4076],{"id":3164,"depth":1088,"text":3165},{"id":3173,"depth":1088,"text":3174},{"id":3217,"depth":1088,"text":3218},{"id":3446,"depth":1088,"text":3447},{"id":3536,"depth":1088,"text":3537},{"id":3996,"depth":1074,"text":3997},{"id":4029,"depth":1074,"text":4030},[4080],"productivity","2026-09-15","本文詳細介紹如何利用開源工具 Synch 與 Ignis 在您的 VPS 上搭建私有同步伺服器，從而在多台電腦、手機以及平板裝置之間安全地同步您的 Obsidian 筆記庫。我們還將所有服務全部部署在 Cloudflare Zero Trust 私有網路中，從而完全阻斷來自公網的惡意掃描與未授權存取，保障數據隱私安全。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002FTW-Sync-Obsidian-Across-Devices.webp","使用自建 Synch 平台和 Ignis 網頁端在 Cloudflare Zero Trust 安全私有網路中同步多端 Obsidian 本地筆記庫的架構圖",{"schemaOrg":4086,"robots":1721,"sitemap":4090},[4087,4089],{"@type":4088,"headline":2645,"description":4082,"image":4083},"Article",{"@type":1700,"name":2645,"description":4082,"image":4083},{"lastmod":4091},"2026-09-16",{"title":4093,"description":4082,"ogTitle":2645,"ogDescription":4082,"twitterTitle":2645,"twitterDescription":4082},"基於自建 Synch 與 Ignis 實現 Obsidian 跨裝置安全同步","tw\u002Farticle\u002Fsync-obsidian-across-devices",[4096,4097,4098,2639],"自建服务","Obsidian","云端同步","6DsOPDA5q5K5tiypqYFvhyUvxHAduTMMII_8Mf-xVXM",{"id":4101,"title":455,"author":425,"body":4102,"category":6232,"date":6233,"description":465,"extension":1692,"image":466,"imageAlt":467,"isPublished":1077,"meta":6234,"minRead":2407,"navigation":1077,"path":263,"seo":6256,"stem":6258,"tags":6259,"updatedAt":1730,"__hash__":6263},"article\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":427,"value":4103,"toc":6202},[4104,4107,4113,4118,4122,4125,4163,4167,4173,4211,4215,4219,4233,4239,4243,4247,4251,4264,4270,4319,4345,4349,4357,4363,4367,4370,4580,4584,4624,4629,4636,4644,4694,4700,4729,4733,4737,4756,4782,4795,4837,4845,5116,5120,5163,5168,5175,5179,5183,5207,5210,5216,5222,5226,5233,5239,5242,5248,5255,5279,5286,5292,5295,5301,5305,5308,5311,5314,5320,5323,5329,5335,5341,5346,5350,5361,5368,5374,5377,5383,5386,5393,5399,5405,5409,5417,5481,5490,5545,5548,5618,5624,5638,5644,5648,5693,5699,5702,5708,5711,5717,5721,5738,5754,5760,5857,5860,5866,5877,5923,5929,5935,5948,5964,5967,5973,5977,5984,6006,6016,6114,6124,6130,6137,6143,6146,6152,6155,6161,6163,6166,6169,6199],[430,4105,4106],{},"在與多個 AI 智能體（AI Agent）協同工作時，最讓人頭痛的障礙莫過於「上下文斷片化（Context Fragmentation）」。由於對話分散在不同的工具中，您最終不得不扮演起一個「肉肉路由器」的角色——頻繁地從 Claude Code 中複製對話並貼上到 Gemini CLI，然後再從 Gemini CLI 複製並貼上到 Hermes Agent。而當您身邊還有人類團隊成員一起協作時，這種繁瑣的摩擦感更是成倍增長。",[430,4108,4109],{},[433,4110],{"alt":4111,"src":4112},"Buzz 協作工作空間的使用者介面，顯示聊天頻道和活躍的 AI 智能體","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[430,4114,4115,4117],{},[441,4116,1115],{}," 是一款開源的協同工作空間，它將人類團隊和 AI 智能體凝聚在一個統一環境中。在這裡，人類同事與 AI 智能體能夠共享相同的任務和專案歷史，並實現天衣無缝的工作交接。",[474,4119,4121],{"id":4120},"什麼是-block-旗下的-buzz人機協同的-ai-智能體共享空間","什麼是 Block 旗下的 Buzz？人機協同的 AI 智能體共享空間",[430,4123,4124],{},"Buzz 是 Block 公司（由推特創辦人傑克·多西創立）推出的開源協作工作空間，它讓團隊成員和 AI 智能體能夠在相同的頻道與專案中並肩工作。它具有以下幾個核心亮點：",[484,4126,4127,4133,4139,4145,4151,4157],{},[487,4128,4129,4132],{},[441,4130,4131],{},"共享上下文："," 頻道是團隊成員與智能體開展協作的核心陣地。所有的對話記錄和專案歷史都完整保留在頻道中。",[487,4134,4135,4138],{},[441,4136,4137],{},"智能體間通信："," 智能體之間能够跨機器直接進行交流。一個 AI 智能體可以 @ 另一個智能體，從上完成工作的轉交或代碼的交叉審查。",[487,4140,4141,4144],{},[441,4142,4143],{},"提及驅動激活："," AI 智能體僅在被 @ 提及時才會激活，平時則保持靜默。被提及時，智能體將讀取頻道中的相關上下文並開始工作。",[487,4146,4147,4150],{},[441,4148,4149],{},"統一身份系統："," 團隊成員與 AI 智能體使用同一套身份系統，並通過加密私鑰\u002F公鑰進行安全認證。",[487,4152,4153,4156],{},[441,4154,4155],{},"委派命令："," 您可以向人類同事授予指揮您的智能體的權限，讓整個團隊都能輕鬆指派和調用彼此的數位助手。",[487,4158,4159,4162],{},[441,4160,4161],{},"自託管伺服器："," 因為您是該伺服器的託管者，所以您的數據完全由您掌控。您可以自由決定誰能加入，並定義專屬的運行規則。",[474,4164,4166],{"id":4165},"基於-nostr-的加密級-buzz-架構解析","基於 Nostr 的加密級 Buzz 架構解析",[430,4168,4169],{},[433,4170],{"alt":4171,"src":4172},"基於 Nostr 協定的 Buzz 協作空間加密級架構拓撲圖","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[484,4174,4175,4181,4187,4193,4199,4205],{},[487,4176,4177,4180],{},[441,4178,4179],{},"Nostr 中繼器充當伺服器："," 消息、工作流、代碼倉庫以及其他事件都經過加密簽名和驗證，並儲存在 Nostr 中繼伺服器（Relay）上。Nostr 協定原生支援通過 WebSockets 和 REST API 進行通信。",[487,4182,4183,4186],{},[441,4184,4185],{},"統一加密身份："," 人類和智能體都使用各自的加密金鑰進行認證。此身份完全保留在用戶端，絕不會儲存在伺服器上。",[487,4188,4189,4192],{},[441,4190,4191],{},"一等公民級智能體："," 每个智能體都擁有獨立的身份、頻道成員資格和審計跟蹤（Audit Trail）。智能體使用智能體通信協定（ACP）連接到工作空間。",[487,4194,4195,4198],{},[441,4196,4197],{},"去中心化 Git 倉庫："," 代碼庫儲存在相容 S3 的物件儲存中，而任務、拉取請求（PR）和代碼審查則在 Nostr 事件日誌中進行追蹤。因此，Buzz 的 Git 倉庫實際上是託管在 Nostr 中繼器上，而非 GitHub。",[487,4200,4201,4204],{},[441,4202,4203],{},"Buzz 用戶端屬於 Nostr 用戶端："," Buzz 應用與 Nostr 中繼器是分離的；它是一個桌面或移動端用戶端，負責連接到中繼器的 URL 節點。",[487,4206,4207,4210],{},[441,4208,4209],{},"基礎技術棧："," 由 PostgreSQL 資料庫處理事件儲存與全文檢索，Redis 負責管理發佈\u002F訂閱（Pub\u002FSub）消息佇列，而相容 S3 的 MinIO 用於儲存媒體檔案。",[474,4212,4214],{"id":4213},"如何在-linux-vps-上部署自託管的-block-旗下-buzz","如何在 Linux VPS 上部署自託管的 Block 旗下 Buzz",[892,4216,4218],{"id":4217},"_0-前提條件","0. 前提條件",[484,4220,4221,4224,4227,4230],{},[487,4222,4223],{},"一台 Linux VPS",[487,4225,4226],{},"域名已指向您的伺服器 IP 地址",[487,4228,4229],{},"Docker 以及 Docker Compose 外掛程式",[487,4231,4232],{},"Cloudflare 帳戶（免費服務計劃）",[430,4234,4235,4236,4238],{},"在本指南中，我們將把 Nostr 中繼器部署在 Ubuntu VPS 上，並通過 ",[444,4237,1734],{"href":363}," 保護其安全。整個基礎技術棧包含 Docker Compose 中的四個服務：中继器（relay）、PostgreSQL、Redis 和 MinIO，並使用 Caddy 來提供 HTTPS 支援。",[463,4240],{"description":4241,"image":2628,"image-alt":4242,"label":2701,"min-read":2702,"title":1734,"to":363},"了解如何利用 Cloudflare WARP 和 Zero Trust（零信任）在不開放入站防火牆端口的情況下，安全地在全球範圍內暴露和存取您的 Hermes Agent。","使用 Cloudflare Zero Trust 和 WARP 隧道安全地將 Hermes Agent 暴露到私有網路",[892,4244,4246],{"id":4245},"_1-cloudflare-dns-與-api-權杖","1. Cloudflare DNS 與 API 權杖",[2182,4248,4250],{"id":4249},"創建-cloudflare-api-權杖token","創建 Cloudflare API 權杖（Token）",[532,4252,4253,4259],{},[487,4254,4255,4256,1807],{},"點擊右上角的個人頭像，並在下拉選單中選擇 ",[441,4257,4258],{},"Profile",[487,4260,3054,4261,1807],{},[441,4262,4263],{},"API Tokens",[430,4265,4266],{},[433,4267],{"alt":4268,"src":4269},"Cloudflare 使用者個人資料頁面，顯示 API 權杖創建選單","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[532,4271,4272,4278,4284,4304,4309,4313,4316],{"start":1081},[487,4273,3054,4274,4277],{},[441,4275,4276],{},"Create Token"," 按鈕。",[487,4279,4280,4281,1807],{},"選擇使用範本 ",[441,4282,4283],{},"Edit zone DNS",[487,4285,4286,4287],{},"配置範本如下：\n",[484,4288,4289,4295],{},[487,4290,4291,4294],{},[441,4292,4293],{},"Permissions",": Zone — DNS — Edit",[487,4296,4297,4300,4301],{},[441,4298,4299],{},"Zone Resources",": Include — Specific zone — ",[494,4302,4303],{},"example.com",[487,4305,3054,4306,1807],{},[441,4307,4308],{},"Continue to summary",[487,4310,3054,4311,1807],{},[441,4312,4276],{},[487,4314,4315],{},"拷貝生成的 API 權杖，因為頁面關閉後它將不再顯示。",[487,4317,4318],{},"在終端機中驗證生成的權杖，確保其能正常工作：",[936,4320,4322],{"className":1045,"code":4321,"language":1047,"meta":425,"style":425},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[494,4323,4324],{"__ignoreMap":425},[944,4325,4326,4328,4330,4333,4335,4338,4340,4343],{"class":946,"line":947},[944,4327,2981],{"class":1054},[944,4329,3268],{"class":958},[944,4331,4332],{"class":1058},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[944,4334,3682],{"class":958},[944,4336,4337],{"class":1058}," -H",[944,4339,3268],{"class":958},[944,4341,4342],{"class":1058},"Authorization: Bearer YOUR_TOKEN_HERE",[944,4344,1980],{"class":958},[2182,4346,4348],{"id":4347},"dns-解析記錄","DNS 解析記錄",[484,4350,4351],{},[487,4352,4353,4354,4356],{},"創建一條 A 記錄，並將代理狀態設置為 ",[441,4355,2758],{},"（DNS only）。",[430,4358,4359],{},[433,4360],{"alt":4361,"src":4362},"在 Cloudflare 控制台中配置 Buzz 域名的 DNS A 記錄，並將代理狀態設置為僅限 DNS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-dns-a-record-configuration.webp",[892,4364,4366],{"id":4365},"_2-在-ubuntu-上安裝-docker","2. 在 Ubuntu 上安裝 Docker",[430,4368,4369],{},"運行以下命令在 Ubuntu 上安裝 Docker：",[936,4371,4373],{"className":1045,"code":4372,"language":1047,"meta":425,"style":425},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[494,4374,4375,4380,4408,4412,4417,4459,4463,4468,4478,4482,4487,4508,4512,4517,4528,4532,4537,4543,4547,4561,4565,4570],{"__ignoreMap":425},[944,4376,4377],{"class":946,"line":947},[944,4378,4379],{"class":1084},"# Add Docker's official GPG key and set up the Docker repository\n",[944,4381,4382,4384,4387,4390,4393,4396,4399,4402,4405],{"class":946,"line":1074},[944,4383,2981],{"class":1054},[944,4385,4386],{"class":1058}," -fsSL",[944,4388,4389],{"class":1058}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[944,4391,4392],{"class":958}," |",[944,4394,4395],{"class":1054}," sudo",[944,4397,4398],{"class":1058}," gpg",[944,4400,4401],{"class":1058}," --dearmor",[944,4403,4404],{"class":1058}," -o",[944,4406,4407],{"class":1058}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[944,4409,4410],{"class":946,"line":1081},[944,4411,1078],{"emptyLinePlaceholder":1077},[944,4413,4414],{"class":946,"line":1088},[944,4415,4416],{"class":1084},"# Add the official Docker repository\n",[944,4418,4419,4422,4424,4427,4430,4433,4436,4439,4442,4444,4446,4448,4450,4453,4456],{"class":946,"line":1948},[944,4420,4421],{"class":976},"echo",[944,4423,3268],{"class":958},[944,4425,4426],{"class":1058},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[944,4428,4429],{"class":958},"$(",[944,4431,4432],{"class":1054},"lsb_release",[944,4434,4435],{"class":1058}," -cs",[944,4437,4438],{"class":958},")",[944,4440,4441],{"class":1058}," stable",[944,4443,3682],{"class":958},[944,4445,4392],{"class":958},[944,4447,4395],{"class":1054},[944,4449,3812],{"class":1058},[944,4451,4452],{"class":1058}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[944,4454,4455],{"class":958}," >",[944,4457,4458],{"class":1058}," \u002Fdev\u002Fnull\n",[944,4460,4461],{"class":946,"line":1953},[944,4462,1078],{"emptyLinePlaceholder":1077},[944,4464,4465],{"class":946,"line":1959},[944,4466,4467],{"class":1084},"# Update package list\n",[944,4469,4470,4472,4475],{"class":946,"line":2294},[944,4471,1916],{"class":1054},[944,4473,4474],{"class":1058}," apt",[944,4476,4477],{"class":1058}," update\n",[944,4479,4480],{"class":946,"line":2305},[944,4481,1078],{"emptyLinePlaceholder":1077},[944,4483,4484],{"class":946,"line":2401},[944,4485,4486],{"class":1084},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[944,4488,4489,4491,4493,4496,4499,4502,4505],{"class":946,"line":2407},[944,4490,1916],{"class":1054},[944,4492,4474],{"class":1058},[944,4494,4495],{"class":1058}," install",[944,4497,4498],{"class":1058}," docker-ce",[944,4500,4501],{"class":1058}," docker-ce-cli",[944,4503,4504],{"class":1058}," containerd.io",[944,4506,4507],{"class":1058}," -y\n",[944,4509,4510],{"class":946,"line":2413},[944,4511,1078],{"emptyLinePlaceholder":1077},[944,4513,4514],{"class":946,"line":2418},[944,4515,4516],{"class":1084},"# Start automatically when the system boots\n",[944,4518,4519,4521,4523,4525],{"class":946,"line":1723},[944,4520,1916],{"class":1054},[944,4522,1919],{"class":1058},[944,4524,2046],{"class":1058},[944,4526,4527],{"class":1058}," docker\n",[944,4529,4530],{"class":946,"line":3337},[944,4531,1078],{"emptyLinePlaceholder":1077},[944,4533,4534],{"class":946,"line":3348},[944,4535,4536],{"class":1084},"# Verify docker is installed\n",[944,4538,4539,4541],{"class":946,"line":3353},[944,4540,1190],{"class":1054},[944,4542,3605],{"class":1058},[944,4544,4545],{"class":946,"line":3361},[944,4546,1078],{"emptyLinePlaceholder":1077},[944,4548,4549,4551,4553,4555,4558],{"class":946,"line":3902},[944,4550,1916],{"class":1054},[944,4552,4474],{"class":1058},[944,4554,4495],{"class":1058},[944,4556,4557],{"class":1058}," -y",[944,4559,4560],{"class":1058}," docker-compose-plugin\n",[944,4562,4563],{"class":946,"line":3908},[944,4564,1078],{"emptyLinePlaceholder":1077},[944,4566,4567],{"class":946,"line":3917},[944,4568,4569],{"class":1084},"# Verify the compose plugin is installed\n",[944,4571,4573,4575,4577],{"class":946,"line":4572},22,[944,4574,1190],{"class":1054},[944,4576,1193],{"class":1058},[944,4578,4579],{"class":1058}," version\n",[892,4581,4583],{"id":4582},"_3-克隆倉庫並進行配置","3. 克隆倉庫並進行配置",[936,4585,4587],{"className":1045,"code":4586,"language":1047,"meta":425,"style":425},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[494,4588,4589,4598,4602,4609,4617],{"__ignoreMap":425},[944,4590,4591,4593,4595],{"class":946,"line":947},[944,4592,2782],{"class":1054},[944,4594,2785],{"class":1058},[944,4596,4597],{"class":1058}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[944,4599,4600],{"class":946,"line":1074},[944,4601,1078],{"emptyLinePlaceholder":1077},[944,4603,4604,4606],{"class":946,"line":1081},[944,4605,2806],{"class":976},[944,4607,4608],{"class":1058}," buzz\u002Fdeploy\u002Fcompose\n",[944,4610,4611,4613,4615],{"class":946,"line":1088},[944,4612,2823],{"class":1054},[944,4614,2826],{"class":1058},[944,4616,2829],{"class":1058},[944,4618,4619,4622],{"class":946,"line":1948},[944,4620,4621],{"class":1054},"nano",[944,4623,2829],{"class":1058},[430,4625,2833,4626,4628],{},[494,4627,2836],{}," 文件：",[484,4630,4631],{},[487,4632,4633],{},[441,4634,4635],{},"域名配置:",[936,4637,4642],{"className":4638,"code":4640,"language":4641},[4639],"language-text","BUZZ_DOMAIN=buzz.pafor.me\nRELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\nBUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_MEDIA_BASE_URL=https:\u002F\u002Fbuzz.pafor.me\u002Fmedia\nBUZZ_MEDIA_SERVER_DOMAIN=buzz.pafor.me\nBUZZ_CORS_ORIGINS=https:\u002F\u002Fbuzz.pafor.me\n","text",[494,4643,4640],{"__ignoreMap":425},[484,4645,4646,4656],{},[487,4647,4648,4651,4652,4655],{},[441,4649,4650],{},"所有者金鑰:"," ",[494,4653,4654],{},"RELAY_OWNER_PUBKEY"," 欄位需要填入您的 64 位 16 進位公鑰。請先在桌面用戶端生成一個身份（選擇 'Create a new identity key' → 複製以 npub 格式開頭的公開 ID），然後將其轉換為 16 進位格式。",[487,4657,4658,4661],{},[441,4659,4660],{},"金鑰安全（Secrets）:",[484,4662,4663,4673,4687],{},[487,4664,4665,4666,4669,4670,4672],{},"使用該 ",[444,4667,4668],{"href":2857},"線上工具"," 或運行命令 ",[494,4671,2862],{},"（運行 7 次）來生成高強度的隨機金鑰。",[487,4674,4675,4676,4679,4680,1536,4683,4686],{},"將所有的 ",[494,4677,4678],{},"CHANGE_ME"," 佔位符替換掉：包括 ",[494,4681,4682],{},"BUZZ_RELAY_PRIVATE_KEY",[494,4684,4685],{},"BUZZ_GIT_HOOK_HMAC_SECRET","、Postgres\u002FRedis\u002FTypesense 的密碼以及 S3 的 Access\u002FSecret Key。",[487,4688,4689,4690,4693],{},"未替換的佔位符是導致容器陷入無限重啟循環的最常見原因；請通過命令 ",[494,4691,4692],{},"grep CHANGE_ME .env"," 來核對並排除隱患。",[936,4695,4698],{"className":4696,"code":4697,"language":4641},[4639],"    BUZZ_RELAY_PRIVATE_KEY=CHANGE_ME_64_HEX_PRIVATE_KEY\n    BUZZ_GIT_HOOK_HMAC_SECRET=CHANGE_ME_RANDOM_64_HEX\n    POSTGRES_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    REDIS_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    TYPESENSE_API_KEY=CHANGE_ME_RANDOM_API_KEY\n    BUZZ_S3_ACCESS_KEY=CHANGE_ME_RANDOM_ACCESS_KEY\n    BUZZ_S3_SECRET_KEY=CHANGE_ME_RANDOM_SECRET_KEY\n",[494,4699,4697],{"__ignoreMap":425},[484,4701,4702],{},[487,4703,4704,4707],{},[441,4705,4706],{},"其他配置項:",[484,4708,4709,4716],{},[487,4710,4711,4712,4715],{},"將環境變數 ",[494,4713,4714],{},"CLOUDFLARE_API_TOKEN"," 添加到您的配置中，並賦予先前生成的 API 權杖值。Caddy 將用其自動申請憑證。",[487,4717,4718,4719,4721,4722,1859,4725,4728],{},"Buzz 的預設配置非常開放，任何知道您中繼器地址的人都可以驗證並加入。為了安全起見，請務必配置 ",[494,4720,4654],{},"，並將 ",[494,4723,4724],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[494,4726,4727],{},"BUZZ_REQUIRE_AUTH_TOKEN=true"," 設為啟用狀態。",[892,4730,4732],{"id":4731},"_4-使用-caddy-開啟-https-訪問","4. 使用 Caddy 開啟 HTTPS 訪問",[2182,4734,4736],{"id":4735},"構建集成-cloudflare-dns-模組的自定義-caddy-鏡像","構建集成 Cloudflare DNS 模組的自定義 Caddy 鏡像",[484,4738,4739,4750,4753],{},[487,4740,4741,4742,4745,4746,4749],{},"我們在 Caddy 中配置基於 Cloudflare 的 DNS-01 挑戰（Challenge）。DNS-01 驗證的原理是讓 Caddy 外掛程式向您的",[441,4743,4744],{},"公網 DNS"," 寫入一條 TXT 挑戰記錄 ",[494,4747,4748],{},"_acme-challenge.buzz.pafor.me","；",[487,4751,4752],{},"隨後 Let's Encrypt 從公共網際網路查詢該記錄，以確權您的域名。這意味著您的域名必須是 Cloudflare 帳戶中的公網解析區域，而不能只是 Zero Trust \u002F WARP 區域網路 DNS 內的私有域名。如果您的域名只在私網下分发解析而沒有公網節點，DNS-01 將會失敗，需要改用其他驗證方式。",[487,4754,4755],{},"將以下配置加入到 Caddyfile 中：",[936,4757,4759],{"className":1359,"code":4758,"language":1361,"meta":425,"style":425},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[494,4760,4761,4765,4778],{"__ignoreMap":425},[944,4762,4763],{"class":946,"line":947},[944,4764,2905],{"class":958},[944,4766,4767,4770,4773,4776],{"class":946,"line":1074},[944,4768,4769],{"class":1058},"  acme_dns cloudflare",[944,4771,4772],{"class":958}," {",[944,4774,4775],{"class":1058},"env.CLOUDFLARE_API_TOKEN",[944,4777,2913],{"class":958},[944,4779,4780],{"class":946,"line":1081},[944,4781,2913],{"class":958},[484,4783,4784],{},[487,4785,4786,4787,4790,4791,4794],{},"創建一個 ",[494,4788,4789],{},"Dockerfile.caddy","，其内容如下，這是 ",[494,4792,4793],{},"compose.caddy.yml"," 運行所必需的：",[936,4796,4798],{"className":1359,"code":4797,"language":1361,"meta":425,"style":425},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[494,4799,4800,4805,4809,4814,4819,4823,4828,4832],{"__ignoreMap":425},[944,4801,4802],{"class":946,"line":947},[944,4803,4804],{"class":1058},"FROM caddy:2-builder AS builder\n",[944,4806,4807],{"class":946,"line":1074},[944,4808,1078],{"emptyLinePlaceholder":1077},[944,4810,4811],{"class":946,"line":1081},[944,4812,4813],{"class":1058},"RUN xcaddy build \\\n",[944,4815,4816],{"class":946,"line":1088},[944,4817,4818],{"class":1058},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[944,4820,4821],{"class":946,"line":1948},[944,4822,1078],{"emptyLinePlaceholder":1077},[944,4824,4825],{"class":946,"line":1953},[944,4826,4827],{"class":1058},"FROM caddy:2-alpine\n",[944,4829,4830],{"class":946,"line":1959},[944,4831,1078],{"emptyLinePlaceholder":1077},[944,4833,4834],{"class":946,"line":2294},[944,4835,4836],{"class":1058},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[484,4838,4839],{},[487,4840,4841,4842,4844],{},"修改 ",[494,4843,4793],{},"，以使用我們剛生成的帶有 Cloudflare 外掛程式的 Caddy 鏡像，並傳入 API 權杖參數：",[936,4846,4848],{"className":1359,"code":4847,"language":1361,"meta":425,"style":425},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[494,4849,4850,4856,4863,4875,4879,4886,4893,4903,4913,4922,4929,4936,4946,4952,4962,4972,4978,4989,5000,5006,5013,5020,5027,5036,5044,5052,5057,5064,5072,5080,5091,5099,5106],{"__ignoreMap":425},[944,4851,4852,4854],{"class":946,"line":947},[944,4853,3234],{"class":1371},[944,4855,1386],{"class":958},[944,4857,4858,4861],{"class":946,"line":1074},[944,4859,4860],{"class":1371},"  relay",[944,4862,1386],{"class":958},[944,4864,4865,4867,4869,4872],{"class":946,"line":1081},[944,4866,3258],{"class":1371},[944,4868,1375],{"class":958},[944,4870,4871],{"class":950}," !reset",[944,4873,4874],{"class":958}," []\n",[944,4876,4877],{"class":946,"line":1088},[944,4878,1078],{"emptyLinePlaceholder":1077},[944,4880,4881,4884],{"class":946,"line":1948},[944,4882,4883],{"class":1371},"  caddy",[944,4885,1386],{"class":958},[944,4887,4888,4891],{"class":946,"line":1953},[944,4889,4890],{"class":1371},"    build",[944,4892,1386],{"class":958},[944,4894,4895,4898,4900],{"class":946,"line":1959},[944,4896,4897],{"class":1371},"      context",[944,4899,1375],{"class":958},[944,4901,4902],{"class":2950}," .\n",[944,4904,4905,4908,4910],{"class":946,"line":2294},[944,4906,4907],{"class":1371},"      dockerfile",[944,4909,1375],{"class":958},[944,4911,4912],{"class":1058}," Dockerfile.caddy\n",[944,4914,4915,4917,4919],{"class":946,"line":2305},[944,4916,3248],{"class":1371},[944,4918,1375],{"class":958},[944,4920,4921],{"class":1058}," buzz-caddy:cloudflare\n",[944,4923,4924,4927],{"class":946,"line":2401},[944,4925,4926],{"class":1371},"    depends_on",[944,4928,1386],{"class":958},[944,4930,4931,4934],{"class":946,"line":2407},[944,4932,4933],{"class":1371},"      relay",[944,4935,1386],{"class":958},[944,4937,4938,4941,4943],{"class":946,"line":2413},[944,4939,4940],{"class":1371},"        condition",[944,4942,1375],{"class":958},[944,4944,4945],{"class":1058}," service_healthy\n",[944,4947,4948,4950],{"class":946,"line":2418},[944,4949,3278],{"class":1371},[944,4951,1386],{"class":958},[944,4953,4954,4957,4959],{"class":946,"line":1723},[944,4955,4956],{"class":1371},"      BUZZ_DOMAIN",[944,4958,1375],{"class":958},[944,4960,4961],{"class":1058}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[944,4963,4964,4967,4969],{"class":946,"line":3337},[944,4965,4966],{"class":1371},"      CLOUDFLARE_API_TOKEN",[944,4968,1375],{"class":958},[944,4970,4971],{"class":1058}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[944,4973,4974,4976],{"class":946,"line":3348},[944,4975,3258],{"class":1371},[944,4977,1386],{"class":958},[944,4979,4980,4982,4984,4987],{"class":946,"line":3353},[944,4981,3265],{"class":958},[944,4983,3268],{"class":958},[944,4985,4986],{"class":1058},"${CADDY_HTTP_PORT:-80}:80",[944,4988,1980],{"class":958},[944,4990,4991,4993,4995,4998],{"class":946,"line":3361},[944,4992,3265],{"class":958},[944,4994,3268],{"class":958},[944,4996,4997],{"class":1058},"${CADDY_HTTPS_PORT:-443}:443",[944,4999,1980],{"class":958},[944,5001,5002,5004],{"class":946,"line":3902},[944,5003,3311],{"class":1371},[944,5005,1386],{"class":958},[944,5007,5008,5010],{"class":946,"line":3908},[944,5009,3265],{"class":958},[944,5011,5012],{"class":1058}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[944,5014,5015,5017],{"class":946,"line":3917},[944,5016,3265],{"class":958},[944,5018,5019],{"class":1058}," buzz-caddy-data:\u002Fdata\n",[944,5021,5022,5024],{"class":946,"line":4572},[944,5023,3265],{"class":958},[944,5025,5026],{"class":1058}," buzz-caddy-config:\u002Fconfig\n",[944,5028,5030,5032,5034],{"class":946,"line":5029},23,[944,5031,3340],{"class":1371},[944,5033,1375],{"class":958},[944,5035,3345],{"class":1058},[944,5037,5039,5042],{"class":946,"line":5038},24,[944,5040,5041],{"class":1371},"    networks",[944,5043,1386],{"class":958},[944,5045,5047,5049],{"class":946,"line":5046},25,[944,5048,3265],{"class":958},[944,5050,5051],{"class":1058}," buzz-net\n",[944,5053,5055],{"class":946,"line":5054},26,[944,5056,1078],{"emptyLinePlaceholder":1077},[944,5058,5060,5062],{"class":946,"line":5059},27,[944,5061,3356],{"class":1371},[944,5063,1386],{"class":958},[944,5065,5067,5070],{"class":946,"line":5066},28,[944,5068,5069],{"class":1371},"  buzz-caddy-data",[944,5071,1386],{"class":958},[944,5073,5075,5078],{"class":946,"line":5074},29,[944,5076,5077],{"class":1371},"    labels",[944,5079,1386],{"class":958},[944,5081,5083,5086,5088],{"class":946,"line":5082},30,[944,5084,5085],{"class":1371},"      com.buzz.volume",[944,5087,1375],{"class":958},[944,5089,5090],{"class":1058}," caddy-data\n",[944,5092,5094,5097],{"class":946,"line":5093},31,[944,5095,5096],{"class":1371},"  buzz-caddy-config",[944,5098,1386],{"class":958},[944,5100,5102,5104],{"class":946,"line":5101},32,[944,5103,5077],{"class":1371},[944,5105,1386],{"class":958},[944,5107,5109,5111,5113],{"class":946,"line":5108},33,[944,5110,5085],{"class":1371},[944,5112,1375],{"class":958},[944,5114,5115],{"class":1058}," caddy-config\n",[2182,5117,5119],{"id":5118},"啟動-docker-容器組合","啟動 Docker 容器組合",[936,5121,5123],{"className":1045,"code":5122,"language":1047,"meta":425,"style":425},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[494,5124,5125,5145,5149,5154],{"__ignoreMap":425},[944,5126,5127,5129,5131,5133,5136,5138,5141,5143],{"class":946,"line":947},[944,5128,1190],{"class":1054},[944,5130,1193],{"class":1058},[944,5132,3420],{"class":1058},[944,5134,5135],{"class":1058}," compose.yml",[944,5137,3420],{"class":1058},[944,5139,5140],{"class":1058}," compose.caddy.yml",[944,5142,2972],{"class":1058},[944,5144,2975],{"class":1058},[944,5146,5147],{"class":946,"line":1074},[944,5148,1078],{"emptyLinePlaceholder":1077},[944,5150,5151],{"class":946,"line":1081},[944,5152,5153],{"class":1084},"#Check the Docker status\n",[944,5155,5156,5158,5160],{"class":946,"line":1088},[944,5157,1190],{"class":1054},[944,5159,1193],{"class":1058},[944,5161,5162],{"class":1058}," ps\n",[433,5164],{"src":5165,"alt":5166,"style":5167},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","終端機視窗顯示通過 docker compose ps 運行的 Buzz 服務容器狀態","max-width: 700px; width: 100%; height: auto;",[430,5169,5170,5171,5174],{},"打開您的網頁瀏覽器並訪問 ",[494,5172,5173],{},"http:\u002F\u002Fbuzz.pafor.me","，驗證中繼服務是否已順利跑起來。",[433,5176],{"src":5177,"alt":5178,"style":3102},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-relay-running-browser-verification.webp","瀏覽器驗證頁面，顯示自託管 Block's Buzz 中繼伺服器的成功運行響應",[892,5180,5182],{"id":5181},"步驟-5建立起首日備份機制","步驟 5：建立起首日備份機制",[936,5184,5186],{"className":1045,"code":5185,"language":1047,"meta":425,"style":425},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[494,5187,5188,5199],{"__ignoreMap":425},[944,5189,5190,5193,5196],{"class":946,"line":947},[944,5191,5192],{"class":1054},"mkdir",[944,5194,5195],{"class":1058}," -p",[944,5197,5198],{"class":1058}," \u002Fbuzz_backups\n",[944,5200,5201,5204],{"class":946,"line":1074},[944,5202,5203],{"class":1054},"crontab",[944,5205,5206],{"class":1058}," -e\n",[430,5208,5209],{},"添加一個每日凌晨自動執行的資料庫快照定時任務（Cron Job）：",[936,5211,5214],{"className":5212,"code":5213,"language":4641},[4639],"0 3 * * * cd \u002Fhome\u002F\u003Cuser>\u002Fbuzz\u002Fdeploy\u002Fcompose && docker compose exec -T postgres pg_dump -U buzz buzz > \u002Fbuzz_backups\u002Fbuzz-$(date +\\%Y\\%m\\%d).sql\n",[494,5215,5213],{"__ignoreMap":425},[430,5217,5218,5219,5221],{},"注意：請將 ",[494,5220,4682],{}," 視為永久不可失配的金鑰。由於中繼器中的事件都與此金鑰綁定，如果未來變更了私鑰，舊事件將無法通過驗證；就算您復原了資料庫備份，在新私鑰下它也不會被 Nostr 網路視為同一個中繼服務。",[474,5223,5225],{"id":5224},"配置-buzz-桌面用戶端與-nostr-加密身份","配置 Buzz 桌面用戶端與 Nostr 加密身份",[430,5227,2486,5228,5232],{},[444,5229,5230],{"href":5230,"rel":5231},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[448]," 下載最新版 Buzz 桌面用戶端並運行。依次完善個人資料，直到您來到 “Join or create a community” 介面。",[430,5234,5235],{},[433,5236],{"alt":5237,"src":5238},"Buzz 桌面用戶端簡易設定介面，用於加入或創建社區","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[430,5240,5241],{},"點擊 “Join a community” 並拷貝您的公鑰（Public Key）。",[430,5243,5244],{},[433,5245],{"alt":5246,"src":5247},"Buzz 用戶端介面顯示加入社區前的公鑰數位身份","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-join-community-public-key.webp",[430,5249,5250,5251,5254],{},"在 ",[441,5252,5253],{},"VPS 上","運行以下命令列工具，將您自己添加為該平台的首位會員：",[936,5256,5258],{"className":1045,"code":5257,"language":1047,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[494,5259,5260],{"__ignoreMap":425},[944,5261,5262,5264,5266,5268,5270,5272,5274,5276],{"class":946,"line":947},[944,5263,1190],{"class":1054},[944,5265,1193],{"class":1058},[944,5267,1196],{"class":1058},[944,5269,1199],{"class":1058},[944,5271,1202],{"class":1058},[944,5273,1205],{"class":1058},[944,5275,1208],{"class":1058},[944,5277,5278],{"class":1058}," npub1yourkeyhere\n",[430,5280,5281,5282,5285],{},"在用戶端中填入 ",[494,5283,5284],{},"wss:\u002F\u002Fbuzz.pafor.me"," 作為社區接入 URL，然後點擊 “Next”。",[430,5287,5288],{},[433,5289],{"alt":5290,"src":5291},"在 Buzz 桌面用戶端中輸入自託管社區中繼伺服器的 URL 地址","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[430,5293,5294],{},"起一個帥氣的暱稱，然後點擊 “Next” 按鈕。",[430,5296,5297],{},[433,5298],{"alt":5299,"src":5300},"Buzz 用戶端個人資料配置介面，用於輸入使用者暱稱","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-profile-name-input.webp",[892,5302,5304],{"id":5303},"協作頻道與-ai-智能體","協作頻道與 AI 智能體",[430,5306,5307],{},"頻道是圍繞特定任務或專案劃分的群組。為您手頭的每個任務或工程建立獨立的頻道，並將團隊成員與所需的 AI 智能體拉入其中。",[430,5309,5310],{},"頻道內的所有消息、代碼與文件都會被自動分享，免去了逐一向新成員同步前因後果的煩惱。任何人都可以通過「@」來點名激活特定的 AI 智能體，智能體收到召喚後會讀取相關歷史消息並立刻著手處理。更妙的是，不同的 AI 智能體之間也能互相 @ 指派任務。",[430,5312,5313],{},"讓我們試著給預置的智能體發一條私信（DM）",[430,5315,5316],{},[433,5317],{"alt":5318,"src":5319},"在 Buzz 協同桌面用戶端中給 AI 智能體發送私信（DM）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[430,5321,5322],{},"創建一個新頻道并拉幾個 AI 智能體進來吧",[430,5324,5325],{},[433,5326],{"alt":5327,"src":5328},"在 Buzz 桌面用戶端中創建新的任務或專案協作頻道","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-create-channel-dialog.webp",[430,5330,5331],{},[433,5332],{"alt":5333,"src":5334},"將團隊成員和 AI 智能體添加至新創建的協作頻道中","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-agents-to-channel.webp",[430,5336,5337],{},[433,5338],{"alt":5339,"src":5340},"活躍協作頻道視圖，展示合併後的聊天歷史和專案任務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[433,5342],{"src":5343,"alt":5344,"style":5345},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-active-agents.webp","已整合到協同專案頻道中的活躍 AI 智能體列表細節檢視","max-width: 367px; width: 100%; height: auto;",[892,5347,5349],{"id":5348},"激活智能體運行時agent-runtimes","激活智能體運行時（Agent Runtimes）",[430,5351,5352,5353,5356,5357,5360],{},"平台自帶的運行時預設依賴於「自動探測」來查找特定系統目錄（例如 ",[494,5354,5355],{},"~\u002F.local\u002Fbin","）下的執行程序（如 ",[494,5358,5359],{},"hermes-acp","）。如果您的智能體軟體安裝在非標準路徑下，Buzz 將無法正確識別。",[430,5362,5363,5364,5367],{},"以 Kimi Code 為例，它的智能體 ID 為 kimi，Buzz 預設會在 ",[494,5365,5366],{},"~\u002F.local\u002Fbin\u002Fkimi"," 尋找它。通過創建一個軟連結（Symbolic Link）即可輕鬆搞定：",[936,5369,5372],{"className":5370,"code":5371,"language":4641},[4639],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[494,5373,5371],{"__ignoreMap":425},[430,5375,5376],{},"此時，Kimi Code 就會顯示在「Agent runtimes」列表中。",[430,5378,5379],{},[433,5380],{"alt":5381,"src":5382},"Buzz 用戶端設置介面，顯示已配置的 AI 智能體執行期列表（包括 Kimi）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-agent-runtimes-list.webp",[892,5384,5385],{"id":5385},"專案與代碼倉庫管理",[430,5387,5388,5389,5392],{},"請先在 Settings → Experiments 菜單中激活「",[441,5390,5391],{},"Projects","」實驗性功能：",[430,5394,5395],{},[433,5396],{"alt":5397,"src":5398},"在 Buzz 用戶端設置的 Experiments 標籤頁中激活實驗性 Projects 功能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[430,5400,5401,5402,5404],{},"目前，一個專案（Project）必須使用 ",[494,5403,1220],{}," 命令列工具來創建（雖然在後續版本中會加入 UI 直接創建的支持）。",[2182,5406,5408],{"id":5407},"在-vps-上安裝並部署-buzz-cli","在 VPS 上安裝並部署 buzz-cli",[430,5410,5250,5411,5413,5414,5416],{},[441,5412,5253],{},"依次執行以下命令，編譯並安裝好 ",[494,5415,1220],{}," 用戶端：",[936,5418,5420],{"className":1045,"code":5419,"language":1047,"meta":425,"style":425},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[494,5421,5422,5433,5440,5453],{"__ignoreMap":425},[944,5423,5424,5426,5428,5430],{"class":946,"line":947},[944,5425,1916],{"class":1054},[944,5427,4474],{"class":1058},[944,5429,4495],{"class":1058},[944,5431,5432],{"class":1058}," cargo\n",[944,5434,5435,5437],{"class":946,"line":1074},[944,5436,2806],{"class":976},[944,5438,5439],{"class":1058}," ~\u002Fbuzz\n",[944,5441,5442,5445,5447,5450],{"class":946,"line":1081},[944,5443,5444],{"class":1054},"cargo",[944,5446,4495],{"class":1058},[944,5448,5449],{"class":1058}," --path",[944,5451,5452],{"class":1058}," crates\u002Fbuzz-cli\n",[944,5454,5455,5457,5460,5463,5466,5469,5472,5475,5478],{"class":946,"line":1088},[944,5456,4421],{"class":976},[944,5458,5459],{"class":958}," '",[944,5461,5462],{"class":1058},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[944,5464,5465],{"class":958},"'",[944,5467,5468],{"class":958}," >>",[944,5470,5471],{"class":1058}," ~\u002F.bashrc",[944,5473,5474],{"class":958}," &&",[944,5476,5477],{"class":976}," source",[944,5479,5480],{"class":1058}," ~\u002F.bashrc\n",[430,5482,5483,5484,5486,5487,5489],{},"使用線上工具或通過 ",[494,5485,1220],{}," 生成一對 Nostr 加密公私鑰。這組金鑰將代表该 ",[494,5488,1220],{}," 工具在 Nostr 網路中的數位身份。",[936,5491,5493],{"className":1045,"code":5492,"language":1047,"meta":425,"style":425},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[494,5494,5495,5517,5521,5526],{"__ignoreMap":425},[944,5496,5497,5499,5502,5505,5508,5511,5514],{"class":946,"line":947},[944,5498,1190],{"class":1054},[944,5500,5501],{"class":1058}," run",[944,5503,5504],{"class":1058}," --rm",[944,5506,5507],{"class":1058}," --entrypoint",[944,5509,5510],{"class":1058}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[944,5512,5513],{"class":1058}," ghcr.io\u002Fblock\u002Fbuzz:main",[944,5515,5516],{"class":1058}," generate-key\n",[944,5518,5519],{"class":946,"line":1074},[944,5520,1078],{"emptyLinePlaceholder":1077},[944,5522,5523],{"class":946,"line":1081},[944,5524,5525],{"class":1084},"# Use the generated Public Key\n",[944,5527,5528,5530,5532,5534,5536,5538,5540,5542],{"class":946,"line":1088},[944,5529,1190],{"class":1054},[944,5531,1193],{"class":1058},[944,5533,1196],{"class":1058},[944,5535,1199],{"class":1058},[944,5537,1202],{"class":1058},[944,5539,1205],{"class":1058},[944,5541,1208],{"class":1058},[944,5543,5544],{"class":1058}," generated_Public_key\n",[430,5546,5547],{},"配置您的 CLI 變數：",[936,5549,5551],{"className":1045,"code":5550,"language":1047,"meta":425,"style":425},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[494,5552,5553,5558,5589,5593],{"__ignoreMap":425},[944,5554,5555],{"class":946,"line":947},[944,5556,5557],{"class":1084},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[944,5559,5560,5562,5564,5567,5569,5572,5575,5578,5581,5584,5586],{"class":946,"line":1074},[944,5561,4421],{"class":976},[944,5563,5459],{"class":958},[944,5565,5566],{"class":1058},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[944,5568,5465],{"class":958},[944,5570,5571],{"class":958},"  >>",[944,5573,5574],{"class":1058}," \u002Fhome\u002F",[944,5576,5577],{"class":958},"\u003C",[944,5579,5580],{"class":1058},"use",[944,5582,5583],{"class":954},"r",[944,5585,1263],{"class":958},[944,5587,5588],{"class":1058},"\u002F.bashrc\n",[944,5590,5591],{"class":946,"line":1081},[944,5592,1078],{"emptyLinePlaceholder":1077},[944,5594,5595,5597,5599,5602,5604,5606,5608,5610,5612,5614,5616],{"class":946,"line":1088},[944,5596,4421],{"class":976},[944,5598,5459],{"class":958},[944,5600,5601],{"class":1058},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[944,5603,5465],{"class":958},[944,5605,5571],{"class":958},[944,5607,5574],{"class":1058},[944,5609,5577],{"class":958},[944,5611,5580],{"class":1058},[944,5613,5583],{"class":954},[944,5615,1263],{"class":958},[944,5617,5588],{"class":1058},[430,5619,5620,5621,5623],{},"運行以下命令來測試 ",[494,5622,1220],{}," 是否已經與您的中繼器配对暢通：",[936,5625,5627],{"className":1045,"code":5626,"language":1047,"meta":425,"style":425},"buzz channels list\n",[494,5628,5629],{"__ignoreMap":425},[944,5630,5631,5633,5635],{"class":946,"line":947},[944,5632,1243],{"class":1054},[944,5634,1246],{"class":1058},[944,5636,5637],{"class":1058}," list\n",[430,5639,5640],{},[433,5641],{"alt":5642,"src":5643},"終端機命令列運行驗證，通過列出活躍頻道來檢查 buzz-cli 配置是否正確","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-cli-channels-list-terminal.webp",[2182,5645,5647],{"id":5646},"使用-buzz-cli-創建全新的專案","使用 buzz-cli 創建全新的專案",[936,5649,5651],{"className":1045,"code":5650,"language":1047,"meta":425,"style":425},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[494,5652,5653,5658],{"__ignoreMap":425},[944,5654,5655],{"class":946,"line":947},[944,5656,5657],{"class":1084},"# --channel refers to the UUID of the channel\n",[944,5659,5660,5662,5665,5668,5671,5674,5677,5679,5682,5684,5686,5688,5691],{"class":946,"line":1074},[944,5661,1243],{"class":1054},[944,5663,5664],{"class":1058}," repos",[944,5666,5667],{"class":1058}," create",[944,5669,5670],{"class":1058}," --id",[944,5672,5673],{"class":1058}," TestKOA",[944,5675,5676],{"class":1058}," --name",[944,5678,5459],{"class":958},[944,5680,5681],{"class":1058},"Display Name",[944,5683,5465],{"class":958},[944,5685,1251],{"class":1058},[944,5687,3268],{"class":958},[944,5689,5690],{"class":1058},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[944,5692,1980],{"class":958},[430,5694,5695,5696,5698],{},"專案的所有權極為嚴格，只有創建者才有權將其刪除。由於該「Display Name」專案是由 ",[494,5697,1220],{}," 發起創建的，而目前的命令列版本尚未內置刪除指令，因此該專案無法通過常規方式清空。",[430,5700,5701],{},"再次點開您的桌面用戶端，驗證該專案是否已顯示在工作區中。",[430,5703,5704],{},[433,5705],{"alt":5706,"src":5707},"Buzz 桌面用戶端專案檢視頁面，確認專案已成功創建","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[430,5709,5710],{},"一旦專案列表在介面中開啟，後續您便可以直接通過右上角的 「+」 按鈕隨心所欲地添加更多子專案了。",[430,5712,5713],{},[433,5714],{"alt":5715,"src":5716},"在 Buzz 桌面用戶端中點擊右上角加號按鈕來添加新專案","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-project-button.webp",[2182,5718,5720],{"id":5719},"拉入現有的-git-代碼倉庫","拉入現有的 Git 代碼倉庫",[430,5722,5723,5724,5727,5728,5731,5732,5737],{},"在您的本地開發機器上安裝 ",[494,5725,5726],{},"git-credential-nostr"," 憑證輔助工具。這需要您的系統已安裝 ",[441,5729,5730],{},"Git 2.46+"," 版本並配有 Rust 構建環境。詳情可參考此專案的 ",[444,5733,5736],{"href":5734,"rel":5735},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[448],"Readme"," 描述：",[936,5739,5741],{"className":1045,"code":5740,"language":1047,"meta":425,"style":425},"cargo install --path crates\u002Fgit-credential-nostr\n",[494,5742,5743],{"__ignoreMap":425},[944,5744,5745,5747,5749,5751],{"class":946,"line":947},[944,5746,5444],{"class":1054},[944,5748,4495],{"class":1058},[944,5750,5449],{"class":1058},[944,5752,5753],{"class":1058}," crates\u002Fgit-credential-nostr\n",[430,5755,5756,5757,5759],{},"對 ",[494,5758,5726],{}," 進行配置，使其獲得 Buzz 中繼器的授權權限：",[936,5761,5763],{"className":1045,"code":5762,"language":1047,"meta":425,"style":425},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[494,5764,5765,5770,5786,5799,5803,5808,5817,5844],{"__ignoreMap":425},[944,5766,5767],{"class":946,"line":947},[944,5768,5769],{"class":1084},"# 1. Register the helper and enable per-path credentials.\n",[944,5771,5772,5774,5777,5780,5783],{"class":946,"line":1074},[944,5773,2782],{"class":1054},[944,5775,5776],{"class":1058}," config",[944,5778,5779],{"class":1058}," --global",[944,5781,5782],{"class":1058}," credential.helper",[944,5784,5785],{"class":1058}," nostr\n",[944,5787,5788,5790,5792,5794,5797],{"class":946,"line":1081},[944,5789,2782],{"class":1054},[944,5791,5776],{"class":1058},[944,5793,5779],{"class":1058},[944,5795,5796],{"class":1058}," credential.useHttpPath",[944,5798,1397],{"class":958},[944,5800,5801],{"class":946,"line":1088},[944,5802,1078],{"emptyLinePlaceholder":1077},[944,5804,5805],{"class":946,"line":1948},[944,5806,5807],{"class":1084},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[944,5809,5810,5812,5814],{"class":946,"line":1953},[944,5811,5192],{"class":1054},[944,5813,5195],{"class":1058},[944,5815,5816],{"class":1058}," ~\u002F.nostr\n",[944,5818,5819,5821,5823,5826,5828,5830,5833,5835,5838,5841],{"class":946,"line":1959},[944,5820,4421],{"class":976},[944,5822,3268],{"class":958},[944,5824,5825],{"class":1058},"nsec1...",[944,5827,3682],{"class":958},[944,5829,4455],{"class":958},[944,5831,5832],{"class":1058}," ~\u002F.nostr\u002Fkey",[944,5834,5474],{"class":958},[944,5836,5837],{"class":1054}," chmod",[944,5839,5840],{"class":2950}," 600",[944,5842,5843],{"class":1058}," ~\u002F.nostr\u002Fkey\n",[944,5845,5846,5848,5850,5852,5855],{"class":946,"line":2294},[944,5847,2782],{"class":1054},[944,5849,5776],{"class":1058},[944,5851,5779],{"class":1058},[944,5853,5854],{"class":1058}," nostr.keyfile",[944,5856,5843],{"class":1058},[430,5858,5859],{},"在 Buzz 中繼上開闢出該 Git 庫的儲存節點：",[936,5861,5864],{"className":5862,"code":5863,"language":4641},[4639],"buzz repos create --id koa-email-routing --name \"KOA Email Routing\" --clone \"https:\u002F\u002Fbuzz.pafor.me\u002Fgit\u002F\u003Cpub_key>\u002Fkoa-email-routing\" --nostr-relay \"wss:\u002F\u002Fbuzz.pafor.me\"\n",[494,5865,5863],{"__ignoreMap":425},[430,5867,5868,5869,5872,5873,5876],{},"在第一次執行 ",[494,5870,5871],{},"git push"," 時，您可能會被攔截並報錯 ",[494,5874,5875],{},"remote: missing Authorization header","。這是由於 Git 寫入控制（ACL）是由頻道成員資格決定的，您必須先將該倉庫 ID 與一個具體的 Buzz 頻道進行綁定，從而授權合規寫入：",[936,5878,5880],{"className":1045,"code":5879,"language":1047,"meta":425,"style":425},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[494,5881,5882,5907,5911,5916],{"__ignoreMap":425},[944,5883,5884,5886,5888,5891,5893,5896,5898,5900,5902,5904],{"class":946,"line":947},[944,5885,1243],{"class":1054},[944,5887,5664],{"class":1058},[944,5889,5890],{"class":1058}," bind",[944,5892,5670],{"class":1058},[944,5894,5895],{"class":1058}," koa-email-routing",[944,5897,1251],{"class":1058},[944,5899,1254],{"class":958},[944,5901,1257],{"class":1058},[944,5903,1260],{"class":954},[944,5905,5906],{"class":958},">\n",[944,5908,5909],{"class":946,"line":1074},[944,5910,1078],{"emptyLinePlaceholder":1077},[944,5912,5913],{"class":946,"line":1081},[944,5914,5915],{"class":1084},"# push the code again\n",[944,5917,5918,5920],{"class":946,"line":1088},[944,5919,2782],{"class":1054},[944,5921,5922],{"class":1058}," push\n",[430,5924,5925,5926,5928],{},"在某些情況下，在 Buzz 桌面版中查閱專案進度時會遇到類似下方的 Git 模組拉取失敗提示。這是由於該桌面應用要求系統必須搭載 ",[441,5927,5730],{}," 版本，而應用直接啟動時可能預設尋址到了系統中的舊版 Git 引擎：",[430,5930,5931],{},[433,5932],{"alt":5933,"src":5934},"Buzz 用戶端展示由於本地 Git 版本低於 2.46 導致的 Git 庫載入失敗報錯介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[430,5936,5937,5938,5941,5942,5947],{},"請在您的 shell 設定檔中通過執行 ",[494,5939,5940],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\""," 聲明新版 Git 所在的 PATH，並直接在終端中拉起 Buzz 應用。對此可參考該 ",[444,5943,5946],{"href":5944,"rel":5945},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[448],"Issue"," 的詳細排查記錄。",[936,5949,5951],{"className":1045,"code":5950,"language":1047,"meta":425,"style":425},"open -a Buzz\n",[494,5952,5953],{"__ignoreMap":425},[944,5954,5955,5958,5961],{"class":946,"line":947},[944,5956,5957],{"class":1054},"open",[944,5959,5960],{"class":1058}," -a",[944,5962,5963],{"class":1058}," Buzz\n",[430,5965,5966],{},"重新進入用戶端中的 Projects 標籤頁，您會驚喜地發現代碼庫的所有提交與詳情已經完美載入出來了。",[430,5968,5969],{},[433,5970],{"alt":5971,"src":5972},"代碼庫提交詳情成功載入後的 Buzz 桌面用戶端專案面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-repository-details-loaded.webp",[474,5974,5976],{"id":5975},"利用二維碼將-ai-助手同步至手機端-buzz-app","利用二維碼將 AI 助手同步至手機端 Buzz App",[430,5978,5979,5980,5983],{},"Buzz 手機端的「掃碼配對」只認 HTTPS 協定，且 VPS 上的中繼服務預設並不會在背景運行 ",[494,5981,5982],{},"buzz-pair-relay"," 組件。",[936,5985,5987],{"className":1045,"code":5986,"language":1047,"meta":425,"style":425},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[494,5988,5989,5995],{"__ignoreMap":425},[944,5990,5991,5993],{"class":946,"line":947},[944,5992,2806],{"class":976},[944,5994,5439],{"class":1058},[944,5996,5997,5999,6001,6003],{"class":946,"line":1074},[944,5998,5444],{"class":1054},[944,6000,4495],{"class":1058},[944,6002,5449],{"class":1058},[944,6004,6005],{"class":1058}," crates\u002Fbuzz-pair-relay\n",[430,6007,6008,6009,6012,6013,6015],{},"將以下配置注入到您的 ",[494,6010,6011],{},"compose.yml"," 文件中，聲明並啟動 ",[494,6014,5982],{}," 容器進程：",[936,6017,6019],{"className":1359,"code":6018,"language":1361,"meta":425,"style":425},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[494,6020,6021,6028,6037,6057,6063,6073,6079,6090,6098,6104],{"__ignoreMap":425},[944,6022,6023,6026],{"class":946,"line":947},[944,6024,6025],{"class":1371},"  pair",[944,6027,1386],{"class":958},[944,6029,6030,6032,6034],{"class":946,"line":1074},[944,6031,3248],{"class":1371},[944,6033,1375],{"class":958},[944,6035,6036],{"class":1058}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[944,6038,6039,6042,6044,6047,6049,6052,6054],{"class":946,"line":1081},[944,6040,6041],{"class":1371},"    entrypoint",[944,6043,1375],{"class":958},[944,6045,6046],{"class":958}," [",[944,6048,3682],{"class":958},[944,6050,6051],{"class":1058},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[944,6053,3682],{"class":958},[944,6055,6056],{"class":958},"]\n",[944,6058,6059,6061],{"class":946,"line":1088},[944,6060,3278],{"class":1371},[944,6062,1386],{"class":958},[944,6064,6065,6068,6070],{"class":946,"line":1948},[944,6066,6067],{"class":1371},"      BUZZ_PAIR_RELAY_BIND_ADDR",[944,6069,1375],{"class":958},[944,6071,6072],{"class":1058}," 0.0.0.0:5000\n",[944,6074,6075,6077],{"class":946,"line":1953},[944,6076,3258],{"class":1371},[944,6078,1386],{"class":958},[944,6080,6081,6083,6085,6088],{"class":946,"line":1959},[944,6082,3265],{"class":958},[944,6084,3268],{"class":958},[944,6086,6087],{"class":1058},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[944,6089,1980],{"class":958},[944,6091,6092,6094,6096],{"class":946,"line":2294},[944,6093,3340],{"class":1371},[944,6095,1375],{"class":958},[944,6097,3345],{"class":1058},[944,6099,6100,6102],{"class":946,"line":2305},[944,6101,5041],{"class":1371},[944,6103,1386],{"class":958},[944,6105,6106,6109,6112],{"class":946,"line":2401},[944,6107,6108],{"class":958},"      [",[944,6110,6111],{"class":1058},"buzz-net",[944,6113,6056],{"class":958},[430,6115,6116,6117,6119,6120,6123],{},"在您的 ",[494,6118,2836],{}," 中聲明 ",[494,6121,6122],{},"BUZZ_PAIRING_RELAY_URL"," 及其專用的運行埠號：",[936,6125,6128],{"className":6126,"code":6127,"language":4641},[4639],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[494,6129,6127],{"__ignoreMap":425},[430,6131,6132,6133,6136],{},"點擊桌面端應用中的 Settings, 進入 「",[441,6134,6135],{},"Mobile","」 配對項：",[430,6138,6139],{},[433,6140],{"alt":6141,"src":6142},"Buzz 桌面用戶端設置中展示的 Mobile 行動端配對配置標籤頁","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[430,6144,6145],{},"點擊 “Start pairing” —— 介面會生成專屬的綁定二維碼；打開手機端 App 掃一掃，接著在桌面端點擊 “Code Match” 確認無誤，雙端便立即完成信任綁定。",[430,6147,6148],{},[433,6149],{"alt":6150,"src":6151},"在桌面用戶端中生成安全的配對二維碼，用於同步 Buzz 手機端 App","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[430,6153,6154],{},"注意：手機端应用中的智能體之所以能隨叫隨到，是基於您的桌面端應用在背景持續維繫運行。只有保障桌面機處於線上狀態，手機端派發的智能體指令才能被順利分發與執行。",[430,6156,6157],{},[433,6158],{"alt":6159,"src":6160},"在手機端 Buzz App 中成功載入同步後的活躍 AI 智能體列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-mobile-app-active-agents.webp",[474,6162,2592],{"id":2592},[430,6164,6165],{},"不可否認，作為一個還處於發展初期的技術方案，Buzz 在面對大規模生產環境時依然稍顯稚嫩，伴隨著一些偶發的系統 Bug 與介面互動上的限制。但對於小型團隊或單兵作戰的獨立開發者而言，這無疑是一場令人血脈偾張的前沿探索。它為我们揭開了一幅波瀾壯闊的人機無縫協奏畫卷，讓我們提前觸碰到了「AI 智能體成為工作夥伴」的未來工作模式。",[474,6167,6168],{"id":6168},"參考資源",[484,6170,6171,6178,6185,6192],{},[487,6172,6173],{},[444,6174,6177],{"href":6175,"rel":6176},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[448],"Buzz releases",[487,6179,6180],{},[444,6181,6184],{"href":6182,"rel":6183},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[448],"Introducing Buzz",[487,6186,6187],{},[444,6188,6191],{"href":6189,"rel":6190},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[448],"What is buzz",[487,6193,6194],{},[444,6195,6198],{"href":6196,"rel":6197},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[448],"How to self-host Buzz (Miget)",[1667,6200,6201],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":425,"searchDepth":1074,"depth":1081,"links":6203},[6204,6205,6206,6220,6229,6230,6231],{"id":4120,"depth":1074,"text":4121},{"id":4165,"depth":1074,"text":4166},{"id":4213,"depth":1074,"text":4214,"children":6207},[6208,6209,6213,6214,6215,6219],{"id":4217,"depth":1081,"text":4218},{"id":4245,"depth":1081,"text":4246,"children":6210},[6211,6212],{"id":4249,"depth":1088,"text":4250},{"id":4347,"depth":1088,"text":4348},{"id":4365,"depth":1081,"text":4366},{"id":4582,"depth":1081,"text":4583},{"id":4731,"depth":1081,"text":4732,"children":6216},[6217,6218],{"id":4735,"depth":1088,"text":4736},{"id":5118,"depth":1088,"text":5119},{"id":5181,"depth":1081,"text":5182},{"id":5224,"depth":1074,"text":5225,"children":6221},[6222,6223,6224],{"id":5303,"depth":1081,"text":5304},{"id":5348,"depth":1081,"text":5349},{"id":5385,"depth":1081,"text":5385,"children":6225},[6226,6227,6228],{"id":5407,"depth":1088,"text":5408},{"id":5646,"depth":1088,"text":5647},{"id":5719,"depth":1088,"text":5720},{"id":5975,"depth":1074,"text":5976},{"id":2592,"depth":1074,"text":2592},{"id":6168,"depth":1074,"text":6168},[1688,1687,1243],"2026-09-08",{"schemaOrg":6235,"robots":1721,"sitemap":6254},[6236,6237],{"@type":1698,"headline":455,"description":465,"image":466},{"@type":1700,"name":455,"description":465,"image":466,"step":6238},[6239,6242,6245,6248,6251],{"@type":1703,"name":6240,"text":6241},"階段 1：Cloudflare 設置","創建 Cloudflare API 權杖並配置 DNS 解析設置。",{"@type":1703,"name":6243,"text":6244},"階段 2：安裝 Docker","在 Ubuntu VPS 上設置並安裝 Docker 容器引擎。",{"@type":1703,"name":6246,"text":6247},"階段 3：克隆與配置","克隆倉庫代碼並配置 docker-compose 環境變數。",{"@type":1703,"name":6249,"text":6250},"階段 4：整合 Caddy","編譯帶有 Cloudflare DNS 挑戰模組的的自訂 Caddy 鏡像。",{"@type":1703,"name":6252,"text":6253},"階段 5：自動備份","配置 cron 定時任務以實現 PostgreSQL 資料庫的自動備份。",{"lastmod":6255},"2026-09-03",{"title":6257,"description":465,"ogTitle":455,"ogDescription":465,"twitterTitle":455,"twitterDescription":465},"如何在 Ubuntu VPS 上自建 Block 旗下的 Buzz 協作中繼伺服器","tw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[1728,6260,1115,6261,6262],"Docker","Caddy","Cloudflare","IBYHxp-6BbUZwuDc9Hxf1yMQj3uMpBUTAm2W1CTRUic",{"id":6265,"title":6266,"author":1730,"body":6267,"category":8137,"date":8139,"description":8140,"extension":1692,"image":8141,"imageAlt":8142,"isPublished":1077,"meta":8143,"minRead":4572,"navigation":1077,"path":261,"seo":8149,"stem":8150,"tags":8151,"updatedAt":6255,"__hash__":8153},"article\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek.md","使用Docker與TREK自託管您的個性化智能旅行日程：一站式深度規劃並輕鬆管理預訂、財務和行李清單",{"type":427,"value":6268,"toc":8096},[6269,6272,6275,6278,6282,6286,6428,6431,6437,6456,6459,6462,6566,6577,6580,6585,6588,6599,6603,6607,6610,6613,6646,6650,6653,6686,6689,6729,6732,6737,6749,6753,6760,6764,6767,6858,6862,6865,6869,6876,6880,6883,6901,6912,6916,6919,6930,6934,6938,6949,6953,6957,6960,6964,6968,6971,6976,6979,6984,6990,6994,6998,7001,7005,7017,7022,7028,7033,7037,7040,7045,7050,7053,7060,7064,7067,7070,7080,7086,7091,7098,7103,7107,7112,7117,7120,7125,7129,7135,7139,7144,7148,7151,7154,7159,7164,7169,7173,7180,7185,7190,7195,7200,7204,7210,7215,7221,7225,7228,7232,7238,7243,7248,7254,7259,7264,7269,7283,7287,7292,7313,7318,7321,7325,7328,7333,7336,7384,7388,7395,7401,7406,7412,7417,7423,7428,7434,7437,7442,7449,7454,7460,7464,7471,7476,7479,7483,7487,7493,7497,7500,7507,7511,7518,7522,7533,7535,7539,7543,7553,7563,7568,7575,7580,7587,7591,7594,7759,7762,7766,7769,7774,7777,7783,7787,7794,7798,7801,7806,7813,7818,7822,7832,7903,7919,7922,7927,7931,7935,7946,8022,8035,8038,8042,8046,8049,8051,8054,8057,8066,8070,8093],[430,6270,6271],{},"在規劃旅行時，最繁瑣的部分莫過於那些零散的資料：機票預訂PDF、酒店確認信、旅伴之間的聊天記錄、想去的景點清單等，都散落在不同的角落。而當需要匯總總花費、拆分帳單時，又得在海量的出行記錄中不停翻找，極為耗費精力。",[430,6273,6274],{},"TREK是一款可以自託管的開源旅行規劃系統，能夠將您的行程、預訂、財務預算和行李清單一站式整合到同一個平台中。其內建的MCP（Model Context Protocol）伺服器還允許AI代理（如Claude Desktop）直接操作您的出行資料。",[430,6276,6277],{},"本教學將帶您一步步完成從系統部署到完整管理一次真實旅行的全過程。",[892,6279,6281],{"id":6280},"_1-如何使用docker部署trek旅行規劃器","1. 如何使用Docker部署TREK旅行規劃器",[2182,6283,6285],{"id":6284},"在ubuntu-vps上安裝docker","在Ubuntu VPS上安裝Docker",[936,6287,6289],{"className":1045,"code":6288,"language":1047,"meta":425,"style":425},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Verify docker is installed\ndocker --version\n\n# Starts automatically when your system boots\nsudo systemctl enable docker\n",[494,6290,6291,6295,6315,6319,6323,6355,6359,6363,6371,6375,6379,6395,6399,6403,6409,6413,6418],{"__ignoreMap":425},[944,6292,6293],{"class":946,"line":947},[944,6294,4379],{"class":1084},[944,6296,6297,6299,6301,6303,6305,6307,6309,6311,6313],{"class":946,"line":1074},[944,6298,2981],{"class":1054},[944,6300,4386],{"class":1058},[944,6302,4389],{"class":1058},[944,6304,4392],{"class":958},[944,6306,4395],{"class":1054},[944,6308,4398],{"class":1058},[944,6310,4401],{"class":1058},[944,6312,4404],{"class":1058},[944,6314,4407],{"class":1058},[944,6316,6317],{"class":946,"line":1081},[944,6318,1078],{"emptyLinePlaceholder":1077},[944,6320,6321],{"class":946,"line":1088},[944,6322,4416],{"class":1084},[944,6324,6325,6327,6329,6331,6333,6335,6337,6339,6341,6343,6345,6347,6349,6351,6353],{"class":946,"line":1948},[944,6326,4421],{"class":976},[944,6328,3268],{"class":958},[944,6330,4426],{"class":1058},[944,6332,4429],{"class":958},[944,6334,4432],{"class":1054},[944,6336,4435],{"class":1058},[944,6338,4438],{"class":958},[944,6340,4441],{"class":1058},[944,6342,3682],{"class":958},[944,6344,4392],{"class":958},[944,6346,4395],{"class":1054},[944,6348,3812],{"class":1058},[944,6350,4452],{"class":1058},[944,6352,4455],{"class":958},[944,6354,4458],{"class":1058},[944,6356,6357],{"class":946,"line":1953},[944,6358,1078],{"emptyLinePlaceholder":1077},[944,6360,6361],{"class":946,"line":1959},[944,6362,4467],{"class":1084},[944,6364,6365,6367,6369],{"class":946,"line":2294},[944,6366,1916],{"class":1054},[944,6368,4474],{"class":1058},[944,6370,4477],{"class":1058},[944,6372,6373],{"class":946,"line":2305},[944,6374,1078],{"emptyLinePlaceholder":1077},[944,6376,6377],{"class":946,"line":2401},[944,6378,4486],{"class":1084},[944,6380,6381,6383,6385,6387,6389,6391,6393],{"class":946,"line":2407},[944,6382,1916],{"class":1054},[944,6384,4474],{"class":1058},[944,6386,4495],{"class":1058},[944,6388,4498],{"class":1058},[944,6390,4501],{"class":1058},[944,6392,4504],{"class":1058},[944,6394,4507],{"class":1058},[944,6396,6397],{"class":946,"line":2413},[944,6398,1078],{"emptyLinePlaceholder":1077},[944,6400,6401],{"class":946,"line":2418},[944,6402,4536],{"class":1084},[944,6404,6405,6407],{"class":946,"line":1723},[944,6406,1190],{"class":1054},[944,6408,3605],{"class":1058},[944,6410,6411],{"class":946,"line":3337},[944,6412,1078],{"emptyLinePlaceholder":1077},[944,6414,6415],{"class":946,"line":3348},[944,6416,6417],{"class":1084},"# Starts automatically when your system boots\n",[944,6419,6420,6422,6424,6426],{"class":946,"line":3353},[944,6421,1916],{"class":1054},[944,6423,1919],{"class":1058},[944,6425,2046],{"class":1058},[944,6427,4527],{"class":1058},[2182,6429,6430],{"id":6430},"生成加密金鑰",[430,6432,6433,6434,6436],{},"TREK使用一个專門的金鑰來加密敏感資料。您可以使用以下指令或這個",[444,6435,4668],{"href":2857},"來生成加密金鑰：",[936,6438,6440],{"className":1045,"code":6439,"language":1047,"meta":425,"style":425},"openssl rand -hex 32\n",[494,6441,6442],{"__ignoreMap":425},[944,6443,6444,6447,6450,6453],{"class":946,"line":947},[944,6445,6446],{"class":1054},"openssl",[944,6448,6449],{"class":1058}," rand",[944,6451,6452],{"class":1058}," -hex",[944,6454,6455],{"class":2950}," 32\n",[430,6457,6458],{},"請務必將其妥善保存在安全的地方。如果遺失該金鑰，您將無法存取已加密的資料。",[2182,6460,6461],{"id":6461},"啟動容器",[936,6463,6465],{"className":1045,"code":6464,"language":1047,"meta":425,"style":425},"docker run -d \\\n  --name trek \\\n  -p 3000:3000 \\\n  -e ENCRYPTION_KEY=\"\u003Cgenerated_key>\" \\\n  -e APP_URL=\"https:\u002F\u002Ftrek.pafor.me\" \\\n  -v .\u002Fdata:\u002Fapp\u002Fdata \\\n  -v .\u002Fuploads:\u002Fapp\u002Fuploads \\\n  --restart unless-stopped \\\n  mauriceboe\u002Ftrek:latest\n",[494,6466,6467,6479,6489,6499,6516,6532,6542,6551,6561],{"__ignoreMap":425},[944,6468,6469,6471,6473,6476],{"class":946,"line":947},[944,6470,1190],{"class":1054},[944,6472,5501],{"class":1058},[944,6474,6475],{"class":1058}," -d",[944,6477,6478],{"class":954}," \\\n",[944,6480,6481,6484,6487],{"class":946,"line":1074},[944,6482,6483],{"class":1058},"  --name",[944,6485,6486],{"class":1058}," trek",[944,6488,6478],{"class":954},[944,6490,6491,6494,6497],{"class":946,"line":1081},[944,6492,6493],{"class":1058},"  -p",[944,6495,6496],{"class":1058}," 3000:3000",[944,6498,6478],{"class":954},[944,6500,6501,6504,6507,6509,6512,6514],{"class":946,"line":1088},[944,6502,6503],{"class":1058},"  -e",[944,6505,6506],{"class":1058}," ENCRYPTION_KEY=",[944,6508,3682],{"class":958},[944,6510,6511],{"class":1058},"\u003Cgenerated_key>",[944,6513,3682],{"class":958},[944,6515,6478],{"class":954},[944,6517,6518,6520,6523,6525,6528,6530],{"class":946,"line":1948},[944,6519,6503],{"class":1058},[944,6521,6522],{"class":1058}," APP_URL=",[944,6524,3682],{"class":958},[944,6526,6527],{"class":1058},"https:\u002F\u002Ftrek.pafor.me",[944,6529,3682],{"class":958},[944,6531,6478],{"class":954},[944,6533,6534,6537,6540],{"class":946,"line":1953},[944,6535,6536],{"class":1058},"  -v",[944,6538,6539],{"class":1058}," .\u002Fdata:\u002Fapp\u002Fdata",[944,6541,6478],{"class":954},[944,6543,6544,6546,6549],{"class":946,"line":1959},[944,6545,6536],{"class":1058},[944,6547,6548],{"class":1058}," .\u002Fuploads:\u002Fapp\u002Fuploads",[944,6550,6478],{"class":954},[944,6552,6553,6556,6559],{"class":946,"line":2294},[944,6554,6555],{"class":1058},"  --restart",[944,6557,6558],{"class":1058}," unless-stopped",[944,6560,6478],{"class":954},[944,6562,6563],{"class":946,"line":2305},[944,6564,6565],{"class":1058},"  mauriceboe\u002Ftrek:latest\n",[484,6567,6568],{},[487,6569,6570,6576],{},[441,6571,6572,6573],{},"必須正確設定 ",[494,6574,6575],{},"APP_URL"," —— 因為MCP伺服器的OAuth授權探索流程完全依賴於它。請在一開始就將其設定為您最終的公開HTTPS網址。",[430,6578,6579],{},"首次執行需要一些時間來拉取映像檔：",[433,6581],{"src":6582,"alt":6583,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-pull-image.webp","TREK 的 Docker 拉取与執行日誌","max-width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6586,6587],{},"驗證容器是否成功執行：",[936,6589,6591],{"className":1045,"code":6590,"language":1047,"meta":425,"style":425},"docker ps\n",[494,6592,6593],{"__ignoreMap":425},[944,6594,6595,6597],{"class":946,"line":947},[944,6596,1190],{"class":1054},[944,6598,5162],{"class":1058},[433,6600],{"src":6601,"alt":6602,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-ps-status.webp","透過 docker ps 驗證執行中的容器狀態",[892,6604,6606],{"id":6605},"_2-使用caddy反向代理設定網域路由與ssl憑證","2. 使用Caddy反向代理設定網域路由與SSL憑證",[430,6608,6609],{},"通行鑰（Passkeys）功能和MCP所需的OAuth授權都強制要求HTTPS加密。我們的網域託管在提供免費SSL憑證和DDoS保護的Cloudflare上。",[430,6611,6612],{},"我們將Caddy配置為安全的反向代理伺服器，用來指向容器的3000連接埠。Caddyfile設定範例如下：",[936,6614,6616],{"className":2896,"code":6615,"language":2898,"meta":425,"style":425},"{$TREK_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:3000\n}\n",[494,6617,6618,6629,6633,6642],{"__ignoreMap":425},[944,6619,6620,6622,6625,6627],{"class":946,"line":947},[944,6621,2926],{"class":958},[944,6623,6624],{"class":954},"$TREK_DOMAIN",[944,6626,2932],{"class":958},[944,6628,2935],{"class":958},[944,6630,6631],{"class":946,"line":1074},[944,6632,2940],{"class":954},[944,6634,6635,6637,6639],{"class":946,"line":1081},[944,6636,2945],{"class":954},[944,6638,1375],{"class":958},[944,6640,6641],{"class":2950},"3000\n",[944,6643,6644],{"class":946,"line":1088},[944,6645,2913],{"class":958},[892,6647,6649],{"id":6648},"_3-初始配置與安全的管理員設定","3. 初始配置與安全的管理員設定",[430,6651,6652],{},"建立管理員帳戶有兩種方式：",[484,6654,6655,6667],{},[487,6656,6657,6666],{},[441,6658,6659,6660,1859,6663],{},"在環境配置中直接設定 ",[494,6661,6662],{},"ADMIN_EMAIL",[494,6664,6665],{},"ADMIN_PASSWORD"," 變數，系統將直接使用該憑證。",[487,6668,6669,6670,6673,6674,6677,6678,6681,6682,6685],{},"TREK會自動生成一個信箱 ",[494,6671,6672],{},"admin@trek.local","、使用者名稱 ",[494,6675,6676],{},"admin","，以及一個",[441,6679,6680],{},"隨機生成的密碼，並列印到容器日誌中","。執行 ",[494,6683,6684],{},"docker logs trek"," 即可獲取。",[430,6687,6688],{},"如果您在日誌中找不到密碼，可以透過以下指令進行手動重置：",[936,6690,6692],{"className":1045,"code":6691,"language":1047,"meta":425,"style":425},"docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server\u002Freset-admin.js\n",[494,6693,6694],{"__ignoreMap":425},[944,6695,6696,6698,6700,6703,6706,6709,6711,6714,6716,6719,6721,6723,6726],{"class":946,"line":947},[944,6697,1190],{"class":1054},[944,6699,1196],{"class":1058},[944,6701,6702],{"class":1058}," -it",[944,6704,6705],{"class":1058}," -e",[944,6707,6708],{"class":1058}," RESET_ADMIN_EMAIL=admin@trek.local",[944,6710,6705],{"class":1058},[944,6712,6713],{"class":1058}," RESET_ADMIN_PASSWORD=",[944,6715,5465],{"class":958},[944,6717,6718],{"class":1058},"YourNewPassword",[944,6720,5465],{"class":958},[944,6722,6486],{"class":1058},[944,6724,6725],{"class":1058}," node",[944,6727,6728],{"class":1058}," server\u002Freset-admin.js\n",[430,6730,6731],{},"在首次登入時，系統會提示您修改初始密碼。",[433,6733],{"src":6734,"alt":6735,"style":6736},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-initial-login-password-prompt.webp","初始登入與管理員密碼重設提示","max-width: 215px; width:100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6738,6739,6740,6743,6744],{},"按一下 ",[441,6741,6742],{},"Admin（管理員）"," 索引標籤並更新您的電子信箱：",[433,6745],{"src":6746,"alt":6747,"style":6748},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-email-update-panel.webp","在 TREK 管理員設定中設定自訂電子郵件","max-width: 700px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,6750,6752],{"id":6751},"_31-備份策略","3.1 備份策略",[430,6754,6755,6756],{},"在管理員後台，可以非常方便地配置帶有保留策略的自動備份方案：\n",[433,6757],{"src":6758,"alt":6759,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-backup-retention-policy.webp","設定自動備份排程與保留規則",[2182,6761,6763],{"id":6762},"_32-將上傳的檔案儲存到cloudflare-r2","3.2 將上傳的檔案儲存到Cloudflare R2",[430,6765,6766],{},"將上傳的檔案、照片和備份資料保存在Cloudflare R2中，能夠讓您的VPS磁碟保持乾淨和輕量。TREK全面支援S3相容的儲存後端，而Cloudflare R2正是這一需求的完美解決方案。",[532,6768,6769,6776,6788,6798,6809,6821,6832,6847],{},[487,6770,6771,6772,6775],{},"新建一個名為 ",[494,6773,6774],{},"trek"," 的R2儲存桶。",[487,6777,5250,6778,6781,6782,6783],{},[441,6779,6780],{},"Account Details（帳戶詳情）"," 區域，找到您的帳戶ID：","\n  ",[433,6784],{"src":6785,"alt":6786,"style":6787},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-account-details-id.webp","在主控台中定位 Cloudflare 帳戶 ID","max-width: 325px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6789,6739,6790,492,6782,6793],{},[441,6791,6792],{},"Manage API Tokens（管理API權杖）",[433,6794],{"src":6795,"alt":6796,"style":6797},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-manage-api-tokens-button.webp","Cloudflare 主控台中的管理 API 權杖畫面","max-width: 282px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6799,6739,6800,6803,6782,6804],{},[441,6801,6802],{},"Create Account API token（建立帳戶API權杖）","，並授予針對該桶的讀寫權限：",[433,6805],{"src":6806,"alt":6807,"style":6808},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-create-token-permissions.webp","建立具有讀寫權限的 R2 存取權杖","max-width: 360px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6810,6811,6812,6815,6782,6816],{},"在管理員面板中，按一下 ",[441,6813,6814],{},"Storage（儲存）"," 配置頁：",[433,6817],{"src":6818,"alt":6819,"style":6820},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-administration-storage-menu.webp","導覽至 TREK 控制面板中的儲存設定","max-width: 539px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6822,6739,6823,6826,6782,6827],{},[441,6824,6825],{},"Add Backend（新增後端）"," 按鈕，填入您的Endpoint（端點）、Bucket（儲存桶名稱）和API憑證：",[433,6828],{"src":6829,"alt":6830,"style":6831},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-storage-backend-credentials.webp","設定 S3 相容的 Cloudflare R2 儲存端","max-width: 445px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6833,6739,6834,6837,6838,6841,6782,6842],{},[441,6835,6836],{},"Apply（套用）","，然後按一下 ",[441,6839,6840],{},"Test（測試）"," 連結。當看到「Connection OK」字樣时，說明連線測試成功：",[433,6843],{"src":6844,"alt":6845,"style":6846},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-test-storage-backend-connection-ok.webp","儲存端連線測試成功，顯示 Connection OK","max-width: 677px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[487,6848,6849,6850,492,6782,6853],{},"将所有儲存類別切換為Cloudflare R2并按一下 ",[441,6851,6852],{},"Save changes（儲存修改）",[433,6854],{"src":6855,"alt":6856,"style":6857},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-switch-storage-categories-r2.webp","將所有檔案儲存分類路由至 Cloudflare R2","max-width: 653px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,6859,6861],{"id":6860},"_33-通行鑰passkey登入","3.3 通行鑰（Passkey）登入",[430,6863,6864],{},"TREK支援通行鑰、雙重身份驗證（2FA）以及基於OIDC的單一登入。如果想開啟通行鑰，請在設定中輸入您的網域名稱和Allowed Origins（允許的來源），然後儲存即可：",[433,6866],{"src":6867,"alt":6868,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-passkey-allowed-origins-settings.webp","註冊用於安全金鑰（Passkey）身分驗證的允許來源",[430,6870,6871,6872,6875],{},"如果沒有正確配置 ",[441,6873,6874],{},"Allowed Origins","，通行鑰註冊將會失敗。",[2182,6877,6879],{"id":6878},"_34-google-maps-api金鑰","3.4 Google Maps API金鑰",[430,6881,6882],{},"配置Google Maps金鑰可以讓您的地點檢索功能變得更豐富，自動補充評分、營業时间和地點實景圖。如果您不配置金鑰，TREK會預設降級使用免費的OpenStreetMap（只是不顯示評分和實景照片）。",[430,6884,6885,6886,6891,6892,6895,6896],{},"造訪此",[444,6887,6890],{"href":6888,"rel":6889},"https:\u002F\u002Fmapsplatform.google.com\u002Fmaps-demo-key\u002F",[448],"連結","並按一下 ",[441,6893,6894],{},"Get demo key"," 即可申請一個測試金鑰：                                                  ",[433,6897],{"src":6898,"alt":6899,"style":6900},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgoogle-maps-get-demo-api-key.webp","申請 Google Maps Platform API 金鑰","max-width: 176px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6902,6903,6904,6907,6908],{},"將獲取到的API Key貼上到設定中，然後按一下 ",[441,6905,6906],{},"Test"," 驗證連線是否通暢：\n",[433,6909],{"src":6910,"alt":6911,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-key-test-connection.webp","在設定中驗證 Google Maps API 金鑰的連通性",[2182,6913,6915],{"id":6914},"_35-ai整合","3.5 AI整合",[430,6917,6918],{},"內建的AI解析引擎主要用於處理您的預訂確認郵件和PDF，將它們自動轉換為結構化的預訂資料。",[430,6920,6921,6922,6925,6926,6929],{},"按一下左側選單中的 ",[441,6923,6924],{},"Addons（附加元件）"," 並啟用 ",[441,6927,6928],{},"AI Parsing","。選擇「OpenAI」（或其他相容的AI提供商）並填寫相應的憑證資訊：",[433,6931],{"src":6932,"alt":6933,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-ai-parsing-openai.webp","啟用附帶 OpenAI 整合的 AI 解析外掛",[2182,6935,6937],{"id":6936},"_36-mcp存取權限","3.6 MCP存取權限",[430,6939,6940,6941,6944,6945,6948],{},"同樣在 ",[441,6942,6943],{},"Addons"," 選項中，開啟 ",[441,6946,6947],{},"MCP"," 協定：",[433,6950],{"src":6951,"alt":6952,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-mcp.webp","啟用 Model Context Protocol MCP 伺服器外掛",[2182,6954,6956],{"id":6955},"_37-外掛推薦","3.7 外掛推薦",[430,6958,6959],{},"以下幾款官方外掛非常推薦您順手啟用：",[433,6961],{"src":6962,"alt":6963,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-recommended-addons-plugins-activation.webp","活躍的推薦外掛與擴充功能列表",[2182,6965,6967],{"id":6966},"_38-建立您的日常使用帳戶","3.8 建立您的日常使用帳戶",[430,6969,6970],{},"在平時規劃旅行時，建議使用一般使用者帳戶，而非管理員帳戶。讓我們在後台建立一個日常帳戶並登入：",[433,6972],{"src":6973,"alt":6974,"style":6975},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-regular-user-form.webp","在 TREK 面板中建立一般使用者帳戶","max-width: 420px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6977,6978],{},"登入後，建議立刻綁定通行鑰或設定2FA來強化該帳戶的安全層級：",[433,6980],{"src":6981,"alt":6982,"style":6983},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-user-security-passkey-2fa-setup.webp","使用安全金鑰（Passkey）與雙重認證設定使用者安全設定","max-width: 381px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6985,6739,6986,6989],{},[441,6987,6988],{},"+ Add a passkey","，輸入目前密碼，然後按照瀏覽器提示完成安全確認：",[433,6991],{"src":6992,"alt":6993,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-passkey-confirm-password.webp","確認密碼以註冊新的硬體安全金鑰",[892,6995,6997],{"id":6996},"_4-測試您的部署匯入歷史出行資料","4. 測試您的部署：匯入歷史出行資料",[430,6999,7000],{},"快速上手並熟悉TREK系統的一個極佳方式是，將您過去走過的旅行足跡錄入其中。",[2182,7002,7004],{"id":7003},"_41-建立旅行計劃","4.1 建立旅行計劃",[430,7006,6739,7007,7010,7011,1859,7014,492],{},[441,7008,7009],{},"+ New Trip（新建旅行）","，並根據那次歷史旅行的真實起止時間設定 ",[441,7012,7013],{},"Start Date",[441,7015,7016],{},"End Date",[433,7018],{"src":7019,"alt":7020,"style":7021},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-trip-details.webp","建立具有自訂日期範圍的新旅行","max-width: 334px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7023,7024,7025,492],{},"上傳一張好看的封面圖（可以直接將圖片拖入或從剪貼簿貼上），接著按一下 ",[441,7026,7027],{},"Create New Trip",[433,7029],{"src":7030,"alt":7031,"style":7032},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-cover-image-upload.webp","設定高品質的旅行封面圖片","max-width: 608px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7034,7036],{"id":7035},"_42-匯入預訂資訊","4.2 匯入預訂資訊",[430,7038,7039],{},"將您當時留存的機票、火車票和其他交通工具預訂確認檔案直接拖放到上傳區域：",[433,7041],{"src":7042,"alt":7043,"style":7044},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-travel-booking-files.webp","用於匯入旅行 PDF 與預訂檔案的拖放區域","max-width: 570px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7046],{"src":7047,"alt":7048,"style":7049},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-booking-pdf-processing-status.webp","已上傳預訂的處理視窗，顯示擷取狀態","max-width: 377px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7051,7052],{},"由於我們已經啟用了AI解析引擎，預訂確認PDF檔案會被自動分析，提取出結構化的預訂日程。",[430,7054,7055,7056,7059],{},"檢查解析結果無誤后，按一下 ",[441,7057,7058],{},"Add"," 將其正式寫入預訂資料中：",[433,7061],{"src":7062,"alt":7063,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-review-parsed-booking-details.webp","審查由 AI 擷取的結構化預訂細節",[430,7065,7066],{},"如果有些預訂確認僅保存在郵件中，您可以將其匯出為PDF格式并上傳，同樣可以走這套提取流程。",[430,7068,7069],{},"在系統中，已匯入的預訂資訊會以極具現代感的方式呈現：",[430,7071,7072,7076],{},[433,7073],{"src":7074,"alt":7075,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-bookings-timeline-view.webp","旅行預訂的完整時間軸展示",[433,7077],{"src":7078,"alt":7079,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-booking-confirmation-details.webp","已確認交通預訂的詳細檢視",[430,7081,5250,7082,7085],{},[441,7083,7084],{},"Plan（日程規劃）"," 頁面中，所有的飯店和住宿點都會在地圖上被優雅地標註出來：",[433,7087],{"src":7088,"alt":7089,"style":7090},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-plan-accommodations-map-display.webp","標有所有飯店住宿的互動式地圖","max-width: 546px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7092,7093,7094,7097],{},"按一下上方的 ",[441,7095,7096],{},"Atlas（旅行足跡）","，您將能从清單和世界地圖上直觀地看到所有已拜訪的国家：",[433,7099],{"src":7100,"alt":7101,"style":7102},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-atlas-countries-visited-summary.webp","個人 Atlas 追蹤器中的旅行歷史概述","max-width: 407px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7104,7106],{"id":7105},"_43-新增旅行同伴","4.3 新增旅行同伴",[430,7108,6739,7109,3009],{},[441,7110,7111],{},"Share（分享）",[433,7113],{"src":7114,"alt":7115,"style":7116},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-share-options-button.webp","在 TREK 中開啟旅行分享對話方塊","max-width: 224px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7118,7119],{},"在彈出的對話方塊底部，可以直接新增旅行同伴為Guest（嘉賓）：",[433,7121],{"src":7122,"alt":7123,"style":7124},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-add-companions-guests.webp","新增自訂旅行同伴與隨行客人","max-width: 635px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7126,7128],{"id":7127},"_44-記錄旅行費用","4.4 記錄旅行費用",[430,7130,6739,7131,7134],{},[441,7132,7133],{},"Add expense（新增開銷）","，來記錄那些無法透過PDF預訂單自動解析的雜項支出，例如境外險、當地公共交通費、臨時SIM卡等：",[433,7136],{"src":7137,"alt":7138,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-custom-expense-form.webp","在支出表單中輸入詳細的消費數據",[433,7140],{"src":7141,"alt":7142,"style":7143},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-expenses-list-billing-split.webp","分攤帳單明細與費用追蹤帳本","max-width: 526px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7145,7147],{"id":7146},"_45-拆分旅行階段","4.5 拆分旅行階段",[430,7149,7150],{},"該功能需要提前在後台激活“Trip Segment”外掛。",[430,7152,7153],{},"對於那些超長週期的旅程，將其拆分為不同的階段能讓脈絡更清晰，每個階段都可以有自己獨立的預訂項目、待辦事項和成本帳單：",[433,7155],{"src":7156,"alt":7157,"style":7158},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-overview-display.webp","將複雜的行程拆分為旅行段","max-width: 465px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7160],{"src":7161,"alt":7162,"style":7163},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segment-itinerary-details.webp","顯示地點與計劃的活躍旅行段","max-width: 596px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7165],{"src":7166,"alt":7167,"style":7168},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-interactive-map.webp","在時間軸上繪製不同的旅行航段","max-width: 605px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7170,7172],{"id":7171},"_46-建立journal日誌並查看旅行足跡atlas","4.6 建立Journal（日誌）並查看旅行足跡（Atlas）",[430,7174,7175,7176,7179],{},"您還可以將幾次旅行串聯成一個 ",[441,7177,7178],{},"Journey（旅程）","，並圖文並茂地撰寫遊記故事，方便分享給您的朋友們：",[433,7181],{"src":7182,"alt":7183,"style":7184},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-journey-group.webp","將多次旅行合併為一個視覺化的旅程","max-width: 441px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7186],{"src":7187,"alt":7188,"style":7189},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-timeline-story-writing.webp","在旅程面板中撰寫視覺化故事","max-width: 443px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7191],{"src":7192,"alt":7193,"style":7194},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-gallery-media-grid.webp","旅程內部的媒體收集與畫廊網格","max-width: 440px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7196],{"src":7197,"alt":7198,"style":7199},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-public-share-link.webp","為協同旅程產生公開分享連結","max-width: 532px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[892,7201,7203],{"id":7202},"_5-設計自訂行程與行李清單","5. 設計自訂行程與行李清單",[430,7205,6739,7206,7209],{},[441,7207,7208],{},"+ New Trip","，輸入旅行的專屬名稱並指定起止日期：",[433,7211],{"src":7212,"alt":7213,"style":7214},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-planning-new-trip-setup.webp","建立未定日期旅行的初始提示對話方塊","max-width: 432px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7216,7217,7220],{},[441,7218,7219],{},"如果具體的出行時間還沒有敲定，可以將日期項留空。"," 此時系統會顯示一個「天數配置（最高支援365天）」欄位，您可以先設計每日的遊玩內容，等後續買好機票後再一鍵錨定日期。",[2182,7222,7224],{"id":7223},"_51-新增地點景點","5.1 新增地點\u002F景點",[430,7226,7227],{},"這是旅行規劃中最耗時的一步，但TREK提供了四種極具效率的方式來協助您新增地點：",[433,7229],{"src":7230,"alt":7231,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-places-methods-overview.webp","向行程新增新地點的多種途徑",[430,7233,7234,7237],{},[441,7235,7236],{},"1. 直接在地圖上右鍵點擊："," 會該座標處直接建立新地點，其標準地址會被系統自動逆地理編碼解析出來：",[433,7239],{"src":7240,"alt":7241,"style":7242},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-map-location.webp","在地圖介面右鍵點擊以精確定位","max-width: 632px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7244],{"src":7245,"alt":7246,"style":7247},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-reverse-geocode-address.webp","所選地圖座標的自動逆地理編碼","max-width: 628px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7249,7250,7253],{},[441,7251,7252],{},"2. 按一下 + Add Place\u002FActivity："," 在搜尋框中直接透過關鍵字進行檢索",[433,7255],{"src":7256,"alt":7257,"style":7258},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-search-place-by-name-input.webp","使用文字輸入搜尋真實地點","max-width: 642px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7260],{"src":7261,"alt":7262,"style":7263},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-select-place-search-results-list.webp","顯示附帶地址標註的地點搜尋結果清單","max-width: 594px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7265],{"src":7266,"alt":7267,"style":7268},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-place-details-rich-info-card.webp","包含評論與評分的完整地點資訊卡","max-width: 568px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7270,7271,7274,7275,7278,7279,7282],{},[441,7272,7273],{},"3. 直接貼上Google地圖分享連結："," （如 ",[494,7276,7277],{},"maps.app.goo.gl\u002F…"," 或 ",[494,7280,7281],{},"maps.google.com\u002F…","）貼上到檢索欄中。TREK會自動抓取該地點的名稱、地址和經緯度：",[433,7284],{"src":7285,"alt":7286,"style":6846},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-paste-google-maps-share-link.webp","直接從貼上的 Google 地圖分享連結解析地點",[433,7288],{"src":7289,"alt":7290,"style":7291},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-parsed-location.webp","成功從地圖 URL 中擷取座標","max-width: 543px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7293,7294,7297,7298,7301,7302,7278,7305,7308,7309,7312],{},[441,7295,7296],{},"4. 批次匯入資料："," 這是最輕鬆的方案。如果您在Google Maps中維護著自己的「想去清單」，可以將其匯出為 ",[494,7299,7300],{},".gpx"," 檔案（",[494,7303,7304],{},".kml",[494,7306,7307],{},".kmz"," 格式亦支援），然後按一下右側面板的 ",[441,7310,7311],{},"Import file","，一鍵拉取所有資料：",[433,7314],{"src":7315,"alt":7316,"style":7317},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-bulk-import-places-gpx-file.webp","使用 GPX 或 KML 檔案批次匯入地點","max-width: 389px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7319,7320],{},"推薦您可以先把所有感興趣的項目都新增進來。至於如何將它們科學地歸入到每一天的日程中，後續可以直接在面板裡拖拽處理。",[2182,7322,7324],{"id":7323},"_52-每日日程與備忘","5.2 每日日程與備忘",[430,7326,7327],{},"Day Plan（每日計劃）的核心邏輯是將所有的目的地按每日訪問順序進行排序。整個介面是一個可以折疊、支援任意拖放的模組：",[433,7329],{"src":7330,"alt":7331,"style":7332},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-drag-drop-ordering.webp","使用拖放操作自訂每日路線順序","max-width: 496px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7334,7335],{},"這些細節機制設計得極其精妙實用：",[484,7337,7338,7348,7358,7368],{},[487,7339,7340,7343,7344],{},[441,7341,7342],{},"中間移動方式","：按一下每日日程左上角的公車圖示，可以設定各節點之間的過渡交通方式（如地鐵、自駕、甚至是直達航班）：\n",[433,7345],{"src":7346,"alt":7347,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-commuting-transport-button.webp","登記日行程各段之間的通勤交通方式",[487,7349,7350,7353,7354],{},[441,7351,7352],{},"每日備忘","：按一下左下角的便簽圖示可以附加各種客製化提醒（例如：「今天需要提早出發」、「美術館門票需提前預約」）：\n",[433,7355],{"src":7356,"alt":7357,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-icon-tagged-notes-button.webp","為天行程新增顯眼的、帶有圖示的自訂備註",[487,7359,7360,7363,7364],{},[441,7361,7362],{},"指定時間段","：從右側拖拽地點並給它分配一個開始時間。設定了時間的地點會自動在地圖上生成推薦的行進路線：\n",[433,7365],{"src":7366,"alt":7367,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-timed-places-routing.webp","帶時間點的地點之間自動計算的交通路線",[487,7369,7370,7371,7374,7375,7378,7379,1807],{},"關於智慧路線優化（",[441,7372,7373],{},"Route optimisation","）以及氣候（",[441,7376,7377],{},"Weather","），您可以查閱 ",[444,7380,7383],{"href":7381,"rel":7382},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FDay-Plans-and-Notes",[448],"Day Plans and Notes的Wiki文件",[2182,7385,7387],{"id":7386},"_53-收藏夾可重複使用的地點清單","5.3 收藏夾：可重複使用的地點清單",[430,7389,7390,7391,7394],{},"Collections（收藏夾）允許使用者在具體的旅行專案之外，保存並分類管理自己精心收集的寶藏地點。您可以將其打包分享給朋友。這些地點在加入旅行時是採用",[441,7392,7393],{},"複製","的方式，因此在旅行日程中對其進行的任何個性化標註，都不會破壞您收藏夾裡的原始乾淨資料。",[430,7396,7397,7398,492],{},"按一下頂部選單列中的 ",[441,7399,7400],{},"Collections",[433,7402],{"src":7403,"alt":7404,"style":7405},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-dashboard-view.webp","存取儲存地點的自訂使用者收藏夾","max-width: 495px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7407,6739,7408,7411],{},[441,7409,7410],{},"+ New list"," 建立新的分類列表：",[433,7413],{"src":7414,"alt":7415,"style":7416},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-create-new-list.webp","在收藏夾中建立自訂清單","max-width: 269px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7418,6739,7419,7422],{},[441,7420,7421],{},"+ Add a place"," 並填入該地點的詳細情況：",[433,7424],{"src":7425,"alt":7426,"style":7427},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-add-place-manually-form.webp","手動輸入表單以填充自訂收藏清單","max-width: 271px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7429,7430,7433],{},[441,7431,7432],{},"注意："," 收藏夾內的搜尋元件偶爾可能會因網路原因失效，如果發生該情況，您可以透過手動輸入來建立。",[430,7435,7436],{},"當地點帶有準確的GPS座標時，它們會精美地展示在地圖中：",[433,7438],{"src":7439,"alt":7440,"style":7441},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-map-places-display.webp","在互動式地圖上視覺化自訂收藏中的地點","max-width: 592px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7443,7444,7445,7448],{},"如需批次整理這些地標，可以按一下 ",[441,7446,7447],{},"checkbox（勾選框）"," 圖示：",[433,7450],{"src":7451,"alt":7452,"style":7453},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-select-places-tickbox.webp","批次標記已儲存地點的選擇模式","max-width: 662px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7455,7456,7457,492],{},"多選目標後，按一下 ",[441,7458,7459],{},"Assign label（分配標籤）",[433,7461],{"src":7462,"alt":7463,"style":7291},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-group-assign-label.webp","為選定的收藏地點分配描述性標籤",[430,7465,7466,7467,7470],{},"在分配之前，先按一下 ",[441,7468,7469],{},"Manage labels（管理標籤）"," 來新建一些醒目的彩色分組標籤：",[433,7472],{"src":7473,"alt":7474,"style":7475},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-manage-custom-labels.webp","建立與管理自訂標籤","max-width: 411px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7477,7478],{},"按一下一個具體標籤，接著選擇一鍵綁定：",[433,7480],{"src":7481,"alt":7482,"style":7102},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-confirm-label-selection.webp","套用自訂標籤至分群的地點",[2182,7484,7486],{"id":7485},"_54-費用與預算","5.4 費用與預算",[430,7488,5250,7489,7492],{},[441,7490,7491],{},"Costs（財務管理）"," 頁面中，我們可以錄入其他的預備預算和旅途支出。",[433,7494],{"src":7495,"alt":7496,"style":7332},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-budget-overall-expenses-list.webp","完整的支出表格與餘額結算帳本",[430,7498,7499],{},"在結伴出行時，您可以在此頁記錄每個人的墊付帳單，並選定分攤規則。",[430,7501,7502,7503,7506],{},"系統的結算後台採用了一種貪心匹配演算法，計算並生成",[441,7504,7505],{},"最簡化的轉帳精算方案","，幫大家用最少的轉帳次數輕鬆對齊帳目。",[892,7508,7510],{"id":7509},"_6-利用model-context-protocolmcp實現ai驅動的旅行規劃","6. 利用Model Context Protocol（MCP）實現AI驅動的旅行規劃",[430,7512,7513,7514,7517],{},"TREK內建了 ",[441,7515,7516],{},"MCP（模型上下文協定）伺服器","。這意味著，AI代理可以直接「讀寫」您的行程規劃資料。它提供了超過150个精細的原子工具和30個核心資料源，全方位覆蓋行程、地點、帳目、行李、預訂和多人協作。",[2182,7519,7521],{"id":7520},"_61-cloudflare-zero-trust網路配置","6.1 Cloudflare Zero Trust網路配置",[430,7523,7524,7525,7527,7528,1807],{},"由於我們的自託管服務執行在 ",[444,7526,1749],{"href":363}," 內網環境下，我們需要在「Split Tunnels（分流隧道）」配置中，將該服務的網域加入到 Inclusion List（包含\u002F直連白名單）中。否則在進行 OAuth 登入授權探索時，介面呼叫會被網路策略阻斷。具體的配置排障可以參考這個 GitHub 討論貼：",[444,7529,7532],{"href":7530,"rel":7531},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fissues\u002F1463",[448],"GitHub Issue",[463,7534],{"description":2627,"image":2628,"image-alt":2629,"label":2701,"min-read":1286,"title":1734,"to":363},[433,7536],{"src":7537,"alt":7538,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-zero-trust-split-tunnels-domain.webp","向 Cloudflare Warp 分流隧道（Split Tunnels）新增自訂網域名稱",[2182,7540,7542],{"id":7541},"_62-claude-desktop用戶端配置","6.2 Claude Desktop用戶端配置",[430,7544,6739,7545,7548,7549],{},[441,7546,7547],{},"+ New Client"," 創設一個新的 AI 用戶端介面：\n",[433,7550],{"src":7551,"alt":7552,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-register-new-mcp-client.webp","在設定中註冊新的自訂用戶端權杖",[430,7554,7555,7556,7559,7560,492],{},"選擇 ",[441,7557,7558],{},"Claude Desktop"," 項目，然後按一下 ",[441,7561,7562],{},"Register Client（註冊用戶端）",[433,7564],{"src":7565,"alt":7566,"style":7567},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-claude-desktop-client-credentials.webp","產生 Claude Desktop 用戶端憑據","max-width: 354px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7569,7570,7571,7574],{},"系統此時會展示唯一的 Client ID 和 Client Secret，請妥善保存。接著按一下 ",[441,7572,7573],{},"Client Configuration（用戶端配置）"," 調出我們需要在本地寫入的 JSON 程式碼片段：",[433,7576],{"src":7577,"alt":7578,"style":7579},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-client-configuration-block.webp","取得預先格式化的 MCP 伺服器組態組塊","max-width: 508px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7581,7582,7583,7586],{},"在 Claude Desktop 軟體中，按一下 ",[441,7584,7585],{},"Edit Config"," 會在編輯器中打開您本地的 MCP server 檔案：",[433,7588],{"src":7589,"alt":7590,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-config-json.webp","編輯 Claude Desktop 的本機 MCP 設定檔 json",[430,7592,7593],{},"將 TREK 的 MCP 程式碼區塊貼上進去，並把佔位符部分替換為上一步生成的用戶端憑證：",[936,7595,7597],{"className":2896,"code":7596,"language":2898,"meta":425,"style":425},"  \"mcpServers\": {\n    \"trek\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n        \"--static-oauth-client-info\",\n        \"{\\\"client_id\\\": \\\"\u003Cyour_client_id>\\\", \\\"client_secret\\\": \\\"\u003Cyour_client_secret>\\\"}\"\n      ]\n    }\n  },\n",[494,7598,7599,7614,7627,7649,7663,7675,7686,7697,7742,7747,7752],{"__ignoreMap":425},[944,7600,7601,7604,7607,7609,7612],{"class":946,"line":947},[944,7602,7603],{"class":958},"  \"",[944,7605,7606],{"class":1058},"mcpServers",[944,7608,3682],{"class":958},[944,7610,7611],{"class":954},": ",[944,7613,2905],{"class":958},[944,7615,7616,7619,7621,7623,7625],{"class":946,"line":1074},[944,7617,7618],{"class":958},"    \"",[944,7620,6774],{"class":950},[944,7622,3682],{"class":958},[944,7624,1375],{"class":958},[944,7626,2935],{"class":958},[944,7628,7629,7632,7635,7637,7639,7641,7644,7646],{"class":946,"line":1081},[944,7630,7631],{"class":958},"      \"",[944,7633,7634],{"class":1054},"command",[944,7636,3682],{"class":958},[944,7638,1375],{"class":958},[944,7640,3268],{"class":958},[944,7642,7643],{"class":1058},"npx",[944,7645,3682],{"class":958},[944,7647,7648],{"class":958},",\n",[944,7650,7651,7653,7656,7658,7660],{"class":946,"line":1088},[944,7652,7631],{"class":958},[944,7654,7655],{"class":1054},"args",[944,7657,3682],{"class":958},[944,7659,1375],{"class":958},[944,7661,7662],{"class":958}," [\n",[944,7664,7665,7668,7671,7673],{"class":946,"line":1948},[944,7666,7667],{"class":958},"        \"",[944,7669,7670],{"class":1058},"mcp-remote",[944,7672,3682],{"class":958},[944,7674,7648],{"class":958},[944,7676,7677,7679,7682,7684],{"class":946,"line":1953},[944,7678,7667],{"class":958},[944,7680,7681],{"class":1058},"https:\u002F\u002Ftrek.pafor.me\u002Fmcp",[944,7683,3682],{"class":958},[944,7685,7648],{"class":958},[944,7687,7688,7690,7693,7695],{"class":946,"line":1959},[944,7689,7667],{"class":958},[944,7691,7692],{"class":1058},"--static-oauth-client-info",[944,7694,3682],{"class":958},[944,7696,7648],{"class":958},[944,7698,7699,7701,7703,7706,7709,7711,7713,7715,7718,7720,7722,7724,7727,7729,7731,7733,7736,7738,7740],{"class":946,"line":2294},[944,7700,7667],{"class":958},[944,7702,2926],{"class":1058},[944,7704,7705],{"class":954},"\\\"",[944,7707,7708],{"class":1058},"client_id",[944,7710,7705],{"class":954},[944,7712,7611],{"class":1058},[944,7714,7705],{"class":954},[944,7716,7717],{"class":1058},"\u003Cyour_client_id>",[944,7719,7705],{"class":954},[944,7721,876],{"class":1058},[944,7723,7705],{"class":954},[944,7725,7726],{"class":1058},"client_secret",[944,7728,7705],{"class":954},[944,7730,7611],{"class":1058},[944,7732,7705],{"class":954},[944,7734,7735],{"class":1058},"\u003Cyour_client_secret>",[944,7737,7705],{"class":954},[944,7739,2932],{"class":1058},[944,7741,1980],{"class":958},[944,7743,7744],{"class":946,"line":2305},[944,7745,7746],{"class":958},"      ]\n",[944,7748,7749],{"class":946,"line":2401},[944,7750,7751],{"class":958},"    }\n",[944,7753,7754,7757],{"class":946,"line":2407},[944,7755,7756],{"class":958},"  }",[944,7758,7648],{"class":954},[430,7760,7761],{},"重新啟動 Claude Desktop 用戶端。此時在 Local MCP servers（本地MCP服務）列表中就會看到 TREK 已經成功連線：",[433,7763],{"src":7764,"alt":7765,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-trek-server-connected.webp","在 Claude 介面中驗證活躍的 TREK 連線狀態",[430,7767,7768],{},"現在，您可以直接用日常口語來下達規劃指令了：",[433,7770],{"src":7771,"alt":7772,"style":7773},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-natural-language-prompt.webp","使用自然語言提示 Claude 操作旅行資料","max-width: 550px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7775,7776],{},"例如，我们用純中文錄入一筆非標準化的日常開支：",[936,7778,7781],{"className":7779,"code":7780,"language":4641,"meta":425},[4639],"For the West Europe trip, the Grab from KLIA1 to the hotel cost RM115.90 on 26\u002F4\u002F2025. Please add it as an expense without split to the trip.\n",[494,7782,7780],{"__ignoreMap":425},[433,7784],{"src":7785,"alt":7786,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-expense-response.webp","Claude 呼叫工具自動記錄一筆支出",[430,7788,7789,7790,7793],{},"回到後台，重新整理 ",[441,7791,7792],{},"Costs"," 面板。我們可以看到這筆打車費用已經被精確地記錄下來，且因為命令中並未提及“由誰付款”，系統體貼地將付款人項歸納為了“No one paid yet（尚未有人支付）”：",[433,7795],{"src":7796,"alt":7797,"style":6748},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-page-mcp-parsed-expense.webp","在費用檢視中確認最新由 AI 解析的支出",[430,7799,7800],{},"管理行李清單的方式也完全一致：",[433,7802],{"src":7803,"alt":7804,"style":7805},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-packing-items.webp","Claude 使用自然語言提示新增打包清單物品","max-width: 631px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7807,7808,7809,7812],{},"再次重新整理 ",[441,7810,7811],{},"Packing List"," 頁面，指定的这三樣出行裝備已經被整齊地加入到了清單之中：",[433,7814],{"src":7815,"alt":7816,"style":7817},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-packing-list-mcp-parsed-items.webp","在打包清單頁面中確認最新解析的打包物品","max-width: 312px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2182,7819,7821],{"id":7820},"_63-gemini-cli動態註冊","6.3 Gemini CLI（動態註冊）",[430,7823,7824,7825,7828,7829,2223],{},"Gemini CLI 對 ",[441,7826,7827],{},"Dynamic Registration（動態註冊機制）"," 提供了極佳的支援，這使得您完全無需在系統後台手動預註冊任何用戶端憑證。直接將以下程式碼追加到您本地的 ",[494,7830,7831],{},".gemini\u002Fsettings.json",[936,7833,7835],{"className":2896,"code":7834,"language":2898,"meta":425,"style":425},"    \"trek\": {\n      \"httpUrl\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[494,7836,7837,7849,7868,7881,7894,7899],{"__ignoreMap":425},[944,7838,7839,7841,7843,7845,7847],{"class":946,"line":947},[944,7840,7618],{"class":958},[944,7842,6774],{"class":1058},[944,7844,3682],{"class":958},[944,7846,7611],{"class":954},[944,7848,2905],{"class":958},[944,7850,7851,7853,7856,7858,7860,7862,7864,7866],{"class":946,"line":1074},[944,7852,7631],{"class":958},[944,7854,7855],{"class":950},"httpUrl",[944,7857,3682],{"class":958},[944,7859,1375],{"class":958},[944,7861,3268],{"class":958},[944,7863,7681],{"class":1058},[944,7865,3682],{"class":958},[944,7867,7648],{"class":958},[944,7869,7870,7872,7875,7877,7879],{"class":946,"line":1081},[944,7871,7631],{"class":958},[944,7873,7874],{"class":950},"oauth",[944,7876,3682],{"class":958},[944,7878,1375],{"class":958},[944,7880,2935],{"class":958},[944,7882,7883,7885,7888,7890,7892],{"class":946,"line":1088},[944,7884,7667],{"class":958},[944,7886,7887],{"class":1054},"enabled",[944,7889,3682],{"class":958},[944,7891,1375],{"class":958},[944,7893,1397],{"class":958},[944,7895,7896],{"class":946,"line":1948},[944,7897,7898],{"class":958},"      }\n",[944,7900,7901],{"class":946,"line":1953},[944,7902,7751],{"class":958},[430,7904,7905,7906,7909,7910,7913,7914],{},"在終端機執行 ",[494,7907,7908],{},"gemini"," 指令，並在隨後拉起的網頁授權頁面中按一下 ",[441,7911,7912],{},"Approve（批准）"," 即可：\n",[433,7915],{"src":7916,"alt":7917,"style":7918},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fmcp-client-oauth-authorization-prompt.webp","批准針對 TREK MCP 伺服器的 OAuth 存取授權","max-width: 488px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7920,7921],{},"現在便可以透過極簡的命令列終端機向 AI 提問了：",[433,7923],{"src":7924,"alt":7925,"style":7926},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-prompt-itinerary.webp","使用 Gemini CLI 提示獲取旅行行程","max-width: 415px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7928],{"src":7929,"alt":7930,"style":7194},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-display-itinerary.webp","Gemini CLI 成功展示結構化的旅行資訊",[2182,7932,7934],{"id":7933},"_64-kimi-cli動態註冊","6.4 Kimi CLI（動態註冊）",[430,7936,7937,7938,7941,7942,7945],{},"原理基本相同。請在本地 ",[494,7939,7940],{},"\u002FUsers\u002F\u003C您的用戶名>\u002F.kimi\u002F"," 目錄下找到 ",[494,7943,7944],{},"mcp.json"," 並寫入以下連線配置：",[936,7947,7949],{"className":2896,"code":7948,"language":2898,"meta":425,"style":425},"    \"trek\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"auth\": \"oauth\"\n    }\n",[494,7950,7951,7963,7983,8001,8018],{"__ignoreMap":425},[944,7952,7953,7955,7957,7959,7961],{"class":946,"line":947},[944,7954,7618],{"class":958},[944,7956,6774],{"class":1058},[944,7958,3682],{"class":958},[944,7960,7611],{"class":954},[944,7962,2905],{"class":958},[944,7964,7965,7967,7970,7972,7974,7976,7979,7981],{"class":946,"line":1074},[944,7966,7631],{"class":958},[944,7968,7969],{"class":950},"type",[944,7971,3682],{"class":958},[944,7973,1375],{"class":958},[944,7975,3268],{"class":958},[944,7977,7978],{"class":1058},"http",[944,7980,3682],{"class":958},[944,7982,7648],{"class":958},[944,7984,7985,7987,7989,7991,7993,7995,7997,7999],{"class":946,"line":1081},[944,7986,7631],{"class":958},[944,7988,875],{"class":950},[944,7990,3682],{"class":958},[944,7992,1375],{"class":958},[944,7994,3268],{"class":958},[944,7996,7681],{"class":1058},[944,7998,3682],{"class":958},[944,8000,7648],{"class":958},[944,8002,8003,8005,8008,8010,8012,8014,8016],{"class":946,"line":1088},[944,8004,7631],{"class":958},[944,8006,8007],{"class":950},"auth",[944,8009,3682],{"class":958},[944,8011,1375],{"class":958},[944,8013,3268],{"class":958},[944,8015,7874],{"class":1058},[944,8017,1980],{"class":958},[944,8019,8020],{"class":946,"line":1948},[944,8021,7751],{"class":958},[430,8023,7905,8024,8027,8028,8031,8032],{},[494,8025,8026],{},"kimi mcp auth trek"," 並在網頁上按一下 ",[441,8029,8030],{},"Approve"," 完成快速授權：\n",[433,8033],{"src":7916,"alt":7917,"style":8034},"max-width: 453px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,8036,8037],{},"完成授權後，您將網頁在命令列直接呼叫所有關聯的微服務工具：",[433,8039],{"src":8040,"alt":8041,"style":6584},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fkimi-cli-mcp-authorized-tools-list.webp","授權成功後 Kimi CLI 顯示的可用工具清單",[892,8043,8045],{"id":8044},"_7-行動端使用體驗","7. 行動端使用體驗",[430,8047,8048],{},"在手機和行動裝置上，TREK是以 PWA（漸進式Web應用程式）的形式呈現的。其內建的 Service Worker 能夠將地圖網格瓦片和日程 API 資料離線快取，確保在野外或沒有網路訊號的極佳狀態下，您依然能夠流暢查看已制定的全部行程。不過，離線狀態下的推播通知回應速度相較原生應用程式會有微小的延遲。",[892,8050,2592],{"id":2592},[430,8052,8053],{},"透過 MCP 將 AI 代理接入您的日常旅行規劃，可以幫您省去那些因手動鍵入繁多的航班和酒店確認單而產生的大量枯燥勞動。不僅如此，AI 還能根據您指定的具體出行節點和所處季節，智慧推薦周邊的特色景點。僅僅透過幾句隨意的對話，AI 就能輕鬆打通從前期靈感檢索、行程路線設計，再到後期預算拆分和行李打包的完整全鏈路。",[430,8055,8056],{},"不過在目前的版本中，依然存在一些微小的體驗瑕疵。例如：透過 PDF 智慧解析匯入訂單時，帳單貨幣會預設對齊到旅行專案的主貨幣，而不是當時實際刷卡結算的付款貨幣。此外，在 Collections 收藏夾中新建清單列表時，如果在列表尚未保存時就給它配置封面，該封面可能在保存後失效（您需要在列表正式建立後，點擊「編輯」來重新添加並保存，即可解決）。",[430,8058,8059,8060,8065],{},"此外，因為它需要您擁有一定的 VPS 運維基礎來親自執行這套程序，對一般使用者確實存在一些上手門檻。TREK 更適合那些重度旅行愛好者、數位游牧以及對於自身出行資料隱私和排版有著高水準要求的極客使用者。我們由衷地建議您在下定決心搭建自託管服務之前，可以先在 ",[444,8061,8064],{"href":8062,"rel":8063},"https:\u002F\u002Fdemo.liketrek.com\u002F",[448],"demo.liketrek.com"," 上完整試用一下官方提供的公測 DEMO，看它是否切中您的日常痛點。",[892,8067,8069],{"id":8068},"參考資料","參考資料:",[484,8071,8072,8079,8086],{},[487,8073,8074],{},[444,8075,8078],{"href":8076,"rel":8077},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FQuick-Start",[448],"TREK Quick Start",[487,8080,8081],{},[444,8082,8085],{"href":8083,"rel":8084},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FTroubleshooting",[448],"TREK Troubleshooting",[487,8087,8088],{},[444,8089,8092],{"href":8090,"rel":8091},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FMCP-Scopes",[448],"TREK MCP Scopes",[1667,8094,8095],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":425,"searchDepth":1074,"depth":1081,"links":8097},[8098,8103,8104,8114,8122,8128,8134,8135,8136],{"id":6280,"depth":1081,"text":6281,"children":8099},[8100,8101,8102],{"id":6284,"depth":1088,"text":6285},{"id":6430,"depth":1088,"text":6430},{"id":6461,"depth":1088,"text":6461},{"id":6605,"depth":1081,"text":6606},{"id":6648,"depth":1081,"text":6649,"children":8105},[8106,8107,8108,8109,8110,8111,8112,8113],{"id":6751,"depth":1088,"text":6752},{"id":6762,"depth":1088,"text":6763},{"id":6860,"depth":1088,"text":6861},{"id":6878,"depth":1088,"text":6879},{"id":6914,"depth":1088,"text":6915},{"id":6936,"depth":1088,"text":6937},{"id":6955,"depth":1088,"text":6956},{"id":6966,"depth":1088,"text":6967},{"id":6996,"depth":1081,"text":6997,"children":8115},[8116,8117,8118,8119,8120,8121],{"id":7003,"depth":1088,"text":7004},{"id":7035,"depth":1088,"text":7036},{"id":7105,"depth":1088,"text":7106},{"id":7127,"depth":1088,"text":7128},{"id":7146,"depth":1088,"text":7147},{"id":7171,"depth":1088,"text":7172},{"id":7202,"depth":1081,"text":7203,"children":8123},[8124,8125,8126,8127],{"id":7223,"depth":1088,"text":7224},{"id":7323,"depth":1088,"text":7324},{"id":7386,"depth":1088,"text":7387},{"id":7485,"depth":1088,"text":7486},{"id":7509,"depth":1081,"text":7510,"children":8129},[8130,8131,8132,8133],{"id":7520,"depth":1088,"text":7521},{"id":7541,"depth":1088,"text":7542},{"id":7820,"depth":1088,"text":7821},{"id":7933,"depth":1088,"text":7934},{"id":8044,"depth":1081,"text":8045},{"id":2592,"depth":1081,"text":2592},{"id":8068,"depth":1081,"text":8069},[8138,1687],"travel","2026-09-01","本文詳細介紹如何使用Docker部署開源旅行規劃系統TREK。我們將帶您配置Caddy反向代理和Cloudflare R2物件儲存，實現資料的安全備份與圖片的高效載入。此外，還將演示如何利用MCP（模型上下文協定）連接Claude等AI代理，通過自然语言對話一鍵生成您的專屬旅行日程，開啟完美旅程。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002FTW-Self-hosted-travel-planner-TREK.webp","在一張溫和的羊皮紙背景上，高品質極簡風格的TREK自託管旅行規劃器儀表板3D插圖。",{"schemaOrg":8144,"robots":1721,"sitemap":8148},[8145,8146],{"@type":1700,"headline":6266,"description":8140},{"@type":4088,"headline":8147,"description":8140},"如何自託管AI旅行規劃器TREK：基於Docker、Caddy與Cloudflare R2的終極部署教程",{"lastmod":8139},{"title":8147,"description":8140,"ogTitle":6266,"ogDescription":8140,"twitterTitle":6266,"twitterDescription":8140},"tw\u002Farticle\u002Fself-hosted-travel-planner-trek",[6260,8152,6261,6262,6947],"TREK","4z3qxnioPNFhbOX0uBxJtousA1aOkRBZl0xQJeZeC7M",{"id":8155,"title":8156,"author":425,"body":8157,"category":8724,"date":8725,"description":8726,"extension":1692,"image":8727,"imageAlt":8728,"isPublished":1077,"meta":8729,"minRead":1074,"navigation":1077,"path":257,"seo":8733,"stem":8735,"tags":8736,"updatedAt":1730,"__hash__":8740},"article\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts.md","從傳統初始化範本腳本到智慧體：AI Agent 技能如何優雅地取代 Nuxt 應用程式的腳手架建構腳本",{"type":427,"value":8158,"toc":8717},[8159,8173,8177,8180,8276,8279,8307,8313,8317,8332,8335,8352,8356,8367,8537,8541,8624,8628,8637,8657,8664,8679,8689,8692,8698,8701,8706,8714],[430,8160,8161,8162,1859,8165,8168,8169,8172],{},"當我們使用 Nuxt 框架啟動一個新應用程式時，總是需要經歷一系列繁瑣的初始化步驟，比如安裝各種依賴模組，以及配置 ",[494,8163,8164],{},"nuxt.config.ts",[494,8166,8167],{},"wrangler.jsonc"," 等檔案。傳統的腳本固然可以解決一部分問題，但隨著專案客製化需求的增加，腳本的局限性也迅速暴露出來。這正是我們探索並嘗試用 ",[441,8170,8171],{},"AI Agent 技能 (Agent Skill)"," 取代傳統腳本的原因。",[474,8174,8176],{"id":8175},"傳統-shell-腳本擅長什麼","傳統 Shell 腳本擅長什麼",[430,8178,8179],{},"傳統的 Shell 腳本非常適合按順序執行一組固定的指令，且其中的所有決策都是在程式碼中預先寫死的 (Hardcoded)。",[936,8181,8183],{"className":1045,"code":8182,"language":1047,"meta":425,"style":425},"#!\u002Fusr\u002Fbin\u002Fenv bash\nset -e\n\nnpx nuxi@latest init \"$1\" --template minimal --packageManager pnpm --no-gitInit -M @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n\ncd \"$1\"\n\ncp ~\u002Ftemplates\u002Fnuxt.config.ts .\ncp ~\u002Ftemplates\u002Fwrangler.jsonc .\n",[494,8184,8185,8190,8197,8201,8240,8244,8254,8258,8267],{"__ignoreMap":425},[944,8186,8187],{"class":946,"line":947},[944,8188,8189],{"class":1084},"#!\u002Fusr\u002Fbin\u002Fenv bash\n",[944,8191,8192,8195],{"class":946,"line":1074},[944,8193,8194],{"class":976},"set",[944,8196,5206],{"class":1058},[944,8198,8199],{"class":946,"line":1081},[944,8200,1078],{"emptyLinePlaceholder":1077},[944,8202,8203,8205,8208,8211,8213,8217,8219,8222,8225,8228,8231,8234,8237],{"class":946,"line":1088},[944,8204,7643],{"class":1054},[944,8206,8207],{"class":1058}," nuxi@latest",[944,8209,8210],{"class":1058}," init",[944,8212,3268],{"class":958},[944,8214,8216],{"class":8215},"sHdIc","$1",[944,8218,3682],{"class":958},[944,8220,8221],{"class":1058}," --template",[944,8223,8224],{"class":1058}," minimal",[944,8226,8227],{"class":1058}," --packageManager",[944,8229,8230],{"class":1058}," pnpm",[944,8232,8233],{"class":1058}," --no-gitInit",[944,8235,8236],{"class":1058}," -M",[944,8238,8239],{"class":1058}," @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n",[944,8241,8242],{"class":946,"line":1948},[944,8243,1078],{"emptyLinePlaceholder":1077},[944,8245,8246,8248,8250,8252],{"class":946,"line":1953},[944,8247,2806],{"class":976},[944,8249,3268],{"class":958},[944,8251,8216],{"class":8215},[944,8253,1980],{"class":958},[944,8255,8256],{"class":946,"line":1959},[944,8257,1078],{"emptyLinePlaceholder":1077},[944,8259,8260,8262,8265],{"class":946,"line":2294},[944,8261,2823],{"class":1054},[944,8263,8264],{"class":1058}," ~\u002Ftemplates\u002Fnuxt.config.ts",[944,8266,4902],{"class":1058},[944,8268,8269,8271,8274],{"class":946,"line":2305},[944,8270,2823],{"class":1054},[944,8272,8273],{"class":1058}," ~\u002Ftemplates\u002Fwrangler.jsonc",[944,8275,4902],{"class":1058},[430,8277,8278],{},"但在面對以下開發痛點时，這種腳本就無能為力了：",[484,8280,8281,8287,8297],{},[487,8282,8283,8286],{},[441,8284,8285],{},"固定的預設值。"," 該腳本將 Nuxt UI 模組寫死了。如果我們想換成 Ant Design UI 呢？每增加一個可選的模組，就需要使用者提供更多的命令列參數。",[487,8288,8289,8292,8293,8296],{},[441,8290,8291],{},"無法理解使用者的真實意圖。"," 「幫我建一個部落格網站」需要引入 ",[494,8294,8295],{},"@nuxt\u002Fcontent","；「幫我建一個帶訂閱電子報功能的網站」則需要 Cloudflare D1 和 Drizzle ORM。普通的 Shell 腳本根本無法識別這些細微的語意差別——針對每種細微的變體，你都必須重新寫一個腳本。",[487,8298,8299,8302,8303,8306],{},[441,8300,8301],{},"在不知不覺中悄然過時。"," Nuxt 框架在大版本迭代時，其目錄規範往往會發生顯著改變。例如 Nuxt 4 將預設的原始碼目錄更改為了 ",[494,8304,8305],{},"app\u002F","。如果你繼續執行為 Nuxt 3 編寫的腳手架腳本，它會在背景靜默地生成錯誤的目錄結構，且絕不會向使用者發出任何警報。",[430,8308,8309,8312],{},[441,8310,8311],{},"應用程式腳手架的建構","（Scaffolding）本質上是一個需要「因地制宜做出決策」的問題，而不僅僅是「按步驟執行」。當決策變數增加時，傳統的腳本機制完全無法實現規模化擴充。",[474,8314,8316],{"id":8315},"為什麼要使用-ai-agent-技能取代傳統腳本","為什麼要使用 AI Agent 技能取代傳統腳本？",[430,8318,8319,8320,8323,8324,8327,8328,8331],{},"Agent 技能 (Agent Skill) 並非只是一段死板執行的程式碼，而是一套",[441,8321,8322],{},"供 AI Agent 遵循的結構化知識庫","。它包含一個核心的 ",[494,8325,8326],{},"SKILL.md"," 指南，並可以無縫捆綁該任務所需的任何其他檔案（如參考文件、配置範本和可執行腳本）。我們在 ",[444,8329,8330],{"href":351},"什麼是 AI Agent 技能？深入探討其工作原理並手把手教你如何建構高效、可複用的Agent技能"," 一文中詳細剖析了 Agent 技能的工作原理。",[430,8333,8334],{},"Agent 技能在保留了腳本執行力度的同時，注入了腳本所匱乏的合理決策能力：",[484,8336,8337,8340,8343,8346,8349],{},[487,8338,8339],{},"能夠推斷使用者的意圖，自動評估該應用程式是否需要搭配資料庫。",[487,8341,8342],{},"根據指定的候選清單，智慧判斷並按需安裝可選模組。例如，只有在使用者明確提出相關需求時，才會選擇性（Opt-in）匯入 Nuxt Content、i18n 多語言和流量分析模組。",[487,8344,8345],{},"能夠敏銳適應當前的開發生態，使用最新的 Nuxt 框架規範、針對 Cloudflare 綁定的 NuxtHub 以及用於部署的 Wrangler 命令列工具。",[487,8347,8348],{},"具備強大的自我修復能力，能夠在某一步驟失敗時自律分析原因並重新嘗試。",[487,8350,8351],{},"在最終交付專案前，能夠嚴格按照最終檢查清單 (Checklist) 进行校驗，確保交付品質。",[474,8353,8355],{"id":8354},"我們的-nuxt-cloudflare-腳手架-agent-技能技術內幕","我們的 Nuxt & Cloudflare 腳手架 Agent 技能技術內幕",[430,8357,8358,8359,8366],{},"這個開源技能 ",[444,8360,8363],{"href":8361,"rel":8362},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill",[448],[494,8364,8365],{},"scaffold-nuxt-cloudflare-app-skill"," 包含了一整套面向生產環境的自律建構流程：",[532,8368,8369,8401,8421,8446,8476,8515,8523],{},[487,8370,8371,3089,8374],{},[441,8372,8373],{},"自動澄清無法推斷的模糊要點",[484,8375,8376,8387,8393],{},[487,8377,8378,8379,8382,8383,8386],{},"確認首選的 UI 框架（預設是 ",[441,8380,8381],{},"Nuxt UI","，也可選擇 ",[441,8384,8385],{},"Antdv Next","）；",[487,8388,8389,8390,8386],{},"確認是否需要資料庫支援（如 ",[441,8391,8392],{},"Cloudflare D1",[487,8394,8395,8396,7278,8399,1807],{},"確認是否需要額外模組，例如用於建構 CMS 功能的 ",[494,8397,8398],{},"@nuxtjs\u002Fi18n",[494,8400,8295],{},[487,8402,8403,8406,8407,8410,8411,8413,8414,1859,8417,8420],{},[441,8404,8405],{},"初始化基礎應用程式框架","：執行 ",[494,8408,8409],{},"pnpm dlx nuxi@latest init"," 命令，使用 ",[494,8412,3572],{}," 套件管理器初始化最新版的 Nuxt 框架。隨後配置原生建構白名冊 (native-build allowlists)，以確保 Cloudflare 的建構環境能夠順利編譯 ",[494,8415,8416],{},"better-sqlite3",[494,8418,8419],{},"sharp"," 等原生依賴包。",[487,8422,8423,8426,8427,7278,8430,1536,8433,1536,8436,1536,8439,1536,8442,8445],{},[441,8424,8425],{},"基於決策表按需安裝模組","：自動安裝 ",[494,8428,8429],{},"@nuxt\u002Fui",[494,8431,8432],{},"@antdv-next\u002Fnuxt",[494,8434,8435],{},"@nuxt\u002Fimage",[494,8437,8438],{},"@nuxtjs\u002Fseo",[494,8440,8441],{},"@nuxthub\u002Fcore",[494,8443,8444],{},"@vueuse\u002Fnuxt","，並在選中時條件分支安裝 Drizzle\u002FD1、Nuxt Content 以及 i18n。",[487,8447,8448,3089,8451],{},[441,8449,8450],{},"科學合理的目錄結構布局",[484,8452,8453,8458,8463,8468,8473],{},[487,8454,8455,8457],{},[494,8456,8305],{}," (Nuxt 4 規範)",[487,8459,8460],{},[494,8461,8462],{},"server\u002F",[487,8464,8465],{},[494,8466,8467],{},"shared\u002F",[487,8469,8470],{},[494,8471,8472],{},"tests\u002F",[487,8474,8475],{},"根目錄下的各類標準設定檔案。",[487,8477,8478,3089,8483],{},[441,8479,8480,8481],{},"精細配置 ",[494,8482,8164],{},[484,8484,8485,8494,8501,8508],{},[487,8486,8487,8488,1859,8491],{},"為 SEO 配置 ",[494,8489,8490],{},"site.url",[494,8492,8493],{},"site.name",[487,8495,8496,8497,8500],{},"寫入用於 Cloudflare 綁定的 NuxtHub ",[494,8498,8499],{},"hub"," 配置區塊",[487,8502,8503,8504,8507],{},"自動配置 ",[494,8505,8506],{},"routeRules"," 路由與快取規則",[487,8509,8510,8511,8514],{},"寫入最新的 ",[494,8512,8513],{},"compatibilityDate"," 相容性日期",[487,8516,8517],{},[441,8518,8519,8520,8522],{},"科學生成 ",[494,8521,8167],{}," 設定檔案並進行雲端資源綁定",[487,8524,8525,8528,8529,8532,8533,8536],{},[441,8526,8527],{},"配置 Vitest 測試框架與 ESLint 程式碼規範","，隨後執行",[441,8530,8531],{},"最終校驗清單","，在背景實際執行 ",[494,8534,8535],{},"pnpm install && pnpm dev"," 進行沙箱執行測試，全部通過後方才宣告建構成功。",[474,8538,8540],{"id":8539},"傳統-shell-腳本-vs-ai-agent-技能維度對比","傳統 Shell 腳本 vs AI Agent 技能：維度對比",[604,8542,8543,8556],{},[607,8544,8545],{},[610,8546,8547,8550,8553],{},[613,8548,8549],{},"對比維度",[613,8551,8552],{},"傳統 Shell 腳本",[613,8554,8555],{},"AI Agent 技能",[622,8557,8558,8569,8580,8591,8602,8613],{},[610,8559,8560,8563,8566],{},[627,8561,8562],{},"意圖識別能力",[627,8564,8565],{},"❌ 行為完全寫死",[627,8567,8568],{},"✅ 自動理解自然語言並按需適配",[610,8570,8571,8574,8577],{},[627,8572,8573],{},"動態決策能力",[627,8575,8576],{},"❌ 僅限硬編碼的參數判斷",[627,8578,8579],{},"✅ 執行時動態推敲最佳方案",[610,8581,8582,8585,8588],{},[627,8583,8584],{},"生态更新適應度",[627,8586,8587],{},"❌ 需開發者手動重寫程式碼",[627,8589,8590],{},"✅ 自動感知當前技術棧規範並適配",[610,8592,8593,8596,8599],{},[627,8594,8595],{},"容錯與復原機制",[627,8597,8598],{},"❌ 一旦出錯立即中斷退出",[627,8600,8601],{},"✅ 自動定位錯誤、自癒並繼續執行",[610,8603,8604,8607,8610],{},[627,8605,8606],{},"成果品質校驗",[627,8608,8609],{},"❌ 缺乏品質校驗機制",[627,8611,8612],{},"✅ 依托最終檢查清單進行閉環測試",[610,8614,8615,8618,8621],{},[627,8616,8617],{},"長期維護成本",[627,8619,8620],{},"❌ 參數膨脹、邏輯混亂、易崩壞",[627,8622,8623],{},"✅ 只需維護人可讀的 Markdown 設計檔案",[474,8625,8627],{"id":8626},"如何使用-npx-skills-命令行工具安裝-ai-agent-技能","如何使用 npx skills 命令行工具安裝 AI Agent 技能",[430,8629,8630,8631,8636],{},"只需一行簡單的指令，即可透過 ",[444,8632,8635],{"href":8633,"rel":8634},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[448],"skills CLI"," 工具完成該技能的無縫匯入：",[936,8638,8640],{"className":1045,"code":8639,"language":1047,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git -g\n",[494,8641,8642],{"__ignoreMap":425},[944,8643,8644,8646,8649,8651,8654],{"class":946,"line":947},[944,8645,7643],{"class":1054},[944,8647,8648],{"class":1058}," skills",[944,8650,1068],{"class":1058},[944,8652,8653],{"class":1058}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git",[944,8655,8656],{"class":1058}," -g\n",[430,8658,8659,8660],{},"該工具會自動克隆倉庫、定位技能檔案，並詢問您希望將此技能關聯到本地系統所支援的 77 個 Agent 中的哪一個：\n",[433,8661],{"alt":8662,"src":8663},"在終端機中執行 npx skills add 命令列工具來全域安裝 Nuxt 腳手架建構技能的介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-add-scaffold-nuxt-installation.webp",[430,8665,8666,8667,8670,8671,8674,8675],{},"我們強烈推薦選擇 ",[441,8668,8669],{},"Symlink (符號連結)"," 方式。這種模式下，技能只需在 ",[494,8672,8673],{},"~\u002F.agents\u002Fskills"," 目錄中下載一次，所有被勾選的 Agent 都將指向這同一份原始檔案。\n",[433,8676],{"alt":8677,"src":8678},"終端機中顯示的集中式 Agent 技能安裝摘要以及軟連結 (Symlink) 路徑設定詳情","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-installation-summary-details.webp",[484,8680,8681],{},[487,8682,8683],{},[911,8684,8685,8686,1807],{},"如果您希望深入了解如何有效避免技能碎片化並在一處集中管理它們，請參閱我們的這篇深度好文：",[444,8687,8688],{"href":359},"使用 npx skills 徹底解決不同 AI Agent（如 Claude Code 或 Kimi）技能碎片化問題",[430,8690,8691],{},"完成安裝後，打開 Claude Code 終端機，輸入內建指令即可確認該技能已成功啟用。",[430,8693,8694],{},[433,8695],{"alt":8696,"src":8697},"Claude Code 命令列終端機中顯示的全新安裝且已啟用可用的 \u002Fscaffold-nuxt 斜線快捷命令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fclaude-code-scaffold-nuxt-slash-command-active.webp",[430,8699,8700],{},"接下來，您只需輸入一句簡單的自然語言，即可瞬間搞定複雜的工程腳手架搭建：",[2529,8702,8703],{},[430,8704,8705],{},"\"Scaffold a new Nuxt app deployed to Cloudflare Workers — Nuxt UI, a blog section, and a D1 database\"",[430,8707,8708,8709,8713],{},"該腳手架技能完全開源，歡迎訪問我們的 ",[444,8710,8712],{"href":8361,"rel":8711},[448],"GitHub 倉庫"," 提交 Feedback 並上手體驗！",[1667,8715,8716],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1074,"depth":1081,"links":8718},[8719,8720,8721,8722,8723],{"id":8175,"depth":1074,"text":8176},{"id":8315,"depth":1074,"text":8316},{"id":8354,"depth":1074,"text":8355},{"id":8539,"depth":1074,"text":8540},{"id":8626,"depth":1074,"text":8627},[1687],"2026-08-25","輕鬆在 Cloudflare Workers 上快速建構 Nuxt 應用程式腳手架。深入剖析並學習我們如何使用功能強大、極具靈活性、能根據意圖決策且支援自我修復的 AI 智慧體技能，來徹底取代脆弱且難以維護的傳統 Shell 腳本，並詳細演示如何透過 npx skills 命令行工具將其無缝安裝到您的本地開發工作流中。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002FTW-How-AI-Agent-Skills-Replace-Nuxt-App-Scaffolding-Scripts.webp","Nuxt 應用程式在 Cloudflare 上的腳手架建構：傳統 Shell 腳本與 AI 智慧體技能對比。分析為什麼智慧體技能優於傳統初始化腳本。",{"schemaOrg":8730,"robots":1721,"sitemap":8732},[8731],{"@type":1698,"headline":8156,"description":8726,"image":8727},{"lastmod":8725},{"title":8734,"description":8726,"ogTitle":8156,"ogDescription":8726,"twitterTitle":8156,"twitterDescription":8726},"Nuxt 應用程式在 Cloudflare 上的腳手架建構：傳統 Shell 腳本與 AI 智慧體技能對比","tw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",[8737,6262,8738,8739],"Nuxt","AI Agent","Scaffolding","7Hh5zal4sRkoJezAuNT3T7Bv8UlZZI9OVmJtSb0kBX4",{"id":8742,"title":8743,"author":1730,"body":8744,"category":9526,"date":9528,"description":9529,"extension":1692,"image":9530,"imageAlt":9531,"isPublished":1077,"meta":9532,"minRead":9537,"navigation":1077,"path":277,"seo":9538,"stem":9539,"tags":9540,"updatedAt":1730,"__hash__":9542},"article\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","基於Cloudflare Workers與MCP協定構建個人專屬AI持久化記憶系統，完美解決Context空白痛點",{"type":427,"value":8745,"toc":9508},[8746,8750,8753,8756,8760,8763,8778,8782,8789,8803,8806,8809,8853,8857,8938,8942,8967,9064,9075,9079,9084,9124,9149,9153,9158,9225,9230,9234,9266,9272,9311,9314,9346,9350,9358,9362,9402,9406,9456,9459,9462,9465,9468,9471,9505],[474,8747,8749],{"id":8748},"持久化-ai-記憶對智慧體agent的重要性","持久化 AI 記憶對智慧體（Agent）的重要性",[430,8751,8752],{},"隨著 AI 助手逐漸融入我們的日常生活與工作，我們經常會遇到「空白上下文」的問題（Blank Context Issue）。上週已經確認的決策在開啟新對話後便被遺忘，這迫使我们不得不一遍又一遍地輸入相同的技術堆疊（Tech Stack）細節，並在每個新會話中重新設定使用者偏好。",[430,8754,8755],{},"與其每次都從零開始，我們需要構建一個能夠持續演進、深入理解使用者決策的記憶系統，從而徹底消除重複輸入上下文的煩惱。",[474,8757,8759],{"id":8758},"自行架設-ai-記憶系統-vs-內置-ai-記憶功能","自行架設 AI 記憶系統 vs. 內置 AI 記憶功能",[430,8761,8762],{},"雖然許多 AI 智慧體或用戶端（如 ChatGPT、Claude 等）自帶了內建記憶功能，但我們很少在所有場景下只使用單一智慧體。我們可能會用 Claude 來設計和規劃專案架構，用 Kimi 來編寫程式碼，用 ChatGPT 進行深度的背景研究。然而，這些不同的智慧體之間無法直接共享上下文，所有記憶依然被孤立在各自的生態黑盒子中。",[430,8764,8765,8766,8771,8772,8777],{},"從軟體工程的角度來看，我們並不信任無法控制的黑盒子。我們需要的是一個可觀察、可審計且完全處於自己掌控之下的 AI 記憶系統。開放原始碼專案 ",[444,8767,8770],{"href":8768,"rel":8769},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[448],"Second Brain","（Fork 自 ",[444,8773,8776],{"href":8774,"rel":8775},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare%EF%BC%89%E6%8F%90%E4%BE%9B%E4%BA%86%E4%B8%80%E5%80%8B%E6%94%AF%E6%8F%B4%E6%A8%A1%E5%9E%8B%E4%B8%8A%E4%B8%8B%E6%96%87%E5%8D%94%E5%AE%9A%EF%BC%88Model",[448],"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare）提供了一個支援模型上下文協定（Model"," Context Protocol，簡稱 MCP）的持久化自行架設 AI 記憶系統。任何相容 MCP 協定的 AI 智慧體（如 Claude、ChatGPT、Kimi Code 等）都可以完美共享相同的上下文記憶庫。",[474,8779,8781],{"id":8780},"如何在-cloudflare-上構建-second-brain-ai-記憶系統","如何在 Cloudflare 上構建 Second Brain AI 記憶系統",[430,8783,8784,8785,8788],{},"Second Brain 記憶系統部署在 ",[441,8786,8787],{},"Cloudflare Workers"," 之上，其提供了全球分佈式、極低延遲的 Serverless 執行基礎設施。這使得在 AI 的推理和決策循環中，檢索記憶（Recall）及寫入等操作能夠以近乎零延遲的體驗執行。",[430,8790,8791,8792,8795,8796,8799,8800,8802],{},"系統使用 ",[441,8793,8794],{},"Workers AI"," 的嵌入（Embedding）模型来生成高維向量。這些嵌入向量儲存在 ",[441,8797,8798],{},"Cloudflare Vectorize"," 中，這是一項經過高度優化、全球分佈式的高性能向量資料庫服務。",[441,8801,8798],{}," 會執行餘弦相似度（Cosine Similarity）搜尋，以精準匹配具有語意相關性的記憶切片。",[430,8804,8805],{},"Second Brain 還內建了智慧的去重與合併機制。只有在內容相似度低於 85% 時，系統才會將其作為新記憶儲存；否則，該內容將被攔截或標記為潛在的重複候選。超過 1,600 字元的長文字會被系統在句子或換行符邊界處進行合理切分，並保持相鄰分片之間有 200 字元的重疊（Overlap），以防丟失上下文語境。隨後，每個文字分片都會被單獨向量化，從而實現極高精度的語意匹配。",[430,8807,8808],{},"系統為 AI 智慧體直接暴露了以下 MCP 工具介面：",[484,8810,8811,8817,8823,8829,8835,8841,8847],{},[487,8812,8813,8816],{},[494,8814,8815],{},"remember","：儲存想法、決策、偏好及專案整體上下文",[487,8818,8819,8822],{},[494,8820,8821],{},"append","：為已有的記憶內容追加新的更新或補充資訊",[487,8824,8825,8828],{},[494,8826,8827],{},"update","：完全替換已有的某條記憶內容",[487,8830,8831,8834],{},[494,8832,8833],{},"recall","：基於語意相似度檢索相關記憶，而非死板的關鍵字精確匹配",[487,8836,8837,8840],{},[494,8838,8839],{},"list_recent","：瀏覽最近儲存的記憶記錄",[487,8842,8843,8846],{},[494,8844,8845],{},"forget","：永久且徹底地刪除某條記憶",[487,8848,8849,8852],{},[494,8850,8851],{},"link\u002Fconnections","：明示關聯不同的記憶節點（V2 版本提供的圖譜功能）",[892,8854,8856],{"id":8855},"在-cloudflare-上設定-second-brain","在 Cloudflare 上設定 Second Brain",[532,8858,8859,8876,8883,8890,8897,8904,8915,8922,8925,8932],{},[487,8860,5250,8861,8866,8867,8870,8871,8875],{},[444,8862,8865],{"href":8863,"rel":8864},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[448],"Github 儲存庫"," 頁面，點擊 ",[494,8868,8869],{},"Deploy to Cloudflare"," 按鈕。 [[",[433,8872],{"alt":8873,"src":8874},"GitHub 頁面上突出顯示的 Deploy to Cloudflare 部署按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[487,8877,8878,8879],{},"填寫彈出的 Cloudflare Worker 設定表單。\n",[433,8880],{"alt":8881,"src":8882},"Cloudflare Workers 部署設定表單","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[487,8884,8885,8886],{},"在 Dimensions（維度）輸入 '384'，Metric（度量指標）選擇 'cosine'，然後點擊 Deploy 按鈕。\n",[433,8887],{"alt":8888,"src":8889},"Cloudflare Vectorize 向量資料庫建立與維度設定","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[487,8891,8892,8893],{},"部署成功後，以下是 Cloudflare Workers 平台中 Second Brain 實例的概覽資訊：\n",[433,8894],{"alt":8895,"src":8896},"已部署的 Second Brain Worker 實例概覽首頁","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[487,8898,8899,8900],{},"點擊 'Settings'（設定），然後點擊 'AUTH_TOKEN' 環境變數旁的編輯圖示，以建立一條高強度的存取權杖（Token）：\n",[433,8901],{"alt":8902,"src":8903},"Cloudflare Worker 變數設定中高亮顯示的 AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[487,8905,8906,8907,8911],{},"點擊 'Rotate'（輪換）連結，以便能輸入新的安全值： ",[433,8908],{"alt":8909,"src":8910},"AUTH_TOKEN 變數修改與金鑰輪換介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[433,8912],{"alt":8913,"src":8914},"在 AUTH_TOKEN 值欄位中輸入產生的隨機安全字串","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[487,8916,8917,8918,8921],{},"在 macOS 終端機中執行 ",[494,8919,8920],{},"openssl rand -base64 32"," 命令來生成一個隨機的安全字串，並將其複製貼上到 'Value' 輸入框中。",[487,8923,8924],{},"點擊 'Deploy' 按鈕，使新設定的 'AUTH_TOKEN' 正式生效。",[487,8926,8927,8928],{},"在瀏覽器中打開您剛剛建立的 Second Brain Worker 存取網域：\n",[433,8929],{"alt":8930,"src":8931},"包含 Bearer Token 輸入欄位收藏的 Second Brain Web 登入介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[487,8933,5250,8934,8937],{},[494,8935,8936],{},"Bearer token"," 輸入框中填入剛才建立的 'AUTH_TOKEN'，然後點擊 'Connect' 按鈕登入 Web 主控台。",[892,8939,8941],{"id":8940},"透過-mcp-協定整合-claude-desktop","透過 MCP 協定整合 Claude Desktop",[532,8943,8944,8951,8958],{},[487,8945,8946,8947],{},"在 Claude Desktop 用戶端中點擊 'Customize'（自訂）按鈕。\n",[433,8948],{"alt":8949,"src":8950},"Claude Desktop 介面中指向 Customize 自訂按鈕的位置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[487,8952,8953,8954],{},"點擊 'Developer'（開發者）選項，手動編輯本地的 MCP 設定檔：\n",[433,8955],{"alt":8956,"src":8957},"Claude Desktop 開發者設定選單中用於開啟 MCP 設定檔的選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[487,8959,5250,8960,8963,8964,8966],{},[494,8961,8962],{},"claude_desktop_config.json"," 的 ",[494,8965,7606],{}," 欄位中加入以下設定程式碼區塊：",[936,8968,8970],{"className":2896,"code":8969,"language":2898,"meta":425,"style":425},"    \"second-brain\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n        \"--header\",\n        \"Authorization: Bearer \u003Cyour-token>\"\n      ]\n    }\n",[494,8971,8972,8985,9003,9015,9025,9036,9047,9056,9060],{"__ignoreMap":425},[944,8973,8974,8976,8979,8981,8983],{"class":946,"line":947},[944,8975,7618],{"class":958},[944,8977,8978],{"class":1058},"second-brain",[944,8980,3682],{"class":958},[944,8982,7611],{"class":954},[944,8984,2905],{"class":958},[944,8986,8987,8989,8991,8993,8995,8997,8999,9001],{"class":946,"line":1074},[944,8988,7631],{"class":958},[944,8990,7634],{"class":950},[944,8992,3682],{"class":958},[944,8994,1375],{"class":958},[944,8996,3268],{"class":958},[944,8998,7643],{"class":1058},[944,9000,3682],{"class":958},[944,9002,7648],{"class":958},[944,9004,9005,9007,9009,9011,9013],{"class":946,"line":1081},[944,9006,7631],{"class":958},[944,9008,7655],{"class":950},[944,9010,3682],{"class":958},[944,9012,1375],{"class":958},[944,9014,7662],{"class":958},[944,9016,9017,9019,9021,9023],{"class":946,"line":1088},[944,9018,7667],{"class":958},[944,9020,7670],{"class":1058},[944,9022,3682],{"class":958},[944,9024,7648],{"class":958},[944,9026,9027,9029,9032,9034],{"class":946,"line":1948},[944,9028,7667],{"class":958},[944,9030,9031],{"class":1058},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[944,9033,3682],{"class":958},[944,9035,7648],{"class":958},[944,9037,9038,9040,9043,9045],{"class":946,"line":1953},[944,9039,7667],{"class":958},[944,9041,9042],{"class":1058},"--header",[944,9044,3682],{"class":958},[944,9046,7648],{"class":958},[944,9048,9049,9051,9054],{"class":946,"line":1959},[944,9050,7667],{"class":958},[944,9052,9053],{"class":1058},"Authorization: Bearer \u003Cyour-token>",[944,9055,1980],{"class":958},[944,9057,9058],{"class":946,"line":2294},[944,9059,7746],{"class":958},[944,9061,9062],{"class":946,"line":2305},[944,9063,7751],{"class":958},[430,9065,9066,9070,9071],{},[433,9067],{"alt":9068,"src":9069},"包含 Second Brain 遠端服務的 Claude Desktop MCP 設定檔","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-config-json.webp","\n4. 重啟 Claude Desktop 並檢查 'Local MCP servers' 列表，狀態應顯示為 'running'（運行中）。\n",[433,9072],{"alt":9073,"src":9074},"Claude Desktop 用戶端中顯示為執行（running）狀態的的 Second Brain MCP 服務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[892,9076,9078],{"id":9077},"透過-mcp-協定整合-claude-code","透過 MCP 協定整合 Claude Code",[484,9080,9081],{},[487,9082,9083],{},"在終端機中執行以下命令以新增該遠端 MCP 服務：",[936,9085,9087],{"className":2324,"code":9086,"language":2326,"meta":425,"style":425},"claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n",[494,9088,9089],{"__ignoreMap":425},[944,9090,9091,9094,9097,9099,9102,9105,9108,9111,9113,9116,9119,9121],{"class":946,"line":947},[944,9092,9093],{"class":1054},"claude",[944,9095,9096],{"class":1058}," mcp",[944,9098,1068],{"class":1058},[944,9100,9101],{"class":1058}," --transport",[944,9103,9104],{"class":1058}," http",[944,9106,9107],{"class":1058}," second-brain",[944,9109,9110],{"class":1058}," https:\u002F\u002F",[944,9112,5577],{"class":958},[944,9114,9115],{"class":1058},"your-worker-ur",[944,9117,9118],{"class":954},"l",[944,9120,1263],{"class":958},[944,9122,9123],{"class":1058},"\u002Fmcp\n",[484,9125,9126,9132],{},[487,9127,9128,9129,1807],{},"Claude Code 會自動偵測到該端點需要 OAuth 身份驗證，並在您的預設瀏覽器中打開登入頁面，供您輸入並驗證剛才建立的 ",[494,9130,9131],{},"AUTH_TOKEN",[487,9133,9134,9135,9138,9139,9142,9143,9148],{},"在本地的 ",[494,9136,9137],{},"~\u002F.claude"," 目錄下建立 ",[494,9140,9141],{},"CLAUDE.md"," 檔案，並將 ",[444,9144,9147],{"href":9145,"rel":9146},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[448],"CLAUDE_INSTRUCTIONS.md"," 檔案中的引導詞和規則完整寫入其中。",[892,9150,9152],{"id":9151},"透過-mcp-協定整合-gemini-cli","透過 MCP 協定整合 Gemini CLI",[532,9154,9155],{},[487,9156,9157],{},"将以下 MCP 設定資訊加入您本地的 '.\u002F.gemini\u002Fsettings.json' 檔案：",[936,9159,9161],{"className":2896,"code":9160,"language":2898,"meta":425,"style":425},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[494,9162,9163,9175,9193,9205,9217,9221],{"__ignoreMap":425},[944,9164,9165,9167,9169,9171,9173],{"class":946,"line":947},[944,9166,7618],{"class":958},[944,9168,8978],{"class":1058},[944,9170,3682],{"class":958},[944,9172,7611],{"class":954},[944,9174,2905],{"class":958},[944,9176,9177,9179,9181,9183,9185,9187,9189,9191],{"class":946,"line":1074},[944,9178,7631],{"class":958},[944,9180,7855],{"class":950},[944,9182,3682],{"class":958},[944,9184,1375],{"class":958},[944,9186,3268],{"class":958},[944,9188,9031],{"class":1058},[944,9190,3682],{"class":958},[944,9192,7648],{"class":958},[944,9194,9195,9197,9199,9201,9203],{"class":946,"line":1081},[944,9196,7631],{"class":958},[944,9198,7874],{"class":950},[944,9200,3682],{"class":958},[944,9202,1375],{"class":958},[944,9204,2935],{"class":958},[944,9206,9207,9209,9211,9213,9215],{"class":946,"line":1088},[944,9208,7667],{"class":958},[944,9210,7887],{"class":1054},[944,9212,3682],{"class":958},[944,9214,1375],{"class":958},[944,9216,1397],{"class":958},[944,9218,9219],{"class":946,"line":1948},[944,9220,7898],{"class":958},[944,9222,9223],{"class":946,"line":1953},[944,9224,7751],{"class":958},[532,9226,9227],{"start":1074},[487,9228,9229],{},"啟動 Gemini CLI 用戶端。",[892,9231,9233],{"id":9232},"在不同-ai-智慧體中測試-second-brain-效果","在不同 AI 智慧體中測試 Second Brain 效果",[532,9235,9236,9245,9259],{},[487,9237,5250,9238,9240,9241],{},[441,9239,7558],{}," 中，如果我們只是進行簡單的品牌色調偏好設定，此時預設並不會呼叫外部的 Second Brain 服務：\n",[433,9242],{"alt":9243,"src":9244},"在未啟用 Second Brain 記憶層時在 Claude Desktop 中進行的首次偏好設定測試","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[487,9246,9247,9248,9250,9251,9254,9255],{},"如果我們只是輸入 'remember' 等常規詞，由於其尚未觸發特定提示詞引導，",[441,9249,7558],{}," 此時僅會呼叫本地內建的 ",[494,9252,9253],{},"memory_user-edits"," 工具，並不會同步到雲端的持久化記憶層。\n",[433,9256],{"alt":9257,"src":9258},"Claude Desktop 預設呼叫本地內建使用者編輯工具而忽略雲端 Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[487,9260,9261,9262,9265],{},"而當我们在配置了規則引導的 ",[441,9263,9264],{},"Claude Code"," 終端機中，輸入以下具體指令時，系統便成功地在背景觸發並呼叫了 Second Brain 工具：",[936,9267,9270],{"className":9268,"code":9269,"language":4641},[4639],"Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n",[494,9271,9269],{"__ignoreMap":425},[430,9273,9274,9278,9279,9282,9283,9287,9288,9291,9292,9294,9295,9299,9300,9303,9304,9287,9308],{},[433,9275],{"alt":9276,"src":9277},"Claude Code 終端機視窗顯示成功觸發並寫入 Second Brain 遠端記憶","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. 登入 ",[441,9280,9281],{},"Cloudflare Workers 主控台"," 查看 Second Brain 的資料庫，確認這些顏色資訊已成功同步並儲存在雲端：\n",[433,9284],{"alt":9285,"src":9286},"在 Second Brain 主控台 Web UI 中驗證已成功儲存的品牌色設定資料","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[911,9289,9290],{},"Claude Code 之所以能夠自動無縫工作，得益於專案目錄下的 CLAUDE_INSTRUCTIONS.md 檔案。該檔案讓智慧體能夠理解並關聯包含 'Second Brain' 關鍵字的記憶流程。","\n5. 在 ",[441,9293,7558],{}," 中若想達到相同效果，我們需要在提示詞中顯式提及 'Second Brain' 相關的指引，以強制智慧體讀取或寫入這一持久化記憶圖層。\n",[433,9296],{"alt":9297,"src":9298},"在提示詞中顯式提及 'Second Brain' 關鍵字以觸發遠端記憶讀寫","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. 同樣地，在 ",[441,9301,9302],{},"Gemini CLI"," 互動中，我們也需要提到 'Second Brain' 關鍵字，以喚醒並觸發其對應的遠端 MCP 工具。\n",[433,9305],{"alt":9306,"src":9307},"Gemini CLI 終端機命令列互動中成功觸發 Second Brain 讀寫","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[911,9309,9310],{},"如果您仿照 CLAUDE_INSTRUCTIONS.md 的做法，在本地的 GEMINI.md 檔案中添加類似的上下文引導，AI 便可在背景靜默呼叫 Second Brain 記憶層，不再需要您每次都手動輸入觸發關鍵字。",[892,9312,9313],{"id":9313},"瀏覽器擴充功能与快捷剪輯",[484,9315,9316,9319],{},[487,9317,9318],{},"系統為 Chrome、Firefox 和 Microsoft Edge 瀏覽器提供了官方外掛程式支援。",[487,9320,9321,9322],{},"透過該外掛程式，您可以非常快捷地完成以下操作：\n",[484,9323,9324,9330,9336],{},[487,9325,9326,9329],{},[441,9327,9328],{},"網頁一鍵剪輯"," — 一鍵將當前頁面的網頁標題與 URL 網址快捷歸檔到您的 Second Brain 中。",[487,9331,9332,9335],{},[441,9333,9334],{},"選取文字摘要剪輯"," — 選取網頁中的任意精彩段落或技術細節後點擊剪輯，該摘錄便會配合網頁標題和 URL 被一併儲存。",[487,9337,9338,9341,9342,9345],{},[441,9339,9340],{},"自由文字速記"," — 在儲存前直接在功能彈窗中輸入額外的補充上下文，或直接附帶 ",[494,9343,9344],{},"#標記","；這些標記會被系統自動識別並提取。",[892,9347,9349],{"id":9348},"透過-obsidian-外掛程式同步個人本地知識庫","透過 Obsidian 外掛程式同步個人本地知識庫",[484,9351,9352,9355],{},[487,9353,9354],{},"系統提供了一個 Obsidian 專屬外掛程式，支援將您本地 Obsidian Vault（保險庫）中的特定筆記完美同步至 Cloudflare 端自託管的 Second Brain 記憶中心。",[487,9356,9357],{},"透過設定特定的同步標記，您可以精準控制哪些筆記能夠寫入您的持久化 AI 上下文庫中。",[2182,9359,9361],{"id":9360},"安装-obsidian-外掛程式","安装 Obsidian 外掛程式",[532,9363,9364,9378,9388,9395],{},[487,9365,9366,9367,9370,9371,9374],{},"啟動 Obsidian 用戶端 → 點擊 ",[944,9368,9369],{},"Settings（設定）"," → ",[944,9372,9373],{},"Community Plugins（第三方外掛程式）",[433,9375],{"alt":9376,"src":9377},"Obsidian 系統設定面板中指向第三方社群外掛程式的入口","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[487,9379,3054,9380,9383,9384],{},[944,9381,9382],{},"Browse（瀏覽）"," 按鈕。\n",[433,9385],{"alt":9386,"src":9387},"Obsidian 第三方外掛程式市集並高亮顯示的 Browse 瀏覽按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[487,9389,9390,9391],{},"檢索關鍵詞 'Second Brain Sync'。\n",[433,9392],{"alt":9393,"src":9394},"在 Obsidian 第三方外掛程式市集中搜尋 Second Brain Sync 外掛程式","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[487,9396,9397,9398],{},"點擊 'Install' 進行安裝，然後點擊 'Enable' 啟用該外掛程式。\n",[433,9399],{"alt":9400,"src":9401},"在 Obsidian 中點擊安裝並啟用 Second Brain Sync 外掛程式","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[2182,9403,9405],{"id":9404},"設定-obsidian-外掛程式","設定 Obsidian 外掛程式",[532,9407,9408,9418,9425,9432,9439,9449],{},[487,9409,9410,9411,9413,9414,9417],{},"進入 Obsidian 用戶端 ",[944,9412,9369],{}," → 選取 ",[944,9415,9416],{},"Second Brain Sync"," 外掛程式設定頁面：",[487,9419,9420,9421],{},"準確填寫您的 Worker 的端點「URL」和剛才建立的「Auth token（身份權杖）」：\n",[433,9422],{"alt":9423,"src":9424},"在 Obsidian 外掛程式設定頁面中輸入 Worker URL 和 AUTH_TOKEN 身份憑證","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[487,9426,9427,9428],{},"點擊 'Test' 按鈕來驗證網路連線是否暢通：\n",[433,9429],{"alt":9430,"src":9431},"Obsidian 外掛程式連線測試傳回成功（Success）提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[487,9433,9434,9435],{},"設定具體的同步策略。設定您的同步標記「Sync tag」並開啟「Auto-sync on save（儲存時自動同步）」功能：\n",[433,9436],{"alt":9437,"src":9438},"在 Obsidian 外掛程式中設定特定同步標記並啟用儲存時自動同步","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[487,9440,9441,9442,9444,9445],{},"在 Obsidian 知識庫中新建一篇筆記，並為其附帶您設定好的同步標記（例如： ",[494,9443,8978],{},"）：\n",[433,9446],{"alt":9447,"src":9448},"在 Obsidian 中建立一篇帶有 'second-brain' 標籤的待同步本地筆記","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[487,9450,9451,9452],{},"筆記儲存後，其內容已成功觸發並自動同步到在 Cloudflare 上運行的自託管 Second Brain 實例中：\n",[433,9453],{"alt":9454,"src":9455},"在雲端 Second Brain 主控台 Web UI 中驗證已成功同步過來的 Obsidian 筆記","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[474,9457,9458],{"id":9458},"總結與展望",[430,9460,9461],{},"Second Brain 記憶系統為困擾當前 AI 生態的最大痛點之一 —— 長期上下文遺忘與記憶斷層，提供了一套極為優雅的開源解決方案。透過將自託管專案與 Cloudflare Workers 彈性、全球分佈的 Serverless 基礎設施深度結合，我們得以在邊緣網路上輕鬆架設起一條低延遲、高回應速度的個人語意記憶閘道。得益於 MCP 這一開放的標準，這條記憶脈絡如今已能無縫流動、並被移植共享於各種主流的 AI 助手和開發終端之間。",[430,9463,9464],{},"Obsidian 專屬同步外掛程式的加入，更是將這套架構完美融合進了個人日常的知識管理（PKM）流程。您平時隨手記錄的雜亂卡片或開發速記，能被有選擇地提煉並重構，轉化為可被 AI 完美解析的結構化上下文。",[430,9466,9467],{},"將私有化部署、高精度的語意向量搜尋以及開放式的 MCP 整合標準相融合，Second Brain 不僅僅是一層記憶的外掛，它正向我們展示著一個由使用者個人掌握核心資料所有權，安全、獨立、互聯的未來 Agent 生態系統基石。",[474,9469,9470],{"id":8068},"參考資料：",[484,9472,9473,9479,9485,9492,9499],{},[487,9474,9475],{},[444,9476,9477],{"href":9477,"rel":9478},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[448],[487,9480,9481],{},[444,9482,9483],{"href":9483,"rel":9484},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[448],[487,9486,9487],{},[444,9488,9491],{"href":9489,"rel":9490},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[448],"Connect to AI Clients",[487,9493,9494],{},[444,9495,9498],{"href":9496,"rel":9497},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[448],"Second Brain Obsidian Plugin",[487,9500,9501],{},[444,9502,9503],{"href":9503,"rel":9504},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[448],[1667,9506,9507],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":425,"searchDepth":1074,"depth":1081,"links":9509},[9510,9511,9512,9524,9525],{"id":8748,"depth":1074,"text":8749},{"id":8758,"depth":1074,"text":8759},{"id":8780,"depth":1074,"text":8781,"children":9513},[9514,9515,9516,9517,9518,9519,9520],{"id":8855,"depth":1081,"text":8856},{"id":8940,"depth":1081,"text":8941},{"id":9077,"depth":1081,"text":9078},{"id":9151,"depth":1081,"text":9152},{"id":9232,"depth":1081,"text":9233},{"id":9313,"depth":1081,"text":9313},{"id":9348,"depth":1081,"text":9349,"children":9521},[9522,9523],{"id":9360,"depth":1088,"text":9361},{"id":9404,"depth":1088,"text":9405},{"id":9458,"depth":1074,"text":9458},{"id":8068,"depth":1074,"text":9470},[9527,1687],"cloudflare","2026-08-07","學習如何利用Cloudflare Workers、Vectorize與MCP協定自行架設AI持久化記憶系統（Second Brain）。在Claude、Gemini與Obsidian之間完美共享上下文。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FTW-Use-Cloudflare-as-AI-memory.webp","基於 Cloudflare Workers 和 Vectorize 構建的自託管 AI 持久化記憶系統，支援 MCP 協定與 Obsidian 筆記雙向同步。",{"schemaOrg":9533,"robots":1721,"sitemap":9536},[9534],{"@type":1698,"headline":9535,"description":9529},"基於Cloudflare與MCP協定自行架設AI持久化記憶系統",{"lastmod":9528},35,{"title":9535,"description":9529,"ogTitle":8743,"ogDescription":9529,"twitterTitle":8743,"twitterDescription":9529},"tw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[6262,6947,9541,8770,4097],"AI 記憶","YPOf86d5u4oQ6tOrox0pT9UIC3Wk6d7rbNYqAotfw5s",{"id":9544,"title":2541,"author":425,"body":9545,"category":10059,"date":10060,"description":10061,"extension":1692,"image":10062,"imageAlt":10063,"isPublished":1077,"meta":10064,"minRead":1074,"navigation":1077,"path":269,"seo":10068,"stem":10069,"tags":10070,"updatedAt":1730,"__hash__":10073},"article\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md",{"type":427,"value":9546,"toc":10052},[9547,9551,9554,9561,9565,9568,9571,9574,9578,9581,9588,9604,9897,10011,10014,10017,10019,10049],[474,9548,9550],{"id":9549},"什麼是-cloudflare-warp","什麼是 Cloudflare WARP？",[430,9552,9553],{},"Cloudflare WARP 是一款用戶端應用程式，它會將指定裝置的網路流量引導至 Cloudflare 的全球網路進行路由，而不是直接傳送到公共網際網路。",[430,9555,9556,9557,9560],{},"它基於 ",[441,9558,9559],{},"WireGuard"," 通訊協定建立一條加密隧道，從而保護從裝置到最近的 Cloudflare 資料中心之間的流量安全。隨後，您可以在 Cloudflare 控制面板中建立原則，對這些流入的流量進行篩選、記錄、檢查或路由。",[474,9562,9564],{"id":9563},"為什麼我們需要-cloudflare-warp","為什麼我們需要 Cloudflare WARP？",[430,9566,9567],{},"為了向員工、承包商和其他專案關係人安全地公開內部資源（如私有 Web 服務或 SaaS 應用程式），Cloudflare WARP 用戶端被用作**零信任網路存取 (ZTNA)**的用戶端強制執行點。",[430,9569,9570],{},"Cloudflare WARP 用戶端安裝在用戶的筆記型電腦或手機上。它要求用戶在授予存取權限之前進行身分驗證，並滿足特定的安全性狀態檢查（例如來自經過核准的 IP 範圍、使用已註冊的電子郵件網域或執行處於作用狀態的防火牆）。",[430,9572,9573],{},"透過將裝置流量直接通道化傳輸到 Cloudflare，用戶的身分、裝置和原則將在要求到達內部資源之前得到驗證。因此，內部資源永遠不會暴露在公共網際網路上，每一次要求都將得到完整的記錄和稽核。",[474,9575,9577],{"id":9576},"在單一裝置上支援多個-warp-設定檔","在單一裝置上支援多個 WARP 設定檔",[430,9579,9580],{},"當用戶需要在個人和企業 Cloudflare 帳戶之間進行切換，或者當系統管理員需要管理多個租戶（tenant）時，在單一裝置上支援多個 WARP 設定檔就顯得至关重要。",[430,9582,9583,9584,9587],{},"要在 macOS 上實現此目標，我們可以使用 ",[494,9585,9586],{},".mobileconfig"," MDM 設定檔來定義和註冊不同的 WARP 環境。",[484,9589,9590,9601],{},[487,9591,9592,9593,1807],{},"直接從 Cloudflare ",[444,9594,9597,9598,9600],{"href":9595,"rel":9596},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[448],"下載 ",[494,9599,9586],{}," 範例檔案",[487,9602,9603],{},"以下是該設定檔的範例文本：",[936,9605,9609],{"className":9606,"code":9607,"language":9608,"meta":425,"style":425},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n  \u003Ckey>PayloadContent\u003C\u002Fkey>\n  \u003Carray>\n    \u003Cdict>\n      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n      \u003Ckey>PayloadType\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n      \u003Cinteger>1\u003C\u002Finteger>\n      \u003Ckey>configs\u003C\u002Fkey>\n      \u003Carray>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 1\u003C\u002Fstring>\n        \u003C\u002Fdict>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 2\u003C\u002Fstring>\n        \u003C\u002Fdict>\n      \u003C\u002Farray>\n    \u003C\u002Fdict>\n  \u003C\u002Farray>\n  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n  \u003Cfalse\u002F>\n  \u003Ckey>PayloadScope\u003C\u002Fkey>\n  \u003Cstring>System\u003C\u002Fstring>\n  \u003Ckey>PayloadType\u003C\u002Fkey>\n  \u003Cstring>Configuration\u003C\u002Fstring>\n  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n  \u003Cinteger>1\u003C\u002Finteger>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n","xml",[494,9610,9611,9616,9621,9626,9631,9636,9641,9646,9651,9656,9661,9666,9671,9676,9681,9686,9691,9696,9701,9706,9711,9716,9721,9726,9731,9736,9741,9746,9750,9754,9759,9763,9768,9772,9778,9783,9789,9795,9801,9807,9813,9819,9825,9831,9837,9843,9849,9855,9861,9867,9873,9879,9885,9891],{"__ignoreMap":425},[944,9612,9613],{"class":946,"line":947},[944,9614,9615],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[944,9617,9618],{"class":946,"line":1074},[944,9619,9620],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[944,9622,9623],{"class":946,"line":1081},[944,9624,9625],{},"\u003Cplist version=\"1.0\">\n",[944,9627,9628],{"class":946,"line":1088},[944,9629,9630],{},"\u003Cdict>\n",[944,9632,9633],{"class":946,"line":1948},[944,9634,9635],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[944,9637,9638],{"class":946,"line":1953},[944,9639,9640],{},"  \u003Carray>\n",[944,9642,9643],{"class":946,"line":1959},[944,9644,9645],{},"    \u003Cdict>\n",[944,9647,9648],{"class":946,"line":2294},[944,9649,9650],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[944,9652,9653],{"class":946,"line":2305},[944,9654,9655],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[944,9657,9658],{"class":946,"line":2401},[944,9659,9660],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[944,9662,9663],{"class":946,"line":2407},[944,9664,9665],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[944,9667,9668],{"class":946,"line":2413},[944,9669,9670],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[944,9672,9673],{"class":946,"line":2418},[944,9674,9675],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[944,9677,9678],{"class":946,"line":1723},[944,9679,9680],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[944,9682,9683],{"class":946,"line":3337},[944,9684,9685],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[944,9687,9688],{"class":946,"line":3348},[944,9689,9690],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[944,9692,9693],{"class":946,"line":3353},[944,9694,9695],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[944,9697,9698],{"class":946,"line":3361},[944,9699,9700],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[944,9702,9703],{"class":946,"line":3902},[944,9704,9705],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[944,9707,9708],{"class":946,"line":3908},[944,9709,9710],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[944,9712,9713],{"class":946,"line":3917},[944,9714,9715],{},"      \u003Carray>\n",[944,9717,9718],{"class":946,"line":4572},[944,9719,9720],{},"        \u003Cdict>\n",[944,9722,9723],{"class":946,"line":5029},[944,9724,9725],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[944,9727,9728],{"class":946,"line":5038},[944,9729,9730],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[944,9732,9733],{"class":946,"line":5046},[944,9734,9735],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[944,9737,9738],{"class":946,"line":5054},[944,9739,9740],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[944,9742,9743],{"class":946,"line":5059},[944,9744,9745],{},"        \u003C\u002Fdict>\n",[944,9747,9748],{"class":946,"line":5066},[944,9749,9720],{},[944,9751,9752],{"class":946,"line":5074},[944,9753,9725],{},[944,9755,9756],{"class":946,"line":5082},[944,9757,9758],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[944,9760,9761],{"class":946,"line":5093},[944,9762,9735],{},[944,9764,9765],{"class":946,"line":5101},[944,9766,9767],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[944,9769,9770],{"class":946,"line":5108},[944,9771,9745],{},[944,9773,9775],{"class":946,"line":9774},34,[944,9776,9777],{},"      \u003C\u002Farray>\n",[944,9779,9780],{"class":946,"line":9537},[944,9781,9782],{},"    \u003C\u002Fdict>\n",[944,9784,9786],{"class":946,"line":9785},36,[944,9787,9788],{},"  \u003C\u002Farray>\n",[944,9790,9792],{"class":946,"line":9791},37,[944,9793,9794],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[944,9796,9798],{"class":946,"line":9797},38,[944,9799,9800],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[944,9802,9804],{"class":946,"line":9803},39,[944,9805,9806],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[944,9808,9810],{"class":946,"line":9809},40,[944,9811,9812],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[944,9814,9816],{"class":946,"line":9815},41,[944,9817,9818],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[944,9820,9822],{"class":946,"line":9821},42,[944,9823,9824],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[944,9826,9828],{"class":946,"line":9827},43,[944,9829,9830],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[944,9832,9834],{"class":946,"line":9833},44,[944,9835,9836],{},"  \u003Cfalse\u002F>\n",[944,9838,9840],{"class":946,"line":9839},45,[944,9841,9842],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[944,9844,9846],{"class":946,"line":9845},46,[944,9847,9848],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[944,9850,9852],{"class":946,"line":9851},47,[944,9853,9854],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[944,9856,9858],{"class":946,"line":9857},48,[944,9859,9860],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[944,9862,9864],{"class":946,"line":9863},49,[944,9865,9866],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[944,9868,9870],{"class":946,"line":9869},50,[944,9871,9872],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[944,9874,9876],{"class":946,"line":9875},51,[944,9877,9878],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[944,9880,9882],{"class":946,"line":9881},52,[944,9883,9884],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[944,9886,9888],{"class":946,"line":9887},53,[944,9889,9890],{},"\u003C\u002Fdict>\n",[944,9892,9894],{"class":946,"line":9893},54,[944,9895,9896],{},"\u003C\u002Fplist>\n",[484,9898,9899,9909,9923,9933,9939,9956,9969,9987,10002],{},[487,9900,9901,9902,1859,9905,9908],{},"將 ",[494,9903,9904],{},"your-team-name-1",[494,9906,9907],{},"your-team-name-2"," 替換為您各自的 Cloudflare Zero Trust 團隊名稱。",[487,9910,9911,9912,9915,9916,9918,9919,9922],{},"在終端機中執行指令 ",[494,9913,9914],{},"uuidgen"," 產生唯一的 UUID，並使用它們替換 ",[494,9917,9586],{}," 檔案中的預留位置 ",[494,9920,9921],{},"PayloadUUID"," 值。",[487,9924,9925,9926,9929,9930,9932],{},"確保 ",[494,9927,9928],{},"PayloadIdentifier"," 字串中也包含更新後的 ",[494,9931,9921],{},"，以保證設定檔的唯一性。",[487,9934,9935,9936,9938],{},"儲存編輯後的 ",[494,9937,9586],{}," 檔案。",[487,9940,9941,9942,9945,9946,9949,9950,9952],{},"打開 Mac 上的",[441,9943,9944],{},"系統設定","，搜尋並選擇",[441,9947,9948],{},"描述檔","（Profiles）。",[1904,9951],{},[433,9953],{"alt":9954,"src":9955},"macOS 系統設定中的描述檔面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-system-settings-profiles.webp",[487,9957,9958,9959,9962,9963,9965],{},"按一下",[441,9960,9961],{},"安裝、檢視或移除...","（Install, view or remove...）開始新增您的新設定檔。",[1904,9964],{},[433,9966],{"alt":9967,"src":9968},"macOS 描述檔安裝、檢視或移除按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-view-remove.webp",[487,9970,9971,9972,9974,9975,9938,9977,9979,9983],{},"按一下左下角的 ",[441,9973,725],{},"（加號）圖示，並選擇您儲存的 ",[494,9976,9586],{},[1904,9978],{},[433,9980],{"alt":9981,"src":9982},"macOS 描述檔左下角新增（+）按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-add-profile.webp",[433,9984],{"alt":9985,"src":9986},"在 macOS 上選擇 .mobileconfig 設定檔","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-select-mobileconfig-file.webp",[487,9988,7555,9989,9991,9992,9995,9996,9998],{},[441,9990,1746],{}," 並按一下",[441,9993,9994],{},"安裝","以套用此設定。",[1904,9997],{},[433,9999],{"alt":10000,"src":10001},"在 macOS 上確認安裝 Cloudflare WARP 描述檔","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-install-cloudflare-warp-profile.webp",[487,10003,10004,10005,10007],{},"重新啟動您的 Cloudflare WARP 用戶端。您現在應該可以在使用者介面中看到多組織切換器：",[1904,10006],{},[433,10008],{"alt":10009,"src":10010},"macOS 上支援多組織切換的 Cloudflare WARP 用戶端介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fcloudflare-warp-multi-profile-switcher.webp",[474,10012,10013],{"id":10013},"結論",[430,10015,10016],{},"Cloudflare WARP 用戶端在用戶裝置上扮演著關鍵的安全邊界角色，使零信任網路存取（ZTNA）既穩固又極具實用性。透過將內部資源與公共網際網路隔離開來，可確保每一次連線嘗試都經過安全的身份驗證、評估與稽核。",[474,10018,8068],{"id":8068},[484,10020,10021,10028,10035,10042],{},[487,10022,10023],{},[444,10024,10027],{"href":10025,"rel":10026},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[448],"Managed Deployment Preparation",[487,10029,10030],{},[444,10031,10034],{"href":10032,"rel":10033},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[448],"Switch Between Zero Trust Organizations",[487,10036,10037],{},[444,10038,10041],{"href":10039,"rel":10040},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[448],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[487,10043,10044],{},[444,10045,10048],{"href":10046,"rel":10047},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[448],"Cloudflare One Client Documentation",[1667,10050,10051],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1074,"depth":1081,"links":10053},[10054,10055,10056,10057,10058],{"id":9549,"depth":1074,"text":9550},{"id":9563,"depth":1074,"text":9564},{"id":9576,"depth":1074,"text":9577},{"id":10013,"depth":1074,"text":10013},{"id":8068,"depth":1074,"text":8068},[2625,9527],"2026-07-04","本指南將詳細介紹如何在macOS系統上，通過使用MDM .mobileconfig設定檔，實現多個Cloudflare WARP零信任組織或帳戶之間的無縫切換。本文為企業IT系統管理員提供了一套完整的、可直接落地部署的教學指南與設定步驟範本，幫助企業輕鬆管理並確保終端用戶的網路安全、合規審計與流暢體驗。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002FTW-Switch-Between-Multiple-Cloudflare-WARP-Orgs-on-Mac.webp","在Mac上配置和切換多個Cloudflare WARP組織帳戶",{"schemaOrg":10065,"robots":1721,"sitemap":10067},[10066],{"@type":1700,"headline":2541,"description":10061},{"lastmod":10060},{"title":10063,"description":10061,"ogTitle":2541,"ogDescription":10061,"twitterTitle":2541,"twitterDescription":10061},"tw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[10071,1746,10072,2639],"macOS","MDM","zclGoAFYNMezL6vd0bCfBa4isSiwsXYfCQa7Cwm9YLI",{"id":10075,"title":8330,"author":425,"body":10076,"category":10452,"date":10453,"description":10454,"extension":1692,"image":10455,"imageAlt":10456,"isPublished":1077,"meta":10457,"minRead":1074,"navigation":1077,"path":249,"seo":10461,"stem":10462,"tags":10463,"updatedAt":1730,"__hash__":10468},"article\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md",{"type":427,"value":10077,"toc":10442},[10078,10082,10092,10103,10164,10169,10173,10176,10185,10191,10194,10249,10260,10266,10269,10326,10330,10333,10340,10343,10354,10358,10403,10406,10423,10425,10436,10439],[474,10079,10081],{"id":10080},"什麼是-ai-agent-技能","什麼是 AI Agent 技能？",[430,10083,10084,10085,10088,10089,10091],{},"代理技能（agent skill）是一種可複用的",[441,10086,10087],{},"指令集"," —— 它是一個標準化的流程，旨在指導 Agent 如何卓越地完成某一特定類型的任務。一個技能通常由單個 Markdown 文件 ",[494,10090,8326],{}," 構成，並且可以打包該任務所需的任何其他文件，例如參考文件、範本或可執行腳本。",[430,10093,10094,10095,10102],{},"以 ",[444,10096,10099],{"href":10097,"rel":10098},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[448],[494,10100,10101],{},"grill-me"," 技能为例：",[936,10104,10106],{"className":2226,"code":10105,"language":2228,"meta":425,"style":425},"---\nname: grill-me\ndescription: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n---\n\nInterview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n\nAsk the questions one at a time.\n\nIf a question can be answered by exploring the codebase, explore the codebase instead.\n",[494,10107,10108,10113,10123,10133,10137,10141,10146,10150,10155,10159],{"__ignoreMap":425},[944,10109,10110],{"class":946,"line":947},[944,10111,10112],{"class":1054},"---\n",[944,10114,10115,10118,10120],{"class":946,"line":1074},[944,10116,10117],{"class":1371},"name",[944,10119,1375],{"class":958},[944,10121,10122],{"class":1058}," grill-me\n",[944,10124,10125,10128,10130],{"class":946,"line":1081},[944,10126,10127],{"class":1371},"description",[944,10129,1375],{"class":958},[944,10131,10132],{"class":1058}," Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n",[944,10134,10135],{"class":946,"line":1088},[944,10136,10112],{"class":1054},[944,10138,10139],{"class":946,"line":1948},[944,10140,1078],{"emptyLinePlaceholder":1077},[944,10142,10143],{"class":946,"line":1953},[944,10144,10145],{"class":1058},"Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n",[944,10147,10148],{"class":946,"line":1959},[944,10149,1078],{"emptyLinePlaceholder":1077},[944,10151,10152],{"class":946,"line":2294},[944,10153,10154],{"class":1058},"Ask the questions one at a time.\n",[944,10156,10157],{"class":946,"line":2305},[944,10158,1078],{"emptyLinePlaceholder":1077},[944,10160,10161],{"class":946,"line":2401},[944,10162,10163],{"class":1058},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[430,10165,10166,10168],{},[494,10167,8326],{}," 文件包含一小塊元資料（metadata）和指令的正文。元資料由技能的名稱（name）和描述（description）組成，AI Agent 會在啟動時將其載入。",[474,10170,10172],{"id":10171},"ai-agent-技能的工作原理漸進式披露progressive-disclosure","AI Agent 技能的工作原理：漸進式披露（Progressive Disclosure）",[430,10174,10175],{},"在初始階段，只有技能的名稱和描述會被載入到上下文視窗（Context）中。當使用者的請求與技能的描述相匹配時，该技能的完整指令正文才會被載入到相同的上下文中。",[430,10177,10178,10179,10184],{},"讓我們來看看在實際使用中，",[444,10180,10182],{"href":10097,"rel":10181},[448],[494,10183,10101],{}," 技能是如何工作的。",[430,10186,10187],{},[433,10188],{"alt":10189,"src":10190},"展示 AI 代理技能執行中漸進式揭示（Progressive Disclosure）機制的時序圖","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-progressive-disclosure-sequence-diagram.webp",[892,10192,10193],{"id":10193},"逐步流程",[532,10195,10196,10202,10208,10214,10220,10233,10243],{},[487,10197,10198,10201],{},[441,10199,10200],{},"請求（Request）"," —— 使用者向 Agent 提出需求（例如：“對我的工作流設計進行壓力測試剖析”）。",[487,10203,10204,10207],{},[441,10205,10206],{},"選擇提示词（Selection prompt）"," —— 使用者的請求與所有可用技能的描述一起發送給 LLM。",[487,10209,10210,10213],{},[441,10211,10212],{},"LLM 做出選擇"," —— LLM 將請求與每個描述進行對比，並返回匹配的技能。",[487,10215,10216,10219],{},[441,10217,10218],{},"確認（Confirmation）"," —— Agent 将推薦的技能呈現給使用者，由使用者進行確認（或拒絕\u002F調整）該選擇。",[487,10221,10222,10225,10226,10229,10230,10232],{},[441,10223,10224],{},"載入指令"," —— Agent 獲取已確認技能的",[911,10227,10228],{},"完整","指令：即 ",[494,10231,8326],{}," 的正文內容。",[487,10234,10235,10238,10239,10242],{},[441,10236,10237],{},"執行提示詞（Execution prompt）"," —— 使用者的請求",[441,10240,10241],{},"加上所選技能的具体指令","一起發送給 LLM。",[487,10244,10245,10248],{},[441,10246,10247],{},"響應（Response）"," —— LLM 生成輸出，即壓力測試訪談中的第一個剖析問題。",[430,10250,10251,10252,10259],{},"現在，我們使用 ",[444,10253,10256],{"href":10254,"rel":10255},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[448],[494,10257,10258],{},"excalidraw-diagram-skill"," 來演示帶參考文件的技能是如何工作的：",[430,10261,10262],{},[433,10263],{"alt":10264,"src":10265},"展示 AI 代理執行載有外部參考檔案與範本的技能時序圖","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-with-reference-files-sequence-diagram.webp",[892,10267,10193],{"id":10268},"逐步流程-1",[532,10270,10271,10276,10281,10290,10296,10308,10316],{},[487,10272,10273,10275],{},[441,10274,10200],{}," —— 使用者向 Agent 提出需求（“繪製部署流程的工作流圖”）。",[487,10277,10278,10207],{},[441,10279,10280],{},"選擇提示詞",[487,10282,10283,10285,10286,10289],{},[441,10284,10212],{}," —— LLM 將請求與每個描述進行對比，並返回匹配的技能。在這裡，“繪製工作流圖”與 ",[494,10287,10288],{},"excalidraw-diagram"," 的描述匹配，因此該技能被選中。",[487,10291,10292,10295],{},[441,10293,10294],{},"確認"," —— Agent 將推薦的技能呈現給使用者，由使用者進行確認（或拒绝\u002F調整）該選擇。",[487,10297,10298,10225,10300,10229,10302,10304,10305,10307],{},[441,10299,10224],{},[911,10301,10228],{},[494,10303,8326],{}," 的正文內容以及任何引用的參考文件（對於 ",[494,10306,10288],{},"，這包括調色盤、JSON Schema 和圖表元素範本）。",[487,10309,10310,10238,10313,10315],{},[441,10311,10312],{},"執行提示詞",[441,10314,10241],{},"一起發送給 LLM。模型現在擁有了它所需的詳細方法論。",[487,10317,10318,10321,10322,10325],{},[441,10319,10320],{},"響應"," —— LLM 生成輸出（一個 ",[494,10323,10324],{},".excalidraw"," 的 JSON 文件），由 Agent 將其返回給使用者。",[474,10327,10329],{"id":10328},"ai-agent-技能-vs-工具與-mcp","AI Agent 技能 vs. 工具與 MCP",[430,10331,10332],{},"技能並不能替代提示詞、普通工具（Tools）或 MCP。工具和 MCP 整合擴展了 Agent 對外部系統的存取範圍 —— 例如查詢資料庫、呼叫 API 等等。而技能則加深了 Agent 完成特定任務的實戰訣竅（Know-how）和專業深度。",[430,10334,10335,10336,10339],{},"諸如 ",[444,10337,10338],{"href":395},"在 ChatGPT 與 Claude 中配置 NetSuite MCP"," 的 MCP 整合，能夠讓 Agent 透過存取 NetSuite 中的即時財務和營運資料來回答使用者問題。而 NetSuite 業務報告技能則會進一步引導 Agent 如何去撰寫這份報告，并以規範的報表形式呈現給使用者。",[430,10341,10342],{},"使用技能的典型場景包括：",[484,10344,10345,10348,10351],{},[487,10346,10347],{},"多步驟複雜工作流",[487,10349,10350],{},"文件處理，例如從 PDF 中提取特定資料結構",[487,10352,10353],{},"程式碼生成規範與標準",[474,10355,10357],{"id":10356},"如何建立-ai-agent-技能","如何建立 AI Agent 技能",[532,10359,10360,10370,10384,10393],{},[487,10361,10362,10365,10366,10369],{},[441,10363,10364],{},"建立一個資料夾","，並以技能名稱命名（例如 ",[494,10367,10368],{},"netsuite-operation-report\u002F","）。",[487,10371,10372,10377,10378,10380,10381,10383],{},[441,10373,10374,10375],{},"撰寫 ",[494,10376,8326],{},"，包含 ",[494,10379,10117],{},"、精準的 ",[494,10382,10127],{},"，以及精煉的指令正文（控制在 200 字以內）。",[487,10385,10386,10389,10390,10392],{},[441,10387,10388],{},"添加任務所需資源"," —— 包括參考文件、範本、腳本。保持 ",[494,10391,8326],{}," 短小精悍，並將細節連結至其他文件。",[487,10394,10395,10398,10399,10402],{},[441,10396,10397],{},"進行安裝","，讓 Agent 能夠發現它。參考 ",[444,10400,10401],{"href":359},"解決 AI 智能代理技能碎片化：集中化管理技能"," 以了解如何在多個 Agent 之間集中管理技能。",[430,10404,10405],{},"撰寫優秀技能的幾個技巧：",[484,10407,10408,10411,10417,10420],{},[487,10409,10410],{},"技能描述（description）應當面向系統觸發器（Trigger）來写，而不是給人類閱讀。",[487,10412,10413,10414,10416],{},"保持 ",[494,10415,8326],{}," 極其精簡 —— 限制在 200 字以內。在正文中寫下通用流程，將邊緣情況和細節留給參考文件。",[487,10418,10419],{},"凡是確定性的任務，應當使用腳本（Script）来處理。不要讓 LLM 去做算術。",[487,10421,10422],{},"做好版本控制，將其提交進 Git 中。",[474,10424,2592],{"id":2592},[430,10426,10427,10428,10431,10432,10435],{},"與定義“",[911,10429,10430],{},"連接到什麼","”的工具和 MCP 不同，智能代理技能封裝了“",[911,10433,10434],{},"如何去完成工作","”。它們是不可或缺的互補，而非替代關係。",[430,10437,10438],{},"透過利用漸進式披露（Progressive Disclosure），技能可以使 Agent 的上下文視窗保持整潔和高效 —— 僅在使用者請求觸發时，才會載入詳細的指令、參考文件和可執行腳本。",[1667,10440,10441],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1074,"depth":1081,"links":10443},[10444,10445,10449,10450,10451],{"id":10080,"depth":1074,"text":10081},{"id":10171,"depth":1074,"text":10172,"children":10446},[10447,10448],{"id":10193,"depth":1081,"text":10193},{"id":10268,"depth":1081,"text":10193},{"id":10328,"depth":1074,"text":10329},{"id":10356,"depth":1074,"text":10357},{"id":2592,"depth":1074,"text":2592},[1687],"2026-06-26","全面系統地深入了解什麼是AI Agent技能、漸進式披露（Progressive Disclosure）的工作原理，并手把手教你如何撰寫SKILL.md規範，打包參考文件、範本與腳本。本文也將對比技能、工具與MCP的差異與標準开发流程，助你輕鬆建構出可複用、高效率、能處理複雜上下文管理的自訂代理核心技能。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002FTW-AI-Agent-Skills-What-They-Are-%26-How-to-Create-Them.webp","AI Agent技能開發指南：建構可複用、高效率的Agent核心工作流",{"schemaOrg":10458,"robots":1721,"sitemap":10460},[10459],{"@type":1700,"headline":8330,"description":10454},{"lastmod":10453},{"title":10456,"description":10454,"ogTitle":8330,"ogDescription":10454,"twitterTitle":8330,"twitterDescription":10454},"tw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",[10464,10465,10466,10467],"AI 代理","代理技能","可重複使用的工作流程","AI 教程","G6yqiU4D6vrLB8nujfq3SK0n1l9a3H5iB_pDSICyrk4",{"id":10470,"title":10471,"author":425,"body":10472,"category":11077,"date":11078,"description":11079,"extension":1692,"image":11080,"imageAlt":11081,"isPublished":1077,"meta":11082,"minRead":1088,"navigation":1077,"path":259,"seo":11096,"stem":11098,"tags":11099,"updatedAt":1730,"__hash__":11103},"article\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server.md","如何在 Linux VPS 遠端伺服器上從零開始安裝、部署與設定 Hermes Agent",{"type":427,"value":10473,"toc":11066},[10474,10478,10481,10484,10488,10492,10495,10508,10514,10517,10542,10549,10576,10583,10588,10602,10614,10620,10625,10641,10645,10648,10667,10673,10676,10687,10697,10708,10739,10743,10754,10764,10774,10788,10795,10805,10811,10840,10856,10860,10866,10878,10883,10917,10921,10924,10938,10947,11010,11013,11057,11060,11063],[474,10475,10477],{"id":10476},"為什麼在遠端-vps-上代管-hermes-agent","為什麼在遠端 VPS 上代管 Hermes Agent？",[430,10479,10480],{},"由於 Hermes Agent 具備執行背景任務、排程作業以及回應 Webhook 呼叫的能力，我們需要一台機器保持 24\u002F7 全天候待命。本地設備可能會遇到斷電、斷網，或者面臨硬體資源耗盡的風險。而遠端伺服器（VPS）則能保證 99% 以上的在線率（Uptime），並在需要時輕鬆進行計算資源的彈性擴充。",[430,10482,10483],{},"目前市面上有幾家性價比極高的虛擬專屬伺服器（VPS）提供商，例如 Hetzner、Hostinger 和 Contabo。我們已經使用 Contabo 有一段時間了，到目前為止，它的表現非常穩定且出色。",[474,10485,10487],{"id":10486},"如何在-linux-vps-上設定-hermes-agent","如何在 Linux VPS 上設定 Hermes Agent",[892,10489,10491],{"id":10490},"第一步連線到您的-vps","第一步：連線到您的 VPS",[430,10493,10494],{},"開啟終端機並使用 SSH 登入您的遠端伺服器：",[936,10496,10498],{"className":1045,"code":10497,"language":1047,"meta":425,"style":425},"ssh root@your_server_ip\n",[494,10499,10500],{"__ignoreMap":425},[944,10501,10502,10505],{"class":946,"line":947},[944,10503,10504],{"class":1054},"ssh",[944,10506,10507],{"class":1058}," root@your_server_ip\n",[430,10509,10510],{},[433,10511],{"alt":10512,"src":10513},"在終端機中透過 SSH 連線到 Linux VPS 伺服器","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fvps-terminal-ssh-connection.webp",[430,10515,10516],{},"確保伺服器的套件均已更新至最新版本：",[936,10518,10520],{"className":1045,"code":10519,"language":1047,"meta":425,"style":425},"sudo apt update && sudo apt upgrade -y\n",[494,10521,10522],{"__ignoreMap":425},[944,10523,10524,10526,10528,10531,10533,10535,10537,10540],{"class":946,"line":947},[944,10525,1916],{"class":1054},[944,10527,4474],{"class":1058},[944,10529,10530],{"class":1058}," update",[944,10532,5474],{"class":958},[944,10534,4395],{"class":1054},[944,10536,4474],{"class":1058},[944,10538,10539],{"class":1058}," upgrade",[944,10541,4507],{"class":1058},[430,10543,10544,10545,10548],{},"新增一個新使用者 ",[494,10546,10547],{},"hermes","，或者您自訂的其他使用者名稱：",[936,10550,10552],{"className":1045,"code":10551,"language":1047,"meta":425,"style":425},"sudo adduser hermes \nsudo passwd hermes\n",[494,10553,10554,10566],{"__ignoreMap":425},[944,10555,10556,10558,10561,10564],{"class":946,"line":947},[944,10557,1916],{"class":1054},[944,10559,10560],{"class":1058}," adduser",[944,10562,10563],{"class":1058}," hermes",[944,10565,2049],{"class":954},[944,10567,10568,10570,10573],{"class":946,"line":1074},[944,10569,1916],{"class":1054},[944,10571,10572],{"class":1058}," passwd",[944,10574,10575],{"class":1058}," hermes\n",[430,10577,10578,10579,10582],{},"關閉 ",[494,10580,10581],{},"root"," 使用者的密碼登入以增強安全性：",[532,10584,10585],{},[487,10586,10587],{},"開啟 SSH 設定檔：",[936,10589,10591],{"className":1045,"code":10590,"language":1047,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fssh\u002Fsshd_config\n",[494,10592,10593],{"__ignoreMap":425},[944,10594,10595,10597,10599],{"class":946,"line":947},[944,10596,1916],{"class":1054},[944,10598,2335],{"class":1058},[944,10600,10601],{"class":1058}," \u002Fetc\u002Fssh\u002Fsshd_config\n",[532,10603,10604],{"start":1074},[487,10605,10606,10607,10610,10611,492],{},"找到 ",[494,10608,10609],{},"PermitRootLogin"," 這一行，將其值修改為 ",[494,10612,10613],{},"no",[936,10615,10618],{"className":10616,"code":10617,"language":4641,"meta":425},[4639],"PermitRootLogin no\n",[494,10619,10617],{"__ignoreMap":425},[532,10621,10622],{"start":1081},[487,10623,10624],{},"儲存檔案並重啟 SSH 服務：",[936,10626,10628],{"className":1045,"code":10627,"language":1047,"meta":425,"style":425},"sudo systemctl restart ssh\n",[494,10629,10630],{"__ignoreMap":425},[944,10631,10632,10634,10636,10638],{"class":946,"line":947},[944,10633,1916],{"class":1054},[944,10635,1919],{"class":1058},[944,10637,1922],{"class":1058},[944,10639,10640],{"class":1058}," ssh\n",[892,10642,10644],{"id":10643},"第二步安裝-hermes-agent","第二步：安裝 Hermes Agent",[430,10646,10647],{},"執行以下命令：",[936,10649,10651],{"className":1045,"code":10650,"language":1047,"meta":425,"style":425},"curl -fsSL https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh | bash\n",[494,10652,10653],{"__ignoreMap":425},[944,10654,10655,10657,10659,10662,10664],{"class":946,"line":947},[944,10656,2981],{"class":1054},[944,10658,4386],{"class":1058},[944,10660,10661],{"class":1058}," https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh",[944,10663,4392],{"class":958},[944,10665,10666],{"class":1054}," bash\n",[430,10668,10669],{},[433,10670],{"alt":10671,"src":10672},"在終端機中執行 Hermes Agent 的一鍵安裝指令碼","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-installation-terminal.webp",[430,10674,10675],{},"安裝完成後，輸入以下命令驗證是否安裝成功：",[936,10677,10679],{"className":1045,"code":10678,"language":1047,"meta":425,"style":425},"hermes --version\n",[494,10680,10681],{"__ignoreMap":425},[944,10682,10683,10685],{"class":946,"line":947},[944,10684,10547],{"class":1054},[944,10686,3605],{"class":1058},[430,10688,3746,10689,10692,10693],{},[494,10690,10691],{},"hermes setup"," 命令列工具來設定 Hermes Agent：\n",[433,10694],{"alt":10695,"src":10696},"In terminal, run hermes setup command to initiate setup wizard","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-setup-wizard.webp",[430,10698,10699,10700,10703,10704],{},"選擇大語言模型（LLM）提供商，我們可以先選擇 ",[494,10701,10702],{},"DeepSeek","，後續再依需求加入其他模型。\n",[433,10705],{"alt":10706,"src":10707},"在 Hermes 設定中選擇 DeepSeek 作為 LLM 大模型提供商","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-llm-provider-selection.webp",[430,10709,10710,10711,10713,10714,10718,10722,10723,3089,10726,10730,10731,10734,10735],{},"輸入您的 ",[494,10712,10702],{}," API 金鑰：\n",[433,10715],{"alt":10716,"src":10717},"在終端機命令列中輸入 DeepSeek API 金鑰","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-enter-api-key.webp",[433,10719],{"alt":10720,"src":10721},"成功驗證並確認大模型提供商的 API 金鑰","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-api-key-success.webp","\n在執行 Hermes Agent 的環境選項中選擇 ",[494,10724,10725],{},"local machine",[433,10727],{"alt":10728,"src":10729},"選擇 local machine 本地設備作為 Hermes Agent 的執行環境","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-local-machine.webp","\n在通訊管道（Channels）中選擇 ",[494,10732,10733],{},"Telegram","，其他管道可以在後續隨時設定。\n",[433,10736],{"alt":10737,"src":10738},"在 Hermes 設定中選擇 Telegram 作為通訊管道管道","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-telegram-channel.webp",[892,10740,10742],{"id":10741},"第三步與-telegram-進行整合","第三步：與 Telegram 進行整合",[430,10744,10745,10746,10749,10750],{},"選擇選項 ",[494,10747,10748],{},"[2]"," 來使用 Telegram 機器人。\n",[433,10751],{"alt":10752,"src":10753},"選擇選項開始整合並設定 Telegram 機器人","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-bot-integration-option.webp",[430,10755,10756,10757,10759,10760],{},"開啟 ",[494,10758,10733],{}," 並搜尋 'BotFather' 官方帳號。\n",[433,10761],{"alt":10762,"src":10763},"在 Telegram 應用中搜尋官方 BotFather 帳號","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-botfather.webp",[430,10765,3054,10766,10769,10770],{},[494,10767,10768],{},"Open"," 開啟與 'BotFather' 的對話框。\n",[433,10771],{"alt":10772,"src":10773},"在 Telegram 中開啟與 BotFather 的對話框","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-open-botfather-chat.webp",[430,10775,3054,10776,10779,10780,10783,10784],{},[494,10777,10778],{},"Create a New Bot","（或輸入 ",[494,10781,10782],{},"\u002Fnewbot"," 指令）。\n",[433,10785],{"alt":10786,"src":10787},"向 BotFather 發送 \u002Fnewbot 指令以建立全新的機器人","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-create-new-bot.webp",[430,10789,10790,10791],{},"按照提示填寫名稱和使用者名稱，完成機器人的建立。\n",[433,10792],{"alt":10793,"src":10794},"設定新 Telegram 機器人的暱稱與唯一使用者名稱","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-bot-details-configured.webp",[430,10796,3054,10797,10800,10801],{},[494,10798,10799],{},"Copy"," 複製機器人 Token（權杖），並將其貼回終端機中。\n",[433,10802],{"alt":10803,"src":10804},"複製新建立的 Telegram 機器人的 HTTP API 存取 Token","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-copy-http-api-token.webp",[430,10806,10807,10808,10810],{},"獲取您的 ",[494,10809,10733],{}," 帳號 ID 並將其加入允許存取的使用者清單（'Allowed user list'）中：",[484,10812,10813,10822,10837],{},[487,10814,5250,10815,10817,10818],{},[494,10816,10733],{}," 中搜尋 '@raw_data_bot'。\n",[433,10819],{"alt":10820,"src":10821},"在 Telegram 中搜尋 raw data bot 機器人以檢索帳號 ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-raw-data-bot.webp",[487,10823,10824,10825,10828,10829,10832,10833],{},"點擊進入 ",[494,10826,10827],{},"RawDataBot"," 並點擊 Start（開始）按鈕。您的使用者 ID 將顯示在 ",[494,10830,10831],{},"P.S. Your ID:"," 後方。\n",[433,10834],{"alt":10835,"src":10836},"啟動 RawDataBot 機器人以獲取目前使用者 的帳號 ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-raw-data-bot-user-id.webp",[487,10838,10839],{},"複製該使用者 ID 並貼到終端機中。",[430,10841,10842,10843,10847,10848,10852],{},"由於我們在雲端執行此服務，我們希望它能在系統啟動时自動執行。\n",[433,10844],{"alt":10845,"src":10846},"設定 Hermes systemd 服務開機自啟自動執行的選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-autostart-service-option.webp","\n將其他設定均保持預設值即可：\n",[433,10849],{"alt":10850,"src":10851},"在終端機設定中將各項基礎設定保持預設推薦值","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-1.webp",[433,10853],{"alt":10854,"src":10855},"在 Hermes 設定精靈中完成預設選項的設定","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-2.webp",[474,10857,10859],{"id":10858},"使用-telegram-機器人測試您的-hermes-agent","使用 Telegram 機器人測試您的 Hermes Agent",[430,10861,10862,10863,934],{},"執行以下命令啟動 ",[494,10864,10865],{},"hermes gateway",[936,10867,10869],{"className":1045,"code":10868,"language":1047,"meta":425,"style":425},"hermes gateway\n",[494,10870,10871],{"__ignoreMap":425},[944,10872,10873,10875],{"class":946,"line":947},[944,10874,10547],{"class":1054},[944,10876,10877],{"class":1058}," gateway\n",[430,10879,10756,10880,10882],{},[494,10881,10733],{},"，將剛剛建立的機器人，例如 '@tech_cloud_hermes_bot'，加入對話中。",[484,10884,10885,10898,10908],{},[487,10886,10887,10888,10890,10891,10893,10894],{},"在對話框中輸入 ",[494,10889,1477],{}," 啟動一個全新的 ",[494,10892,1742],{}," 對話工作階段。\n",[433,10895],{"alt":10896,"src":10897},"在 Telegram 聊天框中輸入 \u002Fnew 指令開啟全新的代理對話工作階段","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-new-session.webp",[487,10899,10900,10901,10903,10904],{},"輸入 ",[494,10902,1517],{}," 指令將列出所有可用的操作指令。\n",[433,10905],{"alt":10906,"src":10907},"在 Telegram 聊天框中輸入 \u002Fcommands 指令查看可用操作指令清單","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-commands-list.webp",[487,10909,10900,10910,10912,10913],{},[494,10911,1551],{}," 指令即可查看目前可用的 LLM 大模型列表。\n",[433,10914],{"alt":10915,"src":10916},"在 Telegram 聊天框中輸入 \u002Fmodel 指令查看可切換的 LLM 列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-model-selection.webp",[474,10918,10920],{"id":10919},"將-hermes-gateway-設定為背景常駐服務","將 Hermes Gateway 設定為背景常駐服務",[430,10922,10923],{},"建立 systemd 守護行程服務檔案：",[936,10925,10927],{"className":2324,"code":10926,"language":2326,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[494,10928,10929],{"__ignoreMap":425},[944,10930,10931,10933,10935],{"class":946,"line":947},[944,10932,1916],{"class":1054},[944,10934,2335],{"class":1058},[944,10936,10937],{"class":1058}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[430,10939,10940,10941,3458,10944,10946],{},"貼上以下設定，注意將 ",[494,10942,10943],{},"\u002Fhome\u002Fhermes",[494,10945,10547],{}," 替換為您自己的使用者名稱：",[936,10948,10950],{"className":2350,"code":10949,"language":2352,"meta":425,"style":425},"[Unit]\nDescription=Hermes Gateway\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n",[494,10951,10952,10956,10961,10965,10969,10973,10977,10981,10986,10990,10994,10998,11002,11006],{"__ignoreMap":425},[944,10953,10954],{"class":946,"line":947},[944,10955,2359],{},[944,10957,10958],{"class":946,"line":1074},[944,10959,10960],{},"Description=Hermes Gateway\n",[944,10962,10963],{"class":946,"line":1081},[944,10964,2369],{},[944,10966,10967],{"class":946,"line":1088},[944,10968,1078],{"emptyLinePlaceholder":1077},[944,10970,10971],{"class":946,"line":1948},[944,10972,2378],{},[944,10974,10975],{"class":946,"line":1953},[944,10976,2383],{},[944,10978,10979],{"class":946,"line":1959},[944,10980,2388],{},[944,10982,10983],{"class":946,"line":2294},[944,10984,10985],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\n",[944,10987,10988],{"class":946,"line":2305},[944,10989,2398],{},[944,10991,10992],{"class":946,"line":2401},[944,10993,2404],{},[944,10995,10996],{"class":946,"line":2407},[944,10997,2410],{},[944,10999,11000],{"class":946,"line":2413},[944,11001,1078],{"emptyLinePlaceholder":1077},[944,11003,11004],{"class":946,"line":2418},[944,11005,2421],{},[944,11007,11008],{"class":946,"line":1723},[944,11009,2426],{},[430,11011,11012],{},"啟用並啟動該背景服務：",[936,11014,11016],{"className":2324,"code":11015,"language":2326,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-gateway\nsudo systemctl start hermes-gateway\nsudo systemctl status hermes-gateway\n",[494,11017,11018,11026,11037,11047],{"__ignoreMap":425},[944,11019,11020,11022,11024],{"class":946,"line":947},[944,11021,1916],{"class":1054},[944,11023,1919],{"class":1058},[944,11025,2445],{"class":1058},[944,11027,11028,11030,11032,11034],{"class":946,"line":1074},[944,11029,1916],{"class":1054},[944,11031,1919],{"class":1058},[944,11033,2046],{"class":1058},[944,11035,11036],{"class":1058}," hermes-gateway\n",[944,11038,11039,11041,11043,11045],{"class":946,"line":1081},[944,11040,1916],{"class":1054},[944,11042,1919],{"class":1058},[944,11044,2465],{"class":1058},[944,11046,11036],{"class":1058},[944,11048,11049,11051,11053,11055],{"class":946,"line":1088},[944,11050,1916],{"class":1054},[944,11052,1919],{"class":1058},[944,11054,1943],{"class":1058},[944,11056,11036],{"class":1058},[474,11058,11059],{"id":11059},"結語與展望",[430,11061,11062],{},"在本文中，我們主要分享了如何在雲端伺服器上架設並設定 Hermes Agent，並透過 Telegram 實現與其雙向的高效溝通。讓 Hermes Agent 運行在遠端 VPS 上，能夠為您打造一個 24 小時永不下線的、真正的 AI 數位化個人助理。",[1667,11064,11065],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":425,"searchDepth":1074,"depth":1081,"links":11067},[11068,11069,11074,11075,11076],{"id":10476,"depth":1074,"text":10477},{"id":10486,"depth":1074,"text":10487,"children":11070},[11071,11072,11073],{"id":10490,"depth":1081,"text":10491},{"id":10643,"depth":1081,"text":10644},{"id":10741,"depth":1081,"text":10742},{"id":10858,"depth":1074,"text":10859},{"id":10919,"depth":1074,"text":10920},{"id":11059,"depth":1074,"text":11059},[1687],"2026-06-19","在本篇詳細的實戰教學中，我們將逐步向您展示如何在遠端 Linux VPS 伺服器上成功安裝與部署 Hermes Agent，並實現 24 小時不間斷的穩定運行。我們還會手把手教您如何透過自訂的 Telegram 機器人，快速與Hermes進行無縫對接，輕鬆實現自動化的工作流程管理，確保系統隨時在線回應。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002FTW-How%20to%20Setup%20Hermes%20on%20Remote%20Server.webp","手把手教您如何在遠端 Linux VPS 伺服器上成功安裝與部署 Hermes Agent，並實現與自訂 Telegram 機器人的雙向整合。",{"schemaOrg":11083,"robots":1721,"sitemap":11095},[11084],{"@type":1700,"name":10471,"description":11079,"image":11080,"step":11085},[11086,11089,11092],{"@type":1703,"name":10491,"text":11087,"image":10513,"url":11088},"開啟終端機並使用 SSH 登入您的遠端伺服器： 確保伺服器的套件均已更新至最新版本： 新增一個新使用者 `hermes`，或者您自訂的其他使用者名稱： 關閉 `root` 使用者的密碼登入以增強安全性： 1. 開啟 SSH 設定檔： 2. 找到 `PermitRootLogin` 這一行，將其...","#-vps",{"@type":1703,"name":10644,"text":11090,"image":10672,"url":11091},"執行以下命令： 安裝完成後，輸入以下命令驗證是否安裝成功： 執行 `hermes setup` 命令列工具來設定 Hermes Agent： 選擇大語言模型（LLM）提供商，我們可以先選擇 `DeepSeek`，後續再依需求加入其他模型。 輸入您的 `DeepSeek` API 金鑰： 在執行...","#-hermes-agent",{"@type":1703,"name":10742,"text":11093,"image":10753,"url":11094},"選擇選項 `[2]` 來使用 Telegram 機器人。 開啟 `Telegram` 並搜尋 'BotFather' 官方帳號。 點擊 `Open` 開啟與 'BotFather' 的對話框。 點擊 `Create a New Bot`（或輸入 `\u002Fnewbot` 指令）。 按照提示填寫名稱和...","#-telegram-",{"lastmod":11078},{"title":11097,"description":11079,"ogTitle":10471,"ogDescription":11079,"twitterTitle":10471,"twitterDescription":11079},"Hermes Agent VPS 部署：Telegram 機器人雙向整合指南","tw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",[1742,11100,11101,11102,8738],"VPS Setup","Telegram Bot","Linux VPS","eiDUNI72ExCUCFln1uzuVunlhhybTJO26B1iuQ4qUaM",{"id":11105,"title":11106,"author":1730,"body":11107,"category":11552,"date":11553,"description":11554,"extension":1692,"image":11555,"imageAlt":11556,"isPublished":1077,"meta":11557,"minRead":5101,"navigation":1077,"path":267,"seo":11561,"stem":11563,"tags":11564,"updatedAt":1730,"__hash__":11567},"article\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude.md","NetSuite AI Connector整合與配置完全指南：模型上下文協定MCP設定與典型業務場景詳解",{"type":427,"value":11108,"toc":11538},[11109,11112,11126,11130,11140,11157,11161,11298,11302,11356,11360,11412,11416,11420,11426,11431,11435,11441,11453,11457,11467,11483,11487,11493,11498,11502,11508,11511,11515],[430,11110,11111],{},"Oracle NetSuite 作為面向中小型企業的雲端企業資源規劃（ERP）平台，早已享譽業界。然而，其網頁端使用者介面（UI）也因其陡峭的学习曲線、繁瑣的點擊操作以及死板的報表結構而備受詬病。",[430,11113,11114,11115,11118,11119,1859,11122,11125],{},"隨著近期 ",[441,11116,11117],{},"NetSuite AI Connector Service"," 的發布，使用者現在可以藉由 ",[441,11120,11121],{},"Model Context Protocol (MCP，模型上下文協定)",[441,11123,11124],{},"AI（人工智慧）助手","，直接使用通俗的自然語言提问，並即時獲取企業財務與營運數據的解答。",[474,11127,11129],{"id":11128},"netsuite-mcp-ai-連接器的工作原理","NetSuite MCP AI 連接器的工作原理",[430,11131,11132,11135,11136,11139],{},[441,11133,11134],{},"NetSuite 的 MCP"," 向 ",[441,11137,11138],{},"AI"," 開放了一系列工具，例如執行 SuiteQL 查詢、讀取已儲存搜尋（Saved Searches）和報表，或者執行記錄操作（如建立新的客戶記錄）。所有工具的操作權限都嚴格受控於 NetSuite 原生的基於角色的權限控制（RBAC）。",[430,11141,11142,11143,11145,11146,11149,11150,11153,11154,11156],{},"當使用者用日常語言提出問題時，",[441,11144,11138],{}," 會使用 ",[441,11147,11148],{},"Model Context Protocol (MCP)"," 將該請求轉化為 NetSuite 能夠理解的結構化操作。",[441,11151,11152],{},"NetSuite"," 將使用該使用者端的權限執行這些操作，然後將結果返回給 ",[441,11155,11138],{}," 進行分析和視覺化呈現。",[474,11158,11160],{"id":11159},"netsuite-ai-connector-配置指南","NetSuite AI Connector 配置指南",[532,11162,11163,11219,11234,11243,11250,11257,11279],{},[487,11164,11165,11166,11169,11170,11173,11174],{},"啟用 ",[441,11167,11168],{},"Server SuiteScript","（伺服器端 SuiteScript）和 ",[441,11171,11172],{},"REST Web Services","（REST Web 服務）\n",[532,11175,11176,11187,11214],{},[487,11177,11178,11179,11182,11183],{},"訪問 ",[911,11180,11181],{},"Setup > Company > Enable Features","（設定 > 公司 > 啟用功能）。\n",[433,11184],{"alt":11185,"src":11186},"Oracle NetSuite「啟用功能」設定頁面（位於「設定 > 公司」選單下）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-setup-company-enable-features.webp",[487,11188,5250,11189,11192,11193],{},[441,11190,11191],{},"SuiteCloud"," 子頁籤中：\n",[484,11194,11195,11205],{},[487,11196,11197,11198,11200,11201],{},"在 SuiteScript 欄位下，勾選 ",[441,11199,11168],{},"。\n",[433,11202],{"alt":11203,"src":11204},"在 NetSuite SuiteCloud 索引標籤中勾選啟用「伺服器 SuiteScript」核取方塊","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-server-suitescript.webp",[487,11206,11207,11208,11200,11210],{},"在 SuiteTalk (Web Services) 欄位下，勾选 ",[441,11209,11172],{},[433,11211],{"alt":11212,"src":11213},"在 NetSuite SuiteCloud 索引標籤中勾選啟用「REST 網頁服務」核取方塊","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-rest-web-services.webp",[487,11215,3054,11216,11218],{},[441,11217,1152],{},"（儲存）。",[487,11220,11221,11222,11225,11226,11229,11230],{},"首先安裝 ",[441,11223,11224],{},"NetSuite MCP Standard Tools","。點擊 ",[911,11227,11228],{},"Customization > SuiteCloud Development > SuiteApp Marketplace","（客製化 > SuiteCloud 開發 > SuiteApp 市集）。\n",[433,11231],{"alt":11232,"src":11233},"在 NetSuite 中經由「自訂 > SuiteCloud 開發」導覽至 SuiteApp 應用程式商店","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-navigation.webp",[487,11235,11236,11237,11200,11239],{},"搜尋 ",[441,11238,11224],{},[433,11240],{"alt":11241,"src":11242},"在 SuiteApp 應用程式商店中搜尋「NetSuite MCP Standard Tools」","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-search-mcp-tools.webp",[487,11244,11245,11246],{},"安裝完成後，您將在右側看到「Installed」（已安裝）狀態。\n",[433,11247],{"alt":11248,"src":11249},"在應用程式商店中確認「NetSuite MCP Standard Tools」狀態顯示為「已安裝」","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-status-mcp-tools.webp",[487,11251,11252,11253],{},"按照相同步驟安裝「NetSuite AI Connector Service Companion」。\n",[433,11254],{"alt":11255,"src":11256},"確認「NetSuite AI Connector Service Companion」已成功安裝的狀態頁面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-ai-connector-companion.webp",[487,11258,11259,11260],{},"建立整合記錄（Integration Record）\n",[532,11261,11262,11272],{},[487,11263,11178,11264,11267,11268],{},[911,11265,11266],{},"Setup > Integration > Manage Integrations","（設定 > 整合 > 管理整合）。\n",[433,11269],{"alt":11270,"src":11271},"導覽至 NetSuite 設定選單中的「整合 > 管理整合」頁面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-integration-manage-integrations-navigation.webp",[487,11273,11274,11275],{},"為 ChatGPT 建立一個 Integration Record，稍後我們將回來填入實際產生的 token_id：\n",[433,11276],{"alt":11277,"src":11278},"在 NetSuite 中為 ChatGPT 連線建立全新的整合紀錄（Integration Record）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-create-integration-record-chatgpt.webp",[487,11280,11281,11282,11286,11290,11294],{},"為 MCP 建立一個具備最小化權限的自訂角色並分配給對應使用者，例如：\n",[433,11283],{"alt":11284,"src":11285},"為 NetSuite MCP 整合配置專屬自訂角色的權限設定 - 步驟 1","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-1.webp",[433,11287],{"alt":11288,"src":11289},"為 NetSuite MCP 整合配置專屬自訂角色的權限設定 - 步驟 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-2.webp",[433,11291],{"alt":11292,"src":11293},"為 NetSuite MCP 整合配置專屬自訂角色的權限設定 - 步驟 3","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-3.webp",[433,11295],{"alt":11296,"src":11297},"為 NetSuite MCP 整合配置專屬自訂角色的權限設定 - 步驟 4","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-4.webp",[474,11299,11301],{"id":11300},"如何在-chatgpt-中整合並配置-netsuite-mcp","如何在 ChatGPT 中整合並配置 NetSuite MCP",[532,11303,11304,11311,11318,11325,11335,11342,11349],{},[487,11305,11306,11307],{},"點擊 ChatGPT 的「Settings」（設定）。\n",[433,11308],{"alt":11309,"src":11310},"導覽至 ChatGPT 使用者介面中的「設定（Settings）」","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-settings-navigation.webp",[487,11312,11313,11314],{},"依次點擊「Apps」（應用程式）>「Advanced settings」（進階設定）。\n",[433,11315],{"alt":11316,"src":11317},"在 ChatGPT 設定選單中點選「應用程式（Apps）」與「進階設定」","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-apps-advanced-settings.webp",[487,11319,11320,11321],{},"開啟「Developer mode」（開發者模式），然後點擊「Create app」（建立應用程式）。\n",[433,11322],{"alt":11323,"src":11324},"在 ChatGPT 設定中啟用「開發者模式」並點擊「建立應用程式」","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-developer-mode-create-app.webp",[487,11326,11327,11328,11200,11331],{},"填寫相關細節。在「Connection」（連線）中，輸入 ",[494,11329,11330],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fall",[433,11332],{"alt":11333,"src":11334},"輸入 NetSuite MCP 連線網址等詳細資訊以在 ChatGPT 中建立連線","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-create-app-netsuite-mcp-connection.webp",[487,11336,11337,11338],{},"點擊「Create」（建立）。整合成功後，您會看到如下彈窗。\n",[433,11339],{"alt":11340,"src":11341},"ChatGPT 彈出視窗確認 NetSuite MCP 已成功整合與串接","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-mcp-integrated-popup.webp",[487,11343,11344,11345],{},"點擊「Sign in with NetSuite MCP」（登入 NetSuite MCP）。\n",[433,11346],{"alt":11347,"src":11348},"ChatGPT 提示要求登入與授權「NetSuite MCP Standard Tools」連線","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-sign-in-with-netsuite-mcp.webp",[487,11350,11351,11352],{},"點擊「Continue」（繼續）按鈕授予權限。\n",[433,11353],{"alt":11354,"src":11355},"在 ChatGPT 授權頁面中允許並授予 NetSuite MCP 的存取權限","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-grant-permissions-netsuite-mcp.webp",[474,11357,11359],{"id":11358},"如何在-claude-ai-中整合並配置-netsuite-mcp","如何在 Claude AI 中整合並配置 NetSuite MCP",[532,11361,11362,11369,11376,11383,11398,11405],{},[487,11363,11364,11365],{},"點擊 Claude 的「Customize」（自訂）。\n",[433,11366],{"alt":11367,"src":11368},"在 Claude AI 介面中點選「自訂（Customize）」選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-customize-navigation.webp",[487,11370,11371,11372],{},"點擊「Connect your apps」（連接您的應用程式）。\n",[433,11373],{"alt":11374,"src":11375},"在 Claude AI 自訂設定中點選「連接您的應用程式（Connect your apps）」","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-connect-your-apps.webp",[487,11377,11378,11379],{},"搜尋「NetSuite」。\n",[433,11380],{"alt":11381,"src":11382},"在 Claude AI 連接應用程式清單中搜尋「NetSuite」","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-search-netsuite-app.webp",[487,11384,11385,11386,11389,11390,11393,11394],{},"點擊「NetSuite」並輸入伺服器 URL：",[494,11387,11388],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fsuiteapp\u002Fcom.netsuite.mcpstandardtools","（請將 ",[494,11391,11392],{},"\u003Caccount_id>"," 替換為您實際的 NetSuite 帳戶 ID）。\n",[433,11395],{"alt":11396,"src":11397},"在 Claude AI 設定中輸入 NetSuite MCP 伺服器的連線網址","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-server-url-setup.webp",[487,11399,11400,11401],{},"點擊「Continue」（繼續）按鈕。\n",[433,11402],{"alt":11403,"src":11404},"在 Claude AI 中點擊「繼續」以認證 NetSuite MCP 伺服器連線","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-continue-authentication.webp",[487,11406,11407,11408],{},"再次點擊「Continue」（繼續）以授權並驗證連接器。\n",[433,11409],{"alt":11410,"src":11411},"在 Claude AI 中完成 NetSuite MCP 連接器的最終授權與認證步驟","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-authenticate-connector.webp",[474,11413,11415],{"id":11414},"netsuite-ai-實際應用場景","NetSuite AI 實際應用場景",[892,11417,11419],{"id":11418},"chatgpt-場景示例展示-netsuite-中逾期超過-30-天的帳單應收帳款","ChatGPT 場景示例：展示 NetSuite 中逾期超過 30 天的帳單（應收帳款）",[430,11421,11422],{},[433,11423],{"alt":11424,"src":11425},"ChatGPT 執行 SuiteQL 查詢以篩選並顯示 NetSuite 中逾期超過 30 天的發票","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-overdue-invoices-query-result.webp",[484,11427,11428],{},[487,11429,11430],{},"ChatGPT 自動建立並執行了 SuiteQL 查詢。與使用傳統的 NetSuite 網頁端 UI 去配置複雜的報表相比，這非常方便且節省了大量時間。",[892,11432,11434],{"id":11433},"chatgpt-和-claude-場景示例能否用折線圖繪製過去-30-天的銷售業績","ChatGPT 和 Claude 場景示例：能否用折線圖繪製過去 30 天的銷售業績？",[430,11436,11437],{},[433,11438],{"alt":11439,"src":11440},"ChatGPT 嘗試根據 NetSuite 數據繪製銷售折線圖卻輸出失敗的畫面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-failed-render-netsuite-sales-line-graph.webp",[484,11442,11443,11446],{},[487,11444,11445],{},"在我們的測試中，ChatGPT 無法直接產生並顯示該折線圖。",[487,11447,11448,11449],{},"隨後我在 Claude 上進行了嘗試，成功繪製出了圖表。這種差異主要源於各大語言模型（LLM）的數據視覺化和原生程式碼執行能力的區別。\n",[433,11450],{"alt":11451,"src":11452},"Claude AI 成功根據 NetSuite 銷售數據繪製出直觀的折線圖","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-successfully-rendered-netsuite-sales-line-graph.webp",[892,11454,11456],{"id":11455},"claude-場景示例建立客戶記錄","Claude 場景示例：建立客戶記錄",[430,11458,11459,11463],{},[433,11460],{"alt":11461,"src":11462},"向 Claude AI 發送自然語言指令以在 NetSuite 中新增一筆客戶紀錄","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-prompt.webp",[433,11464],{"alt":11465,"src":11466},"Claude AI 回覆確認已成功在 NetSuite 中建立客戶紀錄","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-success.webp",[484,11468,11469,11476],{},[487,11470,11471,11472],{},"登入 NetSuite 管理後台核對，確認該客戶記錄已正確建立並錄入系統。\n",[433,11473],{"alt":11474,"src":11475},"在 NetSuite 網頁端介面中雙重檢查並確認新客戶紀錄已成功新增","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-ui-verify-new-customer-record-created.webp",[487,11477,11478,11479],{},"在 ChatGPT 中執行查詢，同樣能正常讀取到該筆剛建立的客戶記錄：\n",[433,11480],{"alt":11481,"src":11482},"在 ChatGPT 中執行查詢並確認剛剛新增的 NetSuite 客戶紀錄可正常讀取","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-verify-netsuite-customer-record-available.webp",[892,11484,11486],{"id":11485},"claude-場景示例直接執行-suiteql-查詢","Claude 場景示例：直接執行 SuiteQL 查詢",[430,11488,11489],{},[433,11490],{"alt":11491,"src":11492},"Claude AI 直接執行 NetSuite SuiteQL 查詢並以表格呈現報表結果","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-run-suiteql-query-result.webp",[484,11494,11495],{},[487,11496,11497],{},"AI 助手可以直接向 NetSuite 資料庫執行 SuiteQL 查詢，瞬間返回所需數據。",[474,11499,11501],{"id":11500},"netsuite-ai-connector-總結與展望","NetSuite AI Connector 總結與展望",[430,11503,11504,11505,11507],{},"引入 MCP 的最大贏家是那些缺乏技術背景、無法編寫複雜 SQL 或報表的使用者。他們現在只需使用日常的大白話對數據提問，並讓 ",[441,11506,11138],{}," 按照其期望的格式（如表格、圖表等）完美呈現出來，極大地降低了數據獲取的門檻。",[430,11509,11510],{},"需要特別注意的是，為了防範提示詞注入（Prompt Injection）攻擊和惡意的「寫入」操作，建議對 AI connector 所對應的系統角色僅授予最小限度的寫入權限。當 AI 透過 MCP 介面在後台更新或建立記錄時，它是在伺服器端作為 SuiteScript 執行的，這將完全繞過瀏覽器前端（客戶端）的所有指令碼限制和表單輸入校驗。因此，權限管控必須要嚴密。",[474,11512,11514],{"id":11513},"參考資源英文","參考資源（英文）:",[484,11516,11517,11524,11531],{},[487,11518,11519],{},[444,11520,11523],{"href":11521,"rel":11522},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_0902023450.html#subsect_90090238176",[448],"安裝 MCP Standard Tools SuiteApp（官方文檔）",[487,11525,11526],{},[444,11527,11530],{"href":11528,"rel":11529},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_4160616848.html#subsect_0419123151",[448],"NetSuite AI Connector 常見問題解答（官方文檔）",[487,11532,11533],{},[444,11534,11537],{"href":11535,"rel":11536},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Fsection_0714082142.html#bridgehead_0804033331",[448],"連接到 NetSuite AI Connector 服務步驟（官方文檔）",{"title":425,"searchDepth":1074,"depth":1081,"links":11539},[11540,11541,11542,11543,11544,11550,11551],{"id":11128,"depth":1074,"text":11129},{"id":11159,"depth":1074,"text":11160},{"id":11300,"depth":1074,"text":11301},{"id":11358,"depth":1074,"text":11359},{"id":11414,"depth":1074,"text":11415,"children":11545},[11546,11547,11548,11549],{"id":11418,"depth":1081,"text":11419},{"id":11433,"depth":1081,"text":11434},{"id":11455,"depth":1081,"text":11456},{"id":11485,"depth":1081,"text":11486},{"id":11500,"depth":1074,"text":11501},{"id":11513,"depth":1074,"text":11514},[1687],"2026-06-13","本教學詳細介紹如何配置NetSuite AI Connector (MCP)服務並與ChatGPT和Claude進行整合。您將學習如何透過自然語言直接向AI提問、快速執行SuiteQL查詢ERP財務與業務數據、實現自動化業務流程以及客戶數據記錄建立，輕鬆打破傳統複雜企業ERP的操作門檻。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002FTW-Setup-NetSuite-MCP-on-ChatGPT-%26-Claude.webp","NetSuite MCP AI 整合縮圖，採用深藍色企業背景，展示 ChatGPT 和 Claude 圖示連接至 NetSuite 雲端資料庫",{"schemaOrg":11558,"robots":1721,"sitemap":11560},[11559],{"@type":1698,"headline":11106,"description":11554},{"lastmod":11553},{"title":11562,"description":11554,"ogTitle":11106,"ogDescription":11554,"twitterTitle":11106,"twitterDescription":11554},"NetSuite MCP AI整合教學：連接 ChatGPT 與 Claude 實現 ERP 數據查詢","tw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",[11152,6947,11565,11566,11138],"ChatGPT","Claude","U7VqV9BLrpGuSPAgF-uZvgRJtZqSNq94qObe3B0jMFE",{"id":11569,"title":11570,"author":1730,"body":11571,"category":11764,"date":11765,"description":11766,"extension":1692,"image":11767,"imageAlt":11768,"isPublished":1077,"meta":11769,"minRead":3337,"navigation":1077,"path":273,"seo":11773,"stem":11774,"tags":11775,"updatedAt":1730,"__hash__":11779},"article\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis.md","深度評測全新AI Claude Fable 5：高度複雜的企業財務與金融投資分析能力全面實測與深入對比",{"type":427,"value":11572,"toc":11762},[11573,11584,11595,11598,11604,11620,11630,11636,11642,11648,11670,11680,11694,11702,11720,11723,11734,11743,11746,11759],[430,11574,11575,11576,11579,11580],{},"2026年6月9日，Anthropic 發布了 ",[441,11577,11578],{},"Claude Fable 5","，這是一款「神話級」（Mythos-Class）模型，在網路安全、知識提煉、化學和生物學等特定領域配備了更先進的安全防護機制。\n",[433,11581],{"alt":11582,"src":11583},"Anthropic 官方發布 Claude Fable 5 智能體模型的公告與其核心安全能力介紹","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-launch-announcement.webp",[430,11585,11586,11587,11590,11591],{},"Anthropic 官方公布的數據顯示，Fable 5 在多項關鍵基準測試中均領先於 Opus 4.8 和 GPT-5.5。特別是在評估知識工作能力的 ",[441,11588,11589],{},"GDPval-AA"," 測試中，它明顯領先於 Opus 4.8、GPT 5.5 以及 Gemini 3.1 Pro。\n",[433,11592],{"alt":11593,"src":11594},"Claude Fable 5 在多項關鍵基準測試中的對比圖表，包含 GDPval-AA 知識工作評分","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-benchmarks-gdpval-aa.webp",[430,11596,11597],{},"根據 Claude 的自述：「Fable 5 在處理複雜的分析任務時展現出了強大的性能。」",[430,11599,11600],{},[433,11601],{"alt":11602,"src":11603},"關於 Claude Fable 5 在處理高度複雜的分析任務時表現強勁的性能評測陳述","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-analytical-performance-statement.webp",[430,11605,11606,11607,11610,11611,11614,11615,1807],{},"為了測試 ",[441,11608,11609],{},"Fable 5"," 的實際水準，我們決定以投資研究為目的，使用「",[441,11612,11613],{},"comps-analysis","」（可比公司分析）技能對 SpaceX（Space Exploration Technologies Corporation）進行分析。該分析所用的 'skill.md' 檔案來源於 ",[444,11616,11619],{"href":11617,"rel":11618},"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Ffinancial-services\u002Fblob\u002Fmain\u002Fplugins\u002Fagent-plugins\u002Fmarket-researcher\u002Fskills\u002Fcomps-analysis\u002FSKILL.md",[448],"Anthropic 官方的金融服務 GitHub 倉庫",[430,11621,11622,11626],{},[433,11623],{"alt":11624,"src":11625},"在 Claude 桌面聊天視窗中載入並調用 SpaceX 財務數據對比分析的技能介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-initiation.webp",[433,11627],{"alt":11628,"src":11629},"Claude Fable 5 正在高效運行針對 SpaceX 與其同業公司的自動化財務比率計算","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-running-progress.webp",[430,11631,11632],{},[433,11633],{"alt":11634,"src":11635},"SpaceX 自動化金融可比公司 analysis 工作流的運行結果和終端輸出完成狀態","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-results-terminal.webp",[430,11637,11638,11639,11641],{},"整個任務耗時約 25 分鐘。期間，Claude 除了請求訪問外部網站的權限外，沒有提出任何需要澄清的問題。令人印象深刻的是，",[441,11640,11609],{}," 能夠完全自主地找到用於對比的同業競爭公司。",[430,11643,11644],{},[433,11645],{"alt":11646,"src":11647},"Claude Fable 5 安全沙箱彈出詢問，請求允許訪問外部即時財經新聞和市場數據網站","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-external-site-access-permission.webp",[430,11649,11650,11654,11655,11658,11659,11664,11665,1807],{},[433,11651],{"alt":11652,"src":11653},"Claude Fable 5 憑藉網路搜索能力自主識別並匹配的 SpaceX 核心競爭對手公司列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-spacex-comps-excel-memo.webp","\n*",[441,11656,11657],{},"請注意："," 本評測僅用於研究與教學目的，不構成任何投資建議。實際生成的原始檔案可在此下載：Excel 表格 ",[444,11660,11663],{"href":11661,"rel":11662},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Analysis_2026-06-10.xlsx",[448],"SpaceX_Comps_Analysis_2026-06-10.xlsx"," 以及分析備忘錄 ",[444,11666,11669],{"href":11667,"rel":11668},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Memo_2026-06-10.pdf",[448],"SpaceX_Comps_Memo_2026-06-10.pdf",[430,11671,11672,11673,11676,11677,11679],{},"當我們使用 ",[441,11674,11675],{},"Qwen deep research","（千問深度搜索）測試相同的技能時，我們必須手動輸入對比的同業公司。並且在最終生成的數值上，Qwen 與 ",[441,11678,11609],{}," 相比存在輕微的差異。",[430,11681,11682,11686,11690],{},[433,11683],{"alt":11684,"src":11685},"在阿里 Qwen deep research（深度搜索）介面中啟動針對 SpaceX 的商業估值對比分析","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-initiation.webp",[433,11687],{"alt":11688,"src":11689},"在 Qwen 深度搜索中手動輸入匹配的同業公司名單以啟動 SpaceX 數據收集和對標分析","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-running.webp",[433,11691],{"alt":11692,"src":11693},"由 Qwen deep research 自動生成的 SpaceX 企業對標和財務統計基準分析報告預覽","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-report-preview.webp",[430,11695,11696,11697,1807],{},"*由 Qwen 生成的報告可在此處下載：",[444,11698,11701],{"href":11699,"rel":11700},"https:\u002F\u002Ftechvoyage.dev\u002FThe_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[448],"The_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[430,11703,11704,11705,11708,11709,11200,11712,11716],{},"儘管 Claude 和 Qwen 的報告都是基於該技能中指定的相同方法生成的，但由於它們提取的數據源不同，數據依然存在偏差。例如，Claude Fable 5 使用了 ",[441,11706,11707],{},"Stock Analysis"," 網站，而 Qwen 則使用了美國證券交易委員會官網 ",[441,11710,11711],{},"SEC.gov",[433,11713],{"alt":11714,"src":11715},"Claude Fable 5 引用並抓取自第三方 Stock Analysis 網站的即時財報底層數據","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-data-source-stock-analysis.webp",[433,11717],{"alt":11718,"src":11719},"Qwen deep research 所採信並解析的美國證券交易委員會官網 SEC.gov 官方財務申報文件","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-data-source-sec-gov.webp",[430,11721,11722],{},"此外，Qwen 生成的報告中包含更多關於 SpaceX 商業模式、資本結構和日常營運的詳細資訊。",[430,11724,11725,11726,11729,11730],{},"在對比了兩份報告後，我們決定在 Claude 桌面應用中嘗試使用 ",[494,11727,11728],{},"\u002Fresearch"," 命令重新生成一份報告。\n",[433,11731],{"alt":11732,"src":11733},"在 Claude 桌面用戶端中執行全新 research 深度研究指令以自動撰寫企業估值分析備忘錄","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-desktop-research-command-spacex.webp",[430,11735,11736,11737,11742],{},"新生成的分析報告 ",[444,11738,11741],{"href":11739,"rel":11740},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Analysis.pdf",[448],"SpaceX_Analysis.pdf"," 增加了額外的投資建議和注意事項（免責聲明）部分。但與 Qwen 的深度搜索報告相比，它依然缺乏關於公司具體日常營運和資本結構等層面的詳細企業背景資訊。",[430,11744,11745],{},"Fable 5 是否值得其昂貴的訂閱價格？如果是針對高難度、長週期的任務或自主程式碼編寫，它確實物有所值。然而對於某些知識型工作（如企業財務分析），它可能還不是性價比最高的選擇。",[430,11747,11748,11749,11751,11752,11200,11755],{},"最後，我們測試了 ",[441,11750,11609],{}," 在翻譯任務中的表现。然而奇怪的是，該模型在翻譯時自動切回了 ",[441,11753,11754],{},"Opus 4.8",[433,11756],{"alt":11757,"src":11758},"在調用大上下文長文本翻譯任務時，Claude 用戶端自動將模型從 Fable 5 切換回 Opus 4.8","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-translation-opus-switching.webp",[430,11760,11761],{},"這是否意味著所有涉及長上下文的轉換任務都會被強制退回到 Opus 4.8？這只是 6 月 22 日產品上線前的使用期內臨時出現的特殊狀況，還是系統本身足夠智能，能夠自動判斷翻譯任務並不需要如此強大的模型算力？",{"title":425,"searchDepth":1074,"depth":1081,"links":11763},[],[1687],"2026-06-11","我們針對Anthropic最新發布的Claude Fable 5與Qwen Deep Research在SpaceX企業對比分析（Comps Analysis）等複雜金融財務分析任務中的表現進行了深度實測。本文將為您詳細評估和解答，這款備受矚目的高階大模型是否真的值得金融從業者與企业級用戶付費升級。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002FTW-Testing-Claude-Fable-5-in-Financial-Analysis.webp","Claude Fable 5對比Qwen：AI企業財務分析能力實測",{"schemaOrg":11770,"robots":1721,"sitemap":11772},[11771],{"@type":1698,"headline":11570,"description":11766},{"lastmod":11765},{"title":11768,"description":11766,"ogTitle":11570,"ogDescription":11766,"twitterTitle":11570,"twitterDescription":11766},"tw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",[11578,11776,11777,11778],"財務分析","Qwen Deep Research","AI基準測試","UOQs3UOhBHDSS_RcBfDQOzKs2G-BKS5W3ezR1NC_tQs",{"id":11781,"title":11782,"author":1730,"body":11783,"category":11990,"date":11991,"description":11992,"extension":1692,"image":11993,"imageAlt":11994,"isPublished":1077,"meta":11995,"minRead":1081,"navigation":1077,"path":275,"seo":11999,"stem":12000,"tags":12001,"updatedAt":1730,"__hash__":12002},"article\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2.md","Google Antigravity 2 自動化指南：深入掌握 Browser 與 Scheduler 核心指令",{"type":427,"value":11784,"toc":11985},[11785,11797,11801,11806,11815,11830,11836,11839,11850,11854,11857,11864,11871,11882,11885,11891,11902,11908,11918,11931,11941,11951,11954,11960,11963,11974],[430,11786,11787,3458,11790,1859,11793,11796],{},[441,11788,11789],{},"Google Antigravity 2",[494,11791,11792],{},"\u002Fbrowser",[494,11794,11795],{},"\u002Fschedule"," 指令重新定義了我們與 AI 互動的方式。這兩個指令將 Antigravity 轉化為一個主動型自動化平台，使其能夠與即時網頁互動並運行週期性工作流。",[474,11798,11800],{"id":11799},"browser-run","Browser Run",[430,11802,11803,11805],{},[494,11804,11792],{}," 指令會強制使用 Chrome 瀏覽器來完成任務。在整個工作流中，用戶可以完全控制智能體何時以及如何訪問網頁。在此過程中，系統會自動截取螢幕截圖和影片片段。",[430,11807,11808,11811],{},[441,11809,11810],{},"使用場景：",[433,11812],{"alt":11813,"src":11814},"使用 \u002Fbrowser 命令提交病假","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-command-sick-leave-prompt.webp",[430,11816,11817,11818,11822,11826],{},"以下是智能體的輸出結果：\n",[433,11819],{"alt":11820,"src":11821},"瀏覽器自動化子代理開始病假提交任務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-subagent-delegation.webp",[433,11823],{"alt":11824,"src":11825},"瀏覽器自動化工具設置具有遠端除錯和權限的Chrome","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-permissions-and-chrome-setup.webp",[433,11827],{"alt":11828,"src":11829},"瀏覽器子代理在請求使用者憑證的登入頁面暫停","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-login-wall-encountered.webp",[430,11831,11832],{},[433,11833],{"alt":11834,"src":11835},"瀏覽器子代理等待使用者完成登入流程","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-waiting-for-user-login.webp",[430,11837,11838],{},"Antigravity 能夠成功打開頁面並提交表單。當網頁需要登入時，智能體會耐心等待，直到您完成網站登入。",[430,11840,11841,11846,11847,11849],{},[11842,11843],"video",{"alt":11844,"src":11845,"controls":1077},"瀏覽器子代理執行病假提交流程的影片","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-sick-leave-process.webm","\n當我們需要獲取網頁上最新的文件、查看變更日誌（changelog）、測試 Web 應用或檢查 API 狀態以完成特定任務時，",[494,11848,11792],{}," 指令將非常有用。",[474,11851,11853],{"id":11852},"schedule-task","Schedule Task",[430,11855,11856],{},"Antigravity 2 內置了定時任務排程功能。我們將透過每 10 分鐘自動填寫一次工時表（timesheet）來對其進行測試。",[430,11858,11859,11860],{},"點擊「Scheduled Tasks」（定時任務）：\n",[433,11861],{"alt":11862,"src":11863},"側邊欄中的排程任務選單選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-menu-item.webp",[430,11865,11866,11867],{},"點擊「+ New」按鈕創建一個新的定時任務：\n",[433,11868],{"alt":11869,"src":11870},"帶有新增任務按鈕的空白排程任務視圖","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-empty-state-new-button.webp",[430,11872,11873,11874,11878],{},"填寫表單，並將任務排程設置為每 10 分鐘運行一次：\n",[433,11875],{"alt":11876,"src":11877},"為自動填寫工時表而填寫的新排程任務表單","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-new-task-form.webp",[433,11879],{"alt":11880,"src":11881},"排程任務列表中的有效自動工時表輸入任務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-active-task-list.webp",[430,11883,11884],{},"任務雖然被觸發了，但最終運行出錯。",[430,11886,11887],{},[433,11888],{"alt":11889,"src":11890},"指示未找到閃存層的可用模型的錯誤訊息","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-error-no-models.webp",[430,11892,11893,11894,11897,11898,11901],{},"我們曾嘗試將「env」環境變數添加到 ",[494,11895,11896],{},"sidecar.json"," 文件中（該文件位於 ",[494,11899,11900],{},".gemini\u002Fconfig\u002Fsidecars\u002Fauto-timesheet-entry","），但依然遇到相同的錯誤。",[936,11903,11906],{"className":11904,"code":11905,"language":4641},[4639],"    \"env\": {\n        \"GEMINI_MODEL\": \"gemini-3.5-flash\",\n        \"GOOGLE_CLOUD_PROJECT\": \"your-gcp-project-id\"\n    }\n",[494,11907,11905],{"__ignoreMap":425},[430,11909,11910,11911,11914,11915,1807],{},"檢查位於 ",[494,11912,11913],{},".gemini\u002Fantigravity\u002Fsidecar_data\u002F"," 的定時任務日誌，我們可以看到 ",[494,11916,11917],{},"[schedule] Triggering command: \"agentapi\" [new-conversation]",[430,11919,11920,11921,11926,11927,11930],{},"我們在 ",[444,11922,11925],{"href":11923,"rel":11924},"https:\u002F\u002Fdiscuss.ai.google.dev\u002Ft\u002Fscheduled-tasks-in-antigravity-2-ended-with-errors\u002F168013",[448],"Build with Google AI 技術論壇","上發布了该問題，得到的回覆建議是 ",[494,11928,11929],{},"agentapi"," 需要配置 API 金鑰。我們嘗試配置了 API 金鑰，但仍未能解決問題。",[430,11932,11933,11934,11936,11937],{},"我們嘗試直接在對話框中運行 ",[494,11935,11795],{}," 指令。\n",[433,11938],{"alt":11939,"src":11940},"使用 \u002Fschedule 命令來提示工時表自動化任務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fschedule-command-timesheet-prompt.webp",[430,11942,11943,11944,11946,11947],{},"使用 ",[494,11945,11795],{}," 指令排程的任务不會顯示在「Scheduled Tasks」選單欄中。\n",[433,11948],{"alt":11949,"src":11950},"排程任務列表未顯示透過CLI命令建立的任務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-list-missing-cli-task.webp",[430,11952,11953],{},"不過，cron 定時任務確實成功觸發了。",[430,11955,11956],{},[433,11957],{"alt":11958,"src":11959},"Cron作業日誌確認已觸發","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fcron-job-triggered-log.webp",[474,11961,11962],{"id":11962},"總結與思考",[430,11964,11965,11966,1859,11968,11970,11971,11973],{},"Antigravity 2 中的 ",[494,11967,11792],{},[494,11969,11795],{}," 指令並不是孤立的功能，將庫結合使用將釋放出極大的威力。例如，您可以排程一個智能體，讓其在每週一早上 6:00 自動運行 ",[494,11972,11792],{}," 瀏覽新聞與資訊網站，對資訊進行歸納提煉，並為您呈上一份詳盡的每日簡報。",[430,11975,11976,11977,11980,11981,11984],{},"在設計新的定時任務時，您還可以結合使用其他指令，例如 ",[494,11978,11979],{},"\u002Fgrill-me","（這在文章《",[444,11982,11983],{"href":419},"Antigravity 2 深度實戰：如何透過 AI 智能體、內置 Skill 與 MCP 打造全端應用","》中有所提及）。它會促使智能體主動向用戶提問以澄清模糊之處，並在最終確定方案前捕捉邊緣情況。",{"title":425,"searchDepth":1074,"depth":1081,"links":11986},[11987,11988,11989],{"id":11799,"depth":1074,"text":11800},{"id":11852,"depth":1074,"text":11853},{"id":11962,"depth":1074,"text":11962},[1687],"2026-06-07","深入探索 Google Antigravity 2 的 \u002Fbrowser 與 \u002Fschedule 指令，實現即時網頁互動與定時任務的無縫 AI 自動化。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002FTW-Use-Browser-and-Scheduler-in-Antigravity-2.webp","Google Antigravity 2：如何使用 Browser 與 Schedule 自動運行",{"schemaOrg":11996,"robots":1721,"sitemap":11998},[11997],{"@type":1698,"headline":11994,"description":11992},{"lastmod":11991},{"title":11994,"description":11992,"ogTitle":11782,"ogDescription":11992,"twitterTitle":11782,"twitterDescription":11992},"tw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",[],"KLIDFOvqO9r2wGoHw67sfIzVaxiaiDZMWbbwJ1SJ3CU",{"id":12004,"title":11983,"author":425,"body":12005,"category":12329,"date":12330,"description":12331,"extension":1692,"image":12332,"imageAlt":12333,"isPublished":1077,"meta":12334,"minRead":1081,"navigation":1077,"path":279,"seo":12338,"stem":12339,"tags":12340,"updatedAt":1730,"__hash__":12341},"article\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2.md",{"type":427,"value":12006,"toc":12319},[12007,12010,12016,12019,12025,12028,12033,12039,12042,12048,12054,12060,12070,12075,12079,12087,12091,12097,12103,12109,12112,12118,12124,12129,12134,12137,12141,12150,12156,12160,12166,12172,12178,12181,12185,12188,12192,12198,12204,12210,12213,12293,12299,12311,12313,12316],[430,12008,12009],{},"作為一款以智能體為核心（Agent-first）的桌面應用程式，Antigravity 2 能夠讓使用者編排協同多個子智能體，自動處理日常事務（例如從郵件與行事曆中生成每日簡報），或直接進行應用程式的建構、測試與部署。但在實際開發與應用中，它的表現究竟如何？",[430,12011,12012,12013,1807],{},"讓我們一起深入探索 Antigravity 2 的強大功能 —— 從內置命令、精選 Skill（技能）到能夠讓開發者搖身一變成為全端架構師的 Firebase Model Context Protocol (MCP) 伺服器整合。關於 Skill 和 MCP 伺服器的安裝與詳細設定，請參考這篇教學：",[444,12014,12015],{"href":391},"Google Antigravity 2 深度實測：手把手教你從零開始安裝設定與全新 AI 代理開箱心得",[474,12017,12018],{"id":12018},"內置命令",[892,12020,12022],{"id":12021},"goal",[494,12023,12024],{},"\u002Fgoal",[430,12026,12027],{},"透過此命令，您可以向智能體下達指令，使其持續運行直到特定任務完全結束。",[430,12029,12030],{},[441,12031,12032],{},"應用場景：",[430,12034,12035],{},[433,12036],{"alt":12037,"src":12038},"使用 Antigravity 2 的 goal 指令建立 Textris 遊戲的提示詞","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-goal-command-prompt.webp",[430,12040,12041],{},"當我們請求動態子智能體時，系統會生成三個智能體協同配合來完成該任務。",[430,12043,12044],{},[433,12045],{"alt":12046,"src":12047},"Antigravity 2 生成子代理以自主完成任務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-1.webp",[430,12049,12050],{},[433,12051],{"alt":12052,"src":12053},"Antigravity 2 子代理執行步驟的詳細進度","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-2.webp",[430,12055,12056],{},[433,12057],{"alt":12058,"src":12059},"Antigravity 2 子代理完成自主任務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-3.webp",[430,12061,12062,12063,3089,12066],{},"若想試玩由智能體自動生成的 HTML 版 Textris（俄羅斯方塊）遊戲，請點擊此",[444,12064,6890],{"href":12065},"\u002Ftextris",[11842,12067],{"alt":12068,"src":12069,"controls":1077},"AI generated Textris game in HTML","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fai-generated-textri-game-html.webm",[430,12071,12072,12074],{},[494,12073,12024],{}," 命令會先制定詳盡的執行規劃，隨後按部就班地予以實施，並在每個階段即時向您匯報最新進展。此外，智能體還會自動優化與管理自身的上下文視窗，防止其超出 Token 限制。這極大程度地適用於需要多輪疊代、耗時較長的重大任務，例如效能優化或模組重構等。",[892,12076,12077],{"id":10101},[494,12078,11979],{},[430,12080,12081,12082,12086],{},"此命令會觸發由 Matt Pocock 傾力打造的實用 Skill：",[444,12083,10101],{"href":12084,"rel":12085},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[448],"。它短小精悍卻無比強大，其核心邏輯在於從系統架構的多個維度對您進行「刨根問底式」的提問，以此釐清邊緣情況、對齊業務結構，並在開始程式碼實作前最終敲定執行方案。",[430,12088,12089],{},[441,12090,12032],{},[430,12092,12093],{},[433,12094],{"alt":12095,"src":12096},"在 Antigravity 2 中觸發 Cloudflare 架構的 grill-me 指令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-command-prompt.webp",[430,12098,12099],{},[433,12100],{"alt":12101,"src":12102},"使用 grill-me 技能的互動式問答階段","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-1.webp",[430,12104,12105],{},[433,12106],{"alt":12107,"src":12108},"釐清邊界情況並使用 grill-me 架構計劃","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-2.webp",[430,12110,12111],{},"它還完美支援多選互動：",[430,12113,12114],{},[433,12115],{"alt":12116,"src":12117},"在 grill-me 過程中使用多選功能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-1.webp",[430,12119,12120],{},[433,12121],{"alt":12122,"src":12123},"使用 grill-me 多選功能確定選擇","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-2.webp",[430,12125,12126,12128],{},[494,12127,11979],{}," 命令的表现令人嘆為觀止。它幾乎涵蓋了部署至 Cloudflare 時所需考慮的所有架構設計細節，極為適合應用軟體的架構規劃、跨領域的模組重構以及其他高度複雜的業務設計。",[892,12130,12131],{"id":425},[494,12132,12133],{},"@\u002F ",[430,12135,12136],{},"雖然此命令並未出現在公開的可用命令列表中，但在精細化管理上下文視窗時，它卻必不可少。它被用於向對話框中快速引入特定資料夾或檔案（非多媒體檔案）。",[474,12138,12140],{"id":12139},"skills-技能","Skills (技能)",[430,12142,12143,12144,12147,12148,1807],{},"我們可以輸入 ",[494,12145,12146],{},"\u002F"," 來呼出快捷彈窗並选择特定 Skill。下面我們來測試 ",[494,12149,10288],{},[430,12151,12152],{},[433,12153],{"alt":12154,"src":12155},"從 Antigravity 彈出視窗中選擇 Excalidraw 圖表技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-skill-selection-excalidraw.webp",[430,12157,12158],{},[441,12159,12032],{},[430,12161,12162],{},[433,12163],{"alt":12164,"src":12165},"提供產生 Excalidraw 圖表的指示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-prompt.webp",[430,12167,12168],{},[433,12169],{"alt":12170,"src":12171},"成功產生 Excalidraw 架構圖","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-generation.webp",[430,12173,12174],{},[433,12175],{"alt":12176,"src":12177},"Antigravity architecture diagram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-architecture.webp",[430,12179,12180],{},"在經歷了兩輪系統權限確認後，該 Skill 成功完成了圖表的繪製與輸出。",[474,12182,12184],{"id":12183},"mcp-伺服器","MCP 伺服器",[430,12186,12187],{},"以往當智能體試圖建構後端服務時，您通常必須親自打開網頁主控台、建立資料庫、複製 API 金鑰再將其手動貼回設定中。而當直接在 Antigravity 中引入 MCP 伺服器後，智能体便擁有了直接操作雲端基礎設施的「雙手」。",[430,12189,12190],{},[441,12191,12032],{},[430,12193,12194],{},[433,12195],{"alt":12196,"src":12197},"指示 MCP 伺服器建立 Firebase 網頁應用程式","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-prompt.webp",[430,12199,12200],{},[433,12201],{"alt":12202,"src":12203},"Antigravity 使用 MCP 伺服器操作 Firebase 基礎架構","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-1.webp",[430,12205,12206],{},[433,12207],{"alt":12208,"src":12209},"透過 Antigravity MCP 伺服器成功建立 Firebase 應用程式","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-2.webp",[430,12211,12212],{},"智能體成功透過 MCP 伺服器在 Firebase 中直接建立了 Web 應用。讓我們來看看相關的 GitHub 倉庫。",[936,12214,12216],{"className":1045,"code":12215,"language":1047,"meta":425,"style":425},"Create a new public GitHub repository called ‘to-do-app-techvoyage’. Then push all the current project files to it with the commit message ‘Initial commit — to-do-app’.\n",[494,12217,12218],{"__ignoreMap":425},[944,12219,12220,12223,12226,12229,12232,12235,12238,12241,12244,12247,12250,12253,12256,12259,12262,12265,12268,12271,12274,12276,12279,12282,12285,12287,12290],{"class":946,"line":947},[944,12221,12222],{"class":1054},"Create",[944,12224,12225],{"class":1058}," a",[944,12227,12228],{"class":1058}," new",[944,12230,12231],{"class":1058}," public",[944,12233,12234],{"class":1058}," GitHub",[944,12236,12237],{"class":1058}," repository",[944,12239,12240],{"class":1058}," called",[944,12242,12243],{"class":1058}," ‘to-do-app-techvoyage’.",[944,12245,12246],{"class":1058}," Then",[944,12248,12249],{"class":1058}," push",[944,12251,12252],{"class":1058}," all",[944,12254,12255],{"class":1058}," the",[944,12257,12258],{"class":1058}," current",[944,12260,12261],{"class":1058}," project",[944,12263,12264],{"class":1058}," files",[944,12266,12267],{"class":1058}," to",[944,12269,12270],{"class":1058}," it",[944,12272,12273],{"class":1058}," with",[944,12275,12255],{"class":1058},[944,12277,12278],{"class":1058}," commit",[944,12280,12281],{"class":1058}," message",[944,12283,12284],{"class":1058}," ‘Initial",[944,12286,12278],{"class":1058},[944,12288,12289],{"class":1058}," —",[944,12291,12292],{"class":1058}," to-do-app’.\n",[430,12294,12295],{},[433,12296],{"alt":12297,"src":12298},"代理自動將專案檔案推送到新的 GitHub 儲存庫","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-github-repository-push.webp",[430,12300,12301,12302,12306,12307,12310],{},"您可以透過此",[444,12303,6890],{"href":12304,"rel":12305},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fto-do-app-techvoyage",[448],"訪問 GitHub 上的 ",[494,12308,12309],{},"to-do-app-techvoyage"," 倉庫。",[474,12312,2592],{"id":2592},[430,12314,12315],{},"儘管在 Gemini 3.5 Hack 的強大驅動下，Antigravity 2 中的 MCP 與 Skill 展現出了令人驚嘆的速度，但目前智能體的工作流仍面臨一些瓶頸，如頻繁的權限確認中斷，以及缺乏用於回退的版本控制檢查點等。在官方正式引入檢查點功能之前，養成頻繁進行 Git commit 的習慣依然是保障開發安全的唯一防線。",[1667,12317,12318],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1074,"depth":1081,"links":12320},[12321,12326,12327,12328],{"id":12018,"depth":1074,"text":12018,"children":12322},[12323,12324,12325],{"id":12021,"depth":1081,"text":12024},{"id":10101,"depth":1081,"text":11979},{"id":425,"depth":1081,"text":12133},{"id":12139,"depth":1074,"text":12140},{"id":12183,"depth":1074,"text":12184},{"id":2592,"depth":1074,"text":2592},[1687],"2026-06-06","深入探索 Agent-first 桌面應用 Antigravity 2。學習如何協同 AI 子智能體、運用內置 Skill 並藉由 MCP 伺服器高效構建全端應用。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002FTW-What-can-we-do-with-Antigravity-2.webp","Antigravity 2 教程：AI 智能體、Skill 與 MCP 伺服器實戰指南",{"schemaOrg":12335,"robots":1721,"sitemap":12337},[12336],{"@type":1698,"headline":11983,"description":12331},{"lastmod":12330},{"title":12333,"description":12331,"ogTitle":11983,"ogDescription":12331,"twitterTitle":11983,"twitterDescription":12331},"tw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[],"PZgp9Jw6pZ_dHzrNUAO_3NNJEMdNzextDqfYuU_iCRY",{"id":12343,"title":12015,"author":1730,"body":12344,"category":13023,"date":13024,"description":13025,"extension":1692,"image":13026,"imageAlt":13027,"isPublished":1077,"meta":13028,"minRead":1953,"navigation":1077,"path":265,"seo":13032,"stem":13033,"tags":13034,"updatedAt":1730,"__hash__":13035},"article\u002Ftw\u002Farticle\u002Fsetup-antigravity-2.md",{"type":427,"value":12345,"toc":13012},[12346,12357,12360,12363,12374,12377,12381,12389,12395,12402,12408,12411,12421,12423,12427,12434,12440,12443,12449,12453,12456,12468,12482,12489,12501,12511,12525,12527,12531,12534,12547,12550,12855,12866,12872,12882,12888,12894,12900,12902,12906,12917,12930,12936,12942,12948,12965,12968,12974,12976,12980,12983,12989,12992,12998,13000,13003,13006,13009],[430,12347,12348,12349,12352,12353,12356],{},"在 Google I\u002FO 2026 大會上，Google 宣布推出 ",[441,12350,12351],{},"Antigravity 2","。這是一款將 ",[441,12354,12355],{},"AI 代理人（Agent）"," 作為首要使用者介面的獨立桌面應用程式。使用者只需描述想要達成的目標，代理人就會自動生成方案，將其拆解為容易管理的小任務並直接執行。",[892,12358,12359],{"id":12359},"前期準備",[430,12361,12362],{},"在開始之前，你需要準備：",[484,12364,12365,12368,12371],{},[487,12366,12367],{},"一台電腦（本指南以 macOS 為例）",[487,12369,12370],{},"現代網頁瀏覽器",[487,12372,12373],{},"一個 Gmail 帳號",[12375,12376],"hr",{},[474,12378,12380],{"id":12379},"_1-安裝-antigravity-2","1. 安裝 Antigravity 2",[430,12382,2486,12383,12388],{},[444,12384,12387],{"href":12385,"rel":12386},"https:\u002F\u002Fantigravity.google\u002Fdownload",[448],"antigravity.google"," 下載 Antigravity 2 並安裝到你的電腦上。首次啟動時，系統會提示你使用 Gmail 帳號登入。",[430,12390,12391],{},[433,12392],{"alt":12393,"src":12394},"Antigravity 2 首次啟動時的 Google 帳號登入介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-gmail-login.webp",[430,12396,12397,12398,12401],{},"登入成功後，你會注意到輸入框中多了一個",[441,12399,12400],{},"語音按鈕","，讓你能夠直接錄製語音指令，而無需手動輸入文字。",[430,12403,12404],{},[433,12405],{"alt":12406,"src":12407},"Antigravity 2 輸入框中的語音聽寫與錄音按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-voice-input-field.webp",[430,12409,12410],{},"Antigravity 2 還引入了**專案（Project）**的概念。一個專案可以跨越多個本機資料夾，並擁有獨立且特定的代理人設定與權限。",[430,12412,12413,12417],{},[433,12414],{"alt":12415,"src":12416},"Antigravity 2 設定中的專案選擇與設定選單","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-menu.webp",[433,12418],{"alt":12419,"src":12420},"在 Antigravity 2 中指定資料夾路徑建立新的 AI 專案","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-creation.webp",[12375,12422],{},[474,12424,12426],{"id":12425},"_2-設定-mcp-和外掛程式","2. 設定 MCP 和外掛程式",[430,12428,12429,12430,12433],{},"所有的模型上下文協定（MCP）伺服器、外掛程式（Plugins）和技能（Skills）都可以在設定選單的 ",[441,12431,12432],{},"Customizations（客製化）"," 選項下進行管理：",[430,12435,12436],{},[433,12437],{"alt":12438,"src":12439},"用於管理 MCP 伺服器與技能的 Customizations 客製化設定面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-settings-customizations.webp",[430,12441,12442],{},"目前，唯一可用的外掛程式全部來自 Google 官方，但相信未來會有更多第三方外掛陸續推出。",[430,12444,12445],{},[433,12446],{"alt":12447,"src":12448},"Antigravity 2 中可用的 Google 官方外掛與整合列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-google-plugins-list.webp",[2182,12450,12452],{"id":12451},"新增現有的-mcp-伺服器","新增現有的 MCP 伺服器",[430,12454,12455],{},"安裝預先設定好的 MCP 伺服器（例如 GitHub）：",[532,12457,12458,12463],{},[487,12459,3054,12460,1807],{},[441,12461,12462],{},"Add MCP+",[487,12464,7555,12465,1807],{},[441,12466,12467],{},"GitHub MCP Server",[430,12469,12470,12474,12478],{},[433,12471],{"alt":12472,"src":12473},"點擊 Add MCP plus 按鈕安裝預先設定好的 MCP 伺服器","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-mcp-button.webp",[433,12475],{"alt":12476,"src":12477},"從可用整合列表中選擇 GitHub MCP 伺服器","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-select-github-mcp.webp",[433,12479],{"alt":12480,"src":12481},"GitHub MCP 伺服器授權與安裝設定精靈","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-setup.webp",[430,12483,12484,12485],{},"GitHub MCP 伺服器的安裝最終發生錯誤：\n",[433,12486],{"alt":12487,"src":12488},"安裝 GitHub MCP 伺服器時出現的設定錯誤提示介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-error.webp",[430,12490,12491,12492,12494,12495,12497,12498,12500],{},"由於我們已在 macOS 上安裝了 ",[494,12493,2782],{},"，我們可以直接在對話中執行 ",[494,12496,2782],{}," 指令來繞過這個錯誤。不過在此之前，我們需要顯式地在 Antigravity 權限設定中新增 ",[494,12499,2782],{}," 指令。",[430,12502,12503,12507],{},[433,12504],{"alt":12505,"src":12506},"請求將 git 指令新增至沙箱終端執行權限的對話方塊","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-1.webp",[433,12508],{"alt":12509,"src":12510},"在設定選單中顯式授予 git 指令執行權限的介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-2.webp",[430,12512,12513,12514,12516,12517,12521],{},"讓我們測試一下該指令，看看 ",[494,12515,2782],{}," 指令現在是否可以正常運作：\n",[433,12518],{"alt":12519,"src":12520},"在 AI 代理人對話框中輸入並提交 git status 請求","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-1.webp",[433,12522],{"alt":12523,"src":12524},"對話中成功執行終端 git status 指令並傳回結果的介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-2.webp",[12375,12526],{},[474,12528,12530],{"id":12529},"_3-新增自訂-mcp-伺服器","3. 新增自訂 MCP 伺服器",[430,12532,12533],{},"如果你想要新增的 MCP 伺服器不在預設列表中，可以直接透過編輯 MCP 設定檔來手動新增。設定檔位於：",[936,12535,12537],{"className":1045,"code":12536,"language":1047,"meta":425,"style":425},"~\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[494,12538,12539],{"__ignoreMap":425},[944,12540,12541,12544],{"class":946,"line":947},[944,12542,12543],{"class":958},"~",[944,12545,12546],{"class":954},"\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[430,12548,12549],{},"我們以新增一些 Cloudflare MCP 伺服器為例。由於 Cloudflare 支援動態用戶端註冊，我們只需啟用 OAuth 即可。請將以下內容新增到你的 JSON 設定中：",[936,12551,12553],{"className":2896,"code":12552,"language":2898,"meta":425,"style":425},"    \"cloudflare-api\": {\n      \"serverUrl\": \"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-docs\": {\n      \"serverUrl\": \"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp\"\n    },\n    \"cloudflare-bindings\": {\n      \"serverUrl\": \"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-builds\": {\n      \"serverUrl\": \"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-observability\": {\n      \"serverUrl\": \"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[494,12554,12555,12568,12588,12600,12612,12616,12623,12636,12653,12659,12672,12691,12703,12715,12719,12725,12738,12757,12769,12781,12785,12791,12804,12823,12835,12847,12851],{"__ignoreMap":425},[944,12556,12557,12559,12562,12564,12566],{"class":946,"line":947},[944,12558,7618],{"class":958},[944,12560,12561],{"class":1058},"cloudflare-api",[944,12563,3682],{"class":958},[944,12565,7611],{"class":954},[944,12567,2905],{"class":958},[944,12569,12570,12572,12575,12577,12579,12581,12584,12586],{"class":946,"line":1074},[944,12571,7631],{"class":958},[944,12573,12574],{"class":950},"serverUrl",[944,12576,3682],{"class":958},[944,12578,1375],{"class":958},[944,12580,3268],{"class":958},[944,12582,12583],{"class":1058},"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp",[944,12585,3682],{"class":958},[944,12587,7648],{"class":958},[944,12589,12590,12592,12594,12596,12598],{"class":946,"line":1081},[944,12591,7631],{"class":958},[944,12593,7874],{"class":950},[944,12595,3682],{"class":958},[944,12597,1375],{"class":958},[944,12599,2935],{"class":958},[944,12601,12602,12604,12606,12608,12610],{"class":946,"line":1088},[944,12603,7667],{"class":958},[944,12605,7887],{"class":1054},[944,12607,3682],{"class":958},[944,12609,1375],{"class":958},[944,12611,1397],{"class":958},[944,12613,12614],{"class":946,"line":1948},[944,12615,7898],{"class":958},[944,12617,12618,12621],{"class":946,"line":1953},[944,12619,12620],{"class":958},"    }",[944,12622,7648],{"class":954},[944,12624,12625,12627,12630,12632,12634],{"class":946,"line":1959},[944,12626,7618],{"class":958},[944,12628,12629],{"class":1058},"cloudflare-docs",[944,12631,3682],{"class":958},[944,12633,7611],{"class":954},[944,12635,2905],{"class":958},[944,12637,12638,12640,12642,12644,12646,12648,12651],{"class":946,"line":2294},[944,12639,7631],{"class":958},[944,12641,12574],{"class":950},[944,12643,3682],{"class":958},[944,12645,1375],{"class":958},[944,12647,3268],{"class":958},[944,12649,12650],{"class":1058},"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp",[944,12652,1980],{"class":958},[944,12654,12655,12657],{"class":946,"line":2305},[944,12656,12620],{"class":958},[944,12658,7648],{"class":954},[944,12660,12661,12663,12666,12668,12670],{"class":946,"line":2401},[944,12662,7618],{"class":958},[944,12664,12665],{"class":1058},"cloudflare-bindings",[944,12667,3682],{"class":958},[944,12669,7611],{"class":954},[944,12671,2905],{"class":958},[944,12673,12674,12676,12678,12680,12682,12684,12687,12689],{"class":946,"line":2407},[944,12675,7631],{"class":958},[944,12677,12574],{"class":950},[944,12679,3682],{"class":958},[944,12681,1375],{"class":958},[944,12683,3268],{"class":958},[944,12685,12686],{"class":1058},"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp",[944,12688,3682],{"class":958},[944,12690,7648],{"class":958},[944,12692,12693,12695,12697,12699,12701],{"class":946,"line":2413},[944,12694,7631],{"class":958},[944,12696,7874],{"class":950},[944,12698,3682],{"class":958},[944,12700,1375],{"class":958},[944,12702,2935],{"class":958},[944,12704,12705,12707,12709,12711,12713],{"class":946,"line":2418},[944,12706,7667],{"class":958},[944,12708,7887],{"class":1054},[944,12710,3682],{"class":958},[944,12712,1375],{"class":958},[944,12714,1397],{"class":958},[944,12716,12717],{"class":946,"line":1723},[944,12718,7898],{"class":958},[944,12720,12721,12723],{"class":946,"line":3337},[944,12722,12620],{"class":958},[944,12724,7648],{"class":954},[944,12726,12727,12729,12732,12734,12736],{"class":946,"line":3348},[944,12728,7618],{"class":958},[944,12730,12731],{"class":1058},"cloudflare-builds",[944,12733,3682],{"class":958},[944,12735,7611],{"class":954},[944,12737,2905],{"class":958},[944,12739,12740,12742,12744,12746,12748,12750,12753,12755],{"class":946,"line":3353},[944,12741,7631],{"class":958},[944,12743,12574],{"class":950},[944,12745,3682],{"class":958},[944,12747,1375],{"class":958},[944,12749,3268],{"class":958},[944,12751,12752],{"class":1058},"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp",[944,12754,3682],{"class":958},[944,12756,7648],{"class":958},[944,12758,12759,12761,12763,12765,12767],{"class":946,"line":3361},[944,12760,7631],{"class":958},[944,12762,7874],{"class":950},[944,12764,3682],{"class":958},[944,12766,1375],{"class":958},[944,12768,2935],{"class":958},[944,12770,12771,12773,12775,12777,12779],{"class":946,"line":3902},[944,12772,7667],{"class":958},[944,12774,7887],{"class":1054},[944,12776,3682],{"class":958},[944,12778,1375],{"class":958},[944,12780,1397],{"class":958},[944,12782,12783],{"class":946,"line":3908},[944,12784,7898],{"class":958},[944,12786,12787,12789],{"class":946,"line":3917},[944,12788,12620],{"class":958},[944,12790,7648],{"class":954},[944,12792,12793,12795,12798,12800,12802],{"class":946,"line":4572},[944,12794,7618],{"class":958},[944,12796,12797],{"class":1058},"cloudflare-observability",[944,12799,3682],{"class":958},[944,12801,7611],{"class":954},[944,12803,2905],{"class":958},[944,12805,12806,12808,12810,12812,12814,12816,12819,12821],{"class":946,"line":5029},[944,12807,7631],{"class":958},[944,12809,12574],{"class":950},[944,12811,3682],{"class":958},[944,12813,1375],{"class":958},[944,12815,3268],{"class":958},[944,12817,12818],{"class":1058},"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp",[944,12820,3682],{"class":958},[944,12822,7648],{"class":958},[944,12824,12825,12827,12829,12831,12833],{"class":946,"line":5038},[944,12826,7631],{"class":958},[944,12828,7874],{"class":950},[944,12830,3682],{"class":958},[944,12832,1375],{"class":958},[944,12834,2935],{"class":958},[944,12836,12837,12839,12841,12843,12845],{"class":946,"line":5046},[944,12838,7667],{"class":958},[944,12840,7887],{"class":1054},[944,12842,3682],{"class":958},[944,12844,1375],{"class":958},[944,12846,1397],{"class":958},[944,12848,12849],{"class":946,"line":5054},[944,12850,7898],{"class":958},[944,12852,12853],{"class":946,"line":5059},[944,12854,7751],{"class":958},[430,12856,12857,12858,12861,12862,12865],{},"回到應用程式中的 ",[441,12859,12860],{},"Customizations"," 介面，點擊 ",[441,12863,12864],{},"Refresh（重新整理）"," 按鈕。現在，你會在列表中看到 Cloudflare MCP 伺服器，其狀態顯示為等待授權。",[430,12867,12868],{},[433,12869],{"alt":12870,"src":12871},"在客製化選單中列出的等待授權的 Cloudflare MCP 伺服器列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-mcp-pending.webp",[430,12873,12874,12875,12878,12879,1807],{},"點擊 MCP 伺服器旁邊的 ",[441,12876,12877],{},"Authenticate（認證）","。系統會在瀏覽器中打開一個認證頁面。登入授權後，會生成一個",[441,12880,12881],{},"授權碼（auth code）",[430,12883,12884],{},[433,12885],{"alt":12886,"src":12887},"瀏覽器中顯示的用於 Cloudflare MCP 伺服器的動態 OAuth 授權碼","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-code.webp",[430,12889,12890,12891,1807],{},"複製該授權碼，並將其貼回 Antigravity 的文字輸入框中，最後點擊 ",[441,12892,12893],{},"Submit（提交）",[430,12895,12896],{},[433,12897],{"alt":12898,"src":12899},"在 Antigravity 設定介面中提交 OAuth 驗證授權碼","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-submit.webp",[12375,12901],{},[474,12903,12905],{"id":12904},"_4-新增自訂技能","4. 新增自訂技能",[430,12907,12908,12909,12912,12913,12916],{},"目前，",[441,12910,12911],{},"無法","直接透過桌面應用程式的 UI 介面新增自訂技能。它們必須被直接放入 ",[494,12914,12915],{},"~\u002F.gemini\u002Fconfig\u002Fskills"," 資料夾中。",[430,12918,12919,12920,12923,12924],{},"由於我們使用 ",[494,12921,12922],{},"npx skills"," 命令列工具來統一管理所有代理人技能，因此任何新新增的技能都可以無縫對接到包括 Antigravity 在內的所有代理人。",[911,12925,12926,12927,12929],{},"(想深入了解相關內容，請參閱我們的文章：",[444,12928,8688],{"href":359},")。",[430,12931,12932,12933,12935],{},"最開始，在對話框中輸入 ",[494,12934,12146],{}," 時，技能列表顯示為空：",[430,12937,12938],{},[433,12939],{"alt":12940,"src":12941},"在對話框中輸入斜線快捷鍵時顯示為空的客製化技能列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-empty-skills-list.webp",[430,12943,12944,12945,12947],{},"看來 Antigravity 2 並不會自動讀取全域技能資料夾（",[494,12946,8673],{},"）。為了解決這個問題，我們需要在 Antigravity 設定檔目錄下建立一個指向全域技能資料夾的符號連結（軟連結）：",[936,12949,12951],{"className":1045,"code":12950,"language":1047,"meta":425,"style":425},"ln -s ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[494,12952,12953],{"__ignoreMap":425},[944,12954,12955,12957,12959,12962],{"class":946,"line":947},[944,12956,3668],{"class":1054},[944,12958,3525],{"class":1058},[944,12960,12961],{"class":1058}," ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram",[944,12963,12964],{"class":1058}," ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[430,12966,12967],{},"軟連結建立成功後，該技能即可在應用程式中直接使用！",[430,12969,12970],{},[433,12971],{"alt":12972,"src":12973},"軟連結建立後在 Antigravity 指令列表中正常顯示的 Excalidraw 繪圖技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-excalidraw-skill-available.webp",[12375,12975],{},[474,12977,12979],{"id":12978},"_5-測試簡單任務","5. 測試簡單任務",[430,12981,12982],{},"設定好一切後，讓我們來執行一個測試。",[430,12984,12985],{},[433,12986],{"alt":12987,"src":12988},"提交測試任務讓代理人透過 Cloudflare 伺服器列出 D1 資料庫列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-simple-task-prompt.webp",[430,12990,12991],{},"如下圖所示，模型成功偵測並調用了新新增的 Cloudflare MCP 伺服器來處理該請求。",[430,12993,12994],{},[433,12995],{"alt":12996,"src":12997},"AI 代理人透過 Cloudflare MCP 伺服器成功執行並傳回 D1 資料庫列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-task-success.webp",[12375,12999],{},[474,13001,13002],{"id":13002},"結語與感悟",[430,13004,13005],{},"Antigravity 2 代表了從傳統 IDE 向開箱即用桌面應用程式的重大轉變，讓一般使用者也能成為各種任務的幕後協調者和指揮官。",[430,13007,13008],{},"不過，Antigravity 2 仍有一些細節亟待打磨。當功能執行失敗時，模糊不清的錯誤處理會讓除錯過程變得相當令人沮喪。此外，官方文件顯得不夠精細（極有可能是 AI 生成的），其中好幾處參照和檔案路徑目前都是錯誤的。",[1667,13010,13011],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":425,"searchDepth":1074,"depth":1081,"links":13013},[13014,13015,13016,13019,13020,13021,13022],{"id":12359,"depth":1081,"text":12359},{"id":12379,"depth":1074,"text":12380},{"id":12425,"depth":1074,"text":12426,"children":13017},[13018],{"id":12451,"depth":1088,"text":12452},{"id":12529,"depth":1074,"text":12530},{"id":12904,"depth":1074,"text":12905},{"id":12978,"depth":1074,"text":12979},{"id":13002,"depth":1074,"text":13002},[1687],"2026-06-05","探索 Google Antigravity 2 的全新功能。閱讀這篇手把手實測指南，輕鬆掌握應用程式安裝、AI 代理人任務測試以及手動新增自訂 MCP 伺服器的完整流程。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002FTW-Setup-Antigravity-2.0.webp","Google Antigravity 2 安裝設定與開箱評測：AI 代理人、MCP 伺服器與外掛套件指南",{"schemaOrg":13029,"robots":1721,"sitemap":13031},[13030],{"@type":1698,"headline":13027,"description":13025},{"lastmod":13024},{"title":13027,"description":13025,"ogTitle":12015,"ogDescription":13025,"twitterTitle":12015,"twitterDescription":13025},"tw\u002Farticle\u002Fsetup-antigravity-2",[],"RjkidIkJlgOQ1eI8nZVscgr22hJybTElvBKl6wwxaeg",{"id":13037,"title":8688,"author":1730,"body":13038,"category":13455,"date":13456,"description":13457,"extension":1692,"image":13458,"imageAlt":13459,"isPublished":1077,"meta":13460,"minRead":1959,"navigation":1077,"path":253,"seo":13466,"stem":13467,"tags":13468,"updatedAt":1730,"__hash__":13469},"article\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents.md",{"type":427,"value":13039,"toc":13445},[13040,13051,13054,13077,13093,13096,13106,13122,13132,13139,13142,13164,13170,13181,13199,13209,13219,13222,13229,13250,13253,13259,13269,13276,13279,13299,13308,13312,13318,13390,13397,13401,13437,13442],[430,13041,13042,13043,13046,13047,13050],{},"如果你在電腦上執行了多個 AI Agent（或 CLI 工具）——不論是 Hermes、Claude Code、Codex、Antigravity、Kimi 還是其他支援的工具，你可能都遇過一個極其令人沮喪的問題：",[441,13044,13045],{},"技能碎片化（skills fragmentation）","。每個 Agent 或 CLI 都會維護自己獨立的 ",[494,13048,13049],{},"skills"," 資料夾，這會導致重複安裝、版本偏差以及極高的管理維護成本。",[430,13052,13053],{},"在日常使用 AI Agent 的過程中，我們經常會遇到以下痛點：",[484,13055,13056,13062,13068],{},[487,13057,13058,13061],{},[441,13059,13060],{},"重複安裝","：為了一個 Agent 安裝了新技能後，還必須為其他 Agent 一次又一次地重複安裝。",[487,13063,13064,13067],{},[441,13065,13066],{},"版本偏差（Version Drift）","：在某個 Agent 中客製或修復了某個技能，卻忘記同步更新其他 Agent，導致不同的 Agent 表現出不一致的行為。",[487,13069,13070,13073,13074,13076],{},[441,13071,13072],{},"技能 management 混亂","：必須逐個翻看系統中每個 Agent 的 ",[494,13075,13049],{}," 資料夾，才能知道到底安裝了哪些技能。",[430,13078,13079,13080,13082,13083,13085,13086,13092],{},"由 Vercel 推出的開源 CLI 工具 ",[494,13081,12922],{}," 完美地解決了這個問題。它允許你建立並管理一個統一的、中央化的 ",[494,13084,13049],{}," 資料夾，並無縫共享給所有的 Agent。你可以前往 ",[444,13087,13089,13091],{"href":8633,"rel":13088},[448],[494,13090,12922],{}," 的 GitHub 專案","了解更多資訊。",[474,13094,13095],{"id":13095},"技能一元化管理",[430,13097,13098,13099,13101,13102,13105],{},"這個方案的核心概念非常簡單：如果我們把每個 Agent 的 ",[494,13100,13049],{}," 資料夾都指向",[441,13103,13104],{},"同一個實體資料夾","，那麼碎片化問題就會迎刃而解。",[430,13107,13108,13109,13111,13112,13114,13115,13117,13118,13121],{},"當你使用 ",[494,13110,12922],{}," CLI 安裝技能时，該技能會被下載到你電腦上的中央統一資料夾（",[494,13113,8673],{},"）。接著，CLI 會自動在各個 Agent 的 ",[494,13116,13049],{}," 資料夾中建立",[441,13119,13120],{},"符號連結（Symlink，即指向實際資料夾的捷徑）","，直接導向該中央資料夾。",[430,13123,13124,13125,13128,13129,13131],{},"例如，當 Claude Code 在 ",[494,13126,13127],{},"~\u002F.claude\u002Fskills\u002F"," 中尋找技能時，它會被透明地導向到 ",[494,13130,8673],{},"。只要你對中央資料夾中的技能進行任何微調，所有 Agent 都會立刻同步應用。無需手動複製，無需撰寫同步指令稿，更不會浪費任何硬碟空間。",[474,13133,13135,13136,13138],{"id":13134},"安裝-npx-skills-並新增技能","安裝 ",[494,13137,12922],{}," 並新增技能",[430,13140,13141],{},"執行以下指令來開始並新增我們的第一個技能：",[936,13143,13145],{"className":1045,"code":13144,"language":1047,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill --skill excalidraw-diagram\n",[494,13146,13147],{"__ignoreMap":425},[944,13148,13149,13151,13153,13155,13158,13161],{"class":946,"line":947},[944,13150,7643],{"class":1054},[944,13152,8648],{"class":1058},[944,13154,1068],{"class":1058},[944,13156,13157],{"class":1058}," https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[944,13159,13160],{"class":1058}," --skill",[944,13162,13163],{"class":1058}," excalidraw-diagram\n",[430,13165,13166],{},[433,13167],{"alt":13168,"src":13169},"使用 npx skills add 指令從 GitHub 安裝 AI Agent 技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-add-command.webp",[430,13171,13172,13173,13176,13177],{},"CLI 會詢問是要將此設定套用於特定專案還是全域（globally）。我們通常推薦選擇 ",[441,13174,13175],{},"global","（全域），以便所有支援的 Agent 都能存取它：\n",[433,13178],{"alt":13179,"src":13180},"在 npx skills CLI 中選擇全域（global）安裝選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-install-global-prompt.webp",[430,13182,13183,13184,13187,13188,3089,13191,13195],{},"接下來，請務必選擇 ",[494,13185,13186],{},"Symlink"," 以確保",[441,13189,13190],{},"單一事實來源（Single Source of Truth）",[433,13192],{"alt":13193,"src":13194},"選擇符號連結（Symlink）方式以確保單一事實來源","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-symlink-option.webp",[433,13196],{"alt":13197,"src":13198},"CLI 顯示技能安裝完成與符號連結建立成功確認","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-installation-completed.webp",[430,13200,13201,13202,13204,13205],{},"完成後，我們可以驗證該技能是否已經正確安裝在中央統一資料夾 ",[494,13203,8673],{}," 中：\n",[433,13206],{"alt":13207,"src":13208},"驗證中央統一資料夾中已安裝的 AI Agent 技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-directory-verification.webp",[430,13210,13211,13212,13214,13215],{},"開啟 Kimi CLI（或任何其他 Agent），你會發現 ",[494,13213,10288],{}," 技能已經立即可用！\n",[433,13216],{"alt":13217,"src":13218},"Kimi CLI 顯示已成功載入並可立即使用的中央統一技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skills-integration.webp",[474,13220,13221],{"id":13221},"從零開始建立技能",[430,13223,13224,13225,13228],{},"如果你想自建專屬技能，可以使用 Anthropic 的 ",[494,13226,13227],{},"skill-creator"," 工具。透過以下指令進行安裝：",[936,13230,13232],{"className":1045,"code":13231,"language":1047,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills --skill skill-creator\n",[494,13233,13234],{"__ignoreMap":425},[944,13235,13236,13238,13240,13242,13245,13247],{"class":946,"line":947},[944,13237,7643],{"class":1054},[944,13239,8648],{"class":1058},[944,13241,1068],{"class":1058},[944,13243,13244],{"class":1058}," https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills",[944,13246,13160],{"class":1058},[944,13248,13249],{"class":1058}," skill-creator\n",[430,13251,13252],{},"現在，在 Kimi 或任何其他 Agent 中，輸入以下提示詞（Prompt）：",[936,13254,13257],{"className":13255,"code":13256,"language":4641},[4639],"Use the skill-creator to help me build a skill for creating a product landing page\n",[494,13258,13256],{"__ignoreMap":425},[430,13260,13261,13262,13264,13265],{},"Kimi 或你的 Agent 會自動識別 ",[494,13263,13227],{}," 並引導你一步步完成建立過程：\n",[433,13266],{"alt":13267,"src":13268},"在 Kimi CLI 中執行互動式 skill-creator 引導建立新技能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skill-creator-setup.webp",[474,13270,13272,13273,13275],{"id":13271},"其他實用的-npx-skills-指令","其他實用的 ",[494,13274,12922],{}," 指令",[430,13277,13278],{},"以下是一些常用的便捷指令：",[484,13280,13281,13287,13293],{},[487,13282,13283,13286],{},[494,13284,13285],{},"npx skills ls -g","：列出所有全域安裝的技能",[487,13288,13289,13292],{},[494,13290,13291],{},"npx skills update","：僅需一條指令即可將所有技能一鍵更新到最新版本",[487,13294,13295,13298],{},[494,13296,13297],{},"npx skills remove","：以互動式的方式解除安裝\u002F移除某個技能",[430,13300,13301,13302,13307],{},"請參閱 ",[444,13303,13305,13091],{"href":8633,"rel":13304},[448],[494,13306,12922],{},"以取得更多指令和參考文件。",[474,13309,13311],{"id":13310},"進階玩法結合-git-管理","進階玩法：結合 Git 管理",[430,13313,13314,13315,13317],{},"由於現在所有的技能都集中在同一個地方（",[494,13316,8673],{},"），我們可以將其初始化為一個 Git 儲存庫，並推送到 GitHub 或 GitLab 進行備份與版本控制。",[936,13319,13321],{"className":1045,"code":13320,"language":1047,"meta":425,"style":425},"cd ~\u002F.agents\u002Fskills\ngit init\ngit add .\ngit commit -m \"Initial skills folder\"\ngit remote add origin https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\ngit push -u origin main\n",[494,13322,13323,13330,13337,13345,13361,13376],{"__ignoreMap":425},[944,13324,13325,13327],{"class":946,"line":947},[944,13326,2806],{"class":976},[944,13328,13329],{"class":1058}," ~\u002F.agents\u002Fskills\n",[944,13331,13332,13334],{"class":946,"line":1074},[944,13333,2782],{"class":1054},[944,13335,13336],{"class":1058}," init\n",[944,13338,13339,13341,13343],{"class":946,"line":1081},[944,13340,2782],{"class":1054},[944,13342,1068],{"class":1058},[944,13344,4902],{"class":1058},[944,13346,13347,13349,13351,13354,13356,13359],{"class":946,"line":1088},[944,13348,2782],{"class":1054},[944,13350,12278],{"class":1058},[944,13352,13353],{"class":1058}," -m",[944,13355,3268],{"class":958},[944,13357,13358],{"class":1058},"Initial skills folder",[944,13360,1980],{"class":958},[944,13362,13363,13365,13368,13370,13373],{"class":946,"line":1948},[944,13364,2782],{"class":1054},[944,13366,13367],{"class":1058}," remote",[944,13369,1068],{"class":1058},[944,13371,13372],{"class":1058}," origin",[944,13374,13375],{"class":1058}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\n",[944,13377,13378,13380,13382,13385,13387],{"class":946,"line":1953},[944,13379,2782],{"class":1054},[944,13381,12249],{"class":1058},[944,13383,13384],{"class":1058}," -u",[944,13386,13372],{"class":1058},[944,13388,13389],{"class":1058}," main\n",[430,13391,13392,13393,13396],{},"這樣，我們就擁有了技能修改的完整歷史記錄。萬一某次更新破壞了功能，我們可以非常輕鬆地復原（Rollback）。此外，如果你有多台電腦（例如筆記型電腦和桌上型電腦），只需執行一次快速的 ",[494,13394,13395],{},"git pull","，即可在不同裝置間無縫同步所有技能。",[474,13398,13400],{"id":13399},"幾點注意事項安全與風險","幾點注意事項（安全與風險）",[484,13402,13403,13409,13415,13425,13431],{},[487,13404,13405,13408],{},[441,13406,13407],{},"相容性差異","：並非所有的 Agent 平台都完全支援所有功能（例如自訂勾子 custom hooks 或特定的授權工具）。某個技能在 A Agent 上執行順暢，在 B Agent 上可能會遇到功能限制。",[487,13410,13411,13414],{},[441,13412,13413],{},"來源可信度","：請務必只從信任的來源安裝技能。",[487,13416,13417,13420,13421,13424],{},[441,13418,13419],{},"執行前程式碼審查","：如果你使用的是自訂或第三方的技能，在授權 Agent 執行它之前，請務必先審查其程式碼檔案（尤其是 ",[494,13422,13423],{},"scripts\u002F"," 資料夾下的內容）。",[487,13426,13427,13430],{},[441,13428,13429],{},"最小權限原則","：儘量不要給技能授予超出其核心功能所需的工具權限或系統存取權限。",[487,13432,13433,13436],{},[441,13434,13435],{},"切勿寫死機密資訊","：千萬不要在技能檔案中直接寫入 API 金鑰（API Keys）或其他敏感憑證。",[430,13438,11943,13439,13441],{},[494,13440,12922],{}," 建立「單一事實來源」後，我們的團隊徹底擺脱了版本混亂和重複設定的煩惱。強烈建議你嘗試一下——隨著技能庫的不斷豐富，AI Agent 的能力也將迎來爆發式成長！",[1667,13443,13444],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":425,"searchDepth":1074,"depth":1081,"links":13446},[13447,13448,13450,13451,13453,13454],{"id":13095,"depth":1074,"text":13095},{"id":13134,"depth":1074,"text":13449},"安裝 npx skills 並新增技能",{"id":13221,"depth":1074,"text":13221},{"id":13271,"depth":1074,"text":13452},"其他實用的 npx skills 指令",{"id":13310,"depth":1074,"text":13311},{"id":13399,"depth":1074,"text":13400},[1687],"2026-06-04","正在執行 Claude Code、Kimi 等多個 AI Agent？本文教你如何使用開源 npx skills CLI 建立統一的中央資料夾，徹底解決技能檔案碎片化與多版本衝突。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002F%E4%BD%BF%E7%94%A8-npx-skills-%E5%BE%B9%E5%BA%95%E8%A7%A3%E6%B1%BA%E4%B8%8D%E5%90%8C-AI-Agent%EF%BC%88%E5%A6%82-Claude-Code-%E6%88%96-Kimi%EF%BC%89%E6%8A%80%E8%83%BD%E7%A2%8E%E7%89%87%E5%8C%96%E5%95%8F%E9%A1%8C.webp","使用 npx skills 解決 AI Agent 技能碎片化與重複安裝問題",{"schemaOrg":13461,"robots":1721,"sitemap":13464},[13462],{"@type":1698,"headline":13463,"description":13457},"使用 npx skills 統一管理 AI Agent 的技能檔案",{"lastmod":13465},"2026-06-03",{"title":13463,"description":13457,"ogTitle":8688,"ogDescription":13457,"twitterTitle":8688,"twitterDescription":13457},"tw\u002Farticle\u002Fcentralised-the-skills-for-agents",[],"GGBJGAHIHIN7qA1d2TfRWrBbzQa94ROPTxev_29FenE",1792489972859]