1"use strict";(globalThis.webpackChunkvoiden_docs=globalThis.webpackChunkvoiden_docs||[]).push([[271],{1816:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"getting-started-section/settings/ai-skill","title":"AI Skill","description":"Your AI assistant is great at writing code but it doesn\'t know Voiden\'s .void format out of the box. This is why we have added an AI Skill that fixes that. Enable it once from your settings, and your AI assistant will know everything it needs to write, edit, and generate valid .void files together with you.","source":"@site/docs/getting-started-section/settings/AI Skill.md","sourceDirName":"getting-started-section/settings","slug":"/getting-started-section/settings/ai-skill","permalink":"/docs/getting-started-section/settings/ai-skill","draft":false,"unlisted":false,"editUrl":"https://github.com/VoidenHQ/docs/tree/main/docs/getting-started-section/settings/AI Skill.md","tags":[],"version":"current","lastUpdatedAt":1787133746000,"sidebarPosition":5,"frontMatter":{"id":"ai-skill","title":"AI Skill","sidebar_label":"AI Skill","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"General Settings","permalink":"/docs/getting-started-section/settings/general-setting"},"next":{"title":"Why Voiden is Built on Electron?","permalink":"/docs/getting-started-section/getting-started/why-electron"}}');var t=i(4848),l=i(8453);const r={id:"ai-skill",title:"AI Skill",sidebar_label:"AI Skill",sidebar_position:5},d="AI Skill in Voiden",o={},c=[{value:"How It Works",id:"how-it-works",level:2},{value:"Enabling AI Skill",id:"enabling-ai-skill",level:2},{value:"Enabling MCP Execution",id:"enabling-mcp-execution",level:2},{value:"What the Skill File Includes",id:"what-the-skill-file-includes",level:2},{value:"Core \u2014 Always Included",id:"core--always-included",level:3},{value:"Plugins \u2014 Included When Enabled",id:"plugins--included-when-enabled",level:3},{value:"Example Usage",id:"example-usage",level:2},{value:"Summary",id:"summary",level:2}];function a(e){const s={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"ai-skill-in-voiden",children:"AI Skill in Voiden"})}),"\n",(0,t.jsxs)(s.p,{children:["Your AI assistant is great at writing code but it doesn't know Voiden's ",(0,t.jsx)(s.code,{children:".void"})," format out of the box. This is why we have added an AI Skill that fixes that. Enable it once from your settings, and your AI assistant will know everything it needs to write, edit, and generate valid ",(0,t.jsx)(s.code,{children:".void"})," files together with you."]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"how-it-works",children:"How It Works"}),"\n",(0,t.jsxs)(s.p,{children:["When you enable AI Skill, Voiden generates a ",(0,t.jsx)(s.code,{children:"skill.md"})," file inside your project's ",(0,t.jsx)(s.code,{children:".voiden"})," directory, right where your assistant can find it:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Assistant"}),(0,t.jsx)(s.th,{children:"Skill file location"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Claude"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:".claude/skills/voiden/skill.md"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Codex"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:".codex/skills/voiden/skill.md"})})]})]})]}),"\n",(0,t.jsxs)(s.p,{children:["The file covers the full ",(0,t.jsx)(s.code,{children:".void"})," format: block types, structure rules, variable syntax, and the features from your enabled plugins. Your assistant picks it up automatically as context, so it can read your existing files and generate new ones correctly when required."]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"enabling-ai-skill",children:"Enabling AI Skill"}),"\n",(0,t.jsxs)(s.p,{children:["Head to ",(0,t.jsx)(s.strong,{children:"Settings \u2192 AI Skill"})," and toggle on the assistant(s) you use:"]}),"\n",(0,t.jsx)("img",{src:"/img/geetingstarted/ai-skill.png",alt:"ai-skill",width:""}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Claude"})," \u2014 Generates a skill file for Claude."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Codex"})," \u2014 Generates a skill file for Codex-based assistants."]}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"You can enable both at the same time. In this case, each will get their own file."}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsx)(s.p,{children:"Whenever you enable or disable a plugin, come back here and regenerate the skill file so your assistant stays in sync with your current setup."})}),"\n",(0,t.jsxs)(s.p,{children:["This toggle only ever writes the skill file above \u2014 it teaches your assistant the ",(0,t.jsx)(s.code,{children:".void"})," ",(0,t.jsx)(s.em,{children:"format"}),", nothing more. It doesn't register any MCP server and doesn't touch ",(0,t.jsx)(s.code,{children:".m
1cp.json"})," or ",(0,t.jsx)(s.code,{children:"~/.codex/config.toml"}),"."]}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsxs)(s.p,{children:["Earlier versions of Voiden also registered ",(0,t.jsx)(s.code,{children:"@voiden/mcp-server"})," as a side effect of this toggle. That's no longer the case \u2014 registering the MCP server (so your assistant can actually ",(0,t.jsx)(s.em,{children:"execute"})," ",(0,t.jsx)(s.code,{children:".void"})," requests, not just write them) is now a separate, explicit action. See ",(0,t.jsx)(s.strong,{children:"Enabling MCP Execution"})," below."]})}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"enabling-mcp-execution",children:"Enabling MCP Execution"}),"\n",(0,t.jsxs)(s.p,{children:["Writing valid ",(0,t.jsx)(s.code,{children:".void"})," requests and ",(0,t.jsx)(s.em,{children:"running"})," them for real are two different capabilities. This toggle covers the first. For the second \u2014 letting your assistant list, execute, and record ",(0,t.jsx)(s.code,{children:".void"})," requests \u2014 use the ",(0,t.jsx)(s.strong,{children:"Initialize MCP"})," button in the status bar instead, scoped to whichever project you currently have open. See ",(0,t.jsx)(s.a,{href:"/docs/mcp/initialize",children:"Initialize MCP"})," for what it registers and what it gives your assistant."]}),"\n",(0,t.jsxs)(s.p,{children:["Clicking it also refreshes the authoring skill from ",(0,t.jsx)(s.strong,{children:"How It Works"})," above \u2014\nbut ",(0,t.jsx)(s.em,{children:"not"})," a dedicated skill walking through how to use the MCP tools. Your\nassistant picks that up from each tool's own description instead."]}),"\n",(0,t.jsxs)(s.admonition,{type:"note",children:[(0,t.jsxs)(s.p,{children:["If you ",(0,t.jsx)(s.em,{children:"also"})," have this page's toggle enabled for that assistant, the dedicated walkthrough skill is already installed too, from that toggle:"]}),(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Assistant"}),(0,t.jsx)(s.th,{children:"MCP walkthrough skill location"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Claude"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"~/.claude/skills/voiden-mcp/SKILL.md"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Codex"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"~/.codex/skills/voiden-mcp/SKILL.md"})})]})]})]})]}),"\n",(0,t.jsx)(s.admonition,{type:"tip",children:(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.code,{children:".mcp.json"})," contains an absolute path specific to your machine. Voiden adds it\nto your project's ",(0,t.jsx)(s.code,{children:".gitignore"})," automatically the first time it's written, so\nit never gets committed."]})}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"what-the-skill-file-includes",children:"What the Skill File Includes"}),"\n",(0,t.jsx)(s.p,{children:"The skill file is built from two layers, so your assistant only learns what's actually relevant to your project:"}),"\n",(0,t.jsx)(s.h3,{id:"core--always-included",children:"Core \u2014 Always Included"}),"\n",(0,t.jsx)(s.p,{children:"These fundamentals are always present, no matter what plugins you have enabled:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsxs)(s.strong,{children:[(0,t.jsx)(s.code,{children:".void"})," file format"]})," \u2014 frontmatter fields, block structure, UUID rules, variable syntax"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Environment variables"})," \u2014 ",(0,t.jsx)(s.code,{children:"{{VARIABLE_NAME}}"})," syntax and ",(0,t.jsx)(s.code,{children:".env"})," file usage"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"File naming conventions"})," \u2014 kebab-case naming, folder structure by resource"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"plugins--included-when-enabled",children:"Plugins \u2014 Included When Enabled"}),"\n",(0,t.jsx)(s.p,{children:"Each plugin adds its own block types and syntax. Only what's enabled in your project gets included:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Plugin"}),(0,t.jsx)(s.th,{children:"Blocks added to skill file"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Voiden REST API"})}),(0,t.jsxs)(s.td,{children:[(0,t.jsx)(s.code,{children:"request"}),", ",(0,t.jsx)(s.code,{children:"method"}),", ",(0,t.jsx)(s.code,{children:"url"}),", ",(0,t.jsx)(s.code,{children:"headers-table"}),", ",(0,t.jsx)(s.code,{children:"query-table"}),", ",(0,t.jsx)(s.code,{children:"path-table"}),", ",(0,t.jsx)(s.code,{children:"json_body"}),", ",(0,t.jsx)(s.code,{children:"xml_body"}),", ",(0,t.jsx)(s.code,{children:"yml_body"}),", ",(0,t.jsx)(s.code,{children:"text_body"}),", ",(0,t.jsx)(s.code,{children:"multipart-table"}),", ",(0,t.jsx)(s.code,{children:"url-table"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Voiden GraphQL"})}),(0,t.jsxs)(s.td,{children:[(0,t.jsx)(s.code,{children:"gqlquery"}),", ",(0,t.jsx)(s.code,{children:"gqlvariables"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Simple Assertions"})}),(0,t.jsxs)(s.td,{children:[(0,t.jsx)(s.code,{children:"assertions-table"})," with all operators and field path syntax"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Advanced Authentication"})}),(0,t.jsxs)(s.td,{children:[(0,t.jsx)(s.code,{children:"auth"})," block with all auth types: ",(0,t.jsx)(s.code,{children:"bearer"}),", ",(0,t.jsx)(s.code,{children:"basic"}),", ",(0,t.jsx)(s.code,{children:"apiKey"}),", ",(0,t.jsx)(s.code,{children:"oauth2"}),", ",(0,t.jsx)(s.code,{children:"oauth1"}),", ",(0,t.jsx)(s.code,{children:"digest"}),", ",(0,t.jsx)(s.code,{children:"awsSignature"}),", ",(0,t.jsx)(s.code,{children:"ntlm"}),", ",(0,t.jsx)(s.code,{children:"hawk"}),", ",(0,t.jsx)(s.code,{children:"netrc"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Voiden Scripting"})}),(0,t.jsxs)(s.td,{children:[(0,t.jsx)(s.code,{children:"pre_script"}),", ",(0,t.jsx)(s.code,{children:"post_script"}),", full ",(0,t.jsx)(s.code,{children:"vd"})," API reference"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Voiden Faker"})}),(0,t.jsxs)(s.td,{children:[(0,t.jsx)(s.code,{children:"{{$faker.*()}}"})," syntax with all available categories and methods"]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Voiden MCP Client"})}),(0,t.jsxs)(s.td,{children:[(0,t.jsx)(s.code,{children:"mcp-connection"}),", ",(0,t.jsx)(s.code,{children:"mcpoperation"}),", ",(0,t.jsx)(s.code,{children:"mcp-response"})]})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Voiden Tool"})}),(0,t.jsxs)(s.td,{children:[(0,t.jsx)(s.code,{children:"tool"}),", ",(0,t.jsx)(s.code,{children:"toolparams"}),", ",(0,t.jsx)(s.code,{children:"toolverifies"})]})]})]})]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"example-usage",children:"Example Usage"}),"\n",(0,t.jsx)(s.p,{children:"Once the skill file is in place, your assistant knows exactly how Voiden works. Try asking things like:"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:(0,t.jsxs)(s.em,{children:['"Create a POST request to ',(0,t.jsx)(s.code,{children:"/api/users"}),' with a JSON body and Bearer auth"']})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsxs)(s.em,{children:['"Add assertions to check the status is 200 and ',(0,t.jsx)(s.code,{children:"body.id"}),' exists"']})}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsxs)(s.em,{children:['"Write a pre-script that reads ',(0,t.jsx)(s.code,{children:"USER_ID"}),' from variables and sets it as a header"']}
1)}),"\n",(0,t.jsx)(s.li,{children:(0,t.jsx)(s.em,{children:'"Generate a request body using faker for name, email, and UUID"'})}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:["It will produce valid ",(0,t.jsx)(s.code,{children:".void"})," blocks \u2014 correct format, correct block types, correct syntax \u2014 ready to drop straight into your file."]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.admonition,{type:"note",children:(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"skill.md"})," file is auto-generated by Voiden. Don't edit it manually \u2014 any changes will be overwritten the next time it's regenerated."]})}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"summary",children:"Summary"}),"\n",(0,t.jsxs)(s.p,{children:["AI Skill generates a ",(0,t.jsx)(s.code,{children:"skill.md"})," file that teaches your AI assistant (Claude or Codex) the ",(0,t.jsx)(s.code,{children:".void"})," file format \u2014 covering core blocks, variable syntax, and whichever plugin features you have enabled. Enable it from ",(0,t.jsx)(s.strong,{children:"Settings \u2192 AI Skill"}),", and your assistant can generate valid ",(0,t.jsx)(s.code,{children:".void"})," blocks on request. Regenerate the file after changing plugins to keep it up to date. To let your assistant actually ",(0,t.jsx)(s.em,{children:"execute"})," requests, use the status bar's ",(0,t.jsx)(s.strong,{children:"Initialize MCP"})," button instead \u2014 a separate, per-project action."]})]})}function h(e={}){const{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},8453:(e,s,i)=>{i.d(s,{R:()=>r,x:()=>d});var n=i(6540);const t={},l=n.createContext(t);function r(e){const s=n.useContext(l);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(l.Provider,{value:s},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.