[{"data":1,"prerenderedAt":5248},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness":421,"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness-surround":1714},[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",{"id":422,"title":423,"author":424,"body":425,"category":1668,"date":1672,"description":1673,"extension":1674,"image":1675,"imageAlt":1676,"isPublished":1069,"meta":1677,"minRead":1705,"navigation":1069,"path":183,"seo":1706,"stem":1708,"tags":1709,"updatedAt":1712,"__hash__":1713},"article\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness.md","DeepSeek HarnessにBuzzを連携：自律型Nostrメッセージゲートウェイ構築実践ガイド","",{"type":426,"value":427,"toc":1652},"minimark",[428,436,459,467,470,474,479,524,527,587,591,598,876,879,883,888,895,899,913,917,928,982,989,993,996,1027,1030,1035,1086,1094,1100,1109,1115,1144,1158,1162,1171,1202,1227,1275,1282,1287,1293,1300,1306,1311,1318,1332,1338,1347,1388,1391,1397,1404,1410,1414,1417,1569,1572,1609,1613,1618,1622,1648],[429,430,431],"p",{},[432,433],"img",{"alt":434,"src":435},"Block Buzzチャンネルに接続されたDeepSeek Harnessメッセージゲートウェイの概要","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-nostr-gateway-overview.webp",[429,437,438,439,446,450,453,454,458],{},"DeepSeek Harness（DSH）の公式プラグインである**",[440,441,445],"a",{"href":442,"rel":443},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway",[444],"nofollow","dsh-message-gateway",[447,448,449],"strong",{},"は、Discord、Telegram、WeChatなどの多様なメッセージングプラットフォームへDeepSeek Harnessアシスタントを拡張します。本プラグインリポジトリがフォークおよび拡張され、対応プラットフォーム一覧に",[440,451,452],{"href":383},"Block製Buzzを自己ホスト：人とAIエージェントが自律的に協働する次世代共有ワークスペースの構築","**が追加されました。フォークされたオープンソースリポジトリはGitHub（ ",[440,455,456],{"href":456,"rel":457},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway",[444]," ）にて公開されています。",[460,461],"article-card",{"description":462,"image":463,"image-alt":464,"label":465,"min-read":466,"title":452,"to":383},"Blockが開発したAI協働スペース「Buzz」のNostrリレーを、Cloudflare DNSを介してUbuntu VPS上に自己ホストする方法を解説します。暗号鍵による安全な認証のもと、人間と各種AIエージェントがチャンネルやプロジェクトの履歴を共有し、自律的に連携するセキュアな作業環境を構築しましょう。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FJA-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","深みのあるブルーとオレンジのアクセントが効いたプレミアムな16:9のテックカード。Ubuntu VPS上にBlockのBuzzリレーを自己ホストする方法を表現し、すっきりとしたガラスモーフ調のパネルの中央にタイポグラフィを配置。","事前準備ガイド","12",[429,468,469],{},"DSHアシスタントは正式なメンバーとしてBuzzリレーに参加し、ダイレクトメッセージ（DM）や自身が@メンションされたチャンネルメッセージを受信し、Web UIと全く同一のチャット単位のエージェント実行パイプラインを通じて応答します。",[471,472,473],"h2",{"id":473},"dsh-message-gatewayプラグインの内部アーキテクチャ",[429,475,476,478],{},[447,477,445],{},"プラグインのアーキテクチャは、大きく2つの領域に分かれています：",[480,481,482,514],"ul",{},[483,484,485,488,489,493,494,497,498,501,502,505,506,509,510,513],"li",{},[447,486,487],{},"ホスト側","（Node環境）：",[490,491,492],"code",{},"gateway-store","（認証情報管理、",[490,495,496],{},"~\u002F.dsh\u002Fgateway.json","）、",[490,499,500],{},"platforms.ts","（プラットフォーム定義と接続テスト）、",[490,503,504],{},"routes.ts","（",[490,507,508],{},"\u002Fgateway\u002F*","エンドポイント）、および",[490,511,512],{},"bridge-manager.ts","（常駐ブリッジ：チャットごとの独立エージェントセッションおよびストリーミング応答管理）。",[483,515,516,519,520,523],{},[447,517,518],{},"クライアント側","（ブラウザ）：サイドバーの「",[447,521,522],{},"Message platforms","」設定ページ（認証情報の登録、接続確認、ステータス監視を担当）。",[429,525,526],{},"新しいプラットフォームを追加する際の実装手順は以下の3ステップです：",[528,529,530,548,562],"ol",{},[483,531,532,535,536,539,540,543,544,547],{},[447,533,534],{},"ブリッジクラスの作成","：",[490,537,538],{},"wecom-bridge.ts","をベースに、",[490,541,542],{},"start\u002Fstop\u002Fstatus","メソッドおよび",[490,545,546],{},"onText(text, frame)","コールバックを実装。",[483,549,550,553,554,557,558,561],{},[447,551,552],{},"bridge-managerへの配線","：既存のチャット別処理パイプライン（",[490,555,556],{},"ensureAgentForKey"," + ",[490,559,560],{},"pendingMap","）を再利用し、プラットフォーム固有の返信用シンクに接続。",[483,563,564,535,567,570,571,574,575,578,579,582,583,586],{},[447,565,566],{},"ストレージおよびルーティング設定",[490,568,569],{},"\u002Fgateway\u002Fsave","および",[490,572,573],{},"\u002Fgateway\u002Fdelete","内において、",[447,576,577],{},"認証情報の保存でブリッジを開始し、削除で停止","するよう制御。さらに",[490,580,581],{},"dsh web","起動時に自動再接続するための",[490,584,585],{},"autoStartXxx","フラグを構成。",[471,588,590],{"id":589},"buzzブリッジの実装nostrプロトコルとイベントライフサイクル","Buzzブリッジの実装：Nostrプロトコルとイベントライフサイクル",[429,592,593,594,597],{},"Buzzブリッジの実装には",[447,595,596],{},"DeepSeek Harness","本体が活用されました。本実装は以下のNostrプロトコル仕様に厳密に準拠しています：",[599,600,601,616],"table",{},[602,603,604],"thead",{},[605,606,607,613],"tr",{},[608,609,610],"th",{},[447,611,612],{},"項目",[608,614,615],{},"仕様・動作詳細",[617,618,619,642,660,687,704,729,754,775,789,803,822,839,853],"tbody",{},[605,620,621,627],{},[622,623,624],"td",{},[447,625,626],{},"トランスポート",[622,628,629,630,633,634,637,638,641],{},"NIP-42認証付きWebSocket接続（単一接続）；デフォルトは",[490,631,632],{},"ws:\u002F\u002Flocalhost:3000","；",[490,635,636],{},"http(s):\u002F\u002F","は自動的に",[490,639,640],{},"ws(s):\u002F\u002F","へ正規化",[605,643,644,649],{},[622,645,646],{},[447,647,648],{},"認証",[622,650,651,652,655,656,659],{},"AUTHイベント ",[490,653,654],{},"kind 22242","、タグ ",[490,657,658],{},"[[\"relay\", url], [\"challenge\", challenge]]","、空のコンテンツ、エージェント秘密鍵で署名",[605,661,662,667],{},[622,663,664],{},[447,665,666],{},"購読（Subscription）",[622,668,669,535,672,675,676,679,680,683,684],{},[447,670,671],{},"チャンネルスコープ",[490,673,674],{},"REQ {\"kinds\":[9], \"#h\":[\u003Cuuid>]}","（チャンネルごとに1つのREQ）。広域な",[490,677,678],{},"kinds:[9]","はEOSEを受け取りますがイベントは配信されず、複数値の",[490,681,682],{},"#h","フィルターは",[447,685,686],{},"無効",[605,688,689,694],{},[622,690,691],{},[447,692,693],{},"チャンネル検出",[622,695,696,697,505,700,703],{},"チャンネルメタデータ取得用の過去ログ問い合わせ ",[490,698,699],{},"REQ {kinds:[39000]}",[490,701,702],{},"type == \"dm\"","でダイレクトメッセージを判別）",[605,705,706,711],{},[622,707,708],{},[447,709,710],{},"メンバーシップ管理",[622,712,713,714,717,718,720,721,724,725,728],{},"リアルタイム購読 ",[490,715,716],{},"REQ {kinds:[44100,44101], \"#p\":[自公開鍵], since: now-60s}"," — 44100=追加、44101=離脱（",[490,719,429],{},"+",[490,722,723],{},"h","タグを含む）。メンバー変更時は",[447,726,727],{},"再接続なし","で購読状態を即時更新",[605,730,731,736],{},[622,732,733],{},[447,734,735],{},"チャットイベント",[622,737,738,741,742,745,746,749,750,753],{},[490,739,740],{},"kind 9","（タグ ",[490,743,744],{},"[\"h\", channel]","、任意指定で ",[490,747,748],{},"[\"e\", replyTo]",", ",[490,751,752],{},"[\"p\", mention]","）",[605,755,756,761],{},[622,757,758],{},[447,759,760],{},"インプレース編集",[622,762,763,505,766,557,768,771,772,774],{},[490,764,765],{},"kind 40003",[490,767,723],{},[490,769,770],{},"e","→対象ID）；コンテンツを全置換；リレーの上限64 KBに基づきペイロードは≤ 60,000 Bに制御；長文応答は分割（チャンク0は置換編集、超過分はスレッド形式の",[490,773,740],{},"で追加）",[605,776,777,782],{},[622,778,779],{},[447,780,781],{},"CLOSEDフレーム制御",[622,783,784,785,788],{},"AUTH前の",[490,786,787],{},"auth-required","は正常な初期化動作（AUTH完了後に購読再開）；AUTH後は制限付き再試行（最大3回、0\u002F1\u002F2秒バックオフ）；再接続時は全ステートを再構築",[605,790,791,796],{},[622,792,793],{},[447,794,795],{},"リレー取得上限",[622,797,798,799,802],{},"購読あたり最大2000件の履歴イベント（",[490,800,801],{},"since","指定時も含め、常に最新順で取得）",[605,804,805,810],{},[622,806,807],{},[447,808,809],{},"メンション判定",[622,811,812,813,815,816,818,819,821],{},"受信した",[490,814,740],{},"の処理条件：(a) ",[490,817,429],{},"タグに自公開鍵が含まれる、(b) チャンネルがDM、(c) ",[490,820,770],{},"参照が自身のイベント（スレッド追跡）。自公開鍵の発信は無視（無限ループ防止）",[605,823,824,829],{},[622,825,826],{},[447,827,828],{},"送信メンション",[622,830,831,832,835,836,838],{},"送信テキストはそのまま発行（リレー側での",[490,833,834],{},"@","構文検証はなし）；",[490,837,429],{},"タグには入力送信者＋言及された他の公開鍵を最大7件まで格納（合計最大8件）",[605,840,841,846],{},[622,842,843],{},[447,844,845],{},"ダイレクトメッセージ",[622,847,848,849,852],{},"リレーローカルの平文チャンネル（",[490,850,851],{},"type: \"dm\"","メタデータ）として処理 — 本ブリッジではNIP-04\u002F44暗号化は非使用",[605,854,855,860],{},[622,856,857],{},[447,858,859],{},"添付ファイル（受信）",[622,861,862,863,505,866,749,869,749,872,875],{},"NIP-92 ",[490,864,865],{},"imeta",[490,867,868],{},"url",[490,870,871],{},"sha256",[490,873,874],{},"m","）→ 標準HTTP(S)でダウンロードしSHA-256検証、20 MB上限、1メッセージあたり最大4点；送信画像の公開は現行未サポート",[429,877,878],{},"Buzzブリッジのブートストラップ接続フローは以下の通りです：",[432,880],{"src":881,"alt":882},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-bootstrap.webp","Buzzブリッジのブートストラップ接続とNIP-42認証プロセスを示すシーケンス図",[884,885,887],"h3",{"id":886},"nostrインプレース編集kind-40003によるリアルタイムストリーミング","Nostrインプレース編集（Kind 40003）によるリアルタイムストリーミング",[429,889,890,891,894],{},"Nostrプロトコルにはネイティブな入力中インジケーターが存在せず、イベントは追記専用です。応答の体感速度とインタラクティブ性を高めるため、Buzzブリッジは",[447,892,893],{},"インプレース編集を用いた疑似ストリーミング","を実現しています：",[432,896],{"src":897,"alt":898},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-reply.webp","kind 40003イベントによる逐次インプレース編集でストリーミング応答を再現するフロー図",[480,900,901],{},[483,902,903],{},[904,905,906,907,909,910,912],"em",{},"Buzzブリッジはまずプレースホルダーとなる",[490,908,740],{},"イベントを発行し、エージェントの思考出力に伴ってレートリミットされた",[490,911,765],{},"インプレース編集イベントで段階的にメッセージを書き換えます。そしてエージェントの推論完了時に最終版を確定します。これはTelegramやDiscordブリッジで採用されている実績ある設計パターンです。",[884,914,916],{"id":915},"チャットコマンドを通じたdeepseek-harnessワークスペースの連動","チャットコマンドを通じたDeepSeek Harnessワークスペースの連動",[429,918,919,920,923,924,927],{},"DSH Web UIにおける「ワークスペース」機能は、内部の",[490,921,922],{},"workspaceRegistry","サービス（",[490,925,926],{},"@deepseek-ai\u002Fdsh-workspace","）によって制御されています：",[929,930,934],"pre",{"className":931,"code":932,"language":933,"meta":424,"style":424},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const existing = await ctx.workspaceRegistry.resolveByPath(request.path);\n","typescript",[490,935,936],{"__ignoreMap":424},[937,938,941,945,949,953,957,960,963,965,967,971,974,976,979],"span",{"class":939,"line":940},"line",1,[937,942,944],{"class":943},"spNyl","const",[937,946,948],{"class":947},"sTEyZ"," existing ",[937,950,952],{"class":951},"sMK4o","=",[937,954,956],{"class":955},"s7zQu"," await",[937,958,959],{"class":947}," ctx",[937,961,962],{"class":951},".",[937,964,922],{"class":947},[937,966,962],{"class":951},[937,968,970],{"class":969},"s2Zo4","resolveByPath",[937,972,973],{"class":947},"(request",[937,975,962],{"class":951},[937,977,978],{"class":947},"path)",[937,980,981],{"class":951},";\n",[429,983,984,985,988],{},"Buzzブリッジはチャットコマンド",[490,986,987],{},"\u002Fworkspace \u003Cフォルダパス>","を提供し、ローカルに実在するディレクトリをDSHへ登録できます。ゲートウェイ経由で作成された新規セッションはすべてこのフォルダに関連付けられ、Web UI上にも即座に反映されます。",[432,990],{"src":991,"alt":992},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace.webp","ゲートウェイ経由のチャットコマンドからDeepSeek Harnessワークスペースを登録する連携アーキテクチャ図",[429,994,995],{},"設計上の3つの重要ポイント：",[480,997,998,1008,1017],{},[483,999,1000,1003,1004,1007],{},[447,1001,1002],{},"フォルダ切り替え＝新規セッション開始","：作業ディレクトリ（",[490,1005,1006],{},"cwd","）はセッション作成時にヘッダーへ固定記録されるため、途中で動的に変更することはできません。",[483,1009,1010,535,1013,1016],{},[447,1011,1012],{},"フォルダの実在が必須",[490,1014,1015],{},"create","処理は存在しないパスの指定を即時エラーとして拒否します。",[483,1018,1019,1022,1023,1026],{},[447,1020,1021],{},"セキュリティ配慮","：すべてのセッションは",[447,1024,1025],{},"auto-approve","（自動承認）ポリシーで稼働するため、指定フォルダ配下のファイルに対して完全なアクセス権が付与されます。",[471,1028,1029],{"id":1029},"インストールと詳細設定のステップバイステップ手順",[528,1031,1032],{},[483,1033,1034],{},"ターミナルで以下のコマンドを実行します：",[929,1036,1040],{"className":1037,"code":1038,"language":1039,"meta":424,"style":424},"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",[490,1041,1042,1064,1071,1078],{"__ignoreMap":424},[937,1043,1044,1048,1052,1055,1058,1061],{"class":939,"line":940},[937,1045,1047],{"class":1046},"sBMFI","dsh",[937,1049,1051],{"class":1050},"sfazB"," plugin",[937,1053,1054],{"class":1050}," --profile",[937,1056,1057],{"class":1050}," web",[937,1059,1060],{"class":1050}," add",[937,1062,1063],{"class":1050}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n",[937,1065,1067],{"class":939,"line":1066},2,[937,1068,1070],{"emptyLinePlaceholder":1069},true,"\n",[937,1072,1074],{"class":939,"line":1073},3,[937,1075,1077],{"class":1076},"sHwdD","# Start DSH web\n",[937,1079,1081,1083],{"class":939,"line":1080},4,[937,1082,1047],{"class":1046},[937,1084,1085],{"class":1050}," web\n",[528,1087,1088],{"start":1066},[483,1089,1090,1091,1093],{},"ブラウザでDSH Web UIが開いたら、左側メニューの「",[447,1092,522],{},"」アイコンをクリックします：",[429,1095,1096],{},[432,1097],{"alt":1098,"src":1099},"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",[528,1101,1102],{"start":1073},[483,1103,1104,1105,1108],{},"左側リストから「",[447,1106,1107],{},"Buzz","」を選択します：",[429,1110,1111],{},[432,1112],{"alt":1113,"src":1114},"DeepSeek HarnessメッセージゲートウェイにおけるBuzzブリッジの設定管理画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-message-gateway-buzz-config-panel.webp",[528,1116,1117,1128,1138],{"start":1080},[483,1118,1119,1120,1123,1124,1127],{},"「",[447,1121,1122],{},"Generate keypair","」をクリックしてNostrキーペアを生成します。表示された公開鍵（",[490,1125,1126],{},"npub","）を安全な場所にコピーしてください。",[483,1129,1119,1130,1133,1134,1137],{},[447,1131,1132],{},"Relay URL","」および購読対象のチャンネルUUIDを指定する「",[447,1135,1136],{},"Channels","」を入力します。",[483,1139,1119,1140,1143],{},[447,1141,1142],{},"Save","」ボタンをクリックします。",[429,1145,1146,1147,1150,1151,1154,1155,1157],{},"保存を実行すると認証情報が記録され、",[447,1148,1149],{},"ブリッジが即時起動","します。秘密鍵（",[490,1152,1153],{},"nsec","）は最重要機密として扱われ、ローカルの",[490,1156,496],{},"内にのみ安全に保存されます。",[884,1159,1161],{"id":1160},"buzz-nostrリレーへのエージェント公開鍵登録","Buzz Nostrリレーへのエージェント公開鍵登録",[429,1163,1164,1167,1168,1170],{},[447,1165,1166],{},"DSHアシスタントをリレーの正規メンバーとして追加します。"," 先ほど生成した公開鍵（",[490,1169,1126],{},"）を指定して実行します：",[929,1172,1174],{"className":1037,"code":1173,"language":1039,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub123123123\n",[490,1175,1176],{"__ignoreMap":424},[937,1177,1178,1181,1184,1187,1190,1193,1196,1199],{"class":939,"line":940},[937,1179,1180],{"class":1046},"docker",[937,1182,1183],{"class":1050}," compose",[937,1185,1186],{"class":1050}," exec",[937,1188,1189],{"class":1050}," relay",[937,1191,1192],{"class":1050}," buzz-admin",[937,1194,1195],{"class":1050}," add-member",[937,1197,1198],{"class":1050}," --pubkey",[937,1200,1201],{"class":1050}," npub123123123\n",[429,1203,1204,1207,1208,1211,1212,1215,1216,1218,1219,1222,1223,1226],{},[447,1205,1206],{},"アシスタントを特定のチャンネルへ招待します。"," リレーへ追加した段階では、まだ各チャンネル内での検索や発言はできません。",[490,1209,1210],{},"buzz-cli","を使用してチャンネルへ追加する際、",[490,1213,1214],{},"--pubkey","引数には",[490,1217,1126],{},"ではなく",[447,1220,1221],{},"HEX形式","の公開鍵を指定する必要があります（",[490,1224,1225],{},"buzz-admin add-member","の実行結果にHEX値が出力されます）：",[929,1228,1230],{"className":1037,"code":1229,"language":1039,"meta":424,"style":424},"buzz channels add-member --channel \u003CCHANNEL_UUID> --pubkey \u003CAGENT_HEX> --role member\n",[490,1231,1232],{"__ignoreMap":424},[937,1233,1234,1237,1240,1242,1245,1248,1251,1254,1257,1259,1261,1264,1267,1269,1272],{"class":939,"line":940},[937,1235,1236],{"class":1046},"buzz",[937,1238,1239],{"class":1050}," channels",[937,1241,1195],{"class":1050},[937,1243,1244],{"class":1050}," --channel",[937,1246,1247],{"class":951}," \u003C",[937,1249,1250],{"class":1050},"CHANNEL_UUI",[937,1252,1253],{"class":947},"D",[937,1255,1256],{"class":951},">",[937,1258,1198],{"class":1050},[937,1260,1247],{"class":951},[937,1262,1263],{"class":1050},"AGENT_HE",[937,1265,1266],{"class":947},"X",[937,1268,1256],{"class":951},[937,1270,1271],{"class":1050}," --role",[937,1273,1274],{"class":1050}," member\n",[460,1276],{"description":1277,"image":463,"image-alt":464,"label":1278,"min-read":1279,"title":1280,"to":1281},"Nostrチャンネル、メンバーキー、AIエージェントの権限を管理するためのbuzz-cliのインストールと設定手順を解説します。","CLIガイド","5","buzz-cliのインストールと使用方法","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#install-buzz-cli",[429,1283,1284,1286],{},[490,1285,1210],{},"を使用して、Nostrリレー上のDSHアシスタントの表示名を分かりやすい名前に更新します：",[429,1288,1289],{},[432,1290],{"alt":1291,"src":1292},"buzz-cliを使用してNostrリレー上のDSHアシスタント表示名を更新する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-assistant-buzz-cli-profile-update.webp",[429,1294,1295,1296,1299],{},"DSHアシスタントへ",[447,1297,1298],{},"Wave","（BuzzのDM挨拶アクション）を送信します。アシスタントから応答が返れば接続成功です：",[429,1301,1302],{},[432,1303],{"alt":1304,"src":1305},"Buzz内でDSHアシスタントにWaveメッセージをDM送信して接続テストを行う様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-dm-wave-greeting-reply.webp",[429,1307,1308],{},[904,1309,1310],{},"DSHアシスタントへDMとしてWaveを送信 — ブリッジが正常に応答している様子。",[884,1312,1314,1317],{"id":1313},"workspaceによるローカルフォルダ連携の有効化",[490,1315,1316],{},"\u002Fworkspace","によるローカルフォルダ連携の有効化",[429,1319,1320,1321,1324,1325,1328,1329,1331],{},"デフォルトではセキュリティ保護のため",[490,1322,1323],{},"allowWorkspace","設定が",[490,1326,1327],{},"false","になっているため、初回実行時の",[490,1330,1316],{},"コマンドは拒絶されます：",[429,1333,1334],{},[432,1335],{"alt":1336,"src":1337},"allowWorkspaceが無効な状態で\u002Fworkspaceコマンドを実行した際のエラー通知画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-rejected-error.webp",[429,1339,1340,1343,1344,1346],{},[490,1341,1342],{},"~\u002F.dsh\u002Fprofiles\u002Fweb\u002Fcordis.patch.yml","を編集して機能を有効化し、",[490,1345,581],{},"を再起動します：",[929,1348,1352],{"className":1349,"code":1350,"language":1351,"meta":424,"style":424},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- id: ui-message-gateway\n  config:\n    allowWorkspace: true\n","yml",[490,1353,1354,1369,1377],{"__ignoreMap":424},[937,1355,1356,1359,1363,1366],{"class":939,"line":940},[937,1357,1358],{"class":951},"-",[937,1360,1362],{"class":1361},"swJcz"," id",[937,1364,1365],{"class":951},":",[937,1367,1368],{"class":1050}," ui-message-gateway\n",[937,1370,1371,1374],{"class":939,"line":1066},[937,1372,1373],{"class":1361},"  config",[937,1375,1376],{"class":951},":\n",[937,1378,1379,1382,1384],{"class":939,"line":1073},[937,1380,1381],{"class":1361},"    allowWorkspace",[937,1383,1365],{"class":951},[937,1385,1387],{"class":1386},"sfNiH"," true\n",[429,1389,1390],{},"再起動後の画面：",[429,1392,1393],{},[432,1394],{"alt":1395,"src":1396},"Buzz内で\u002Fworkspaceコマンドを実行しワークスペース登録が成功した確認画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-success-confirmation.webp",[429,1398,1399,1400,1403],{},"重要な注意点：この指定は、ワークスペースフォルダ（スクリーンショット内の",[490,1401,1402],{},"TechVoyage","）がデフォルトのユーザーホーム配下に存在することを前提としています。それ以外の階層を指定する場合はフルパスで入力してください。Buzz経由で登録されたセッションは、DeepSeek Harness Web UI上にも連動して表示されます。",[429,1405,1406],{},[432,1407],{"alt":1408,"src":1409},"Buzzから自動同期されDeepSeek Harness Web UI上に表示された作業セッション","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-synced-workspace-session.webp",[884,1411,1413],{"id":1412},"buzz上で利用可能なコマンド一覧","Buzz上で利用可能なコマンド一覧",[429,1415,1416],{},"他プラットフォームで利用可能な主要コマンドは、Buzz環境でも完全に対応しています：",[599,1418,1419,1429],{},[602,1420,1421],{},[605,1422,1423,1426],{},[608,1424,1425],{},"コマンド",[608,1427,1428],{},"機能概要",[617,1430,1431,1441,1451,1461,1471,1481,1491,1501,1511,1532,1552],{},[605,1432,1433,1438],{},[622,1434,1435],{},[490,1436,1437],{},"\u002Fworkspace \u003Cfolder>",[622,1439,1440],{},"既存のフォルダをチャットの作業スペースとして登録（設定ファイルでの事前有効化が必要）",[605,1442,1443,1448],{},[622,1444,1445],{},[490,1446,1447],{},"\u002Fhelp",[622,1449,1450],{},"利用可能なコマンド一覧を表示",[605,1452,1453,1458],{},[622,1454,1455],{},[490,1456,1457],{},"\u002Ftime",[622,1459,1460],{},"現在のサーバー時刻を表示",[605,1462,1463,1468],{},[622,1464,1465],{},[490,1466,1467],{},"\u002Fnew",[622,1469,1470],{},"新しいクリーンなセッションを開始",[605,1472,1473,1478],{},[622,1474,1475],{},[490,1476,1477],{},"\u002Fclear",[622,1479,1480],{},"現在の会話履歴をクリア",[605,1482,1483,1488],{},[622,1484,1485],{},[490,1486,1487],{},"\u002Fstatus",[622,1489,1490],{},"現在のブリッジ接続ステータスを表示",[605,1492,1493,1498],{},[622,1494,1495],{},[490,1496,1497],{},"\u002Fstats",[622,1499,1500],{},"チャット数および全プラットフォームのブリッジ稼働状態を表示（Buzzを含む）",[605,1502,1503,1508],{},[622,1504,1505],{},[490,1506,1507],{},"\u002Fcommands",[622,1509,1510],{},"全コマンドの詳細な説明を表示",[605,1512,1513,1518],{},[622,1514,1515],{},[490,1516,1517],{},"@path\u002Fto\u002Ffile",[622,1519,1520,1521,1523,1524,1527,1528,1531],{},"Webの@メンションと同様に機能：モデルがワークスペース相対パスでファイルを読み込み。単体の",[490,1522,834],{},"、",[490,1525,1526],{},"@prefix","、または",[490,1529,1530],{},"\u002Ffiles \u003Cprefix>","で一致する候補を一覧表示",[605,1533,1534,1539],{},[622,1535,1536],{},[490,1537,1538],{},"\u002Fmodel",[622,1540,1541,1544,1545,1547,1548,1551],{},[490,1542,1543],{},"[provider model effort]"," — 稼働中のLLMカタログと検証の上、モデルおよび推論レベルを変更。",[490,1546,1538],{},"単体で選択肢一覧、",[490,1549,1550],{},"\u002Fmodel reset","で初期設定にリセット",[605,1553,1554,1559],{},[622,1555,1556],{},[490,1557,1558],{},"\u002Feffort",[622,1560,1561,1564,1565,1568],{},[490,1562,1563],{},"\u003Cid>"," モデルの推論エフォート値のみを調整。",[490,1566,1567],{},"\u002Feffort reset","でデフォルト値に戻す",[884,1570,1571],{"id":1571},"セキュリティ設計の要点",[480,1573,1574,1586,1599],{},[483,1575,1576,535,1579,1581,1582,1585],{},[447,1577,1578],{},"nsec（秘密鍵）の厳格管理",[490,1580,496],{},"内でのみ保管（パーミッション0600、アトミック書き込み）。",[490,1583,1584],{},"\u002Fgateway\u002Flist","などのAPIやログに出力されることは一切ありません。",[483,1587,1588,1591,1592,505,1595,1598],{},[447,1589,1590],{},"暗号検証の徹底","：受信したすべてのイベントは、エージェントへ渡る前に",[447,1593,1594],{},"署名検証",[490,1596,1597],{},"verifyEvent","）、重複排除、自己発信フィルター、メンション検証を通過します。",[483,1600,1601,1604,1605,1608],{},[447,1602,1603],{},"ワークスペース登録の二重防御","：ゲートウェイセッションが自動承認で動作するため、誤ったフォルダ公開を防ぐ目的で明示的な設定有効化（",[490,1606,1607],{},"allowWorkspace: true","）を必須としています。",[471,1610,1612],{"id":1611},"まとめbuzzによる分散型aiコラボレーションの実現","まとめ：Buzzによる分散型AIコラボレーションの実現",[429,1614,1615,1617],{},[490,1616,445],{},"にBuzzを追加する上での最大の技術的挑戦は、Nostrプロトコルが要求する規約の厳密なハンドリングにありました。既存のプラグイン設計がセッション管理やコマンドルーティングを美しく抽象化していたため、イベントの送受信と逐次編集ストリーミングが確立されてからは、極めてスムーズかつ堅牢に稼働させることができました。",[471,1619,1621],{"id":1620},"参考リンク","参考リンク：",[480,1623,1624,1632,1640],{},[483,1625,1626,1631],{},[440,1627,1630],{"href":1628,"rel":1629},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture.md",[444],"dsh-message-gateway architecture guide"," — アーキテクチャガイド、拡張レシピ、セキュリティノート",[483,1633,1634,1639],{},[440,1635,1638],{"href":1636,"rel":1637},"https:\u002F\u002Fgithub.com\u002Fnbd-wtf\u002Fnostr-tools",[444],"nostr-tools"," — 内部で使用されている主要Nostrライブラリ",[483,1641,1642,1647],{},[440,1643,1646],{"href":1644,"rel":1645},"https:\u002F\u002Fgithub.com\u002Fbytedance\u002Fdeer-flow\u002Fblob\u002Fmain\u002Fbackend\u002Fdocs\u002FIM_CHANNEL_CONNECTIONS.md",[444],"deer-flow IM channel connections"," — インスタントメッセージング接続パターンの設計資料",[1649,1650,1651],"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":424,"searchDepth":1066,"depth":1073,"links":1653},[1654,1655,1659,1666,1667],{"id":473,"depth":1066,"text":473},{"id":589,"depth":1066,"text":590,"children":1656},[1657,1658],{"id":886,"depth":1073,"text":887},{"id":915,"depth":1073,"text":916},{"id":1029,"depth":1066,"text":1029,"children":1660},[1661,1662,1664,1665],{"id":1160,"depth":1073,"text":1161},{"id":1313,"depth":1073,"text":1663},"\u002Fworkspaceによるローカルフォルダ連携の有効化",{"id":1412,"depth":1073,"text":1413},{"id":1571,"depth":1073,"text":1571},{"id":1611,"depth":1066,"text":1612},{"id":1620,"depth":1066,"text":1621},[1669,1670,1236,1671],"ai-agents","collaboration","deepseek-harness","2026-09-30","DeepSeek HarnessをNostrプロトコル経由でBlockのAI協働ワークスペースBuzzに接続する詳細手順を解説。NIP-42認証やWebSocket接続、kind 40003による逐次編集ストリーミング、チャンネル単位の自律型エージェント管理、ローカル作業環境コマンド連携までを完全網羅。","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002FJA-Bringing-Buzz-to-DeepSeek-Harness.webp","深みのあるインディゴとアンバーのアクセントが効いたプレミアムな16:9のテックカード。DeepSeek HarnessをNostrリレーブリッジ経由でBlock Buzzに接続する方法を表現し、洗練されたガラスモーフ調パネルの中央にタイポグラフィを配置。",{"schemaOrg":1678,"robots":1703,"sitemap":1704},[1679,1681],{"@type":1680,"headline":423,"description":1673,"image":1675},"TechArticle",{"@type":1682,"name":423,"description":1673,"image":1675,"step":1683},"HowTo",[1684,1688,1691,1694,1697,1700],{"@type":1685,"name":1686,"text":1687},"HowToStep","フェーズ1：ゲートウェイプラグインの導入","dsh-message-gatewayプラグインをインストールしてdsh webを起動します。",{"@type":1685,"name":1689,"text":1690},"フェーズ2：Message platforms設定の開始","DSH Web UIを開き、サイドバーからMessage platforms設定へ移動します。",{"@type":1685,"name":1692,"text":1693},"フェーズ3：Buzzブリッジの接続設定","Nostrキーペアを生成し、Relay URLと購読チャンネルを入力します。",{"@type":1685,"name":1695,"text":1696},"フェーズ4：Nostrリレーへのエージェント登録","buzz-adminを使用してDSHアシスタントをBuzzリレーのメンバーとして追加します。",{"@type":1685,"name":1698,"text":1699},"フェーズ5：特定チャンネルへの参加","buzz-cliを使用してHEX形式の公開鍵をチャンネルに追加します。",{"@type":1685,"name":1701,"text":1702},"フェーズ6：ローカル作業フォルダ連携の有効化","cordis.patch.ymlでallowWorkspaceを有効化し、フォルダ連携を許可します。","index, follow",{"lastmod":1672},15,{"title":1707,"description":1673,"ogTitle":423,"ogDescription":1673,"twitterTitle":423,"twitterDescription":1673},"DeepSeek Harness Buzzプラグイン導入：Nostrプロトコル中継リレー接続の構築手順","ja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",[596,1107,1710,1711,445],"Nostr","AIエージェント",null,"G3P6ZGHDF8ind6nFnnP4iRMS71Dlm2AfulrpNfUFCJE",{"surround":1715,"related":2657},[1716,1712],{"id":1717,"title":1718,"author":424,"body":1719,"category":2609,"date":2611,"description":2612,"extension":1674,"image":2613,"imageAlt":2614,"isPublished":1069,"meta":2615,"minRead":1934,"navigation":1069,"path":187,"seo":2649,"stem":2651,"tags":2652,"updatedAt":2648,"__hash__":2656},"article\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md","Cloudflare WARPでHermes Agentをプライベートネットワークに公開する方法",{"type":426,"value":1720,"toc":2591},[1721,1736,1746,1749,1752,1764,1767,1775,1778,1782,1831,1835,1974,1978,2010,2014,2017,2083,2086,2122,2125,2152,2156,2166,2170,2208,2297,2301,2306,2323,2332,2412,2417,2463,2467,2512,2527,2531,2575,2578,2588],[429,1722,1723,1724,1727,1728,1731,1732,1735],{},"パブリックインターネットに公開することなく、ノートパソコン、タブレット、スマートフォンなどの他のデバイスから",[447,1725,1726],{},"Hermes Agent","にアクセスしたい場合、よく課題に直面します。",[447,1729,1730],{},"Cloudflare WARP","と",[447,1733,1734],{},"Cloudflare Zero Trust","を活用することで、ファイアウォールのインバウンドポートを一切開くことなく、Hermes Agentをグローバルに公開することが可能になります。",[429,1737,1738,1739,1742,1743,1745],{},"以前のガイド「",[440,1740,1741],{"href":375},"リモートのLinux VPSサーバー環境にHermes Agentを導入・デプロイして常時運用する方法","」に従って設定済みであれば、Hermes Agentはすでに24時間稼働しているはずです。従来のVPNの煩雑な管理に対処する代わりに、今回は",[447,1744,1730],{},"クライアントを使用して、インターネット経由でHermes Agentをプライベートネットワークに公開します。",[471,1747,1748],{"id":1748},"アーキテクチャの理解",[429,1750,1751],{},"本構成で動作するコンポーネント：",[528,1753,1754,1759],{},[483,1755,1756,1758],{},[447,1757,1734],{},": ルーティングルールとアクセス権限（ポリシー）を定義するCloudflare의ダッシュボードです。",[483,1760,1761,1763],{},[447,1762,1730],{},": デバイス（VPS、ノートパソコン、スマートフォン）にインストールするクライアントアプリケーションです。プライベートネットワーク宛てのトラフィックを傍受し、安全にルーティングします。",[884,1765,1766],{"id":1766},"前提条件",[480,1768,1769,1772],{},[483,1770,1771],{},"VPS上でHermes Agentが稼働していること。",[483,1773,1774],{},"無料のCloudflareアカウント。",[471,1776,1777],{"id":1777},"ステップバイステップガイド",[884,1779,1781],{"id":1780},"ステップ-1-cloudflare-zero-trustのセットアップ","ステップ 1: Cloudflare Zero Trustのセットアップ",[528,1783,1784,1792,1799,1810,1817,1824],{},[483,1785,1786,1791],{},[440,1787,1790],{"href":1788,"rel":1789},"https:\u002F\u002Fdash.cloudflare.com\u002F",[444],"Cloudflare ダッシュボード","にログインします。",[483,1793,1794,1795],{},"左側のメニューから「Zero Trust」をクリックします。\n",[432,1796],{"alt":1797,"src":1798},"Zero Trustオプションが表示されたCloudflareダッシュボードの左サイドバーナビゲーションメニュー","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[483,1800,1801,1802,1805,1806],{},"初めて利用する場合は、プランの選択（このセットアップには無料プランで十分です）とチーム名の設定（例：",[490,1803,1804],{},"ai-team","）を求められます。\n",[432,1807],{"alt":1808,"src":1809},"初回設定のCloudflare Zero Trustアカウントの作成とチームの命名処理","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[483,1811,1812,1813],{},"「Access」をクリックし、「Policies」を選択して、ネットワークへのアクセス権を持つユーザーを定義するアクセスポリシーを作成します。\n",[432,1814],{"alt":1815,"src":1816},"新しく設定されたアクセス規則を表示しているCloudflare Zero Trustアクセス権限ポリシーページ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[483,1818,1819,1820],{},"「Create new policy」をクリックします。\n",[432,1821],{"alt":1822,"src":1823},"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",[483,1825,1826,1827],{},"「Emails」を選択し、「Policy rules」の下にあなたのメールアドレスを入力します。\n",[432,1828],{"alt":1829,"src":1830},"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",[884,1832,1834],{"id":1833},"ステップ-2-vpsへのcloudflare-warpクライアントのセットアップ","ステップ 2: VPSへのCloudflare WARPクライアントのセットアップ",[528,1836,1837,1848,1855,1862,1865,1880,1883,1967],{},[483,1838,1839,1840,1843,1844,1847],{},"VPSのターミナルで ",[490,1841,1842],{},"sudo apt update"," と ",[490,1845,1846],{},"sudo apt install cloudflare-warp"," を実行します。",[483,1849,1850,1851,1854],{},"ターミナルで ",[490,1852,1853],{},"warp-cli registration new \u003CTEAM-NAME>"," を実行すると、URLが出力されます。",[483,1856,1857,1858,1861],{},"出力されたURL（例：",[490,1859,1860],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp","）をコピーし、ブラウザに貼り付けて認証を行います。",[483,1863,1864],{},"ステップ1のポリシー設定でメール認証を使用したため、メールアドレスを入力して認証を進めます。",[483,1866,1867,1868,1871,1872,1875,1876,1879],{},"ブラウザに「",[447,1869,1870],{},"Success","」ページが表示されたら、青い「",[447,1873,1874],{},"Open Cloudflare WARP","」ボタンを右クリックし、「",[447,1877,1878],{},"検証 (Inspect)","」を選択します。",[483,1881,1882],{},"ボタンのリンク内に表示されている長いトークンをコピーします。",[483,1884,1839,1885,1888,1889,1892,1893],{},[490,1886,1887],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\""," を実行し、VPSをCloudflare Zero Trustに接続します。",[1890,1891],"br",{},"Ubuntu 26で「Error: Failed to communicate with the WARP API」が発生した場合は、次のコマンドを実行します。",[929,1894,1896],{"className":1037,"code":1895,"language":1039,"meta":424,"style":424},"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",[490,1897,1898,1912,1916,1921,1932,1937,1943],{"__ignoreMap":424},[937,1899,1900,1903,1906,1909],{"class":939,"line":940},[937,1901,1902],{"class":1046},"sudo",[937,1904,1905],{"class":1050}," systemctl",[937,1907,1908],{"class":1050}," restart",[937,1910,1911],{"class":1050}," warp-svc.service\n",[937,1913,1914],{"class":939,"line":1066},[937,1915,1070],{"emptyLinePlaceholder":1069},[937,1917,1918],{"class":939,"line":1073},[937,1919,1920],{"class":1076},"# Check status\n",[937,1922,1923,1925,1927,1930],{"class":939,"line":1080},[937,1924,1902],{"class":1046},[937,1926,1905],{"class":1050},[937,1928,1929],{"class":1050}," status",[937,1931,1911],{"class":1050},[937,1933,1935],{"class":939,"line":1934},5,[937,1936,1070],{"emptyLinePlaceholder":1069},[937,1938,1940],{"class":939,"line":1939},6,[937,1941,1942],{"class":1076},"# Run the warp-cli registration token again\n",[937,1944,1946,1949,1952,1955,1958,1961,1964],{"class":939,"line":1945},7,[937,1947,1948],{"class":1046},"warp-cli",[937,1950,1951],{"class":1050}," --accept-tos",[937,1953,1954],{"class":1050}," registration",[937,1956,1957],{"class":1050}," token",[937,1959,1960],{"class":951},"   \"",[937,1962,1963],{"class":1050},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[937,1965,1966],{"class":951},"\"\n",[483,1968,1969,1970],{},"Cloudflare Zero Trustダッシュボードに戻り、「Devices」をクリックします。VPSデバイスが表示されているはずです。\n",[432,1971],{"alt":1972,"src":1973},"Linux VPSが正常に接続されていることを確認するZero Trustデバイスダッシュボード","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-devices-vps-connected.webp",[884,1975,1977],{"id":1976},"ステップ-3-トラフィックのルーティング設定","ステップ 3: トラフィックのルーティング設定",[528,1979,1980,1987,1994,2001],{},[483,1981,1982,1983],{},"Devicesダッシュボードで、VPSのプロファイルをクリックします。\n",[432,1984],{"alt":1985,"src":1986},"登録されたVPSデバイスの詳細と分割トンネル設定へのアクセス画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[483,1988,1989,1990],{},"下にスクロールして「Split Tunnels」セクションを見つけます。\n",[432,1991],{"alt":1992,"src":1993},"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",[483,1995,1996,1997],{},"「Manage」ボタンをクリックし、以下のように設定を構成します。必要に応じてIPアドレスを置き換えてください。\n",[432,1998],{"alt":1999,"src":2000},"Cloudflare設定での分割トンネルIPアドレスとホスト名の除外ルールの管理設定","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[483,2002,2003,1843,2006,2009],{},[490,2004,2005],{},"address",[490,2007,2008],{},"host"," を公開することで、トラフィックが同じプライベートネットワーク経由でサービスにルーティングされるようになります。",[884,2011,2013],{"id":2012},"ステップ-4-vpsでのファイアウォール設定","ステップ 4: VPSでのファイアウォール設定",[429,2015,2016],{},"ファイアウォールを有効にして、「100.96.0.0\u002F12」サブネットのみを許可し、他のすべてのパブリックな受信アクセスをブロックします。",[929,2018,2020],{"className":1037,"code":2019,"language":1039,"meta":424,"style":424},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[490,2021,2022,2035,2052,2066],{"__ignoreMap":424},[937,2023,2024,2026,2029,2032],{"class":939,"line":940},[937,2025,1902],{"class":1046},[937,2027,2028],{"class":1050}," ufw",[937,2030,2031],{"class":1050}," enable",[937,2033,2034],{"class":947}," \n",[937,2036,2037,2039,2041,2044,2047,2050],{"class":939,"line":1066},[937,2038,1902],{"class":1046},[937,2040,2028],{"class":1050},[937,2042,2043],{"class":1050}," default",[937,2045,2046],{"class":1050}," allow",[937,2048,2049],{"class":1050}," outgoing",[937,2051,2034],{"class":947},[937,2053,2054,2056,2058,2060,2063],{"class":939,"line":1073},[937,2055,1902],{"class":1046},[937,2057,2028],{"class":1050},[937,2059,2043],{"class":1050},[937,2061,2062],{"class":1050}," deny",[937,2064,2065],{"class":1050}," incoming\n",[937,2067,2068,2070,2072,2074,2077,2080],{"class":939,"line":1080},[937,2069,1902],{"class":1046},[937,2071,2028],{"class":1050},[937,2073,2046],{"class":1050},[937,2075,2076],{"class":1050}," in",[937,2078,2079],{"class":1050}," from",[937,2081,2082],{"class":1050}," 100.96.0.0\u002F12\n",[429,2084,2085],{},"ローカルサービスが中断されないよう、ループバックトラフィックを許可します：",[929,2087,2089],{"className":1037,"code":2088,"language":1039,"meta":424,"style":424},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[490,2090,2091,2107],{"__ignoreMap":424},[937,2092,2093,2095,2097,2099,2101,2104],{"class":939,"line":940},[937,2094,1902],{"class":1046},[937,2096,2028],{"class":1050},[937,2098,2046],{"class":1050},[937,2100,2076],{"class":1050},[937,2102,2103],{"class":1050}," on",[937,2105,2106],{"class":1050}," lo\n",[937,2108,2109,2111,2113,2115,2118,2120],{"class":939,"line":1066},[937,2110,1902],{"class":1046},[937,2112,2028],{"class":1050},[937,2114,2046],{"class":1050},[937,2116,2117],{"class":1050}," out",[937,2119,2103],{"class":1050},[937,2121,2106],{"class":1050},[429,2123,2124],{},"ファイアウォールをリロードし、ステータスを確認します：",[929,2126,2128],{"className":1037,"code":2127,"language":1039,"meta":424,"style":424},"sudo ufw reload \nsudo ufw status verbose\n",[490,2129,2130,2141],{"__ignoreMap":424},[937,2131,2132,2134,2136,2139],{"class":939,"line":940},[937,2133,1902],{"class":1046},[937,2135,2028],{"class":1050},[937,2137,2138],{"class":1050}," reload",[937,2140,2034],{"class":947},[937,2142,2143,2145,2147,2149],{"class":939,"line":1066},[937,2144,1902],{"class":1046},[937,2146,2028],{"class":1050},[937,2148,1929],{"class":1050},[937,2150,2151],{"class":1050}," verbose\n",[884,2153,2155],{"id":2154},"ステップ-5-hermes-agentをプライベートネットワークに公開する","ステップ 5: Hermes Agentをプライベートネットワークに公開する",[429,2157,2158,2161,2162,2165],{},[447,2159,2160],{},"Hermes Agent Web Dashboard","をプライベートネットワークに公開し、デフォルトの認証プロバイダである",[447,2163,2164],{},"Nous Research","を使用します。",[2167,2168,2169],"h4",{"id":2169},"認証プロバイダのセットアップ",[528,2171,2172,2180,2187,2194,2201],{},[483,2173,2174,2179],{},[440,2175,2178],{"href":2176,"rel":2177},"https:\u002F\u002Fportal.nousresearch.com",[444],"portal.nousresearch.com"," にアクセスし、アカウントを登録します。",[483,2181,2182,2183],{},"「Local Dashboards」を選択します。\n",[432,2184],{"alt":2185,"src":2186},"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",[483,2188,2189,2190],{},"「Register Dashboard」をクリックします。\n",[432,2191],{"alt":2192,"src":2193},"新しいダッシュボード項目を作成するためのRegister Dashboardボタンのクリック操作","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[483,2195,2196,2197],{},"「Dashboard redirect URI」にVPSのプライベートネットワークIPアドレスを入力し、「Save」をクリックします。\n",[432,2198],{"alt":2199,"src":2200},"Nous ResearchポータルにおけるリダイレクトURIとしてのプライベートIPアドレスの登録処理","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-redirect-uri.webp",[483,2202,2203,2204,2207],{},"「OAuth client ID」をコピーし、",[490,2205,2206],{},"config.yaml"," ファイルに貼り付けます：",[929,2209,2213],{"className":2210,"code":2211,"language":2212,"meta":424,"style":424},"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",[490,2214,2215,2222,2232,2242,2249,2259,2269,2276,2287],{"__ignoreMap":424},[937,2216,2217,2220],{"class":939,"line":940},[937,2218,2219],{"class":1361},"dashboard",[937,2221,1376],{"class":951},[937,2223,2224,2227,2229],{"class":939,"line":1066},[937,2225,2226],{"class":1361},"  theme",[937,2228,1365],{"class":951},[937,2230,2231],{"class":1050}," default\n",[937,2233,2234,2237,2239],{"class":939,"line":1073},[937,2235,2236],{"class":1361},"  show_token_analytics",[937,2238,1365],{"class":951},[937,2240,2241],{"class":1386}," false\n",[937,2243,2244,2247],{"class":939,"line":1080},[937,2245,2246],{"class":1361},"  oauth",[937,2248,1376],{"class":951},[937,2250,2251,2254,2256],{"class":939,"line":1934},[937,2252,2253],{"class":1361},"    client_id",[937,2255,1365],{"class":951},[937,2257,2258],{"class":1050}," agent:cmq02x7ha0002jk0ba3kfnb\n",[937,2260,2261,2264,2266],{"class":939,"line":1939},[937,2262,2263],{"class":1361},"    portal_url",[937,2265,1365],{"class":951},[937,2267,2268],{"class":1050}," https:\u002F\u002Fportal.nousresearch.com\n",[937,2270,2271,2274],{"class":939,"line":1945},[937,2272,2273],{"class":1361},"  basic_auth",[937,2275,1376],{"class":951},[937,2277,2279,2282,2284],{"class":939,"line":2278},8,[937,2280,2281],{"class":1361},"    username",[937,2283,1365],{"class":951},[937,2285,2286],{"class":951}," ''\n",[937,2288,2290,2293,2295],{"class":939,"line":2289},9,[937,2291,2292],{"class":1361},"    password_hash",[937,2294,1365],{"class":951},[937,2296,2286],{"class":951},[2167,2298,2300],{"id":2299},"hermes-dashboardを自動起動するためのsystemd設定","Hermes Dashboardを自動起動するためのSystemd設定",[528,2302,2303],{},[483,2304,2305],{},"サービスファイルを作成します：",[929,2307,2311],{"className":2308,"code":2309,"language":2310,"meta":424,"style":424},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[490,2312,2313],{"__ignoreMap":424},[937,2314,2315,2317,2320],{"class":939,"line":940},[937,2316,1902],{"class":1046},[937,2318,2319],{"class":1050}," nano",[937,2321,2322],{"class":1050}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[528,2324,2325],{"start":1066},[483,2326,2327,2328,2331],{},"以下の構成を貼り付けます。必ず ",[490,2329,2330],{},"--host 0.0.0.0"," がコマンドに含まれていることを確認してください：",[929,2333,2337],{"className":2334,"code":2335,"language":2336,"meta":424,"style":424},"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",[490,2338,2339,2344,2349,2354,2358,2363,2368,2373,2378,2383,2389,2395,2400,2406],{"__ignoreMap":424},[937,2340,2341],{"class":939,"line":940},[937,2342,2343],{},"[Unit]\n",[937,2345,2346],{"class":939,"line":1066},[937,2347,2348],{},"Description=Hermes Dashboard\n",[937,2350,2351],{"class":939,"line":1073},[937,2352,2353],{},"After=network.target\n",[937,2355,2356],{"class":939,"line":1080},[937,2357,1070],{"emptyLinePlaceholder":1069},[937,2359,2360],{"class":939,"line":1934},[937,2361,2362],{},"[Service]\n",[937,2364,2365],{"class":939,"line":1939},[937,2366,2367],{},"User=hermes\n",[937,2369,2370],{"class":939,"line":1945},[937,2371,2372],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[937,2374,2375],{"class":939,"line":2278},[937,2376,2377],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[937,2379,2380],{"class":939,"line":2289},[937,2381,2382],{},"Restart=always\n",[937,2384,2386],{"class":939,"line":2385},10,[937,2387,2388],{},"RestartSec=10\n",[937,2390,2392],{"class":939,"line":2391},11,[937,2393,2394],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[937,2396,2398],{"class":939,"line":2397},12,[937,2399,1070],{"emptyLinePlaceholder":1069},[937,2401,2403],{"class":939,"line":2402},13,[937,2404,2405],{},"[Install]\n",[937,2407,2409],{"class":939,"line":2408},14,[937,2410,2411],{},"WantedBy=multi-user.target\n",[528,2413,2414],{"start":1073},[483,2415,2416],{},"サービスを有効化し、起動します：",[929,2418,2420],{"className":2308,"code":2419,"language":2310,"meta":424,"style":424},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[490,2421,2422,2431,2442,2453],{"__ignoreMap":424},[937,2423,2424,2426,2428],{"class":939,"line":940},[937,2425,1902],{"class":1046},[937,2427,1905],{"class":1050},[937,2429,2430],{"class":1050}," daemon-reload\n",[937,2432,2433,2435,2437,2439],{"class":939,"line":1066},[937,2434,1902],{"class":1046},[937,2436,1905],{"class":1050},[937,2438,2031],{"class":1050},[937,2440,2441],{"class":1050}," hermes-dashboard\n",[937,2443,2444,2446,2448,2451],{"class":939,"line":1073},[937,2445,1902],{"class":1046},[937,2447,1905],{"class":1050},[937,2449,2450],{"class":1050}," start",[937,2452,2441],{"class":1050},[937,2454,2455,2457,2459,2461],{"class":939,"line":1080},[937,2456,1902],{"class":1046},[937,2458,1905],{"class":1050},[937,2460,1929],{"class":1050},[937,2462,2441],{"class":1050},[884,2464,2466],{"id":2465},"ステップ-6-デスクトップにcloudflare-warpクライアントをインストールする","ステップ 6: デスクトップにCloudflare WARPクライアントをインストールする",[528,2468,2469,2477,2480,2487,2494,2501],{},[483,2470,2471,2476],{},[440,2472,2475],{"href":2473,"rel":2474},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[444],"Cloudflareのポータル","からCloudflare WARPクライアントをダウンロードします。",[483,2478,2479],{},"インストール後、Cloudflare WARPクライアントを開いて起動します。",[483,2481,2482,2483],{},"画面の指示に従ってログインします。\n",[432,2484],{"alt":2485,"src":2486},"デスクトップ端末に表示されたCloudflare WARPクライアントのログインプロンプト画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[483,2488,2489,2490],{},"ログインに成功すると、「Success」ページが表示されます。\n",[432,2491],{"alt":2492,"src":2493},"デスクトップでのCloudflare Zero Trustログイン成功後の認証完了通知用ウェブページ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[483,2495,2496,2497],{},"WARPクライアントがZero Trustチームに接続されていることが表示されるはずです。\n",[432,2498],{"alt":2499,"src":2500},"Zero Trustプライベートネットワークへのアクティブ接続を証明するデスクトップ用WARPクライアント","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-client-connected.webp",[483,2502,2503,2504,2507,2508],{},"Webブラウザを開き、プライベートIP（例：",[490,2505,2506],{},"100.96.0.3","）を入力します。Hermes Web Dashboardが正常に読み込まれるはずです。\n",[432,2509],{"alt":2510,"src":2511},"デスクトップのブラウザからアクセスしたプライベートなHermes Agentウェブダッシュボード","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[2513,2514,2515],"blockquote",{},[429,2516,2517,2520,2521,2526],{},[447,2518,2519],{},"macOSユーザー向けのヒント:"," 複数のCloudflareアカウントにアクセスするためにWARPクライアントを使用している場合は、「",[447,2522,2523],{},[440,2524,2525],{"href":399},"MacのMDM構成プロファイルを用いて複数のCloudflare WARP組織を切り替える設定手順ガイド","」のクイックガイドをチェックして、アカウント間のシームレスな切り替えに役立ててください。",[884,2528,2530],{"id":2529},"ステップ-7-iosデバイスにcloudflare-warpクライアントをインストールする","ステップ 7: iOSデバイスにCloudflare WARPクライアントをインストールする",[528,2532,2533,2540,2548,2556,2564],{},[483,2534,2535,2536,2539],{},"App Storeから",[447,2537,2538],{},"Cloudflare One","をインストールします。",[483,2541,2542,2543],{},"Cloudflare Oneアプリを開き、画面の指示に従ってチーム名を入力します。\n",[432,2544],{"alt":2545,"src":2546,"width":2547},"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,[483,2549,2550,2551],{},"上記のポリシー設定で登録したのと同じメールアドレスを使用してログインします。\n",[432,2552],{"alt":2553,"src":2554,"width":2555},"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,[483,2557,2558,2559],{},"接続が完了すると、次のようになります：\n",[432,2560],{"alt":2561,"src":2562,"width":2563},"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,[483,2565,2566,2567,2569,2570],{},"モバイルデバイスのWebブラウザを開き、プライベートIP ",[490,2568,2506],{}," を入力してHermes Web Dashboardにアクセスします。\n",[432,2571],{"alt":2572,"src":2573,"width":2574},"スマートフォンのモバイルブラウザ上にロードされたHermes Agentウェブダッシュボードの表示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[471,2576,2577],{"id":2577},"結論",[429,2579,2580,2581,2583,2584,2587],{},"ID（アイデンティティ）ポリシーを管理する",[447,2582,1734],{},"と、暗号化されたトンネル経由でトラフィックをルーティングする",[447,2585,2586],{},"WARP","クライアントを組み合わせることで、世界中のどこからでもお使いのデバイスからHermes Agentへ安全にアクセスできるようになりました。このセットアップにより、完全なリモート環境でプライベートなAIインフラを構築・運用するための、安全で堅牢な基盤が整いました。",[1649,2589,2590],{},"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":424,"searchDepth":1066,"depth":1073,"links":2592},[2593,2596,2608],{"id":1748,"depth":1066,"text":1748,"children":2594},[2595],{"id":1766,"depth":1073,"text":1766},{"id":1777,"depth":1066,"text":1777,"children":2597},[2598,2599,2600,2601,2602,2606,2607],{"id":1780,"depth":1073,"text":1781},{"id":1833,"depth":1073,"text":1834},{"id":1976,"depth":1073,"text":1977},{"id":2012,"depth":1073,"text":2013},{"id":2154,"depth":1073,"text":2155,"children":2603},[2604,2605],{"id":2169,"depth":1080,"text":2169},{"id":2299,"depth":1080,"text":2300},{"id":2465,"depth":1073,"text":2466},{"id":2529,"depth":1073,"text":2530},{"id":2577,"depth":1066,"text":2577},[1669,2610],"security","2026-07-09","ファイアウォールのインバウンドポートを開くことなく、Cloudflare WARPとZero Trustを使用してグローバルかつ安全にHermes Agentへアクセスし、プライベートネットワークに公開する方法を詳しく解説します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FJA-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","Cloudflare Zero TrustとWARPトンネルを使用してHermes Agentをプライベートネットワークに安全に公開",{"schemaOrg":2616,"robots":1703,"sitemap":2647},[2617],{"@type":1682,"headline":1718,"description":2612,"name":1718,"image":2613,"step":2618},[2619,2623,2627,2631,2635,2639,2643],{"@type":1685,"name":2620,"text":2621,"url":2622,"image":1798},"Cloudflare Zero Trustのセットアップ","Cloudflare ダッシュボードにログインします。 左側のメニューから「Zero Trust」をクリックします。 初めて利用する場合は、プランの選択（このセットアップには無料プランで十分です）とチーム名の設定（例：ai-team）を求められます。 「Access」をクリックし、「Policies」を選択して、ネットワークへのアクセス権を持つユーザーを定義するアクセスポリシーを作成します。 「Create new policy」をクリックします。 「Emails」を選択し、「Policy ru","#step-1",{"@type":1685,"name":2624,"text":2625,"url":2626,"image":1973},"VPSへのCloudflare WARPクライアントのセットアップ","VPSのターミナルで sudo apt update と sudo apt install cloudflare-warp を実行します。 ターミナルで warp-cli registration new \u003CTEAM-NAME> を実行すると、URLが出力されます。 出力されたURL（例：https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp）をコピーし、ブラウザに貼り付けて認証を行います。 ステップ1のポリシー設定でメール認証を使用したため、メールアドレスを入力して認","#step-2",{"@type":1685,"name":2628,"text":2629,"url":2630,"image":1986},"トラフィックのルーティング設定","Devicesダッシュボードで、VPSのプロファイルをクリックします。 下にスクロールして「Split Tunnels」セクションを見つけます。 「Manage」ボタンをクリックし、以下のように設定を構成します。必要に応じてIPアドレスを置き換えてください。 address と host を公開することで、トラフィックが同じプライベートネットワーク経由でサービスにルーティングされるようになります。","#step-3",{"@type":1685,"name":2632,"text":2633,"url":2634},"VPSでのファイアウォール設定","ファイアウォールを有効にして、「100.96.0.0\u002F12」サブネットのみを許可し、他のすべてのパブリックな受信アクセスをブロックします。 bash ローカルサービスが中断されないよう、ループバックトラフィックを許可します： bash ファイアウォールをリロードし、ステータスを確認します： bash","#step-4",{"@type":1685,"name":2636,"text":2637,"url":2638},"Hermes Agentをプライベートネットワークに公開する","Hermes Agent Web Dashboardをプライベートネットワークに公開し、デフォルトの認証プロバイダであるNous Researchを使用します。","#step-5",{"@type":1685,"name":2640,"text":2641,"url":2642,"image":2486},"デスクトップにCloudflare WARPクライアントをインストールする","CloudflareのポータルからCloudflare WARPクライアントをダウンロードします。 インストール後、Cloudflare WARPクライアントを開いて起動します。 画面の指示に従ってログインします。 ログインに成功すると、「Success」ページが表示されます。 WARPクライアントがZero Trustチームに接続されていることが表示されるはずです。 Webブラウザを開き、プライベートIP（例：100.96.0.3）を入力します。Hermes Web Dashboardが正常に","#step-6",{"@type":1685,"name":2644,"text":2645,"url":2646,"image":2546},"iOSデバイスにCloudflare WARPクライアントをインストールする","App StoreからCloudflare Oneをインストールします。 Cloudflare Oneアプリを開き、画面の指示に従ってチーム名を入力します。 上記のポリシー設定で登録したのと同じメールアドレスを使用してログインします。 接続が完了すると、次のようになります： モバイルデバイスのWebブラウザを開き、プライベートIP 100.96.0.3 を入力してHermes Web Dashboardにアクセスします。","#step-7",{"lastmod":2648},"2026-09-28",{"title":2650,"description":2612,"ogTitle":1718,"ogDescription":2612,"twitterTitle":1718,"twitterDescription":2612},"Cloudflare Zero TrustによるHermes Agentへの安全なアクセス","ja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[1730,2653,1726,2654,2655],"Zero Trust","プライベートネットワーク","チュートリアル","i0kMFCbckmQif9X-O10srGArjMa6VemzcCDaqwHXHVY",[2658,4855,5247],{"id":2659,"title":452,"author":424,"body":2660,"category":4823,"date":4824,"description":462,"extension":1674,"image":463,"imageAlt":464,"isPublished":1069,"meta":4825,"minRead":2289,"navigation":1069,"path":383,"seo":4847,"stem":4849,"tags":4850,"updatedAt":1712,"__hash__":4854},"article\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":426,"value":2661,"toc":4793},[2662,2665,2671,2677,2681,2684,2722,2726,2732,2770,2774,2778,2792,2799,2805,2809,2813,2827,2833,2881,2910,2914,2923,2929,2933,2936,3154,3158,3204,3210,3217,3225,3276,3282,3311,3315,3319,3339,3367,3372,3414,3423,3704,3708,3754,3759,3766,3771,3775,3799,3802,3808,3814,3818,3825,3831,3834,3840,3846,3870,3877,3883,3886,3892,3896,3899,3902,3905,3911,3914,3920,3926,3932,3937,3941,3952,3959,3965,3968,3974,3977,3984,3990,3996,3999,4007,4071,4080,4135,4138,4208,4214,4228,4234,4237,4282,4288,4291,4297,4300,4306,4310,4327,4343,4349,4446,4449,4455,4466,4512,4518,4524,4536,4552,4555,4561,4565,4572,4594,4604,4702,4714,4720,4727,4733,4736,4742,4745,4751,4754,4757,4760,4790],[429,2663,2664],{},"複数のAIエージェントと協働する際、最も厄介な障害となるのが「文脈（コンテキスト）の断片化」です。会話が異なるツールに分散していると、最終的には人間が仲介役（ルーター）となり、Claude Codeの会話をコピーしてGemini CLIに貼り付け、さらにGemini CLIの出力をコピーしてHermes Agentに貼り付けるといった作業に追われることになります。このような手間は、人間の同僚が同じチームに加わることで、さらに増大します。",[429,2666,2667],{},[432,2668],{"alt":2669,"src":2670},"チャットチャンネルとアクティブなAIエージェントを表示するBuzz協働ワークスペースのユーザーインターフェース","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[429,2672,2673,2674,2676],{},"オープンソースの協働ワークスペースである",[447,2675,1107],{},"は、人間のチームとAIエージェントを単一の統合された環境にシームレスに融合させます。ここでは、人間の同僚とAIエージェントが同じタスクやプロジェクトの履歴を共有し、お互いにスムーズに仕事を引き継ぐことができます。",[471,2678,2680],{"id":2679},"blockのbuzzとは協働型aiエージェントワークスペース","Blockの「Buzz」とは？協働型AIエージェント・ワークスペース",[429,2682,2683],{},"Buzzは、Block（ジャック・ドーシーが率いる企業）が開発したオープンソースの協働ワークスペースであり、人間とAIエージェントが同じチャンネルやプロジェクトを共有して作業を行います。以下のような革新的な主要機能を備えています。",[480,2685,2686,2692,2698,2704,2710,2716],{},[483,2687,2688,2691],{},[447,2689,2690],{},"共有コンテキスト："," 人間とエージェントはチャンネルを通じて共同作業を行います。会話やプロジェクトの全履歴はチャンネル内に集約されます。",[483,2693,2694,2697],{},[447,2695,2696],{},"エージェント間通信："," エージェント同士は、異なるマシン間でさえも直接通信が可能です。あるエージェントが別のエージェントを@-メンションして仕事を引き継いだり、コードをクロスチェックしたりできます。",[483,2699,2700,2703],{},[447,2701,2702],{},"メンション駆動型アクティベーション："," エージェントは@-メンションされた時のみ作動し、それ以外はバックグラウンドで待機します。メンションされると、チャンネル内の関連文脈を読み取って作業を開始します。",[483,2705,2706,2709],{},[447,2707,2708],{},"統合されたアイデンティティ："," 人間とエージェントは同じアイデンティティ・システムを使用し、暗号鍵（クリプトグラフィック・キー）によって認証されます。",[483,2711,2712,2715],{},[447,2713,2714],{},"コマンドの委任："," 人間の同僚に対して、自分のエージェントに命令を下す権限を付与できます。これにより、チーム全体で互いのデジタルアシスタントに指示を出し、活用し合うことが可能になります。",[483,2717,2718,2721],{},[447,2719,2720],{},"セルフホスト対応："," サーバーをご自身でホストするため、データは完全に自身の管理下に置かれます。参加者の選定や運用ルールの定義も自由に行えます。",[471,2723,2725],{"id":2724},"暗号技術とnostrに支えられたbuzzのアーキテクチャ","暗号技術とNostrに支えられたBuzzのアーキテクチャ",[429,2727,2728],{},[432,2729],{"alt":2730,"src":2731},"暗号技術とNostrを搭載したBuzz協働ワークスペースのアーキテクチャ図","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[480,2733,2734,2740,2746,2752,2758,2764],{},[483,2735,2736,2739],{},[447,2737,2738],{},"Nostrリレーがサーバーとして機能："," メッセージ、ワークフロー、リポジトリ、その他のイベントは暗号署名および検証され、Nostrリレーサーバーに保存されます。Nostrプロトコルは、WebSocketおよびREST APIを介した通信をネイティブにサポートしています。",[483,2741,2742,2745],{},[447,2743,2744],{},"統合された暗号化アイデンティティ："," 人間とエージェントは、それぞれ独自の暗号鍵を使って認証を行います。このアイデンティティはクライアント側で管理され、サーバーに保存されることはありません。",[483,2747,2748,2751],{},[447,2749,2750],{},"ファーストクラスとしてのエージェント："," すべてエージェントは、独自のアイデンティティ、チャンネルメンバーシップ、および監査証跡（オーディット・トレイル）を保持します。エージェントは、Agent Communication Protocol (ACP) を介してワークスペースに接続します。",[483,2753,2754,2757],{},[447,2755,2756],{},"分散型Gitリポジトリ："," コードリポジトリはS3互換のオブジェクトストレージに保存され、タスク、プルリクエスト、コードレビューはNostrのイベントログ内で追跡されます。したがって、BuzzのGitリポジトリはGitHubではなく、Nostrリレー上でホストされます。",[483,2759,2760,2763],{},[447,2761,2762],{},"NostrクライアントとしてのBuzzアプリ："," BuzzはNostrリレーとは独立しており、リレーのURLに接続するデスクトップ\u002Fモバイル用のクライアントアプリケーションです。",[483,2765,2766,2769],{},[447,2767,2768],{},"インフラ構成："," PostgreSQLデータベースがイベント保存と全文検索を処理し、RedisがPub\u002FSubメッセージングを管理、S3互換のMinIOがメディアストレージとして使用されます。",[471,2771,2773],{"id":2772},"blockのbuzzリレーをlinux-vpsに自己ホストする方法","BlockのBuzzリレーをLinux VPSに自己ホストする方法",[884,2775,2777],{"id":2776},"_0-前提条件","0. 前提条件",[480,2779,2780,2783,2786,2789],{},[483,2781,2782],{},"Linux VPS",[483,2784,2785],{},"ドメインがサーバーを指していること",[483,2787,2788],{},"DockerおよびDocker Composeプラグイン",[483,2790,2791],{},"Cloudflareアカウント（無料プラン）",[429,2793,2794,2795,2798],{},"このガイドでは、",[440,2796,2797],{"href":363},"Cloudflare WARPでHermes Agentをプライベート ネットワークに公開する方法","を使用して、Cloudflareのプライベートネットワークの背後にあるUbuntu VPS上でNostrリレーを実行します。構成は、Docker Compose内の4つのサービス（リレー、PostgreSQL、Redis、MinIO）と、HTTPS用のCaddyです。",[460,2800],{"description":2801,"image":2613,"image-alt":2802,"label":2803,"min-read":2804,"title":2797,"to":363},"インバウンドのファイアウォールポートを開くことなく、Cloudflare WARPとZero Trustを使用してHermes Agentをグローバルに安全に公開し、アクセスする方法を学びます。","Cloudflare Zero TrustとWARPトンネルを使用してHermes Agentをプライベートネットワークに安全に公開する様子","関連ガイド","8",[884,2806,2808],{"id":2807},"_1-cloudflare-dnsとapiトークン","1. Cloudflare DNSとAPIトークン",[2167,2810,2812],{"id":2811},"cloudflare-apiトークンの作成","Cloudflare APIトークンの作成",[528,2814,2815,2822],{},[483,2816,2817,2818,2821],{},"右上のユーザーアイコンのドロップダウンメニューから、",[447,2819,2820],{},"Profile","をクリックします。",[483,2823,2824,2821],{},[447,2825,2826],{},"API Tokens",[429,2828,2829],{},[432,2830],{"alt":2831,"src":2832},"APIトークン作成メニューを表示するCloudflareのユーザープロファイルページ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[528,2834,2835,2840,2846,2866,2871,2875,2878],{"start":1073},[483,2836,2837,2821],{},[447,2838,2839],{},"Create Token",[483,2841,2842,2845],{},[447,2843,2844],{},"Edit zone DNS","のテンプレートを使用します。",[483,2847,2848,2849],{},"テンプレートを以下のように構成します：\n",[480,2850,2851,2857],{},[483,2852,2853,2856],{},[447,2854,2855],{},"Permissions",": Zone — DNS — Edit",[483,2858,2859,2862,2863],{},[447,2860,2861],{},"Zone Resources",": Include — Specific zone — ",[490,2864,2865],{},"example.com",[483,2867,2868,2821],{},[447,2869,2870],{},"Continue to summary",[483,2872,2873,2821],{},[447,2874,2839],{},[483,2876,2877],{},"生成されたトークンはページを閉じると再表示されないため、必ずコピーしておいてください。",[483,2879,2880],{},"ターミナルで生成されたトークンが動作するか確認します：",[929,2882,2884],{"className":1037,"code":2883,"language":1039,"meta":424,"style":424},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[490,2885,2886],{"__ignoreMap":424},[937,2887,2888,2891,2894,2897,2900,2903,2905,2908],{"class":939,"line":940},[937,2889,2890],{"class":1046},"curl",[937,2892,2893],{"class":951}," \"",[937,2895,2896],{"class":1050},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[937,2898,2899],{"class":951},"\"",[937,2901,2902],{"class":1050}," -H",[937,2904,2893],{"class":951},[937,2906,2907],{"class":1050},"Authorization: Bearer YOUR_TOKEN_HERE",[937,2909,1966],{"class":951},[2167,2911,2913],{"id":2912},"dnsレコード","DNSレコード",[480,2915,2916],{},[483,2917,2918,2919,2922],{},"Aレコードを作成し、プロキシステータスを「",[447,2920,2921],{},"DNS only","」（DNSのみ）に設定します。",[429,2924,2925],{},[432,2926],{"alt":2927,"src":2928},"プロキシステータスをDNSのみに設定してCloudflareダッシュボードでBuzzドメインのDNS Aレコードを設定する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-dns-a-record-configuration.webp",[884,2930,2932],{"id":2931},"_2-ubuntuへのdockerのインストール","2. UbuntuへのDockerのインストール",[429,2934,2935],{},"以下のコマンドを実行して、UbuntuにDockerをインストールします：",[929,2937,2939],{"className":1037,"code":2938,"language":1039,"meta":424,"style":424},"# 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",[490,2940,2941,2946,2974,2978,2983,3026,3030,3035,3045,3049,3054,3075,3079,3084,3095,3099,3105,3113,3118,3133,3138,3144],{"__ignoreMap":424},[937,2942,2943],{"class":939,"line":940},[937,2944,2945],{"class":1076},"# Add Docker's official GPG key and set up the Docker repository\n",[937,2947,2948,2950,2953,2956,2959,2962,2965,2968,2971],{"class":939,"line":1066},[937,2949,2890],{"class":1046},[937,2951,2952],{"class":1050}," -fsSL",[937,2954,2955],{"class":1050}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[937,2957,2958],{"class":951}," |",[937,2960,2961],{"class":1046}," sudo",[937,2963,2964],{"class":1050}," gpg",[937,2966,2967],{"class":1050}," --dearmor",[937,2969,2970],{"class":1050}," -o",[937,2972,2973],{"class":1050}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[937,2975,2976],{"class":939,"line":1073},[937,2977,1070],{"emptyLinePlaceholder":1069},[937,2979,2980],{"class":939,"line":1080},[937,2981,2982],{"class":1076},"# Add the official Docker repository\n",[937,2984,2985,2988,2990,2993,2996,2999,3002,3005,3008,3010,3012,3014,3017,3020,3023],{"class":939,"line":1934},[937,2986,2987],{"class":969},"echo",[937,2989,2893],{"class":951},[937,2991,2992],{"class":1050},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[937,2994,2995],{"class":951},"$(",[937,2997,2998],{"class":1046},"lsb_release",[937,3000,3001],{"class":1050}," -cs",[937,3003,3004],{"class":951},")",[937,3006,3007],{"class":1050}," stable",[937,3009,2899],{"class":951},[937,3011,2958],{"class":951},[937,3013,2961],{"class":1046},[937,3015,3016],{"class":1050}," tee",[937,3018,3019],{"class":1050}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[937,3021,3022],{"class":951}," >",[937,3024,3025],{"class":1050}," \u002Fdev\u002Fnull\n",[937,3027,3028],{"class":939,"line":1939},[937,3029,1070],{"emptyLinePlaceholder":1069},[937,3031,3032],{"class":939,"line":1945},[937,3033,3034],{"class":1076},"# Update package list\n",[937,3036,3037,3039,3042],{"class":939,"line":2278},[937,3038,1902],{"class":1046},[937,3040,3041],{"class":1050}," apt",[937,3043,3044],{"class":1050}," update\n",[937,3046,3047],{"class":939,"line":2289},[937,3048,1070],{"emptyLinePlaceholder":1069},[937,3050,3051],{"class":939,"line":2385},[937,3052,3053],{"class":1076},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[937,3055,3056,3058,3060,3063,3066,3069,3072],{"class":939,"line":2391},[937,3057,1902],{"class":1046},[937,3059,3041],{"class":1050},[937,3061,3062],{"class":1050}," install",[937,3064,3065],{"class":1050}," docker-ce",[937,3067,3068],{"class":1050}," docker-ce-cli",[937,3070,3071],{"class":1050}," containerd.io",[937,3073,3074],{"class":1050}," -y\n",[937,3076,3077],{"class":939,"line":2397},[937,3078,1070],{"emptyLinePlaceholder":1069},[937,3080,3081],{"class":939,"line":2402},[937,3082,3083],{"class":1076},"# Start automatically when the system boots\n",[937,3085,3086,3088,3090,3092],{"class":939,"line":2408},[937,3087,1902],{"class":1046},[937,3089,1905],{"class":1050},[937,3091,2031],{"class":1050},[937,3093,3094],{"class":1050}," docker\n",[937,3096,3097],{"class":939,"line":1705},[937,3098,1070],{"emptyLinePlaceholder":1069},[937,3100,3102],{"class":939,"line":3101},16,[937,3103,3104],{"class":1076},"# Verify docker is installed\n",[937,3106,3108,3110],{"class":939,"line":3107},17,[937,3109,1180],{"class":1046},[937,3111,3112],{"class":1050}," --version\n",[937,3114,3116],{"class":939,"line":3115},18,[937,3117,1070],{"emptyLinePlaceholder":1069},[937,3119,3121,3123,3125,3127,3130],{"class":939,"line":3120},19,[937,3122,1902],{"class":1046},[937,3124,3041],{"class":1050},[937,3126,3062],{"class":1050},[937,3128,3129],{"class":1050}," -y",[937,3131,3132],{"class":1050}," docker-compose-plugin\n",[937,3134,3136],{"class":939,"line":3135},20,[937,3137,1070],{"emptyLinePlaceholder":1069},[937,3139,3141],{"class":939,"line":3140},21,[937,3142,3143],{"class":1076},"# Verify the compose plugin is installed\n",[937,3145,3147,3149,3151],{"class":939,"line":3146},22,[937,3148,1180],{"class":1046},[937,3150,1183],{"class":1050},[937,3152,3153],{"class":1050}," version\n",[884,3155,3157],{"id":3156},"_3-クローンと設定","3. クローンと設定",[929,3159,3161],{"className":1037,"code":3160,"language":1039,"meta":424,"style":424},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[490,3162,3163,3174,3178,3186,3197],{"__ignoreMap":424},[937,3164,3165,3168,3171],{"class":939,"line":940},[937,3166,3167],{"class":1046},"git",[937,3169,3170],{"class":1050}," clone",[937,3172,3173],{"class":1050}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[937,3175,3176],{"class":939,"line":1066},[937,3177,1070],{"emptyLinePlaceholder":1069},[937,3179,3180,3183],{"class":939,"line":1073},[937,3181,3182],{"class":969},"cd",[937,3184,3185],{"class":1050}," buzz\u002Fdeploy\u002Fcompose\n",[937,3187,3188,3191,3194],{"class":939,"line":1080},[937,3189,3190],{"class":1046},"cp",[937,3192,3193],{"class":1050}," .env.example",[937,3195,3196],{"class":1050}," .env\n",[937,3198,3199,3202],{"class":939,"line":1934},[937,3200,3201],{"class":1046},"nano",[937,3203,3196],{"class":1050},[429,3205,3206,3209],{},[490,3207,3208],{},".env","ファイルをグループごとに編集します：",[480,3211,3212],{},[483,3213,3214],{},[447,3215,3216],{},"ドメイン設定:",[929,3218,3223],{"className":3219,"code":3221,"language":3222},[3220],"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",[490,3224,3221],{"__ignoreMap":424},[480,3226,3227,3237],{},[483,3228,3229,3232,3233,3236],{},[447,3230,3231],{},"オーナーキー設定:"," ",[490,3234,3235],{},"RELAY_OWNER_PUBKEY","には、64文字の16進数パブリックキー（公開鍵）を設定する必要があります。まずデスクトップアプリでアイデンティティを生成し（「Create a new identity key」→npub形式のパブリックIDをコピー）、それを16進数（Hex）に変換します。",[483,3238,3239,3242],{},[447,3240,3241],{},"シークレット（Secrets）の設定:",[480,3243,3244,3255,3269],{},[483,3245,3246,3250,3251,3254],{},[440,3247,3249],{"href":3248},"\u002Fja\u002Ftools\u002Fsecret-key-hex","オンラインツール","を使用するか、",[490,3252,3253],{},"openssl rand -hex 32","を実行（計7回実行）して、シークレットキーを生成します。",[483,3256,3257,3258,3261,3262,1523,3265,3268],{},"すべての",[490,3259,3260],{},"CHANGE_ME","プレースホルダーを置き換えます：",[490,3263,3264],{},"BUZZ_RELAY_PRIVATE_KEY",[490,3266,3267],{},"BUZZ_GIT_HOOK_HMAC_SECRET","、Postgres\u002FRedis\u002FTypesenseのパスワード、およびS3のアクセスキー\u002Fシークレットキー。",[483,3270,3271,3272,3275],{},"プレースホルダーが残っていると、コンテナが再起動ループに陥る最も一般的な原因になります。",[490,3273,3274],{},"grep CHANGE_ME .env","を実行して、変更漏れがないか確認してください。",[929,3277,3280],{"className":3278,"code":3279,"language":3222},[3220],"    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",[490,3281,3279],{"__ignoreMap":424},[480,3283,3284],{},[483,3285,3286,3289],{},[447,3287,3288],{},"その他の設定:",[480,3290,3291,3298],{},[483,3292,3293,3294,3297],{},"先ほど生成したAPIトークンを環境変数",[490,3295,3296],{},"CLOUDFLARE_API_TOKEN","として追加します。これはCaddyの自動証明書更新に必要です。",[483,3299,3300,3301,3303,3304,570,3307,3310],{},"Buzzはデフォルトで誰でも参加できるオープンな設定になっています。安全のために",[490,3302,3235],{},"を設定し、",[490,3305,3306],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[490,3308,3309],{},"BUZZ_REQUIRE_AUTH_TOKEN=true","を有効にしてください。",[884,3312,3314],{"id":3313},"_4-caddyによるhttpsの有効化","4. CaddyによるHTTPSの有効化",[2167,3316,3318],{"id":3317},"cloudflare-dnsモジュールを組み込んだカスタムcaddyイメージのビルド","Cloudflare DNSモジュールを組み込んだカスタムCaddyイメージのビルド",[480,3320,3321,3336],{},[483,3322,3323,3324,3327,3328,3331,3332,3335],{},"CaddyにCloudflareを用いたDNS-01チャレンジを設定します。DNS-01は、プラグインが",[447,3325,3326],{},"パブリックDNS","にTXTレコード",[490,3329,3330],{},"_acme-challenge.buzz.pafor.me","を書き込み、Let's Encryptがパブリックインターネット経由でそのレコードを確認してドメインの所有権を検証する仕組みです。そのため、",[490,3333,3334],{},"pafor.me","がCloudflareアカウント上でパブリックゾーンとして登録されている必要があります（Zero Trust\u002FWARPのプライベートDNS内だけに存在するプライベートホスト名では動作しません）。プライベートにしか解決できない場合、DNS-01は失敗し、別の証明書取得アプローチが必要になります。",[483,3337,3338],{},"Caddyfileに以下を追記します：",[929,3340,3342],{"className":1349,"code":3341,"language":1351,"meta":424,"style":424},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[490,3343,3344,3349,3363],{"__ignoreMap":424},[937,3345,3346],{"class":939,"line":940},[937,3347,3348],{"class":951},"{\n",[937,3350,3351,3354,3357,3360],{"class":939,"line":1066},[937,3352,3353],{"class":1050},"  acme_dns cloudflare",[937,3355,3356],{"class":951}," {",[937,3358,3359],{"class":1050},"env.CLOUDFLARE_API_TOKEN",[937,3361,3362],{"class":951},"}\n",[937,3364,3365],{"class":939,"line":1073},[937,3366,3362],{"class":951},[480,3368,3369],{},[483,3370,3371],{},"Dockerfile.caddyを以下の内容で作成します（compose.caddy.ymlから呼び出されます）：",[929,3373,3375],{"className":1349,"code":3374,"language":1351,"meta":424,"style":424},"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",[490,3376,3377,3382,3386,3391,3396,3400,3405,3409],{"__ignoreMap":424},[937,3378,3379],{"class":939,"line":940},[937,3380,3381],{"class":1050},"FROM caddy:2-builder AS builder\n",[937,3383,3384],{"class":939,"line":1066},[937,3385,1070],{"emptyLinePlaceholder":1069},[937,3387,3388],{"class":939,"line":1073},[937,3389,3390],{"class":1050},"RUN xcaddy build \\\n",[937,3392,3393],{"class":939,"line":1080},[937,3394,3395],{"class":1050},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[937,3397,3398],{"class":939,"line":1934},[937,3399,1070],{"emptyLinePlaceholder":1069},[937,3401,3402],{"class":939,"line":1939},[937,3403,3404],{"class":1050},"FROM caddy:2-alpine\n",[937,3406,3407],{"class":939,"line":1945},[937,3408,1070],{"emptyLinePlaceholder":1069},[937,3410,3411],{"class":939,"line":2278},[937,3412,3413],{"class":1050},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[480,3415,3416],{},[483,3417,3418,3419,3422],{},"Cloudflareモジュールを含むイメージを使用し、APIトークンを渡すように",[490,3420,3421],{},"compose.caddy.yml","を編集します：",[929,3424,3426],{"className":1349,"code":3425,"language":1351,"meta":424,"style":424},"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",[490,3427,3428,3435,3442,3455,3459,3466,3473,3484,3494,3504,3511,3518,3528,3535,3545,3555,3561,3573,3584,3591,3598,3605,3612,3623,3631,3639,3644,3652,3660,3668,3679,3687,3694],{"__ignoreMap":424},[937,3429,3430,3433],{"class":939,"line":940},[937,3431,3432],{"class":1361},"services",[937,3434,1376],{"class":951},[937,3436,3437,3440],{"class":939,"line":1066},[937,3438,3439],{"class":1361},"  relay",[937,3441,1376],{"class":951},[937,3443,3444,3447,3449,3452],{"class":939,"line":1073},[937,3445,3446],{"class":1361},"    ports",[937,3448,1365],{"class":951},[937,3450,3451],{"class":943}," !reset",[937,3453,3454],{"class":951}," []\n",[937,3456,3457],{"class":939,"line":1080},[937,3458,1070],{"emptyLinePlaceholder":1069},[937,3460,3461,3464],{"class":939,"line":1934},[937,3462,3463],{"class":1361},"  caddy",[937,3465,1376],{"class":951},[937,3467,3468,3471],{"class":939,"line":1939},[937,3469,3470],{"class":1361},"    build",[937,3472,1376],{"class":951},[937,3474,3475,3478,3480],{"class":939,"line":1945},[937,3476,3477],{"class":1361},"      context",[937,3479,1365],{"class":951},[937,3481,3483],{"class":3482},"sbssI"," .\n",[937,3485,3486,3489,3491],{"class":939,"line":2278},[937,3487,3488],{"class":1361},"      dockerfile",[937,3490,1365],{"class":951},[937,3492,3493],{"class":1050}," Dockerfile.caddy\n",[937,3495,3496,3499,3501],{"class":939,"line":2289},[937,3497,3498],{"class":1361},"    image",[937,3500,1365],{"class":951},[937,3502,3503],{"class":1050}," buzz-caddy:cloudflare\n",[937,3505,3506,3509],{"class":939,"line":2385},[937,3507,3508],{"class":1361},"    depends_on",[937,3510,1376],{"class":951},[937,3512,3513,3516],{"class":939,"line":2391},[937,3514,3515],{"class":1361},"      relay",[937,3517,1376],{"class":951},[937,3519,3520,3523,3525],{"class":939,"line":2397},[937,3521,3522],{"class":1361},"        condition",[937,3524,1365],{"class":951},[937,3526,3527],{"class":1050}," service_healthy\n",[937,3529,3530,3533],{"class":939,"line":2402},[937,3531,3532],{"class":1361},"    environment",[937,3534,1376],{"class":951},[937,3536,3537,3540,3542],{"class":939,"line":2408},[937,3538,3539],{"class":1361},"      BUZZ_DOMAIN",[937,3541,1365],{"class":951},[937,3543,3544],{"class":1050}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[937,3546,3547,3550,3552],{"class":939,"line":1705},[937,3548,3549],{"class":1361},"      CLOUDFLARE_API_TOKEN",[937,3551,1365],{"class":951},[937,3553,3554],{"class":1050}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[937,3556,3557,3559],{"class":939,"line":3101},[937,3558,3446],{"class":1361},[937,3560,1376],{"class":951},[937,3562,3563,3566,3568,3571],{"class":939,"line":3107},[937,3564,3565],{"class":951},"      -",[937,3567,2893],{"class":951},[937,3569,3570],{"class":1050},"${CADDY_HTTP_PORT:-80}:80",[937,3572,1966],{"class":951},[937,3574,3575,3577,3579,3582],{"class":939,"line":3115},[937,3576,3565],{"class":951},[937,3578,2893],{"class":951},[937,3580,3581],{"class":1050},"${CADDY_HTTPS_PORT:-443}:443",[937,3583,1966],{"class":951},[937,3585,3586,3589],{"class":939,"line":3120},[937,3587,3588],{"class":1361},"    volumes",[937,3590,1376],{"class":951},[937,3592,3593,3595],{"class":939,"line":3135},[937,3594,3565],{"class":951},[937,3596,3597],{"class":1050}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[937,3599,3600,3602],{"class":939,"line":3140},[937,3601,3565],{"class":951},[937,3603,3604],{"class":1050}," buzz-caddy-data:\u002Fdata\n",[937,3606,3607,3609],{"class":939,"line":3146},[937,3608,3565],{"class":951},[937,3610,3611],{"class":1050}," buzz-caddy-config:\u002Fconfig\n",[937,3613,3615,3618,3620],{"class":939,"line":3614},23,[937,3616,3617],{"class":1361},"    restart",[937,3619,1365],{"class":951},[937,3621,3622],{"class":1050}," unless-stopped\n",[937,3624,3626,3629],{"class":939,"line":3625},24,[937,3627,3628],{"class":1361},"    networks",[937,3630,1376],{"class":951},[937,3632,3634,3636],{"class":939,"line":3633},25,[937,3635,3565],{"class":951},[937,3637,3638],{"class":1050}," buzz-net\n",[937,3640,3642],{"class":939,"line":3641},26,[937,3643,1070],{"emptyLinePlaceholder":1069},[937,3645,3647,3650],{"class":939,"line":3646},27,[937,3648,3649],{"class":1361},"volumes",[937,3651,1376],{"class":951},[937,3653,3655,3658],{"class":939,"line":3654},28,[937,3656,3657],{"class":1361},"  buzz-caddy-data",[937,3659,1376],{"class":951},[937,3661,3663,3666],{"class":939,"line":3662},29,[937,3664,3665],{"class":1361},"    labels",[937,3667,1376],{"class":951},[937,3669,3671,3674,3676],{"class":939,"line":3670},30,[937,3672,3673],{"class":1361},"      com.buzz.volume",[937,3675,1365],{"class":951},[937,3677,3678],{"class":1050}," caddy-data\n",[937,3680,3682,3685],{"class":939,"line":3681},31,[937,3683,3684],{"class":1361},"  buzz-caddy-config",[937,3686,1376],{"class":951},[937,3688,3690,3692],{"class":939,"line":3689},32,[937,3691,3665],{"class":1361},[937,3693,1376],{"class":951},[937,3695,3697,3699,3701],{"class":939,"line":3696},33,[937,3698,3673],{"class":1361},[937,3700,1365],{"class":951},[937,3702,3703],{"class":1050}," caddy-config\n",[2167,3705,3707],{"id":3706},"dockerコンテナの起動","Dockerコンテナの起動",[929,3709,3711],{"className":1037,"code":3710,"language":1039,"meta":424,"style":424},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[490,3712,3713,3736,3740,3745],{"__ignoreMap":424},[937,3714,3715,3717,3719,3722,3725,3727,3730,3733],{"class":939,"line":940},[937,3716,1180],{"class":1046},[937,3718,1183],{"class":1050},[937,3720,3721],{"class":1050}," -f",[937,3723,3724],{"class":1050}," compose.yml",[937,3726,3721],{"class":1050},[937,3728,3729],{"class":1050}," compose.caddy.yml",[937,3731,3732],{"class":1050}," up",[937,3734,3735],{"class":1050}," -d\n",[937,3737,3738],{"class":939,"line":1066},[937,3739,1070],{"emptyLinePlaceholder":1069},[937,3741,3742],{"class":939,"line":1073},[937,3743,3744],{"class":1076},"#Check the Docker status\n",[937,3746,3747,3749,3751],{"class":939,"line":1080},[937,3748,1180],{"class":1046},[937,3750,1183],{"class":1050},[937,3752,3753],{"class":1050}," ps\n",[432,3755],{"src":3756,"alt":3757,"style":3758},"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;",[429,3760,3761,3762,3765],{},"ブラウザを開き、",[490,3763,3764],{},"http:\u002F\u002Fbuzz.pafor.me","にアクセスしてリレーが正常に稼働しているか確認します。",[432,3767],{"src":3768,"alt":3769,"style":3770},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-relay-running-browser-verification.webp","自己ホストしたBlockのBuzzリレーからの正常な応答を表示するブラウザの検証画面","max-width: 500px; width: 100%; height: auto;",[884,3772,3774],{"id":3773},"ステップ-5初日からの自動バックアップ設定","ステップ 5：初日からの自動バックアップ設定",[929,3776,3778],{"className":1037,"code":3777,"language":1039,"meta":424,"style":424},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[490,3779,3780,3791],{"__ignoreMap":424},[937,3781,3782,3785,3788],{"class":939,"line":940},[937,3783,3784],{"class":1046},"mkdir",[937,3786,3787],{"class":1050}," -p",[937,3789,3790],{"class":1050}," \u002Fbuzz_backups\n",[937,3792,3793,3796],{"class":939,"line":1066},[937,3794,3795],{"class":1046},"crontab",[937,3797,3798],{"class":1050}," -e\n",[429,3800,3801],{},"毎晩データベースのダンプを出力するcronジョブを設定します：",[929,3803,3806],{"className":3804,"code":3805,"language":3222},[3220],"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",[490,3807,3805],{"__ignoreMap":424},[429,3809,3810,3811,3813],{},"注意：",[490,3812,3264],{},"は恒久的なものとして厳重に管理してください。このキーで署名されたイベントは、キーが変更されると検証に失敗します。データベースをリストアしても、新しい鍵と組み合わせた場合は同じリレーとして認識されません。",[471,3815,3817],{"id":3816},"buzzデスクトップクライアントとnostrアイデンティティのセットアップ","BuzzデスクトップクライアントとNostrアイデンティティのセットアップ",[429,3819,3820,3824],{},[440,3821,3822],{"href":3822,"rel":3823},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[444]," からBuzzデスクトップアプリをダウンロードして起動します。プロファイルの設定を進め、「Join or create a community」のページまで進みます。",[429,3826,3827],{},[432,3828],{"alt":3829,"src":3830},"コミュニティへの参加または作成を行うBuzzデスクトップクライアントの初期セットアップ画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[429,3832,3833],{},"「Join a community」をクリックし、ご自身のパブリックキー（公開鍵）をコピーします。",[429,3835,3836],{},[432,3837],{"alt":3838,"src":3839},"コミュニティに参加する前に公開鍵アイデンティティを表示する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",[429,3841,3842,3845],{},[447,3843,3844],{},"VPS上","で以下のコマンドを実行し、自身を最初のメンバーとして追加します：",[929,3847,3849],{"className":1037,"code":3848,"language":1039,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[490,3850,3851],{"__ignoreMap":424},[937,3852,3853,3855,3857,3859,3861,3863,3865,3867],{"class":939,"line":940},[937,3854,1180],{"class":1046},[937,3856,1183],{"class":1050},[937,3858,1186],{"class":1050},[937,3860,1189],{"class":1050},[937,3862,1192],{"class":1050},[937,3864,1195],{"class":1050},[937,3866,1198],{"class":1050},[937,3868,3869],{"class":1050}," npub1yourkeyhere\n",[429,3871,3872,3873,3876],{},"コミュニティURLに",[490,3874,3875],{},"wss:\u002F\u002Fbuzz.pafor.me","を入力し、「Next」をクリックします。",[429,3878,3879],{},[432,3880],{"alt":3881,"src":3882},"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",[429,3884,3885],{},"表示名を入力し、「Next」ボタンをクリックします。",[429,3887,3888],{},[432,3889],{"alt":3890,"src":3891},"表示名を入力する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",[884,3893,3895],{"id":3894},"チャンネルとaiエージェント","チャンネルとAIエージェント",[429,3897,3898],{},"チャンネルはタスクやプロジェクトごとのグループです。タスクごとにチャンネルを作成し、人間とAIエージェントをそこに参加させます。",[429,3900,3901],{},"チャンネル内のすべてのアクティビティは自動的に共有されるため、各メンバーに個別に指示を繰り返す必要はありません。すべてのエージェントは「@」を使ってメンションでき、該当のメッセージ履歴を読み込みます。また、エージェント同士が互いにメンションし合うことも可能です。",[429,3903,3904],{},"事前に設定されたエージェントにダイレクトメッセージ（DM）を送信してみましょう",[429,3906,3907],{},[432,3908],{"alt":3909,"src":3910},"Buzz協働デスクトップクライアントでAIエージェントにダイレクトメッセージを送信する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[429,3912,3913],{},"チャンネルを作成し、いくつかのエージェントを追加してみましょう",[429,3915,3916],{},[432,3917],{"alt":3918,"src":3919},"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",[429,3921,3922],{},[432,3923],{"alt":3924,"src":3925},"新しく作成したチャンネルに人間のメンバーと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",[429,3927,3928],{},[432,3929],{"alt":3930,"src":3931},"統合されたチャット履歴とプロジェクトタスクを表示するアクティブなチャンネル画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[432,3933],{"src":3934,"alt":3935,"style":3936},"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;",[884,3938,3940],{"id":3939},"エージェントランタイムの有効化","エージェント・ランタイムの有効化",[429,3942,3943,3944,3947,3948,3951],{},"プリセットされたランタイムは、",[490,3945,3946],{},"~\u002F.local\u002Fbin","などの標準ディレクトリにある起動用バイナリ（例：",[490,3949,3950],{},"hermes-acp","）の自動検出に依存しています。非標準の場所にツールがインストールされている場合、Buzzはそれを検出できません。",[429,3953,3954,3955,3958],{},"Kimi Codeの場合、エージェントIDはkimiであり、Buzzは",[490,3956,3957],{},"~\u002F.local\u002Fbin\u002Fkimi","にあるバイナリを探します。以下のようにシンボリックリンクを作成することで解決できます。",[929,3960,3963],{"className":3961,"code":3962,"language":3222},[3220],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[490,3964,3962],{"__ignoreMap":424},[429,3966,3967],{},"これにより、Kimi Codeがエージェントのランタイム一覧に表示されます。",[429,3969,3970],{},[432,3971],{"alt":3972,"src":3973},"Kimiを含む設定済みのAIエージェントランタイムを表示するBuzzアプリの設定画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-agent-runtimes-list.webp",[884,3975,3976],{"id":3976},"プロジェクトとリポジトリ",[429,3978,3979,3980,3983],{},"まず、Settings → Experimentsで「",[447,3981,3982],{},"Projects","」機能を有効化します：",[429,3985,3986],{},[432,3987],{"alt":3988,"src":3989},"Buzzの設定タブで実験的機能である「Projects」を有効にする様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[429,3991,3992,3993,3995],{},"現時点では、プロジェクトの作成は",[490,3994,1210],{},"を介して行う必要があります（将来のリリースではUIから直接作成可能になる予定です）。",[2167,3997,3998],{"id":3998},"buzz-cliのインストール",[429,4000,4001,4003,4004,4006],{},[447,4002,3844],{},"で以下のコマンドを実行し、",[490,4005,1210],{},"をインストールします：",[929,4008,4010],{"className":1037,"code":4009,"language":1039,"meta":424,"style":424},"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",[490,4011,4012,4023,4030,4043],{"__ignoreMap":424},[937,4013,4014,4016,4018,4020],{"class":939,"line":940},[937,4015,1902],{"class":1046},[937,4017,3041],{"class":1050},[937,4019,3062],{"class":1050},[937,4021,4022],{"class":1050}," cargo\n",[937,4024,4025,4027],{"class":939,"line":1066},[937,4026,3182],{"class":969},[937,4028,4029],{"class":1050}," ~\u002Fbuzz\n",[937,4031,4032,4035,4037,4040],{"class":939,"line":1073},[937,4033,4034],{"class":1046},"cargo",[937,4036,3062],{"class":1050},[937,4038,4039],{"class":1050}," --path",[937,4041,4042],{"class":1050}," crates\u002Fbuzz-cli\n",[937,4044,4045,4047,4050,4053,4056,4059,4062,4065,4068],{"class":939,"line":1080},[937,4046,2987],{"class":969},[937,4048,4049],{"class":951}," '",[937,4051,4052],{"class":1050},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[937,4054,4055],{"class":951},"'",[937,4057,4058],{"class":951}," >>",[937,4060,4061],{"class":1050}," ~\u002F.bashrc",[937,4063,4064],{"class":951}," &&",[937,4066,4067],{"class":969}," source",[937,4069,4070],{"class":1050}," ~\u002F.bashrc\n",[429,4072,4073,4074,4076,4077,4079],{},"オンラインツールまたは",[490,4075,1210],{},"を使用して公開鍵と秘密鍵のペアを生成します。このペアは、Nostrリレーにおける",[490,4078,1210],{},"のアイデンティティとなります。",[929,4081,4083],{"className":1037,"code":4082,"language":1039,"meta":424,"style":424},"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",[490,4084,4085,4107,4111,4116],{"__ignoreMap":424},[937,4086,4087,4089,4092,4095,4098,4101,4104],{"class":939,"line":940},[937,4088,1180],{"class":1046},[937,4090,4091],{"class":1050}," run",[937,4093,4094],{"class":1050}," --rm",[937,4096,4097],{"class":1050}," --entrypoint",[937,4099,4100],{"class":1050}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[937,4102,4103],{"class":1050}," ghcr.io\u002Fblock\u002Fbuzz:main",[937,4105,4106],{"class":1050}," generate-key\n",[937,4108,4109],{"class":939,"line":1066},[937,4110,1070],{"emptyLinePlaceholder":1069},[937,4112,4113],{"class":939,"line":1073},[937,4114,4115],{"class":1076},"# Use the generated Public Key\n",[937,4117,4118,4120,4122,4124,4126,4128,4130,4132],{"class":939,"line":1080},[937,4119,1180],{"class":1046},[937,4121,1183],{"class":1050},[937,4123,1186],{"class":1050},[937,4125,1189],{"class":1050},[937,4127,1192],{"class":1050},[937,4129,1195],{"class":1050},[937,4131,1198],{"class":1050},[937,4133,4134],{"class":1050}," generated_Public_key\n",[429,4136,4137],{},"CLIの設定を行います：",[929,4139,4141],{"className":1037,"code":4140,"language":1039,"meta":424,"style":424},"# 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",[490,4142,4143,4148,4179,4183],{"__ignoreMap":424},[937,4144,4145],{"class":939,"line":940},[937,4146,4147],{"class":1076},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[937,4149,4150,4152,4154,4157,4159,4162,4165,4168,4171,4174,4176],{"class":939,"line":1066},[937,4151,2987],{"class":969},[937,4153,4049],{"class":951},[937,4155,4156],{"class":1050},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[937,4158,4055],{"class":951},[937,4160,4161],{"class":951},"  >>",[937,4163,4164],{"class":1050}," \u002Fhome\u002F",[937,4166,4167],{"class":951},"\u003C",[937,4169,4170],{"class":1050},"use",[937,4172,4173],{"class":947},"r",[937,4175,1256],{"class":951},[937,4177,4178],{"class":1050},"\u002F.bashrc\n",[937,4180,4181],{"class":939,"line":1073},[937,4182,1070],{"emptyLinePlaceholder":1069},[937,4184,4185,4187,4189,4192,4194,4196,4198,4200,4202,4204,4206],{"class":939,"line":1080},[937,4186,2987],{"class":969},[937,4188,4049],{"class":951},[937,4190,4191],{"class":1050},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[937,4193,4055],{"class":951},[937,4195,4161],{"class":951},[937,4197,4164],{"class":1050},[937,4199,4167],{"class":951},[937,4201,4170],{"class":1050},[937,4203,4173],{"class":947},[937,4205,1256],{"class":951},[937,4207,4178],{"class":1050},[429,4209,4210,4211,4213],{},"以下のコマンドを実行して、",[490,4212,1210],{},"が正常に設定されているか確認します：",[929,4215,4217],{"className":1037,"code":4216,"language":1039,"meta":424,"style":424},"buzz channels list\n",[490,4218,4219],{"__ignoreMap":424},[937,4220,4221,4223,4225],{"class":939,"line":940},[937,4222,1236],{"class":1046},[937,4224,1239],{"class":1050},[937,4226,4227],{"class":1050}," list\n",[429,4229,4230],{},[432,4231],{"alt":4232,"src":4233},"アクティブなチャンネルを一覧表示して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",[2167,4235,4236],{"id":4236},"buzz-cliによるプロジェクト作成",[929,4238,4240],{"className":1037,"code":4239,"language":1039,"meta":424,"style":424},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[490,4241,4242,4247],{"__ignoreMap":424},[937,4243,4244],{"class":939,"line":940},[937,4245,4246],{"class":1076},"# --channel refers to the UUID of the channel\n",[937,4248,4249,4251,4254,4257,4260,4263,4266,4268,4271,4273,4275,4277,4280],{"class":939,"line":1066},[937,4250,1236],{"class":1046},[937,4252,4253],{"class":1050}," repos",[937,4255,4256],{"class":1050}," create",[937,4258,4259],{"class":1050}," --id",[937,4261,4262],{"class":1050}," TestKOA",[937,4264,4265],{"class":1050}," --name",[937,4267,4049],{"class":951},[937,4269,4270],{"class":1050},"Display Name",[937,4272,4055],{"class":951},[937,4274,1244],{"class":1050},[937,4276,2893],{"class":951},[937,4278,4279],{"class":1050},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[937,4281,1966],{"class":951},[429,4283,4284,4285,4287],{},"プロジェクトは作成者（オーナー）しか削除できません。",[490,4286,1210],{},"で作成された「Display Name」プロジェクトは、現在のCLIに削除コマンドが実装されていないため、この方法では削除できません。",[429,4289,4290],{},"Buzzデスクトップアプリに戻り、プロジェクトが作成されていることを確認します。",[429,4292,4293],{},[432,4294],{"alt":4295,"src":4296},"プロジェクトの正常な作成を確認するBuzzデスクトップアプリのプロジェクト画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[429,4298,4299],{},"リポジトリがProjectsビューに追加されると、それ以降はUI右上隅の「+」ボタンから簡単にリポジトリを追加できるようになります。",[429,4301,4302],{},[432,4303],{"alt":4304,"src":4305},"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",[2167,4307,4309],{"id":4308},"既存のgitリポジトリの登録","既存のGitリポジトリの登録",[429,4311,4312,4313,4316,4317,4320,4321,4326],{},"Gitリポジトリが存在するマシンに",[490,4314,4315],{},"git-credential-nostr","をインストールします。これには",[447,4318,4319],{},"Git 2.46以上","とRustのビルド環境（toolchain）が必要です。詳細についてはこちらの",[440,4322,4325],{"href":4323,"rel":4324},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[444],"Readme","を参照してください。",[929,4328,4330],{"className":1037,"code":4329,"language":1039,"meta":424,"style":424},"cargo install --path crates\u002Fgit-credential-nostr\n",[490,4331,4332],{"__ignoreMap":424},[937,4333,4334,4336,4338,4340],{"class":939,"line":940},[937,4335,4034],{"class":1046},[937,4337,3062],{"class":1050},[937,4339,4039],{"class":1050},[937,4341,4342],{"class":1050}," crates\u002Fgit-credential-nostr\n",[429,4344,4345,4346,4348],{},"Buzzリレーでの認証用に",[490,4347,4315],{},"を設定します：",[929,4350,4352],{"className":1037,"code":4351,"language":1039,"meta":424,"style":424},"# 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",[490,4353,4354,4359,4375,4388,4392,4397,4406,4433],{"__ignoreMap":424},[937,4355,4356],{"class":939,"line":940},[937,4357,4358],{"class":1076},"# 1. Register the helper and enable per-path credentials.\n",[937,4360,4361,4363,4366,4369,4372],{"class":939,"line":1066},[937,4362,3167],{"class":1046},[937,4364,4365],{"class":1050}," config",[937,4367,4368],{"class":1050}," --global",[937,4370,4371],{"class":1050}," credential.helper",[937,4373,4374],{"class":1050}," nostr\n",[937,4376,4377,4379,4381,4383,4386],{"class":939,"line":1073},[937,4378,3167],{"class":1046},[937,4380,4365],{"class":1050},[937,4382,4368],{"class":1050},[937,4384,4385],{"class":1050}," credential.useHttpPath",[937,4387,1387],{"class":951},[937,4389,4390],{"class":939,"line":1080},[937,4391,1070],{"emptyLinePlaceholder":1069},[937,4393,4394],{"class":939,"line":1934},[937,4395,4396],{"class":1076},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[937,4398,4399,4401,4403],{"class":939,"line":1939},[937,4400,3784],{"class":1046},[937,4402,3787],{"class":1050},[937,4404,4405],{"class":1050}," ~\u002F.nostr\n",[937,4407,4408,4410,4412,4415,4417,4419,4422,4424,4427,4430],{"class":939,"line":1945},[937,4409,2987],{"class":969},[937,4411,2893],{"class":951},[937,4413,4414],{"class":1050},"nsec1...",[937,4416,2899],{"class":951},[937,4418,3022],{"class":951},[937,4420,4421],{"class":1050}," ~\u002F.nostr\u002Fkey",[937,4423,4064],{"class":951},[937,4425,4426],{"class":1046}," chmod",[937,4428,4429],{"class":3482}," 600",[937,4431,4432],{"class":1050}," ~\u002F.nostr\u002Fkey\n",[937,4434,4435,4437,4439,4441,4444],{"class":939,"line":2278},[937,4436,3167],{"class":1046},[937,4438,4365],{"class":1050},[937,4440,4368],{"class":1050},[937,4442,4443],{"class":1050}," nostr.keyfile",[937,4445,4432],{"class":1050},[429,4447,4448],{},"Buzzリレー上にリポジトリを作成します：",[929,4450,4453],{"className":4451,"code":4452,"language":3222},[3220],"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",[490,4454,4452],{"__ignoreMap":424},[429,4456,4457,4458,4461,4462,4465],{},"最初の",[490,4459,4460],{},"git push","時に、",[490,4463,4464],{},"remote: missing Authorization header","（認証ヘッダー不足）のエラーが発生します。これを解決するには、リポジトリIDをBuzzのチャンネルに関連付ける（バインドする）必要があります。チャンネルのメンバーシップに基づいてGitの書き込み権限（ACL）が制御されるためです。",[929,4467,4469],{"className":1037,"code":4468,"language":1039,"meta":424,"style":424},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[490,4470,4471,4496,4500,4505],{"__ignoreMap":424},[937,4472,4473,4475,4477,4480,4482,4485,4487,4489,4491,4493],{"class":939,"line":940},[937,4474,1236],{"class":1046},[937,4476,4253],{"class":1050},[937,4478,4479],{"class":1050}," bind",[937,4481,4259],{"class":1050},[937,4483,4484],{"class":1050}," koa-email-routing",[937,4486,1244],{"class":1050},[937,4488,1247],{"class":951},[937,4490,1250],{"class":1050},[937,4492,1253],{"class":947},[937,4494,4495],{"class":951},">\n",[937,4497,4498],{"class":939,"line":1066},[937,4499,1070],{"emptyLinePlaceholder":1069},[937,4501,4502],{"class":939,"line":1073},[937,4503,4504],{"class":1076},"# push the code again\n",[937,4506,4507,4509],{"class":939,"line":1080},[937,4508,3167],{"class":1046},[937,4510,4511],{"class":1050}," push\n",[429,4513,4514,4515,4517],{},"Buzzデスクトップアプリでプロジェクトを確認した際、以下のようにGitの読み込みに失敗する場合があります。これはデスクトップアプリが",[447,4516,4319],{},"を要求するためであり、アプリを直接起動した際に古いバージョンのGitが検出されていることが原因です。",[429,4519,4520],{},[432,4521],{"alt":4522,"src":4523},"ローカルのGitバージョンが2.46未満であるためにBuzzクライアントで発生した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",[429,4525,4526,4527,4530,4531,4326],{},"シェルの設定ファイル等で、",[490,4528,4529],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\"","のようにPATH環境変数をエクスポートし、シェル経由でBuzzアプリを起動してください。詳細についてはこちらの",[440,4532,4535],{"href":4533,"rel":4534},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[444],"Issue",[929,4537,4539],{"className":1037,"code":4538,"language":1039,"meta":424,"style":424},"open -a Buzz\n",[490,4540,4541],{"__ignoreMap":424},[937,4542,4543,4546,4549],{"class":939,"line":940},[937,4544,4545],{"class":1046},"open",[937,4547,4548],{"class":1050}," -a",[937,4550,4551],{"class":1050}," Buzz\n",[429,4553,4554],{},"Buzzアプリで「Projects」を再度確認すると、無事にリポジトリの詳細が読み込まれているはずです。",[429,4556,4557],{},[432,4558],{"alt":4559,"src":4560},"Gitリポジトリの詳細とコミットログが正常に読み込まれた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",[471,4562,4564],{"id":4563},"qrコードによるbuzzモバイルアプリとの同期","QRコードによるBuzzモバイルアプリとの同期",[429,4566,4567,4568,4571],{},"BuzzモバイルアプリとのペアリングはHTTPSプロトコルのみを受け付けます。また、VPS上ではデフォルトで",[490,4569,4570],{},"buzz-pair-relay","が起動していません。",[929,4573,4575],{"className":1037,"code":4574,"language":1039,"meta":424,"style":424},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[490,4576,4577,4583],{"__ignoreMap":424},[937,4578,4579,4581],{"class":939,"line":940},[937,4580,3182],{"class":969},[937,4582,4029],{"class":1050},[937,4584,4585,4587,4589,4591],{"class":939,"line":1066},[937,4586,4034],{"class":1046},[937,4588,3062],{"class":1050},[937,4590,4039],{"class":1050},[937,4592,4593],{"class":1050}," crates\u002Fbuzz-pair-relay\n",[429,4595,4596,4597,4600,4601,4603],{},"以下を",[490,4598,4599],{},"compose.yml","に追加し、",[490,4602,4570],{},"サービスを定義します：",[929,4605,4607],{"className":1349,"code":4606,"language":1351,"meta":424,"style":424},"  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",[490,4608,4609,4616,4625,4645,4651,4661,4667,4678,4686,4692],{"__ignoreMap":424},[937,4610,4611,4614],{"class":939,"line":940},[937,4612,4613],{"class":1361},"  pair",[937,4615,1376],{"class":951},[937,4617,4618,4620,4622],{"class":939,"line":1066},[937,4619,3498],{"class":1361},[937,4621,1365],{"class":951},[937,4623,4624],{"class":1050}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[937,4626,4627,4630,4632,4635,4637,4640,4642],{"class":939,"line":1073},[937,4628,4629],{"class":1361},"    entrypoint",[937,4631,1365],{"class":951},[937,4633,4634],{"class":951}," [",[937,4636,2899],{"class":951},[937,4638,4639],{"class":1050},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[937,4641,2899],{"class":951},[937,4643,4644],{"class":951},"]\n",[937,4646,4647,4649],{"class":939,"line":1080},[937,4648,3532],{"class":1361},[937,4650,1376],{"class":951},[937,4652,4653,4656,4658],{"class":939,"line":1934},[937,4654,4655],{"class":1361},"      BUZZ_PAIR_RELAY_BIND_ADDR",[937,4657,1365],{"class":951},[937,4659,4660],{"class":1050}," 0.0.0.0:5000\n",[937,4662,4663,4665],{"class":939,"line":1939},[937,4664,3446],{"class":1361},[937,4666,1376],{"class":951},[937,4668,4669,4671,4673,4676],{"class":939,"line":1945},[937,4670,3565],{"class":951},[937,4672,2893],{"class":951},[937,4674,4675],{"class":1050},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[937,4677,1966],{"class":951},[937,4679,4680,4682,4684],{"class":939,"line":2278},[937,4681,3617],{"class":1361},[937,4683,1365],{"class":951},[937,4685,3622],{"class":1050},[937,4687,4688,4690],{"class":939,"line":2289},[937,4689,3628],{"class":1361},[937,4691,1376],{"class":951},[937,4693,4694,4697,4700],{"class":939,"line":2385},[937,4695,4696],{"class":951},"      [",[937,4698,4699],{"class":1050},"buzz-net",[937,4701,4644],{"class":951},[429,4703,4704,4706,4707,570,4710,4713],{},[490,4705,3208],{},"ファイルに",[490,4708,4709],{},"BUZZ_PAIRING_RELAY_URL",[490,4711,4712],{},"BUZZ_PAIR_RELAY_PORT","を追記します：",[929,4715,4718],{"className":4716,"code":4717,"language":3222},[3220],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[490,4719,4717],{"__ignoreMap":424},[429,4721,4722,4723,4726],{},"Buzzデスクトップの「Settings」から「",[447,4724,4725],{},"Mobile","」を開きます：",[429,4728,4729],{},[432,4730],{"alt":4731,"src":4732},"モバイルデバイスの設定タブを表示するBuzzアプリの設定ダイアログ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[429,4734,4735],{},"「Start pairing」をクリックするとQRコードが生成されます。モバイルデバイスのBuzzアプリでこのQRコードをスキャンし、「Code Match」をクリックするとペアリングが完了します。",[429,4737,4738],{},[432,4739],{"alt":4740,"src":4741},"Buzzモバイルアプリとの同期用にデスクトップクライアントで安全なペアリングQRコードを生成する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[429,4743,4744],{},"モバイルアプリ上のエージェントは、デスクトップアプリ側で対応するエージェントが稼働している場合のみ利用可能です。エージェントを動作させるには、デスクトップマシンを起動しておく必要があります。",[429,4746,4747],{},[432,4748],{"alt":4749,"src":4750},"同期されたアクティブなAIアシスタントエージェントを表示するBuzzモバイルアプリ画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-mobile-app-active-agents.webp",[471,4752,4753],{"id":4753},"おわりに",[429,4755,4756],{},"BuzzはいくつかのバグやUIの制限があり、大規模な本番環境への導入には時期尚早ですが、少人数のチームや個人の開発者にとっては非常に刺激的なツールです。人間とAIが真に同僚として協働する、自律的な「AIネイティブ」な未来のワークスペースをいち早く体験することができます。",[471,4758,4759],{"id":4759},"参考資料",[480,4761,4762,4769,4776,4783],{},[483,4763,4764],{},[440,4765,4768],{"href":4766,"rel":4767},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[444],"Buzz releases",[483,4770,4771],{},[440,4772,4775],{"href":4773,"rel":4774},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[444],"Introducing Buzz",[483,4777,4778],{},[440,4779,4782],{"href":4780,"rel":4781},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[444],"What is buzz",[483,4784,4785],{},[440,4786,4789],{"href":4787,"rel":4788},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[444],"How to self-host Buzz (Miget)",[1649,4791,4792],{},"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":424,"searchDepth":1066,"depth":1073,"links":4794},[4795,4796,4797,4811,4820,4821,4822],{"id":2679,"depth":1066,"text":2680},{"id":2724,"depth":1066,"text":2725},{"id":2772,"depth":1066,"text":2773,"children":4798},[4799,4800,4804,4805,4806,4810],{"id":2776,"depth":1073,"text":2777},{"id":2807,"depth":1073,"text":2808,"children":4801},[4802,4803],{"id":2811,"depth":1080,"text":2812},{"id":2912,"depth":1080,"text":2913},{"id":2931,"depth":1073,"text":2932},{"id":3156,"depth":1073,"text":3157},{"id":3313,"depth":1073,"text":3314,"children":4807},[4808,4809],{"id":3317,"depth":1080,"text":3318},{"id":3706,"depth":1080,"text":3707},{"id":3773,"depth":1073,"text":3774},{"id":3816,"depth":1066,"text":3817,"children":4812},[4813,4814,4815],{"id":3894,"depth":1073,"text":3895},{"id":3939,"depth":1073,"text":3940},{"id":3976,"depth":1073,"text":3976,"children":4816},[4817,4818,4819],{"id":3998,"depth":1080,"text":3998},{"id":4236,"depth":1080,"text":4236},{"id":4308,"depth":1080,"text":4309},{"id":4563,"depth":1066,"text":4564},{"id":4753,"depth":1066,"text":4753},{"id":4759,"depth":1066,"text":4759},[1670,1669,1236],"2026-09-08",{"schemaOrg":4826,"robots":1703,"sitemap":4845},[4827,4828],{"@type":1680,"headline":452,"description":462,"image":463},{"@type":1682,"name":452,"description":462,"image":463,"step":4829},[4830,4833,4836,4839,4842],{"@type":1685,"name":4831,"text":4832},"フェーズ1：Cloudflareのセットアップ","Cloudflare APIトークンを作成し、DNS設定を構成します。",{"@type":1685,"name":4834,"text":4835},"フェーズ2：Dockerのインストール","Ubuntu VPSにDocker Engineをセットアップしてインストールします。",{"@type":1685,"name":4837,"text":4838},"フェーズ3：クローンと構成","リポジトリをクローンし、compose环境変数を構成します。",{"@type":1685,"name":4840,"text":4841},"フェーズ4：Caddyの統合","Cloudflare DNSチャレンジモジュールを使用してカスタムCaddyをビルドします。",{"@type":1685,"name":4843,"text":4844},"フェーズ5：自動バックアップ","PostgreSQLを自動的にバックアップするためのcronジョブを設定します。",{"lastmod":4846},"2026-09-03",{"title":4848,"description":462,"ogTitle":452,"ogDescription":462,"twitterTitle":452,"twitterDescription":462},"BlockのAI共有スペース「Buzz」をUbuntu VPSに自己ホストする方法","ja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[1710,4851,1107,4852,4853],"Docker","Caddy","Cloudflare","EE4T-Z1iblnIGKFh2wTTdhZWcCSPZKlWllLPKPhdosU",{"id":4856,"title":4857,"author":424,"body":4858,"category":5231,"date":5232,"description":5233,"extension":1674,"image":5234,"imageAlt":5235,"isPublished":1069,"meta":5236,"minRead":1066,"navigation":1069,"path":351,"seo":5240,"stem":5241,"tags":5242,"updatedAt":1712,"__hash__":5246},"article\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md","AIエージェントのスキルとは？その基本概念から作成方法、再利用可能なワークフローの構築までを徹底解説",{"type":426,"value":4859,"toc":5221},[4860,4864,4875,4886,4947,4952,4956,4959,4968,4974,4978,5033,5044,5050,5053,5110,5114,5117,5124,5127,5138,5142,5187,5190,5206,5208,5215,5218],[471,4861,4863],{"id":4862},"aiエージェントのスキルagent-skillとは","AIエージェントのスキル（Agent Skill）とは？",[429,4865,4866,4867,4870,4871,4874],{},"エージェントのスキル（agent skill）とは、再利用可能な ",[447,4868,4869],{},"指示（インストラクション）のセット","、すなわち、エージェントに特定のタスクを高いクオリティで実行させるための「標準化された手順書」です。これは ",[490,4872,4873],{},"SKILL.md"," という単一の Markdown ファイルで構成され、タスクに必要なその他のファイル（参照ドキュメント、テンプレート、実行可能なスクリプトなど）をひとまとめにパッケージ化することができます。",[429,4876,4877,4878,4885],{},"例として、計画や設計を問い詰めるスキルである ",[440,4879,4882],{"href":4880,"rel":4881},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[444],[490,4883,4884],{},"grill-me"," を見てみましょう：",[929,4887,4889],{"className":2210,"code":4888,"language":2212,"meta":424,"style":424},"---\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",[490,4890,4891,4896,4906,4916,4920,4924,4929,4933,4938,4942],{"__ignoreMap":424},[937,4892,4893],{"class":939,"line":940},[937,4894,4895],{"class":1046},"---\n",[937,4897,4898,4901,4903],{"class":939,"line":1066},[937,4899,4900],{"class":1361},"name",[937,4902,1365],{"class":951},[937,4904,4905],{"class":1050}," grill-me\n",[937,4907,4908,4911,4913],{"class":939,"line":1073},[937,4909,4910],{"class":1361},"description",[937,4912,1365],{"class":951},[937,4914,4915],{"class":1050}," 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",[937,4917,4918],{"class":939,"line":1080},[937,4919,4895],{"class":1046},[937,4921,4922],{"class":939,"line":1934},[937,4923,1070],{"emptyLinePlaceholder":1069},[937,4925,4926],{"class":939,"line":1939},[937,4927,4928],{"class":1050},"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",[937,4930,4931],{"class":939,"line":1945},[937,4932,1070],{"emptyLinePlaceholder":1069},[937,4934,4935],{"class":939,"line":2278},[937,4936,4937],{"class":1050},"Ask the questions one at a time.\n",[937,4939,4940],{"class":939,"line":2289},[937,4941,1070],{"emptyLinePlaceholder":1069},[937,4943,4944],{"class":939,"line":2385},[937,4945,4946],{"class":1050},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[429,4948,4949,4951],{},[490,4950,4873],{}," ファイルには、少量のメタデータブロックと、指示の本文が含まれています。メタデータにはスキルの名前（name）と説明（description）が記述されており、AI エージェントは起動時にこれを読み込みます。",[471,4953,4955],{"id":4954},"aiエージェントのスキルはどう機能するか段階的開示progressive-disclosure","AIエージェントのスキルはどう機能するか：段階的開示（Progressive Disclosure）",[429,4957,4958],{},"初期状態では、スキルの名前と説明だけがコンテキスト（Context）に読み込まれます。ユーザーの要求がスキルの説明文と一致したときに初めて、指示の本文全体が同じコンテキストに読み込まれます。",[429,4960,4961,4962,4967],{},"実際の開発フローにおいて、この ",[440,4963,4965],{"href":4880,"rel":4964},[444],[490,4966,4884],{}," スキルがどのように使われるかを見てみましょう。",[429,4969,4970],{},[432,4971],{"alt":4972,"src":4973},"AIエージェントスキルの実行における段階的開示（プログレッシブ・ディスクロージャー）メカニズムを示すシーケンス図","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",[884,4975,4977],{"id":4976},"ステップバイステップ","ステップ・バイ・ステップ",[528,4979,4980,4986,4992,4998,5004,5017,5027],{},[483,4981,4982,4985],{},[447,4983,4984],{},"リクエスト（Request）"," — ユーザーがエージェントに「私のワークフローの設計を問い詰めて、ストレステストしてほしい（grill me on my workflow design）」と依頼します。",[483,4987,4988,4991],{},[447,4989,4990],{},"選択用プロンプト（Selection prompt）"," — ユーザーのリクエストと、利用可能なすべてのスキルの説明文が LLM に送信されます。",[483,4993,4994,4997],{},[447,4995,4996],{},"LLM による選択"," — LLM がリクエストと各スキルの説明を比較し、一致するスキルを選択して返します。",[483,4999,5000,5003],{},[447,5001,5002],{},"確認（Confirmation）"," — エージェントが提案されたスキルをユーザーに提示し、ユーザーがそれを確認（または却下・調整）します。",[483,5005,5006,5009,5010,5013,5014,5016],{},[447,5007,5008],{},"指示のロード"," — エージェントは、確認されたスキルの ",[904,5011,5012],{},"完全な"," 指示（",[490,5015,4873],{}," の本文）を取得します。",[483,5018,5019,5022,5023,5026],{},[447,5020,5021],{},"実行用プロンプト（Execution prompt）"," — ユーザーのリクエストに、",[447,5024,5025],{},"選択されたスキルの具体的な指示","を加えたものが LLM に送信されます。",[483,5028,5029,5032],{},[447,5030,5031],{},"レスポンス"," — LLM が、問い詰めのための最初の質問を出力します。",[429,5034,5035,5036,5043],{},"次に、参照ドキュメントを持つスキルがどのように使われるかを、",[440,5037,5040],{"href":5038,"rel":5039},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[444],[490,5041,5042],{},"excalidraw-diagram-skill"," を例に説明します：",[429,5045,5046],{},[432,5047],{"alt":5048,"src":5049},"外部の参照ファイルやテンプレートを読み込んでスキルを実行する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",[884,5051,4977],{"id":5052},"ステップバイステップ-1",[528,5054,5055,5060,5066,5075,5081,5092,5101],{},[483,5056,5057,5059],{},[447,5058,4984],{}," — ユーザーが「デプロイプロセスのワークフローを描いて（draw the workflow of the deployment process）」と依頼します。",[483,5061,5062,5065],{},[447,5063,5064],{},"選択用プロンプト"," — ユーザーのリクエストと、すべてのスキルの説明が LLM に送信されます。",[483,5067,5068,5070,5071,5074],{},[447,5069,4996],{}," — LLM はリクエストと説明を比較し、一致するスキルを返します。ここでは「ワークフローを描く」が ",[490,5072,5073],{},"excalidraw-diagram"," の説明と一致するため、このスキルが選択されます。",[483,5076,5077,5080],{},[447,5078,5079],{},"確認"," — エージェントは提案されたスキルをユーザーに提示し、ユーザーが確認します。",[483,5082,5083,5085,5086,5088,5089,5091],{},[447,5084,5008],{}," — エージェントは、確認されたスキルの指示本文（",[490,5087,4873],{},"）と、関連する参照ファイル（",[490,5090,5073],{}," の場合はカラーパレット、JSON スキーマ、要素テンプレートなど）をすべて読み込みます。",[483,5093,5094,5022,5097,5100],{},[447,5095,5096],{},"実行用プロンプト",[447,5098,5099],{},"スキルの指示と参照ファイル","を足したプロンプトが LLM に送信されます。モデルは必要な詳細な手法や仕様を把握できます。",[483,5102,5103,5105,5106,5109],{},[447,5104,5031],{}," — LLM がアウトプット（",[490,5107,5108],{},".excalidraw"," の JSON ファイル）を生成し、エージェントがそれをユーザーに返します。",[471,5111,5113],{"id":5112},"aiエージェントのスキル-vs-ツール-mcp","AIエージェントのスキル vs ツール ＆ MCP",[429,5115,5116],{},"スキルは、プロンプト、ツール（Tools）、MCP（Model Context Protocol）を置き換えるものではありません。ツールや MCP インテグレーションは、データベースへの問い合わせや API の呼び出しなど、外部システムへアクセスする「エージェントの腕」を伸ばす役割を持ちます。これに対し、スキルは特定のタスクを完遂するための「エージェントのノウハウ（専門知識）」を深める役割を持ちます。",[429,5118,5119,5120,5123],{},"例えば、",[440,5121,5122],{"href":395},"ChatGPTとClaudeでNetSuite MCPをセットアップする方法"," のような MCP を使えば、エージェントは NetSuite 内のリアルタイムな財務・業務データにアクセスしてユーザーの質問に答えられるようになります。そしてさらに「NetSuite業務レポートスキル」を組み合わせることで、エージェントはそのデータをどのように編集し、どのようなレポートとしてユーザーに提示すべきかという具体的な手順を実行できるようになります。",[429,5125,5126],{},"スキルの活用が特に効果的なシナリオ：",[480,5128,5129,5132,5135],{},[483,5130,5131],{},"複数ステップにわたる複雑なワークフロー",[483,5133,5134],{},"PDF からのデータ抽出など、ドキュメントの高度な処理",[483,5136,5137],{},"組織のコード生成標準に沿った実装",[471,5139,5141],{"id":5140},"aiエージェントのスキルの作成方法","AIエージェントのスキルの作成方法",[528,5143,5144,5154,5168,5177],{},[483,5145,5146,5149,5150,5153],{},[447,5147,5148],{},"フォルダを作成","し、スキルの名前を付けます（例：",[490,5151,5152],{},"netsuite-operation-report\u002F","）。",[483,5155,5156,5161,5162,5164,5165,5167],{},[447,5157,5158,5160],{},[490,5159,4873],{}," を作成","し、",[490,5163,4900],{},"（名前）、明確な ",[490,5166,4910],{},"（説明）、および簡潔な指示本文（200語以内）を記述します。",[483,5169,5170,5173,5174,5176],{},[447,5171,5172],{},"リソースを追加","します。タスクに必要な参照ドキュメント、テンプレート、スクリプトなどをフォルダ内に配置します。",[490,5175,4873],{}," 自体は短く保ち、詳細は各ファイルにリンクさせます。",[483,5178,5179,5182,5183,5186],{},[447,5180,5181],{},"インストール","してエージェントが発見できるようにします。複数のエージェント間でスキルを効率的に管理する方法については、",[440,5184,5185],{"href":359},"npx skillsによるAIエージェント用スキルの集中管理"," を参照してください。",[429,5188,5189],{},"質の高いスキルを作成するためのコツ：",[480,5191,5192,5195,5200,5203],{},[483,5193,5194],{},"説明文（description）は、人間向けではなく、システムが判別する「トリガー」として機能するように書きます。",[483,5196,5197,5199],{},[490,5198,4873],{}," は 200語以内で軽量に保ちます。本文には一般的な手順のみを書き、エッジケースは参照ドキュメントに委ねます。",[483,5201,5202],{},"確定的な処理にはスクリプト（コード）を使います。LLM に複雑な算術計算をさせないようにします。",[483,5204,5205],{},"バージョン管理を行い、Git にコミットします。",[471,5207,4753],{"id":4753},[429,5209,5210,5211,5214],{},"接続先（接続可能な外部システム）を定義する「ツール」や「MCP」とは異なり、エージェントの「スキル」は ",[447,5212,5213],{},"どのように仕事を遂行するか（実務の手順）"," をパッケージ化したものです。これらは競合するものではなく、お互いを補完し合う重要な関係にあります。",[429,5216,5217],{},"「段階的開示（Progressive Disclosure）」の仕組みを活かすことで、必要なときだけ詳細な手順や参照ドキュメント、実行スクリプトをロードできるため、エージェントのコンテキストウィンドウをクリーンで無駄のない状態に維持することができます。",[1649,5219,5220],{},"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":424,"searchDepth":1066,"depth":1073,"links":5222},[5223,5224,5228,5229,5230],{"id":4862,"depth":1066,"text":4863},{"id":4954,"depth":1066,"text":4955,"children":5225},[5226,5227],{"id":4976,"depth":1073,"text":4977},{"id":5052,"depth":1073,"text":4977},{"id":5112,"depth":1066,"text":5113},{"id":5140,"depth":1066,"text":5141},{"id":4753,"depth":1066,"text":4753},[1669],"2026-06-26","AIエージェントのスキルとは何か、また状況に応じて詳細なシステム手順を効率的にロードする「段階的開示（Progressive Disclosure）」の仕組みを詳しく解説。開発者向けに再利用可能で強力なカスタムスキルを一から自作し、実開発に適用するための実践的な手順と手法を余すところなく紹介します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002FJA-AI-Agent-Skills-What-They-Are-%26-How-to-Create-Them.webp","AIエージェントのスキル作成・開発ガイド：再利用可能で効率的なワークフローを構築する手順とベストプラクティス",{"schemaOrg":5237,"robots":1703,"sitemap":5239},[5238],{"@type":1682,"headline":4857,"description":5233},{"lastmod":5232},{"title":5235,"description":5233,"ogTitle":4857,"ogDescription":5233,"twitterTitle":4857,"twitterDescription":5233},"ja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",[1711,5243,5244,5245],"エージェントスキル","再利用可能なワークフロー","AIチュートリアル","sMzHllYBdhg70umNdDoR0_xCKy6Ict_7j3aoGx2f6uo",{"id":1717,"title":1718,"author":424,"body":1719,"category":2609,"date":2611,"description":2612,"extension":1674,"image":2613,"imageAlt":2614,"isPublished":1069,"meta":2615,"minRead":1934,"navigation":1069,"path":363,"seo":2649,"stem":2651,"tags":2652,"updatedAt":2648,"__hash__":2656},1792489994779]