[{"data":1,"prerenderedAt":1865},["ShallowReactive",2],{"navigation_docs":3,"-guides-customize-publish-an-add-on":551,"-guides-customize-publish-an-add-on-surround":1860},[4,32,55,206,237,516],{"title":5,"path":6,"stem":7,"children":8},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24,28],{"title":10,"path":6,"stem":11},"Overview","1.get-started\u002Findex",{"title":13,"path":14,"stem":15},"Why Kraft","\u002Fget-started\u002Fwhy-kraft","1.get-started\u002F0.why-kraft",{"title":17,"path":18,"stem":19},"Install","\u002Fget-started\u002Finstall","1.get-started\u002F1.install",{"title":21,"path":22,"stem":23},"Your first work item","\u002Fget-started\u002Ffirst-work-item","1.get-started\u002F2.first-work-item",{"title":25,"path":26,"stem":27},"The real chain","\u002Fget-started\u002Fthe-real-chain","1.get-started\u002F3.the-real-chain",{"title":29,"path":30,"stem":31},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F4.faq",{"title":33,"path":34,"stem":35,"children":36},"Concepts","\u002Fconcepts","2.concepts",[37,39,43,47,51],{"title":10,"path":34,"stem":38},"2.concepts\u002Findex",{"title":40,"path":41,"stem":42},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":44,"path":45,"stem":46},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":48,"path":49,"stem":50},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":52,"path":53,"stem":54},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":56,"path":57,"stem":58,"children":59},"Guides","\u002Fguides","3.guides",[60,62,100,126,148,202],{"title":10,"path":57,"stem":61},"3.guides\u002Findex",{"title":63,"path":64,"stem":65,"children":66},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day\u002Findex",[67,68,72,76,80,84,88,92,96],{"title":10,"path":64,"stem":65},{"title":69,"path":70,"stem":71},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":73,"path":74,"stem":75},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":77,"path":78,"stem":79},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":81,"path":82,"stem":83},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":85,"path":86,"stem":87},"Raise a cap on a stopped item","\u002Fguides\u002Fday-to-day\u002Fraise-a-cap","3.guides\u002F1.day-to-day\u002F6.raise-a-cap",{"title":89,"path":90,"stem":91},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":93,"path":94,"stem":95},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":97,"path":98,"stem":99},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",{"title":101,"path":102,"stem":103,"children":104},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize\u002Findex",[105,106,110,114,118,122],{"title":10,"path":102,"stem":103},{"title":107,"path":108,"stem":109},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":111,"path":112,"stem":113},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":115,"path":116,"stem":117},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":119,"path":120,"stem":121},"Share chains with add-ons","\u002Fguides\u002Fcustomize\u002Fshare-chains-with-addons","3.guides\u002F2.customize\u002F4.share-chains-with-addons",{"title":123,"path":124,"stem":125},"Publish an add-on","\u002Fguides\u002Fcustomize\u002Fpublish-an-add-on","3.guides\u002F2.customize\u002F5.publish-an-add-on",{"title":127,"path":128,"stem":129,"children":130},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses\u002Findex",[131,132,136,140,144],{"title":10,"path":128,"stem":129},{"title":133,"path":134,"stem":135},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":137,"path":138,"stem":139},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":141,"path":142,"stem":143},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":145,"path":146,"stem":147},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":149,"path":150,"stem":151,"children":152},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run\u002Findex",[153,154,158,162,166,170,174,178,182,186,190,194,198],{"title":10,"path":150,"stem":151},{"title":155,"path":156,"stem":157},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":159,"path":160,"stem":161},"Put a proxy in front of Kraft","\u002Fguides\u002Frun\u002Fput-a-proxy-in-front-of-kraft","3.guides\u002F4.run\u002F02.put-a-proxy-in-front-of-kraft",{"title":163,"path":164,"stem":165},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":167,"path":168,"stem":169},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":171,"path":172,"stem":173},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":175,"path":176,"stem":177},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":179,"path":180,"stem":181},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":183,"path":184,"stem":185},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":187,"path":188,"stem":189},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":191,"path":192,"stem":193},"Upgrade from 0.x or a release candidate","\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate","3.guides\u002F4.run\u002F10.upgrade-from-0-x-or-a-release-candidate",{"title":195,"path":196,"stem":197},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":199,"path":200,"stem":201},"Run items in your own checkout","\u002Fguides\u002Frun\u002Frun-items-in-place","3.guides\u002F4.run\u002F12.run-items-in-place",{"title":203,"path":204,"stem":205},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":207,"path":208,"stem":209,"children":210},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[211,213,217,221,225,229,233],{"title":10,"path":208,"stem":212},"4.troubleshooting\u002Findex",{"title":214,"path":215,"stem":216},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":218,"path":219,"stem":220},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":222,"path":223,"stem":224},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":226,"path":227,"stem":228},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":230,"path":231,"stem":232},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":234,"path":235,"stem":236},"Add-on problems","\u002Ftroubleshooting\u002Faddon-problems","4.troubleshooting\u002F6.addon-problems",{"title":238,"path":239,"stem":240,"children":241},"Reference","\u002Freference","5.reference",[242,244,286,308,312,316,414,432,458,462,466,500,504,508,512],{"title":10,"path":239,"stem":243},"5.reference\u002Findex",{"title":245,"path":246,"stem":247,"children":248},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[249,250,254,258,262,266,270,274,278,282],{"title":10,"path":246,"stem":247},{"title":251,"path":252,"stem":253},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":255,"path":256,"stem":257},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":259,"path":260,"stem":261},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":263,"path":264,"stem":265},"Fix loops and test scopes","\u002Freference\u002Fweb-ui\u002Ffix-loops-and-test-scopes","5.reference\u002F00.web-ui\u002F3.fix-loops-and-test-scopes",{"title":267,"path":268,"stem":269},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":271,"path":272,"stem":273},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":275,"path":276,"stem":277},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":279,"path":280,"stem":281},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":283,"path":284,"stem":285},"Cap stops and raises","\u002Freference\u002Fweb-ui\u002Fcap-stops-and-raises","5.reference\u002F00.web-ui\u002F8.cap-stops-and-raises",{"title":287,"path":288,"stem":289,"children":290},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[291,292,296,300,304],{"title":10,"path":288,"stem":289},{"title":293,"path":294,"stem":295},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":297,"path":298,"stem":299},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":301,"path":302,"stem":303},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":305,"path":306,"stem":307},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":309,"path":310,"stem":311},"Console","\u002Freference\u002Fconsole","5.reference\u002F01.console",{"title":313,"path":314,"stem":315},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":317,"path":318,"stem":319,"children":320},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[321,322,340,344,348,352,356,360,364,368,402,406,410],{"title":10,"path":318,"stem":319},{"title":323,"path":324,"stem":325,"children":326},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[327,328,332,336],{"title":10,"path":324,"stem":325},{"title":329,"path":330,"stem":331},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":333,"path":334,"stem":335},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":337,"path":338,"stem":339},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":341,"path":342,"stem":343},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":345,"path":346,"stem":347},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":349,"path":350,"stem":351},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":353,"path":354,"stem":355},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":357,"path":358,"stem":359},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":361,"path":362,"stem":363},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":365,"path":366,"stem":367},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":369,"path":370,"stem":371,"children":372},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[373,374,378,382,386,390,394,398],{"title":10,"path":370,"stem":371},{"title":375,"path":376,"stem":377},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":379,"path":380,"stem":381},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":383,"path":384,"stem":385},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":387,"path":388,"stem":389},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":391,"path":392,"stem":393},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":395,"path":396,"stem":397},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":399,"path":400,"stem":401},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":403,"path":404,"stem":405},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":407,"path":408,"stem":409},"Add-ons and collections","\u002Freference\u002Fconfiguration\u002Faddons","5.reference\u002F03.configuration\u002F12.addons",{"title":411,"path":412,"stem":413},"Repo libraries","\u002Freference\u002Fconfiguration\u002Frepo-libraries","5.reference\u002F03.configuration\u002F13.repo-libraries",{"title":415,"path":416,"stem":417,"children":418},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[419,420,424,428],{"title":10,"path":416,"stem":417},{"title":421,"path":422,"stem":423},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":425,"path":426,"stem":427},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":429,"path":430,"stem":431},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":433,"path":434,"stem":435,"children":436},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[437,438,442,446,450,454],{"title":10,"path":434,"stem":435},{"title":439,"path":440,"stem":441},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":443,"path":444,"stem":445},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":447,"path":448,"stem":449},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":451,"path":452,"stem":453},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":455,"path":456,"stem":457},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":459,"path":460,"stem":461},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":463,"path":464,"stem":465},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":467,"path":468,"stem":469,"children":470},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[471,472,476,480,484,488,492,496],{"title":10,"path":468,"stem":469},{"title":473,"path":474,"stem":475},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":477,"path":478,"stem":479},"Gates, run control, ending and retry","\u002Freference\u002Fhttp-api\u002Fgates-run-control-and-ending","5.reference\u002F08.http-api\u002F3.gates-run-control-and-ending",{"title":481,"path":482,"stem":483},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":485,"path":486,"stem":487},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":489,"path":490,"stem":491},"Repos, chains, harnesses and the server","\u002Freference\u002Fhttp-api\u002Frepos-chains-harnesses-and-server","5.reference\u002F08.http-api\u002F6.repos-chains-harnesses-and-server",{"title":493,"path":494,"stem":495},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":497,"path":498,"stem":499},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":501,"path":502,"stem":503},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":505,"path":506,"stem":507},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":509,"path":510,"stem":511},"VS Code extension","\u002Freference\u002Fvscode-extension","5.reference\u002F11.vscode-extension",{"title":513,"path":514,"stem":515},"Changes from 1.4 to 2.0","\u002Freference\u002Fchanges-from-1-4","5.reference\u002F12.changes-from-1-4",{"title":517,"path":518,"stem":519,"children":520},"Project","\u002Fproject","6.project",[521,523,527,531,535,539,543,547],{"title":10,"path":518,"stem":522},"6.project\u002Findex",{"title":524,"path":525,"stem":526},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":528,"path":529,"stem":530},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":532,"path":533,"stem":534},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":536,"path":537,"stem":538},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":540,"path":541,"stem":542},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":544,"path":545,"stem":546},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":548,"path":549,"stem":550},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":552,"title":123,"body":553,"description":1854,"extension":1855,"links":1856,"meta":1857,"navigation":1104,"path":124,"seo":1858,"stem":125,"__hash__":1859},"docs\u002F3.guides\u002F2.customize\u002F5.publish-an-add-on.md",{"type":554,"value":555,"toc":1839},"minimark",[556,563,579,584,618,622,627,634,678,684,830,840,937,941,966,982,1008,1146,1281,1317,1329,1333,1358,1367,1372,1398,1410,1416,1420,1423,1458,1477,1480,1484,1494,1499,1502,1506,1518,1607,1611,1623,1670,1684,1688,1703,1741,1792,1796,1835],[557,558,559],"p",{},[560,561,562],"em",{},"Added in 2.1",[557,564,565,566,570,571,574,575,578],{},"This guide builds a collection ",[567,568,569],"code",{},"acme"," with one add-on, ",[567,572,573],{},"release",", and installs it from the directory to try it. To install someone else's add-on, see ",[576,577,119],"a",{"href":120},".",[580,581,583],"h2",{"id":582},"before-you-start","Before you start",[585,586,587,594,597],"ul",{},[588,589,590,591,578],"li",{},"A running Kraft server, and ",[567,592,593],{},"git",[588,595,596],{},"A git repository to publish the collection from, if other machines will\ninstall it.",[588,598,599,600,604,605,609,610,613,614,617],{},"The instance defines every ",[576,601,603],{"href":602},"\u002Fconcepts\u002Fvocabulary#harness","harness"," and\n",[576,606,608],{"href":607},"\u002Fconcepts\u002Fvocabulary#agent-profile","agent profile"," the add-on requires. The\nexample needs the shipped ",[567,611,612],{},"claude"," harness and ",[567,615,616],{},"strong"," profile.",[580,619,621],{"id":620},"publish-a-collection","Publish a collection",[623,624,626],"h3",{"id":625},"_1-lay-out-the-collection","1. Lay out the collection",[557,628,629,630,633],{},"A collection is a directory with ",[567,631,632],{},".kraft\u002Fcollection.json"," at its root and one\ndirectory per add-on:",[635,636,642],"pre",{"className":637,"code":639,"language":640,"meta":641},[638],"language-text","acme-kraft\u002F\n  .kraft\u002Fcollection.json\n  addons\u002F\n    release\u002F\n      .kraft\u002Faddon.json\n      library.yaml\n      chains\u002Fship.yaml\n      skills\u002Frelease-notes\u002FSKILL.md\n","text","",[567,643,644,650,654,658,662,666,670,674],{"__ignoreMap":641},[645,646,649],"span",{"className":647},[648],"line","acme-kraft\u002F\n",[645,651,653],{"className":652},[648],"  .kraft\u002Fcollection.json\n",[645,655,657],{"className":656},[648],"  addons\u002F\n",[645,659,661],{"className":660},[648],"    release\u002F\n",[645,663,665],{"className":664},[648],"      .kraft\u002Faddon.json\n",[645,667,669],{"className":668},[648],"      library.yaml\n",[645,671,673],{"className":672},[648],"      chains\u002Fship.yaml\n",[645,675,677],{"className":676},[648],"      skills\u002Frelease-notes\u002FSKILL.md\n",[557,679,680,683],{},[567,681,682],{},"collection.json"," names the collection and lists its add-ons:",[635,685,690],{"className":686,"code":687,"filename":688,"language":689,"meta":641,"style":641},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","{\n  \"$schema\": \"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Fcollection.schema.json\",\n  \"name\": \"acme\",\n  \"description\": \"ACME's Kraft chains and review methods\",\n  \"owner\": { \"name\": \"ACME Platform\", \"email\": \"platform@acme.dev\" },\n  \"addons\": [\n    { \"name\": \"release\", \"source\": \".\u002Faddons\u002Frelease\", \"description\": \"Release chains\" }\n  ]\n}\n","acme-kraft\u002F.kraft\u002Fcollection.json","json",[567,691,692,699,716,729,742,773,782,818,824],{"__ignoreMap":641},[645,693,695],{"class":648,"line":694},1,[645,696,698],{"class":697},"s7iLA","{\n",[645,700,702,706,709,713],{"class":648,"line":701},2,[645,703,705],{"class":704},"sb7M8","  \"$schema\"",[645,707,708],{"class":697},": ",[645,710,712],{"class":711},"semJd","\"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Fcollection.schema.json\"",[645,714,715],{"class":697},",\n",[645,717,719,722,724,727],{"class":648,"line":718},3,[645,720,721],{"class":704},"  \"name\"",[645,723,708],{"class":697},[645,725,726],{"class":711},"\"acme\"",[645,728,715],{"class":697},[645,730,732,735,737,740],{"class":648,"line":731},4,[645,733,734],{"class":704},"  \"description\"",[645,736,708],{"class":697},[645,738,739],{"class":711},"\"ACME's Kraft chains and review methods\"",[645,741,715],{"class":697},[645,743,745,748,751,754,756,759,762,765,767,770],{"class":648,"line":744},5,[645,746,747],{"class":704},"  \"owner\"",[645,749,750],{"class":697},": { ",[645,752,753],{"class":704},"\"name\"",[645,755,708],{"class":697},[645,757,758],{"class":711},"\"ACME Platform\"",[645,760,761],{"class":697},", ",[645,763,764],{"class":704},"\"email\"",[645,766,708],{"class":697},[645,768,769],{"class":711},"\"platform@acme.dev\"",[645,771,772],{"class":697}," },\n",[645,774,776,779],{"class":648,"line":775},6,[645,777,778],{"class":704},"  \"addons\"",[645,780,781],{"class":697},": [\n",[645,783,785,788,790,792,795,797,800,802,805,807,810,812,815],{"class":648,"line":784},7,[645,786,787],{"class":697},"    { ",[645,789,753],{"class":704},[645,791,708],{"class":697},[645,793,794],{"class":711},"\"release\"",[645,796,761],{"class":697},[645,798,799],{"class":704},"\"source\"",[645,801,708],{"class":697},[645,803,804],{"class":711},"\".\u002Faddons\u002Frelease\"",[645,806,761],{"class":697},[645,808,809],{"class":704},"\"description\"",[645,811,708],{"class":697},[645,813,814],{"class":711},"\"Release chains\"",[645,816,817],{"class":697}," }\n",[645,819,821],{"class":648,"line":820},8,[645,822,823],{"class":697},"  ]\n",[645,825,827],{"class":648,"line":826},9,[645,828,829],{"class":697},"}\n",[557,831,832,835,836,839],{},[567,833,834],{},"addon.json"," names the add-on, its version, and what it needs from an\ninstance. ",[567,837,838],{},"\"kraft\": \"2\""," means any Kraft 2.x:",[635,841,844],{"className":686,"code":842,"filename":843,"language":689,"meta":641,"style":641},"{\n  \"$schema\": \"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Faddon.schema.json\",\n  \"name\": \"release\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Release chains\",\n  \"requires\": { \"kraft\": \"2\", \"harnesses\": [\"claude\"], \"profiles\": [\"strong\"] }\n}\n","acme-kraft\u002Faddons\u002Frelease\u002F.kraft\u002Faddon.json",[567,845,846,850,861,871,883,893,933],{"__ignoreMap":641},[645,847,848],{"class":648,"line":694},[645,849,698],{"class":697},[645,851,852,854,856,859],{"class":648,"line":701},[645,853,705],{"class":704},[645,855,708],{"class":697},[645,857,858],{"class":711},"\"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Faddon.schema.json\"",[645,860,715],{"class":697},[645,862,863,865,867,869],{"class":648,"line":718},[645,864,721],{"class":704},[645,866,708],{"class":697},[645,868,794],{"class":711},[645,870,715],{"class":697},[645,872,873,876,878,881],{"class":648,"line":731},[645,874,875],{"class":704},"  \"version\"",[645,877,708],{"class":697},[645,879,880],{"class":711},"\"1.0.0\"",[645,882,715],{"class":697},[645,884,885,887,889,891],{"class":648,"line":744},[645,886,734],{"class":704},[645,888,708],{"class":697},[645,890,814],{"class":711},[645,892,715],{"class":697},[645,894,895,898,900,903,905,908,910,913,916,919,922,925,927,930],{"class":648,"line":775},[645,896,897],{"class":704},"  \"requires\"",[645,899,750],{"class":697},[645,901,902],{"class":704},"\"kraft\"",[645,904,708],{"class":697},[645,906,907],{"class":711},"\"2\"",[645,909,761],{"class":697},[645,911,912],{"class":704},"\"harnesses\"",[645,914,915],{"class":697},": [",[645,917,918],{"class":711},"\"claude\"",[645,920,921],{"class":697},"], ",[645,923,924],{"class":704},"\"profiles\"",[645,926,915],{"class":697},[645,928,929],{"class":711},"\"strong\"",[645,931,932],{"class":697},"] }\n",[645,934,935],{"class":648,"line":784},[645,936,829],{"class":697},[623,938,940],{"id":939},"_2-write-the-add-ons-files","2. Write the add-on's files",[557,942,943,944,947,948,761,951,954,955,958,959,954,962,965],{},"The files have the same shape as the ones in your own ",[567,945,946],{},"config\u002F",". Inside an\nadd-on, a bare ",[567,949,950],{},"extends:",[567,952,953],{},"steering:"," or ",[567,956,957],{},"skill:"," names the add-on's own\ndeclaration. A bare ",[567,960,961],{},"harness:",[567,963,964],{},"profile:"," names the instance's.",[557,967,968,969,761,972,761,975,604,978,981],{},"An add-on holds only the files it uses. One chain, or one skill, is a valid\nadd-on. An add-on with none of ",[567,970,971],{},"library.yaml",[567,973,974],{},"chains\u002F",[567,976,977],{},"skills\u002F",[567,979,980],{},"profiles.yaml"," is refused.",[557,983,984,985,988,989,992,993,954,996,999,1000,1003,1004,1007],{},"A chain is named by its ",[567,986,987],{},"id",", or by its file name when it has none, so the chain\nbelow is ",[567,990,991],{},"release:ship"," once installed. A file name is a lowercase letter, then\nlowercase letters, digits, ",[567,994,995],{},"_",[567,997,998],{},"-",". Kraft ignores ",[567,1001,1002],{},"chains\u002FShip.yaml",", and\n",[567,1005,1006],{},"validate"," warns about it.",[635,1009,1014],{"className":1010,"code":1011,"filename":1012,"language":1013,"meta":641,"style":641},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","tasks:\n  implementer:\n    kind: agent\n    harness: claude\n    profile: strong\n    prompt: Implement the approved plan, then write the release notes.\n    skill: release-notes\n    policy:\n      time_cap_minutes: 90\n\n  test_changed_scopes:\n    kind: builtin\n    ref: kraft.verify_changed_test_scopes\n    scope: each_repository\n","acme-kraft\u002Faddons\u002Frelease\u002Flibrary.yaml","yaml",[567,1015,1016,1024,1031,1041,1051,1061,1071,1081,1088,1099,1106,1114,1124,1135],{"__ignoreMap":641},[645,1017,1018,1021],{"class":648,"line":694},[645,1019,1020],{"class":704},"tasks",[645,1022,1023],{"class":697},":\n",[645,1025,1026,1029],{"class":648,"line":701},[645,1027,1028],{"class":704},"  implementer",[645,1030,1023],{"class":697},[645,1032,1033,1036,1038],{"class":648,"line":718},[645,1034,1035],{"class":704},"    kind",[645,1037,708],{"class":697},[645,1039,1040],{"class":711},"agent\n",[645,1042,1043,1046,1048],{"class":648,"line":731},[645,1044,1045],{"class":704},"    harness",[645,1047,708],{"class":697},[645,1049,1050],{"class":711},"claude\n",[645,1052,1053,1056,1058],{"class":648,"line":744},[645,1054,1055],{"class":704},"    profile",[645,1057,708],{"class":697},[645,1059,1060],{"class":711},"strong\n",[645,1062,1063,1066,1068],{"class":648,"line":775},[645,1064,1065],{"class":704},"    prompt",[645,1067,708],{"class":697},[645,1069,1070],{"class":711},"Implement the approved plan, then write the release notes.\n",[645,1072,1073,1076,1078],{"class":648,"line":784},[645,1074,1075],{"class":704},"    skill",[645,1077,708],{"class":697},[645,1079,1080],{"class":711},"release-notes\n",[645,1082,1083,1086],{"class":648,"line":820},[645,1084,1085],{"class":704},"    policy",[645,1087,1023],{"class":697},[645,1089,1090,1093,1095],{"class":648,"line":826},[645,1091,1092],{"class":704},"      time_cap_minutes",[645,1094,708],{"class":697},[645,1096,1098],{"class":1097},"ssYy9","90\n",[645,1100,1102],{"class":648,"line":1101},10,[645,1103,1105],{"emptyLinePlaceholder":1104},true,"\n",[645,1107,1109,1112],{"class":648,"line":1108},11,[645,1110,1111],{"class":704},"  test_changed_scopes",[645,1113,1023],{"class":697},[645,1115,1117,1119,1121],{"class":648,"line":1116},12,[645,1118,1035],{"class":704},[645,1120,708],{"class":697},[645,1122,1123],{"class":711},"builtin\n",[645,1125,1127,1130,1132],{"class":648,"line":1126},13,[645,1128,1129],{"class":704},"    ref",[645,1131,708],{"class":697},[645,1133,1134],{"class":711},"kraft.verify_changed_test_scopes\n",[645,1136,1138,1141,1143],{"class":648,"line":1137},14,[645,1139,1140],{"class":704},"    scope",[645,1142,708],{"class":697},[645,1144,1145],{"class":711},"each_repository\n",[635,1147,1150],{"className":1010,"code":1148,"filename":1149,"language":1013,"meta":641,"style":641},"id: ship\ndescription: Implement, write release notes, run the tests for what changed.\n\nnodes:\n  - id: implementation\n    kind: exec\n    tasks:\n      - id: implement\n        extends: implementer\n\n  - id: verify\n    kind: exec\n    tasks:\n      - id: test_changed_scopes\n        extends: test_changed_scopes\n","acme-kraft\u002Faddons\u002Frelease\u002Fchains\u002Fship.yaml",[567,1151,1152,1161,1171,1175,1182,1194,1203,1210,1222,1232,1236,1247,1255,1261,1272],{"__ignoreMap":641},[645,1153,1154,1156,1158],{"class":648,"line":694},[645,1155,987],{"class":704},[645,1157,708],{"class":697},[645,1159,1160],{"class":711},"ship\n",[645,1162,1163,1166,1168],{"class":648,"line":701},[645,1164,1165],{"class":704},"description",[645,1167,708],{"class":697},[645,1169,1170],{"class":711},"Implement, write release notes, run the tests for what changed.\n",[645,1172,1173],{"class":648,"line":718},[645,1174,1105],{"emptyLinePlaceholder":1104},[645,1176,1177,1180],{"class":648,"line":731},[645,1178,1179],{"class":704},"nodes",[645,1181,1023],{"class":697},[645,1183,1184,1187,1189,1191],{"class":648,"line":744},[645,1185,1186],{"class":697},"  - ",[645,1188,987],{"class":704},[645,1190,708],{"class":697},[645,1192,1193],{"class":711},"implementation\n",[645,1195,1196,1198,1200],{"class":648,"line":775},[645,1197,1035],{"class":704},[645,1199,708],{"class":697},[645,1201,1202],{"class":711},"exec\n",[645,1204,1205,1208],{"class":648,"line":784},[645,1206,1207],{"class":704},"    tasks",[645,1209,1023],{"class":697},[645,1211,1212,1215,1217,1219],{"class":648,"line":820},[645,1213,1214],{"class":697},"      - ",[645,1216,987],{"class":704},[645,1218,708],{"class":697},[645,1220,1221],{"class":711},"implement\n",[645,1223,1224,1227,1229],{"class":648,"line":826},[645,1225,1226],{"class":704},"        extends",[645,1228,708],{"class":697},[645,1230,1231],{"class":711},"implementer\n",[645,1233,1234],{"class":648,"line":1101},[645,1235,1105],{"emptyLinePlaceholder":1104},[645,1237,1238,1240,1242,1244],{"class":648,"line":1108},[645,1239,1186],{"class":697},[645,1241,987],{"class":704},[645,1243,708],{"class":697},[645,1245,1246],{"class":711},"verify\n",[645,1248,1249,1251,1253],{"class":648,"line":1116},[645,1250,1035],{"class":704},[645,1252,708],{"class":697},[645,1254,1202],{"class":711},[645,1256,1257,1259],{"class":648,"line":1126},[645,1258,1207],{"class":704},[645,1260,1023],{"class":697},[645,1262,1263,1265,1267,1269],{"class":648,"line":1137},[645,1264,1214],{"class":697},[645,1266,987],{"class":704},[645,1268,708],{"class":697},[645,1270,1271],{"class":711},"test_changed_scopes\n",[645,1273,1275,1277,1279],{"class":648,"line":1274},15,[645,1276,1226],{"class":704},[645,1278,708],{"class":697},[645,1280,1271],{"class":711},[635,1282,1287],{"className":1283,"code":1284,"filename":1285,"language":1286,"meta":641,"style":641},"language-markdown shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","---\nname: release-notes\ndescription: Write release notes for the change in this worktree.\n---\n\nAdd one line to `RELEASES.md` for each user-visible change, newest first.\n","acme-kraft\u002Faddons\u002Frelease\u002Fskills\u002Frelease-notes\u002FSKILL.md","markdown",[567,1288,1289,1294,1299,1304,1308,1312],{"__ignoreMap":641},[645,1290,1291],{"class":648,"line":694},[645,1292,1293],{},"---\n",[645,1295,1296],{"class":648,"line":701},[645,1297,1298],{},"name: release-notes\n",[645,1300,1301],{"class":648,"line":718},[645,1302,1303],{},"description: Write release notes for the change in this worktree.\n",[645,1305,1306],{"class":648,"line":731},[645,1307,1293],{},[645,1309,1310],{"class":648,"line":744},[645,1311,1105],{"emptyLinePlaceholder":1104},[645,1313,1314],{"class":648,"line":775},[645,1315,1316],{},"Add one line to `RELEASES.md` for each user-visible change, newest first.\n",[557,1318,1319,1320,1323,1324,1328],{},"An add-on cannot use a component of your local library or of another add-on: it\ncarries everything its chains extend. It also cannot carry a ",[567,1321,1322],{},"subprocess"," task\nor a permission. ",[576,1325,1327],{"href":1326},"\u002Freference\u002Fconfiguration\u002Faddons#what-an-add-on-may-set","What an add-on may set","\nhas the list.",[623,1330,1332],{"id":1331},"_3-validate-it","3. Validate it",[635,1334,1338],{"className":1335,"code":1336,"language":1337,"meta":641,"style":641},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","kraft admin addon validate .\u002Facme-kraft\n","bash",[567,1339,1340],{"__ignoreMap":641},[645,1341,1342,1346,1349,1352,1355],{"class":648,"line":694},[645,1343,1345],{"class":1344},"szw1H","kraft",[645,1347,1348],{"class":711}," admin",[645,1350,1351],{"class":711}," addon",[645,1353,1354],{"class":711}," validate",[645,1356,1357],{"class":711}," .\u002Facme-kraft\n",[635,1359,1362],{"className":1360,"code":1361,"language":640,"meta":641},[638],"release 1.0.0  sha256:f915f6266d319e9c0bc2bb2483683d74f307839138258901919e7d071fd37da4\n",[567,1363,1364],{"__ignoreMap":641},[645,1365,1361],{"className":1366},[648],[557,1368,1369,1371],{},[567,1370,1006],{}," runs the checks an install runs and installs nothing. It prints one\nline per add-on, then:",[585,1373,1374,1381,1388],{},[588,1375,1376,1377,1380],{},"each problem as ",[567,1378,1379],{},"error: \u003Cfile>: \u003Cmessage>",". Any problem makes it exit 1.",[588,1382,1383,1384,1387],{},"each file or manifest key Kraft ignores as ",[567,1385,1386],{},"warning: \u003Cmessage>",". A warning\ndoes not change the exit code.",[588,1389,1390,1391,1393,1394,1397],{},"when the config directory has no ",[567,1392,971],{},", as in CI, a ",[567,1395,1396],{},"skipped:"," line\nthat names the checks it left out.",[557,1399,1400,1401,761,1403,1405,1406,1409],{},"When the config directory has a ",[567,1402,971],{},[567,1404,1006],{}," also checks the\nadd-on against that instance: its ",[567,1407,1408],{},"requires",", its namespace, and your own\nchains.",[557,1411,1412,1415],{},[576,1413,234],{"href":1414},"\u002Ftroubleshooting\u002Faddon-problems#writing-an-add-on"," lists each\nmessage and its fix.",[623,1417,1419],{"id":1418},"_4-try-it-from-the-directory","4. Try it from the directory",[557,1421,1422],{},"Add the directory itself as a collection, and install from it:",[635,1424,1426],{"className":1335,"code":1425,"language":1337,"meta":641,"style":641},"kraft admin addon collection add .\u002Facme-kraft\nkraft admin addon install release@acme\n",[567,1427,1428,1444],{"__ignoreMap":641},[645,1429,1430,1432,1434,1436,1439,1442],{"class":648,"line":694},[645,1431,1345],{"class":1344},[645,1433,1348],{"class":711},[645,1435,1351],{"class":711},[645,1437,1438],{"class":711}," collection",[645,1440,1441],{"class":711}," add",[645,1443,1357],{"class":711},[645,1445,1446,1448,1450,1452,1455],{"class":648,"line":701},[645,1447,1345],{"class":1344},[645,1449,1348],{"class":711},[645,1451,1351],{"class":711},[645,1453,1454],{"class":711}," install",[645,1456,1457],{"class":711}," release@acme\n",[557,1459,1460,1461,1464,1465,1469,1470,1473,1474,578],{},"An add-on from a directory collection has an update whenever its files change,\nwhatever its version. Edit a file, then run ",[567,1462,1463],{},"kraft admin addon update"," and\naccept the review. Before you add the published collection\n(",[576,1466,1468],{"href":1467},"\u002Fguides\u002Fcustomize\u002Fshare-chains-with-addons#install-an-add-on","Install an add-on","), remove this one:\n",[567,1471,1472],{},"kraft admin addon uninstall release@acme",", then\n",[567,1475,1476],{},"kraft admin addon collection remove acme",[557,1478,1479],{},"A directory collection exists on one machine only, and never auto-updates.",[623,1481,1483],{"id":1482},"_5-publish-it","5. Publish it",[557,1485,1486,1487,1490,1491,1493],{},"Commit the collection and push it to a git host. To release a change later,\nraise ",[567,1488,1489],{},"version"," in ",[567,1492,834],{}," and push. An installed instance sees an update\nonly when the version changes, so a push without a new version changes nothing\nfor the people who installed it.",[557,1495,1496,1497,578],{},"Tell people the collection's address and the add-on's id. They add and install\nit with the commands under ",[576,1498,1468],{"href":1467},[557,1500,1501],{},"A private repository works when git on the machine that runs the Kraft server\ncan clone it without a prompt: an SSH key, or a credential helper, that a server\nrun as a service can reach. Put no credentials in the URL; Kraft refuses one\nthat has them.",[623,1503,1505],{"id":1504},"run-validate-in-ci","Run validate in CI",[557,1507,1508,1509,1511,1512,1514,1515,1517],{},"Run ",[567,1510,1006],{}," on every push to the collection. ",[567,1513,1006],{}," needs no server and\nno config directory, so CI only installs Kraft and runs it. The job fails when\n",[567,1516,1006],{}," exits 1. For GitHub Actions:",[635,1519,1522],{"className":1010,"code":1520,"filename":1521,"language":1013,"meta":641,"style":641},"name: validate\non: [push, pull_request]\njobs:\n  validate:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - run: pipx run --spec kraft-sdlc kraft admin addon validate .\n",".github\u002Fworkflows\u002Fvalidate.yml",[567,1523,1524,1534,1552,1559,1566,1576,1583,1595],{"__ignoreMap":641},[645,1525,1526,1529,1531],{"class":648,"line":694},[645,1527,1528],{"class":704},"name",[645,1530,708],{"class":697},[645,1532,1533],{"class":711},"validate\n",[645,1535,1536,1539,1541,1544,1546,1549],{"class":648,"line":701},[645,1537,1538],{"class":1097},"on",[645,1540,915],{"class":697},[645,1542,1543],{"class":711},"push",[645,1545,761],{"class":697},[645,1547,1548],{"class":711},"pull_request",[645,1550,1551],{"class":697},"]\n",[645,1553,1554,1557],{"class":648,"line":718},[645,1555,1556],{"class":704},"jobs",[645,1558,1023],{"class":697},[645,1560,1561,1564],{"class":648,"line":731},[645,1562,1563],{"class":704},"  validate",[645,1565,1023],{"class":697},[645,1567,1568,1571,1573],{"class":648,"line":744},[645,1569,1570],{"class":704},"    runs-on",[645,1572,708],{"class":697},[645,1574,1575],{"class":711},"ubuntu-latest\n",[645,1577,1578,1581],{"class":648,"line":775},[645,1579,1580],{"class":704},"    steps",[645,1582,1023],{"class":697},[645,1584,1585,1587,1590,1592],{"class":648,"line":784},[645,1586,1214],{"class":697},[645,1588,1589],{"class":704},"uses",[645,1591,708],{"class":697},[645,1593,1594],{"class":711},"actions\u002Fcheckout@v4\n",[645,1596,1597,1599,1602,1604],{"class":648,"line":820},[645,1598,1214],{"class":697},[645,1600,1601],{"class":704},"run",[645,1603,708],{"class":697},[645,1605,1606],{"class":711},"pipx run --spec kraft-sdlc kraft admin addon validate .\n",[580,1608,1610],{"id":1609},"or-share-from-the-repository-itself","Or share from the repository itself",[557,1612,1613,1614,1618,1619,1622],{},"A collection suits chains many repositories share. For one repository's own\nchains, commit them in the repository and skip the collection: a\n",[576,1615,1617],{"href":1616},"\u002Fconcepts\u002Fvocabulary#repo-library","repo library"," is read from the repository's\n",[567,1620,1621],{},".kraft\u002F"," folder on its default branch, with no manifest and no install.",[1624,1625,1626,1644,1651],"ol",{},[588,1627,1628,1629,761,1631,761,1633,1636,1637,1640,1641,1643],{},"Put ",[567,1630,971],{},[567,1632,980],{},[567,1634,1635],{},"chains\u002F\u003Cname>.yaml"," or\n",[567,1638,1639],{},"skills\u002F\u003Cname>\u002FSKILL.md"," directly in ",[567,1642,1621],{},", commit them, and merge to the\ndefault branch.",[588,1645,1646,1647,1650],{},"A teammate runs ",[567,1648,1649],{},"kraft repo connect"," in a terminal. Connect prints a review\nof the library and asks whether to take it.",[588,1652,1653,1654,1657,1658,1661,1662,1665,1666,578],{},"Items filed in that repo run ",[567,1655,1656],{},".kraft\u002Fchains\u002Fdefault.yaml"," with no further\nsetup, and ",[567,1659,1660],{},"--chain my-repo:hotfix"," selects another. A later change waits\nuntil someone runs ",[567,1663,1664],{},"kraft repo library"," and takes it. The first accept asks\nwhether later text changes may be taken automatically; see\n",[576,1667,1669],{"href":1668},"\u002Freference\u002Fconfiguration\u002Frepo-libraries#automatic-updates","Automatic updates",[557,1671,1672,1673,1490,1675,1677,1678,1680,1681,1683],{},"The repository's ",[567,1674,987],{},[567,1676,323],{}," is the namespace, and an instance checks\nevery change against the same rules as an add-on. Unlike an add-on, the library\nis visible only to that repository's items: another repository, your own chains\nand ",[567,1679,349],{}," cannot name it.\n",[576,1682,411],{"href":412}," has the facts.",[580,1685,1687],{"id":1686},"serve-claude-code-from-the-same-directory","Serve Claude Code from the same directory",[557,1689,1690,1691,715,1693,761,1695,761,1697,1699,1700,1702],{},"An add-on directory can also be a Claude Code plugin. Kraft reads ",[567,1692,1621],{},[567,1694,971],{},[567,1696,980],{},[567,1698,974],{}," and ",[567,1701,977],{},", and nothing else in\nthe directory:",[635,1704,1707],{"className":1705,"code":1706,"language":640,"meta":641},[638],"addons\u002Frelease\u002F\n  .kraft\u002Faddon.json\n  .claude-plugin\u002Fplugin.json\n  library.yaml\n  chains\u002Fship.yaml\n  skills\u002Frelease-notes\u002FSKILL.md\n  hooks\u002Fhooks.json\n  .mcp.json\n",[567,1708,1709,1713,1717,1721,1725,1729,1733,1737],{"__ignoreMap":641},[645,1710,1712],{"className":1711},[648],"addons\u002Frelease\u002F\n",[645,1714,1716],{"className":1715},[648],"  .kraft\u002Faddon.json\n",[645,1718,1720],{"className":1719},[648],"  .claude-plugin\u002Fplugin.json\n",[645,1722,1724],{"className":1723},[648],"  library.yaml\n",[645,1726,1728],{"className":1727},[648],"  chains\u002Fship.yaml\n",[645,1730,1732],{"className":1731},[648],"  skills\u002Frelease-notes\u002FSKILL.md\n",[645,1734,1736],{"className":1735},[648],"  hooks\u002Fhooks.json\n",[645,1738,1740],{"className":1739},[648],"  .mcp.json\n",[585,1742,1743,1756,1768,1782],{},[588,1744,1745,1747,1748,1751,1752,1755],{},[567,1746,977],{}," has the layout Claude Code uses, so both tools read the same\n",[567,1749,1750],{},"SKILL.md",". The skill is ",[567,1753,1754],{},"release:release-notes"," in both.",[588,1757,1758,761,1761,1699,1764,1767],{},[567,1759,1760],{},".claude-plugin\u002F",[567,1762,1763],{},"hooks\u002F",[567,1765,1766],{},".mcp.json"," never reach Kraft. It does not\ninstall the Claude Code half: do that in Claude Code.",[588,1769,1770,1771,1774,1775,1778,1779,1781],{},"An alias changes the name on Kraft's side only. An add-on installed with\n",[567,1772,1773],{},"--as acme-release"," has ",[567,1776,1777],{},"acme-release:release-notes"," in Kraft and\n",[567,1780,1754],{}," in Claude Code.",[588,1783,1784,1785,1788,1789,1791],{},"A chain of yours that already says ",[567,1786,1787],{},"skill: release:\u003Cname>"," hands that skill to\nthe agent. Once an add-on holds the namespace ",[567,1790,573],{},", Kraft reads the\nskill from the add-on, and the install review lists each such reference.",[580,1793,1795],{"id":1794},"next-steps","Next steps",[585,1797,1798,1803,1812,1822,1830],{},[588,1799,1800,1802],{},[576,1801,119],{"href":120},": install an add-on from a collection, use what it ships, and keep it current.",[588,1804,1805,1807,1808,1811],{},[576,1806,407],{"href":408},": every manifest field, ",[567,1809,1810],{},"addons.yaml",", the lock, and when an add-on loads.",[588,1813,1814,1817,1818,1821],{},[576,1815,305],{"href":1816},"\u002Freference\u002Fcli\u002Fadmin#install-and-update-add-ons",": every ",[567,1819,1820],{},"kraft admin addon"," verb and flag.",[588,1823,1824,1826,1827,1829],{},[576,1825,234],{"href":1414},": the message ",[567,1828,1006],{}," printed, and its fix.",[588,1831,1832,1834],{},[576,1833,107],{"href":108},": the chain and library keys an add-on's files use.",[1836,1837,1838],"style",{},"html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}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 .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}",{"title":641,"searchDepth":701,"depth":701,"links":1840},[1841,1842,1851,1852,1853],{"id":582,"depth":701,"text":583},{"id":620,"depth":701,"text":621,"children":1843},[1844,1845,1847,1848,1849,1850],{"id":625,"depth":718,"text":626},{"id":939,"depth":718,"text":1846},"2. Write the add-​on's files",{"id":1331,"depth":718,"text":1332},{"id":1418,"depth":718,"text":1419},{"id":1482,"depth":718,"text":1483},{"id":1504,"depth":718,"text":1505},{"id":1609,"depth":701,"text":1610},{"id":1686,"depth":701,"text":1687},{"id":1794,"depth":701,"text":1795},"Lay out a collection, write an add-on's chains and skills, validate it, and publish it for other instances to install.","md",null,{},{"title":123,"description":1854},"1Bn-1f7mv4nWRQQDNeLSACx_tg90eh15-lPbeXLrA-M",[1861,1863],{"title":119,"path":120,"stem":121,"description":1862,"children":-1},"Install a Kraft add-on from a collection, use the chains, components and skills it ships, and keep it current or remove it.",{"title":10,"path":128,"stem":129,"description":1864,"children":-1},"Choose which agent CLI runs a task, and give it what it needs to run headless.",1792362346574]