[{"data":1,"prerenderedAt":2622},["ShallowReactive",2],{"navigation_docs":3,"-guides-customize-share-chains-with-addons":520,"-guides-customize-share-chains-with-addons-surround":2617},[4,28,51,191,222,485],{"title":5,"path":6,"stem":7,"children":8},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24],{"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},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F3.faq",{"title":29,"path":30,"stem":31,"children":32},"Concepts","\u002Fconcepts","2.concepts",[33,35,39,43,47],{"title":10,"path":30,"stem":34},"2.concepts\u002Findex",{"title":36,"path":37,"stem":38},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":40,"path":41,"stem":42},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":44,"path":45,"stem":46},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":48,"path":49,"stem":50},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":52,"path":53,"stem":54,"children":55},"Guides","\u002Fguides","3.guides",[56,58,96,117,138,187],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61,"children":62,"page":95},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day",[63,67,71,75,79,83,87,91],{"title":64,"path":65,"stem":66},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":68,"path":69,"stem":70},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":72,"path":73,"stem":74},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":76,"path":77,"stem":78},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":80,"path":81,"stem":82},"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":84,"path":85,"stem":86},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":88,"path":89,"stem":90},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":92,"path":93,"stem":94},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",false,{"title":97,"path":98,"stem":99,"children":100,"page":95},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize",[101,105,109,113],{"title":102,"path":103,"stem":104},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":106,"path":107,"stem":108},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":110,"path":111,"stem":112},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":114,"path":115,"stem":116},"Share chains with add-ons","\u002Fguides\u002Fcustomize\u002Fshare-chains-with-addons","3.guides\u002F2.customize\u002F4.share-chains-with-addons",{"title":118,"path":119,"stem":120,"children":121,"page":95},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses",[122,126,130,134],{"title":123,"path":124,"stem":125},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":127,"path":128,"stem":129},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":131,"path":132,"stem":133},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":135,"path":136,"stem":137},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":139,"path":140,"stem":141,"children":142,"page":95},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run",[143,147,151,155,159,163,167,171,175,179,183],{"title":144,"path":145,"stem":146},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":148,"path":149,"stem":150},"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":152,"path":153,"stem":154},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":156,"path":157,"stem":158},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":160,"path":161,"stem":162},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":164,"path":165,"stem":166},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":168,"path":169,"stem":170},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":172,"path":173,"stem":174},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":176,"path":177,"stem":178},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":180,"path":181,"stem":182},"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":184,"path":185,"stem":186},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":188,"path":189,"stem":190},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":192,"path":193,"stem":194,"children":195},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[196,198,202,206,210,214,218],{"title":10,"path":193,"stem":197},"4.troubleshooting\u002Findex",{"title":199,"path":200,"stem":201},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":203,"path":204,"stem":205},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":207,"path":208,"stem":209},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":211,"path":212,"stem":213},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":215,"path":216,"stem":217},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":219,"path":220,"stem":221},"Add-on problems","\u002Ftroubleshooting\u002Faddon-problems","4.troubleshooting\u002F6.addon-problems",{"title":223,"path":224,"stem":225,"children":226},"Reference","\u002Freference","5.reference",[227,229,267,289,293,391,409,435,439,443,477,481],{"title":10,"path":224,"stem":228},"5.reference\u002Findex",{"title":230,"path":231,"stem":232,"children":233},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[234,235,239,243,247,251,255,259,263],{"title":10,"path":231,"stem":232},{"title":236,"path":237,"stem":238},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":240,"path":241,"stem":242},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":244,"path":245,"stem":246},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":248,"path":249,"stem":250},"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":252,"path":253,"stem":254},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":256,"path":257,"stem":258},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":260,"path":261,"stem":262},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":264,"path":265,"stem":266},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":268,"path":269,"stem":270,"children":271},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[272,273,277,281,285],{"title":10,"path":269,"stem":270},{"title":274,"path":275,"stem":276},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":278,"path":279,"stem":280},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":282,"path":283,"stem":284},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":286,"path":287,"stem":288},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":290,"path":291,"stem":292},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":294,"path":295,"stem":296,"children":297},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[298,299,317,321,325,329,333,337,341,345,379,383,387],{"title":10,"path":295,"stem":296},{"title":300,"path":301,"stem":302,"children":303},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[304,305,309,313],{"title":10,"path":301,"stem":302},{"title":306,"path":307,"stem":308},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":310,"path":311,"stem":312},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":314,"path":315,"stem":316},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":318,"path":319,"stem":320},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":322,"path":323,"stem":324},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":326,"path":327,"stem":328},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":330,"path":331,"stem":332},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":334,"path":335,"stem":336},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":338,"path":339,"stem":340},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":342,"path":343,"stem":344},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":346,"path":347,"stem":348,"children":349},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[350,351,355,359,363,367,371,375],{"title":10,"path":347,"stem":348},{"title":352,"path":353,"stem":354},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":356,"path":357,"stem":358},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":360,"path":361,"stem":362},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":364,"path":365,"stem":366},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":368,"path":369,"stem":370},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":372,"path":373,"stem":374},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":376,"path":377,"stem":378},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":380,"path":381,"stem":382},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":384,"path":385,"stem":386},"Add-ons and collections","\u002Freference\u002Fconfiguration\u002Faddons","5.reference\u002F03.configuration\u002F12.addons",{"title":388,"path":389,"stem":390},"Repo libraries","\u002Freference\u002Fconfiguration\u002Frepo-libraries","5.reference\u002F03.configuration\u002F13.repo-libraries",{"title":392,"path":393,"stem":394,"children":395},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[396,397,401,405],{"title":10,"path":393,"stem":394},{"title":398,"path":399,"stem":400},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":402,"path":403,"stem":404},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":406,"path":407,"stem":408},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":410,"path":411,"stem":412,"children":413},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[414,415,419,423,427,431],{"title":10,"path":411,"stem":412},{"title":416,"path":417,"stem":418},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":420,"path":421,"stem":422},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":424,"path":425,"stem":426},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":428,"path":429,"stem":430},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":432,"path":433,"stem":434},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":436,"path":437,"stem":438},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":440,"path":441,"stem":442},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":444,"path":445,"stem":446,"children":447},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[448,449,453,457,461,465,469,473],{"title":10,"path":445,"stem":446},{"title":450,"path":451,"stem":452},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":454,"path":455,"stem":456},"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":458,"path":459,"stem":460},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":462,"path":463,"stem":464},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":466,"path":467,"stem":468},"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":470,"path":471,"stem":472},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":474,"path":475,"stem":476},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":478,"path":479,"stem":480},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":482,"path":483,"stem":484},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":486,"path":487,"stem":488,"children":489},"Security and project","\u002Fproject","6.project",[490,492,496,500,504,508,512,516],{"title":10,"path":487,"stem":491},"6.project\u002Findex",{"title":493,"path":494,"stem":495},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":497,"path":498,"stem":499},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":501,"path":502,"stem":503},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":505,"path":506,"stem":507},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":509,"path":510,"stem":511},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":513,"path":514,"stem":515},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":517,"path":518,"stem":519},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":521,"title":114,"body":522,"description":2611,"extension":2612,"links":2613,"meta":2614,"navigation":1184,"path":115,"seo":2615,"stem":116,"__hash__":2616},"docs\u002F3.guides\u002F2.customize\u002F4.share-chains-with-addons.md",{"type":523,"value":524,"toc":2576},"minimark",[525,540,567,661,665,699,702,707,714,758,764,910,920,1017,1021,1046,1062,1088,1226,1361,1397,1409,1413,1438,1447,1452,1478,1490,1496,1500,1503,1538,1554,1557,1561,1571,1576,1579,1583,1595,1684,1688,1700,1747,1758,1761,1765,1768,1801,1807,1811,1814,1834,1843,1869,1873,1890,1901,1945,1960,1970,1994,1998,2014,2023,2026,2046,2065,2069,2076,2252,2256,2260,2279,2307,2316,2319,2323,2344,2356,2367,2371,2392,2395,2413,2420,2424,2438,2476,2527,2531,2572],[526,527,528,529,534,535,539],"p",{},"Publish your chains as a ",[530,531,533],"a",{"href":532},"\u002Fconcepts\u002Fvocabulary#add-on","Kraft add-on"," in a\n",[530,536,538],{"href":537},"\u002Fconcepts\u002Fvocabulary#collection","collection",", and install it on every instance\nthat should run them. Each instance pins the add-on to a commit and changes it\nonly through an update you review.",[526,541,542,543,547,548,551,552,556,557,561,562,566],{},"This guide builds a collection ",[544,545,546],"code",{},"acme"," with one add-on, ",[544,549,550],{},"release",", then installs\nit. To write an add-on, start at ",[530,553,555],{"href":554},"#publish-a-collection","Publish a collection",".\nTo install someone else's, check ",[530,558,560],{"href":559},"#before-you-start","Before you start"," first,\nthen go to ",[530,563,565],{"href":564},"#install-an-add-on","Install an add-on",".",[568,569,570,583],"table",{},[571,572,573],"thead",{},[574,575,576,580],"tr",{},[577,578,579],"th",{},"To",[577,581,582],{},"Run",[584,585,586,599,611,623,635,648],"tbody",{},[574,587,588,594],{},[589,590,591],"td",{},[530,592,593],{"href":554},"Check an add-on you wrote",[589,595,596],{},[544,597,598],{},"kraft admin addon validate PATH",[574,600,601,606],{},[589,602,603],{},[530,604,605],{"href":564},"Add a collection",[589,607,608],{},[544,609,610],{},"kraft admin addon collection add SOURCE",[574,612,613,618],{},[589,614,615],{},[530,616,617],{"href":564},"Install an add-on from it",[589,619,620],{},[544,621,622],{},"kraft admin addon install ADDON@COLLECTION",[574,624,625,630],{},[589,626,627],{},[530,628,629],{"href":564},"See what is installed",[589,631,632],{},[544,633,634],{},"kraft admin addon list",[574,636,637,643],{},[589,638,639],{},[530,640,642],{"href":641},"#update-by-hand","Take a new version",[589,644,645],{},[544,646,647],{},"kraft admin addon update",[574,649,650,656],{},[589,651,652],{},[530,653,655],{"href":654},"#remove-an-add-on","Remove an add-on",[589,657,658],{},[544,659,660],{},"kraft admin addon uninstall ADDON@COLLECTION",[662,663,560],"h2",{"id":664},"before-you-start",[666,667,668,675,678],"ul",{},[669,670,671,672,566],"li",{},"A running Kraft server, and ",[544,673,674],{},"git",[669,676,677],{},"A git repository to publish the collection from, if other machines will\ninstall it.",[669,679,680,681,685,686,690,691,694,695,698],{},"The instance defines every ",[530,682,684],{"href":683},"\u002Fconcepts\u002Fvocabulary#harness","harness"," and\n",[530,687,689],{"href":688},"\u002Fconcepts\u002Fvocabulary#agent-profile","agent profile"," the add-on requires. The\nexample needs the shipped ",[544,692,693],{},"claude"," harness and ",[544,696,697],{},"strong"," profile.",[662,700,555],{"id":701},"publish-a-collection",[703,704,706],"h3",{"id":705},"_1-lay-out-the-collection","1. Lay out the collection",[526,708,709,710,713],{},"A collection is a directory with ",[544,711,712],{},".kraft\u002Fcollection.json"," at its root and one\ndirectory per add-on:",[715,716,722],"pre",{"className":717,"code":719,"language":720,"meta":721},[718],"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","",[544,723,724,730,734,738,742,746,750,754],{"__ignoreMap":721},[725,726,729],"span",{"className":727},[728],"line","acme-kraft\u002F\n",[725,731,733],{"className":732},[728],"  .kraft\u002Fcollection.json\n",[725,735,737],{"className":736},[728],"  addons\u002F\n",[725,739,741],{"className":740},[728],"    release\u002F\n",[725,743,745],{"className":744},[728],"      .kraft\u002Faddon.json\n",[725,747,749],{"className":748},[728],"      library.yaml\n",[725,751,753],{"className":752},[728],"      chains\u002Fship.yaml\n",[725,755,757],{"className":756},[728],"      skills\u002Frelease-notes\u002FSKILL.md\n",[526,759,760,763],{},[544,761,762],{},"collection.json"," names the collection and lists its add-ons:",[715,765,770],{"className":766,"code":767,"filename":768,"language":769,"meta":721,"style":721},"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",[544,771,772,779,796,809,822,853,862,898,904],{"__ignoreMap":721},[725,773,775],{"class":728,"line":774},1,[725,776,778],{"class":777},"s7iLA","{\n",[725,780,782,786,789,793],{"class":728,"line":781},2,[725,783,785],{"class":784},"sb7M8","  \"$schema\"",[725,787,788],{"class":777},": ",[725,790,792],{"class":791},"semJd","\"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Fcollection.schema.json\"",[725,794,795],{"class":777},",\n",[725,797,799,802,804,807],{"class":728,"line":798},3,[725,800,801],{"class":784},"  \"name\"",[725,803,788],{"class":777},[725,805,806],{"class":791},"\"acme\"",[725,808,795],{"class":777},[725,810,812,815,817,820],{"class":728,"line":811},4,[725,813,814],{"class":784},"  \"description\"",[725,816,788],{"class":777},[725,818,819],{"class":791},"\"ACME's Kraft chains and review methods\"",[725,821,795],{"class":777},[725,823,825,828,831,834,836,839,842,845,847,850],{"class":728,"line":824},5,[725,826,827],{"class":784},"  \"owner\"",[725,829,830],{"class":777},": { ",[725,832,833],{"class":784},"\"name\"",[725,835,788],{"class":777},[725,837,838],{"class":791},"\"ACME Platform\"",[725,840,841],{"class":777},", ",[725,843,844],{"class":784},"\"email\"",[725,846,788],{"class":777},[725,848,849],{"class":791},"\"platform@acme.dev\"",[725,851,852],{"class":777}," },\n",[725,854,856,859],{"class":728,"line":855},6,[725,857,858],{"class":784},"  \"addons\"",[725,860,861],{"class":777},": [\n",[725,863,865,868,870,872,875,877,880,882,885,887,890,892,895],{"class":728,"line":864},7,[725,866,867],{"class":777},"    { ",[725,869,833],{"class":784},[725,871,788],{"class":777},[725,873,874],{"class":791},"\"release\"",[725,876,841],{"class":777},[725,878,879],{"class":784},"\"source\"",[725,881,788],{"class":777},[725,883,884],{"class":791},"\".\u002Faddons\u002Frelease\"",[725,886,841],{"class":777},[725,888,889],{"class":784},"\"description\"",[725,891,788],{"class":777},[725,893,894],{"class":791},"\"Release chains\"",[725,896,897],{"class":777}," }\n",[725,899,901],{"class":728,"line":900},8,[725,902,903],{"class":777},"  ]\n",[725,905,907],{"class":728,"line":906},9,[725,908,909],{"class":777},"}\n",[526,911,912,915,916,919],{},[544,913,914],{},"addon.json"," names the add-on, its version, and what it needs from an\ninstance. ",[544,917,918],{},"\"kraft\": \"2\""," means any Kraft 2.x:",[715,921,924],{"className":766,"code":922,"filename":923,"language":769,"meta":721,"style":721},"{\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",[544,925,926,930,941,951,963,973,1013],{"__ignoreMap":721},[725,927,928],{"class":728,"line":774},[725,929,778],{"class":777},[725,931,932,934,936,939],{"class":728,"line":781},[725,933,785],{"class":784},[725,935,788],{"class":777},[725,937,938],{"class":791},"\"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Faddon.schema.json\"",[725,940,795],{"class":777},[725,942,943,945,947,949],{"class":728,"line":798},[725,944,801],{"class":784},[725,946,788],{"class":777},[725,948,874],{"class":791},[725,950,795],{"class":777},[725,952,953,956,958,961],{"class":728,"line":811},[725,954,955],{"class":784},"  \"version\"",[725,957,788],{"class":777},[725,959,960],{"class":791},"\"1.0.0\"",[725,962,795],{"class":777},[725,964,965,967,969,971],{"class":728,"line":824},[725,966,814],{"class":784},[725,968,788],{"class":777},[725,970,894],{"class":791},[725,972,795],{"class":777},[725,974,975,978,980,983,985,988,990,993,996,999,1002,1005,1007,1010],{"class":728,"line":855},[725,976,977],{"class":784},"  \"requires\"",[725,979,830],{"class":777},[725,981,982],{"class":784},"\"kraft\"",[725,984,788],{"class":777},[725,986,987],{"class":791},"\"2\"",[725,989,841],{"class":777},[725,991,992],{"class":784},"\"harnesses\"",[725,994,995],{"class":777},": [",[725,997,998],{"class":791},"\"claude\"",[725,1000,1001],{"class":777},"], ",[725,1003,1004],{"class":784},"\"profiles\"",[725,1006,995],{"class":777},[725,1008,1009],{"class":791},"\"strong\"",[725,1011,1012],{"class":777},"] }\n",[725,1014,1015],{"class":728,"line":864},[725,1016,909],{"class":777},[703,1018,1020],{"id":1019},"_2-write-the-add-ons-files","2. Write the add-on's files",[526,1022,1023,1024,1027,1028,841,1031,1034,1035,1038,1039,1034,1042,1045],{},"The files have the same shape as the ones in your own ",[544,1025,1026],{},"config\u002F",". Inside an\nadd-on, a bare ",[544,1029,1030],{},"extends:",[544,1032,1033],{},"steering:"," or ",[544,1036,1037],{},"skill:"," names the add-on's own\ndeclaration. A bare ",[544,1040,1041],{},"harness:",[544,1043,1044],{},"profile:"," names the instance's.",[526,1047,1048,1049,841,1052,841,1055,685,1058,1061],{},"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 ",[544,1050,1051],{},"library.yaml",[544,1053,1054],{},"chains\u002F",[544,1056,1057],{},"skills\u002F",[544,1059,1060],{},"profiles.yaml"," is refused.",[526,1063,1064,1065,1068,1069,1072,1073,1034,1076,1079,1080,1083,1084,1087],{},"A chain is named by its ",[544,1066,1067],{},"id",", or by its file name when it has none, so the chain\nbelow is ",[544,1070,1071],{},"release:ship"," once installed. A file name is a lowercase letter, then\nlowercase letters, digits, ",[544,1074,1075],{},"_",[544,1077,1078],{},"-",". Kraft ignores ",[544,1081,1082],{},"chains\u002FShip.yaml",", and\n",[544,1085,1086],{},"validate"," warns about it.",[715,1089,1094],{"className":1090,"code":1091,"filename":1092,"language":1093,"meta":721,"style":721},"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",[544,1095,1096,1104,1111,1121,1131,1141,1151,1161,1168,1179,1186,1194,1204,1215],{"__ignoreMap":721},[725,1097,1098,1101],{"class":728,"line":774},[725,1099,1100],{"class":784},"tasks",[725,1102,1103],{"class":777},":\n",[725,1105,1106,1109],{"class":728,"line":781},[725,1107,1108],{"class":784},"  implementer",[725,1110,1103],{"class":777},[725,1112,1113,1116,1118],{"class":728,"line":798},[725,1114,1115],{"class":784},"    kind",[725,1117,788],{"class":777},[725,1119,1120],{"class":791},"agent\n",[725,1122,1123,1126,1128],{"class":728,"line":811},[725,1124,1125],{"class":784},"    harness",[725,1127,788],{"class":777},[725,1129,1130],{"class":791},"claude\n",[725,1132,1133,1136,1138],{"class":728,"line":824},[725,1134,1135],{"class":784},"    profile",[725,1137,788],{"class":777},[725,1139,1140],{"class":791},"strong\n",[725,1142,1143,1146,1148],{"class":728,"line":855},[725,1144,1145],{"class":784},"    prompt",[725,1147,788],{"class":777},[725,1149,1150],{"class":791},"Implement the approved plan, then write the release notes.\n",[725,1152,1153,1156,1158],{"class":728,"line":864},[725,1154,1155],{"class":784},"    skill",[725,1157,788],{"class":777},[725,1159,1160],{"class":791},"release-notes\n",[725,1162,1163,1166],{"class":728,"line":900},[725,1164,1165],{"class":784},"    policy",[725,1167,1103],{"class":777},[725,1169,1170,1173,1175],{"class":728,"line":906},[725,1171,1172],{"class":784},"      time_cap_minutes",[725,1174,788],{"class":777},[725,1176,1178],{"class":1177},"ssYy9","90\n",[725,1180,1182],{"class":728,"line":1181},10,[725,1183,1185],{"emptyLinePlaceholder":1184},true,"\n",[725,1187,1189,1192],{"class":728,"line":1188},11,[725,1190,1191],{"class":784},"  test_changed_scopes",[725,1193,1103],{"class":777},[725,1195,1197,1199,1201],{"class":728,"line":1196},12,[725,1198,1115],{"class":784},[725,1200,788],{"class":777},[725,1202,1203],{"class":791},"builtin\n",[725,1205,1207,1210,1212],{"class":728,"line":1206},13,[725,1208,1209],{"class":784},"    ref",[725,1211,788],{"class":777},[725,1213,1214],{"class":791},"kraft.verify_changed_test_scopes\n",[725,1216,1218,1221,1223],{"class":728,"line":1217},14,[725,1219,1220],{"class":784},"    scope",[725,1222,788],{"class":777},[725,1224,1225],{"class":791},"each_repository\n",[715,1227,1230],{"className":1090,"code":1228,"filename":1229,"language":1093,"meta":721,"style":721},"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",[544,1231,1232,1241,1251,1255,1262,1274,1283,1290,1302,1312,1316,1327,1335,1341,1352],{"__ignoreMap":721},[725,1233,1234,1236,1238],{"class":728,"line":774},[725,1235,1067],{"class":784},[725,1237,788],{"class":777},[725,1239,1240],{"class":791},"ship\n",[725,1242,1243,1246,1248],{"class":728,"line":781},[725,1244,1245],{"class":784},"description",[725,1247,788],{"class":777},[725,1249,1250],{"class":791},"Implement, write release notes, run the tests for what changed.\n",[725,1252,1253],{"class":728,"line":798},[725,1254,1185],{"emptyLinePlaceholder":1184},[725,1256,1257,1260],{"class":728,"line":811},[725,1258,1259],{"class":784},"nodes",[725,1261,1103],{"class":777},[725,1263,1264,1267,1269,1271],{"class":728,"line":824},[725,1265,1266],{"class":777},"  - ",[725,1268,1067],{"class":784},[725,1270,788],{"class":777},[725,1272,1273],{"class":791},"implementation\n",[725,1275,1276,1278,1280],{"class":728,"line":855},[725,1277,1115],{"class":784},[725,1279,788],{"class":777},[725,1281,1282],{"class":791},"exec\n",[725,1284,1285,1288],{"class":728,"line":864},[725,1286,1287],{"class":784},"    tasks",[725,1289,1103],{"class":777},[725,1291,1292,1295,1297,1299],{"class":728,"line":900},[725,1293,1294],{"class":777},"      - ",[725,1296,1067],{"class":784},[725,1298,788],{"class":777},[725,1300,1301],{"class":791},"implement\n",[725,1303,1304,1307,1309],{"class":728,"line":906},[725,1305,1306],{"class":784},"        extends",[725,1308,788],{"class":777},[725,1310,1311],{"class":791},"implementer\n",[725,1313,1314],{"class":728,"line":1181},[725,1315,1185],{"emptyLinePlaceholder":1184},[725,1317,1318,1320,1322,1324],{"class":728,"line":1188},[725,1319,1266],{"class":777},[725,1321,1067],{"class":784},[725,1323,788],{"class":777},[725,1325,1326],{"class":791},"verify\n",[725,1328,1329,1331,1333],{"class":728,"line":1196},[725,1330,1115],{"class":784},[725,1332,788],{"class":777},[725,1334,1282],{"class":791},[725,1336,1337,1339],{"class":728,"line":1206},[725,1338,1287],{"class":784},[725,1340,1103],{"class":777},[725,1342,1343,1345,1347,1349],{"class":728,"line":1217},[725,1344,1294],{"class":777},[725,1346,1067],{"class":784},[725,1348,788],{"class":777},[725,1350,1351],{"class":791},"test_changed_scopes\n",[725,1353,1355,1357,1359],{"class":728,"line":1354},15,[725,1356,1306],{"class":784},[725,1358,788],{"class":777},[725,1360,1351],{"class":791},[715,1362,1367],{"className":1363,"code":1364,"filename":1365,"language":1366,"meta":721,"style":721},"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",[544,1368,1369,1374,1379,1384,1388,1392],{"__ignoreMap":721},[725,1370,1371],{"class":728,"line":774},[725,1372,1373],{},"---\n",[725,1375,1376],{"class":728,"line":781},[725,1377,1378],{},"name: release-notes\n",[725,1380,1381],{"class":728,"line":798},[725,1382,1383],{},"description: Write release notes for the change in this worktree.\n",[725,1385,1386],{"class":728,"line":811},[725,1387,1373],{},[725,1389,1390],{"class":728,"line":824},[725,1391,1185],{"emptyLinePlaceholder":1184},[725,1393,1394],{"class":728,"line":855},[725,1395,1396],{},"Add one line to `RELEASES.md` for each user-visible change, newest first.\n",[526,1398,1399,1400,1403,1404,1408],{},"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 ",[544,1401,1402],{},"subprocess"," task\nor a permission. ",[530,1405,1407],{"href":1406},"\u002Freference\u002Fconfiguration\u002Faddons#what-an-add-on-may-set","What an add-on may set","\nhas the list.",[703,1410,1412],{"id":1411},"_3-validate-it","3. Validate it",[715,1414,1418],{"className":1415,"code":1416,"language":1417,"meta":721,"style":721},"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",[544,1419,1420],{"__ignoreMap":721},[725,1421,1422,1426,1429,1432,1435],{"class":728,"line":774},[725,1423,1425],{"class":1424},"szw1H","kraft",[725,1427,1428],{"class":791}," admin",[725,1430,1431],{"class":791}," addon",[725,1433,1434],{"class":791}," validate",[725,1436,1437],{"class":791}," .\u002Facme-kraft\n",[715,1439,1442],{"className":1440,"code":1441,"language":720,"meta":721},[718],"release 1.0.0  sha256:f915f6266d319e9c0bc2bb2483683d74f307839138258901919e7d071fd37da4\n",[544,1443,1444],{"__ignoreMap":721},[725,1445,1441],{"className":1446},[728],[526,1448,1449,1451],{},[544,1450,1086],{}," runs the checks an install runs and installs nothing. It prints one\nline per add-on, then:",[666,1453,1454,1461,1468],{},[669,1455,1456,1457,1460],{},"each problem as ",[544,1458,1459],{},"error: \u003Cfile>: \u003Cmessage>",". Any problem makes it exit 1.",[669,1462,1463,1464,1467],{},"each file or manifest key Kraft ignores as ",[544,1465,1466],{},"warning: \u003Cmessage>",". A warning\ndoes not change the exit code.",[669,1469,1470,1471,1473,1474,1477],{},"when the config directory has no ",[544,1472,1051],{},", as in CI, a ",[544,1475,1476],{},"skipped:"," line\nthat names the checks it left out.",[526,1479,1480,1481,841,1483,1485,1486,1489],{},"When the config directory has a ",[544,1482,1051],{},[544,1484,1086],{}," also checks the\nadd-on against that instance: its ",[544,1487,1488],{},"requires",", its namespace, and your own\nchains.",[526,1491,1492,1495],{},[530,1493,219],{"href":1494},"\u002Ftroubleshooting\u002Faddon-problems#writing-an-add-on"," lists each\nmessage and its fix.",[703,1497,1499],{"id":1498},"_4-try-it-from-the-directory","4. Try it from the directory",[526,1501,1502],{},"Add the directory itself as a collection, and install from it:",[715,1504,1506],{"className":1415,"code":1505,"language":1417,"meta":721,"style":721},"kraft admin addon collection add .\u002Facme-kraft\nkraft admin addon install release@acme\n",[544,1507,1508,1524],{"__ignoreMap":721},[725,1509,1510,1512,1514,1516,1519,1522],{"class":728,"line":774},[725,1511,1425],{"class":1424},[725,1513,1428],{"class":791},[725,1515,1431],{"class":791},[725,1517,1518],{"class":791}," collection",[725,1520,1521],{"class":791}," add",[725,1523,1437],{"class":791},[725,1525,1526,1528,1530,1532,1535],{"class":728,"line":781},[725,1527,1425],{"class":1424},[725,1529,1428],{"class":791},[725,1531,1431],{"class":791},[725,1533,1534],{"class":791}," install",[725,1536,1537],{"class":791}," release@acme\n",[526,1539,1540,1541,1543,1544,1546,1547,1550,1551,566],{},"An add-on from a directory collection has an update whenever its files change,\nwhatever its version. Edit a file, then run ",[544,1542,647],{}," and\naccept the review. Before you add the published collection\n(",[530,1545,565],{"href":564},"), remove this one:\n",[544,1548,1549],{},"kraft admin addon uninstall release@acme",", then\n",[544,1552,1553],{},"kraft admin addon collection remove acme",[526,1555,1556],{},"A directory collection exists on one machine only, and never auto-updates.",[703,1558,1560],{"id":1559},"_5-publish-it","5. Publish it",[526,1562,1563,1564,1567,1568,1570],{},"Commit the collection and push it to a git host. To release a change later,\nraise ",[544,1565,1566],{},"version"," in ",[544,1569,914],{}," 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.",[526,1572,1573,1574,566],{},"Tell people the collection's address and the add-on's id. They add and install\nit with the commands under ",[530,1575,565],{"href":564},[526,1577,1578],{},"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.",[703,1580,1582],{"id":1581},"run-validate-in-ci","Run validate in CI",[526,1584,1585,1586,1588,1589,1591,1592,1594],{},"Run ",[544,1587,1086],{}," on every push to the collection. ",[544,1590,1086],{}," needs no server and\nno config directory, so CI only installs Kraft and runs it. The job fails when\n",[544,1593,1086],{}," exits 1. For GitHub Actions:",[715,1596,1599],{"className":1090,"code":1597,"filename":1598,"language":1093,"meta":721,"style":721},"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",[544,1600,1601,1611,1629,1636,1643,1653,1660,1672],{"__ignoreMap":721},[725,1602,1603,1606,1608],{"class":728,"line":774},[725,1604,1605],{"class":784},"name",[725,1607,788],{"class":777},[725,1609,1610],{"class":791},"validate\n",[725,1612,1613,1616,1618,1621,1623,1626],{"class":728,"line":781},[725,1614,1615],{"class":1177},"on",[725,1617,995],{"class":777},[725,1619,1620],{"class":791},"push",[725,1622,841],{"class":777},[725,1624,1625],{"class":791},"pull_request",[725,1627,1628],{"class":777},"]\n",[725,1630,1631,1634],{"class":728,"line":798},[725,1632,1633],{"class":784},"jobs",[725,1635,1103],{"class":777},[725,1637,1638,1641],{"class":728,"line":811},[725,1639,1640],{"class":784},"  validate",[725,1642,1103],{"class":777},[725,1644,1645,1648,1650],{"class":728,"line":824},[725,1646,1647],{"class":784},"    runs-on",[725,1649,788],{"class":777},[725,1651,1652],{"class":791},"ubuntu-latest\n",[725,1654,1655,1658],{"class":728,"line":855},[725,1656,1657],{"class":784},"    steps",[725,1659,1103],{"class":777},[725,1661,1662,1664,1667,1669],{"class":728,"line":864},[725,1663,1294],{"class":777},[725,1665,1666],{"class":784},"uses",[725,1668,788],{"class":777},[725,1670,1671],{"class":791},"actions\u002Fcheckout@v4\n",[725,1673,1674,1676,1679,1681],{"class":728,"line":900},[725,1675,1294],{"class":777},[725,1677,1678],{"class":784},"run",[725,1680,788],{"class":777},[725,1682,1683],{"class":791},"pipx run --spec kraft-sdlc kraft admin addon validate .\n",[662,1685,1687],{"id":1686},"or-share-from-the-repository-itself","Or share from the repository itself",[526,1689,1690,1691,1695,1696,1699],{},"A collection suits chains many repositories share. For one repository's own\nchains, commit them in the repository and skip the collection: a\n",[530,1692,1694],{"href":1693},"\u002Fconcepts\u002Fvocabulary#repo-library","repo library"," is read from the repository's\n",[544,1697,1698],{},".kraft\u002F"," folder on its default branch, with no manifest and no install.",[1701,1702,1703,1721,1728],"ol",{},[669,1704,1705,1706,841,1708,841,1710,1713,1714,1717,1718,1720],{},"Put ",[544,1707,1051],{},[544,1709,1060],{},[544,1711,1712],{},"chains\u002F\u003Cname>.yaml"," or\n",[544,1715,1716],{},"skills\u002F\u003Cname>\u002FSKILL.md"," directly in ",[544,1719,1698],{},", commit them, and merge to the\ndefault branch.",[669,1722,1723,1724,1727],{},"A teammate runs ",[544,1725,1726],{},"kraft repo connect"," in a terminal. Connect prints a review\nof the library and asks whether to take it.",[669,1729,1730,1731,1734,1735,1738,1739,1742,1743,566],{},"Items filed in that repo run ",[544,1732,1733],{},".kraft\u002Fchains\u002Fdefault.yaml"," with no further\nsetup, and ",[544,1736,1737],{},"--chain my-repo:hotfix"," selects another. A later change waits\nuntil someone runs ",[544,1740,1741],{},"kraft repo library"," and takes it. The first accept asks\nwhether later text changes may be taken automatically; see\n",[530,1744,1746],{"href":1745},"\u002Freference\u002Fconfiguration\u002Frepo-libraries#automatic-updates","Automatic updates",[526,1748,1749,1750,1567,1752,1754,1755,1757],{},"The repository's ",[544,1751,1067],{},[544,1753,300],{}," is the namespace, and an instance checks\nevery change against the same rules as an add-on.\n",[530,1756,388],{"href":389}," has the facts.",[662,1759,565],{"id":1760},"install-an-add-on",[703,1762,1764],{"id":1763},"bound-what-an-add-ons-agents-may-do","Bound what an add-on's agents may do",[526,1766,1767],{},"An add-on's prompts, steering and skills are instructions an agent follows with\nwhatever tools your instance allows it. An add-on cannot widen what a run may\ndo, but with nothing set on the instance an agent may already run any command.\nBefore you install an add-on from people you do not fully trust, set these on\nthe instance:",[666,1769,1770,1781,1794],{},[669,1771,1772,1567,1775,1780],{},[544,1773,1774],{},"maxima:",[530,1776,1778],{"href":1777},"\u002Freference\u002Fconfiguration\u002Fpolicy#defaults-and-maxima",[544,1779,318],{},",\nso no add-on sets a time, attempt or budget limit above yours;",[669,1782,1783,1789,1790,1793],{},[530,1784,1786],{"href":1785},"\u002Freference\u002Fconfiguration\u002Fpolicy#tool-lists",[544,1787,1788],{},"allowed_tools",", so the\n",[530,1791,1792],{"href":437},"permission gate"," answers from your list;",[669,1795,1796,1797,1800],{},"a ",[530,1798,1799],{"href":347},"sandbox"," on each repo the add-on's chains\nrun in.",[526,1802,1803,1806],{},[530,1804,493],{"href":1805},"\u002Fproject\u002Fsecurity#kraft-add-ons"," explains why an add-on carries\nlimits and never permissions.",[703,1808,1810],{"id":1809},"_1-add-the-collection","1. Add the collection",[526,1812,1813],{},"Kraft ships no collection and has no directory of them, so ask whoever\npublished the add-on for its address. Then add it:",[715,1815,1817],{"className":1415,"code":1816,"language":1417,"meta":721,"style":721},"kraft admin addon collection add acme\u002Fkraft-addons\n",[544,1818,1819],{"__ignoreMap":721},[725,1820,1821,1823,1825,1827,1829,1831],{"class":728,"line":774},[725,1822,1425],{"class":1424},[725,1824,1428],{"class":791},[725,1826,1431],{"class":791},[725,1828,1518],{"class":791},[725,1830,1521],{"class":791},[725,1832,1833],{"class":791}," acme\u002Fkraft-addons\n",[715,1835,1838],{"className":1836,"code":1837,"language":720,"meta":721},[718],"added collection acme\n",[544,1839,1840],{"__ignoreMap":721},[725,1841,1837],{"className":1842},[728],[526,1844,1845,1848,1849,1852,1853,1856,1857,1860,1861,1864,1865,1868],{},[544,1846,1847],{},"owner\u002Frepo"," is a GitHub repository. An https URL, an ",[544,1850,1851],{},"ssh:\u002F\u002F"," URL, a\n",[544,1854,1855],{},"user@host:path"," address or a ",[544,1858,1859],{},"file:\u002F\u002F\u002F"," URL works too, and ",[544,1862,1863],{},"--ref"," picks a\nbranch, tag or commit. This installs nothing.\n",[544,1866,1867],{},"kraft admin addon collection list"," shows what the collection publishes.",[703,1870,1872],{"id":1871},"_2-install-the-add-on","2. Install the add-on",[715,1874,1876],{"className":1415,"code":1875,"language":1417,"meta":721,"style":721},"kraft admin addon install release@acme\n",[544,1877,1878],{"__ignoreMap":721},[725,1879,1880,1882,1884,1886,1888],{"class":728,"line":774},[725,1881,1425],{"class":1424},[725,1883,1428],{"class":791},[725,1885,1431],{"class":791},[725,1887,1534],{"class":791},[725,1889,1537],{"class":791},[526,1891,1892,1893,1896,1897,1900],{},"Kraft fetches the add-on, checks it against your instance, and prints a\nreview. ",[697,1894,1895],{},"Reach"," lists what decides how far a run goes: gates, merge steps,\nharnesses, models and limits. ",[697,1898,1899],{},"Content"," lists the rest, with every prompt and\nskill in full. On a first install everything is new:",[715,1902,1905],{"className":1903,"code":1904,"language":720,"meta":721},[718],"release@acme new, 1.0.0\nReach:\n  - release:ship.nodes[implementation].tasks[implement]: harness set to 'claude'\n  - release:ship.nodes[implementation].tasks[implement].policy: limit time_cap_minutes set, set to 90\n  ...\nContent:\n  - release:ship.nodes[implementation].tasks[implement]: prompt new:\nImplement the approved plan, then write the release notes.\n  ...\nApply release@acme? [y\u002FN]\n",[544,1906,1907,1911,1915,1919,1923,1927,1931,1935,1938,1941],{"__ignoreMap":721},[725,1908,1910],{"className":1909},[728],"release@acme new, 1.0.0\n",[725,1912,1914],{"className":1913},[728],"Reach:\n",[725,1916,1918],{"className":1917},[728],"  - release:ship.nodes[implementation].tasks[implement]: harness set to 'claude'\n",[725,1920,1922],{"className":1921},[728],"  - release:ship.nodes[implementation].tasks[implement].policy: limit time_cap_minutes set, set to 90\n",[725,1924,1926],{"className":1925},[728],"  ...\n",[725,1928,1930],{"className":1929},[728],"Content:\n",[725,1932,1934],{"className":1933},[728],"  - release:ship.nodes[implementation].tasks[implement]: prompt new:\n",[725,1936,1150],{"className":1937},[728],[725,1939,1926],{"className":1940},[728],[725,1942,1944],{"className":1943},[728],"Apply release@acme? [y\u002FN]\n",[526,1946,1947,1948,1951,1952,1955,1956,1959],{},"Read it, then answer ",[544,1949,1950],{},"y",". Nothing is installed until you do. ",[544,1953,1954],{},"-y"," accepts without\nasking. A running server loads the add-on at once.\n",[530,1957,219],{"href":1958},"\u002Ftroubleshooting\u002Faddon-problems#adding-installing-updating-and-removing","\ncovers a refused or declined install.",[526,1961,1962,1963,1965,1966,1969],{},"If another add-on or a repository already uses the name ",[544,1964,550],{},", install it\nunder another namespace with ",[544,1967,1968],{},"--as",":",[715,1971,1973],{"className":1415,"code":1972,"language":1417,"meta":721,"style":721},"kraft admin addon install release@acme --as acme-release\n",[544,1974,1975],{"__ignoreMap":721},[725,1976,1977,1979,1981,1983,1985,1988,1991],{"class":728,"line":774},[725,1978,1425],{"class":1424},[725,1980,1428],{"class":791},[725,1982,1431],{"class":791},[725,1984,1534],{"class":791},[725,1986,1987],{"class":791}," release@acme",[725,1989,1990],{"class":1177}," --as",[725,1992,1993],{"class":791}," acme-release\n",[703,1995,1997],{"id":1996},"_3-check-it-worked","3. Check it worked",[715,1999,2001],{"className":1415,"code":2000,"language":1417,"meta":721,"style":721},"kraft admin addon list\n",[544,2002,2003],{"__ignoreMap":721},[725,2004,2005,2007,2009,2011],{"class":728,"line":774},[725,2006,1425],{"class":1424},[725,2008,1428],{"class":791},[725,2010,1431],{"class":791},[725,2012,2013],{"class":791}," list\n",[715,2015,2018],{"className":2016,"code":2017,"language":720,"meta":721},[718],"release@acme  release  1.0.0  f4a11422cc83\n",[544,2019,2020],{"__ignoreMap":721},[725,2021,2017],{"className":2022},[728],[526,2024,2025],{},"The columns are the add-on id, its namespace, its version and the commit it is\npinned to. Then read a chain it ships:",[715,2027,2029],{"className":1415,"code":2028,"language":1417,"meta":721,"style":721},"kraft admin templates show release:ship\n",[544,2030,2031],{"__ignoreMap":721},[725,2032,2033,2035,2037,2040,2043],{"class":728,"line":774},[725,2034,1425],{"class":1424},[725,2036,1428],{"class":791},[725,2038,2039],{"class":791}," templates",[725,2041,2042],{"class":791}," show",[725,2044,2045],{"class":791}," release:ship\n",[526,2047,2048,2049,2052,2053,2056,2057,2060,2061,2064],{},"The output starts with ",[544,2050,2051],{},"# release:ship (release@acme 1.0.0)",".\n",[544,2054,2055],{},"kraft admin doctor"," shows ",[544,2058,2059],{},"1 add-on(s) load"," on its ",[544,2062,2063],{},"add-ons"," row.",[662,2066,2068],{"id":2067},"use-what-an-add-on-ships","Use what an add-on ships",[526,2070,2071,2072,2075],{},"Everything an add-on declares is named ",[544,2073,2074],{},"\u003Cnamespace>:\u003Cname>"," from outside it.",[666,2077,2078,2115,2205,2234],{},[669,2079,2080,2083,2084,1567,2087,1969,2092],{},[697,2081,2082],{},"Run its chain."," Name it when you file an item, or make it a repo's\n",[544,2085,2086],{},"default_chain",[530,2088,2090],{"href":2089},"\u002Freference\u002Fconfiguration\u002Frepos#default_chain",[544,2091,300],{},[715,2093,2095],{"className":1415,"code":2094,"language":1417,"meta":721,"style":721},"kraft item create \"Cut the 4.2 release\" --chain release:ship\n",[544,2096,2097],{"__ignoreMap":721},[725,2098,2099,2101,2104,2107,2110,2113],{"class":728,"line":774},[725,2100,1425],{"class":1424},[725,2102,2103],{"class":791}," item",[725,2105,2106],{"class":791}," create",[725,2108,2109],{"class":791}," \"Cut the 4.2 release\"",[725,2111,2112],{"class":1177}," --chain",[725,2114,2045],{"class":791},[669,2116,2117,2120,2121,2123,2124],{},[697,2118,2119],{},"Extend a component."," A chain or library component of your own takes an\nadd-on's with ",[544,2122,1030],{}," and changes what it needs. An update to the add-on\nreaches your chain too, and its review shows the change:",[715,2125,2128],{"className":1090,"code":2126,"filename":2127,"language":1093,"meta":721,"style":721},"id: mine\nnodes:\n  - id: implementation\n    kind: exec\n    tasks:\n      - id: implement\n        extends: release:implementer\n        policy:\n          time_cap_minutes: 60\n","config\u002Fchains\u002Fmine.yaml",[544,2129,2130,2139,2145,2155,2163,2169,2179,2188,2195],{"__ignoreMap":721},[725,2131,2132,2134,2136],{"class":728,"line":774},[725,2133,1067],{"class":784},[725,2135,788],{"class":777},[725,2137,2138],{"class":791},"mine\n",[725,2140,2141,2143],{"class":728,"line":781},[725,2142,1259],{"class":784},[725,2144,1103],{"class":777},[725,2146,2147,2149,2151,2153],{"class":728,"line":798},[725,2148,1266],{"class":777},[725,2150,1067],{"class":784},[725,2152,788],{"class":777},[725,2154,1273],{"class":791},[725,2156,2157,2159,2161],{"class":728,"line":811},[725,2158,1115],{"class":784},[725,2160,788],{"class":777},[725,2162,1282],{"class":791},[725,2164,2165,2167],{"class":728,"line":824},[725,2166,1287],{"class":784},[725,2168,1103],{"class":777},[725,2170,2171,2173,2175,2177],{"class":728,"line":855},[725,2172,1294],{"class":777},[725,2174,1067],{"class":784},[725,2176,788],{"class":777},[725,2178,1301],{"class":791},[725,2180,2181,2183,2185],{"class":728,"line":864},[725,2182,1306],{"class":784},[725,2184,788],{"class":777},[725,2186,2187],{"class":791},"release:implementer\n",[725,2189,2190,2193],{"class":728,"line":900},[725,2191,2192],{"class":784},"        policy",[725,2194,1103],{"class":777},[725,2196,2197,2200,2202],{"class":728,"line":906},[725,2198,2199],{"class":784},"          time_cap_minutes",[725,2201,788],{"class":777},[725,2203,2204],{"class":1177},"60\n",[669,2206,2207,2210,2211,841,2214,1713,2217,2220,2221,2223,2224,2226,2227,2052,2229,2233],{},[697,2208,2209],{},"Select its skill, steering profile or agent profile."," Set\n",[544,2212,2213],{},"skill: release:release-notes",[544,2215,2216],{},"steering: [release:house-style]",[544,2218,2219],{},"profile: release:careful"," on a task in your own chain or library. The add-on\nmust ship the one you name. The example add-on ships only the skill. An add-on\ndeclares a steering profile in the ",[544,2222,1033],{}," section of its ",[544,2225,1051],{},",\nand an agent profile in its ",[544,2228,1060],{},[530,2230,2232],{"href":2231},"\u002Freference\u002Fconfiguration\u002Faddons#names","Names"," lists every qualified\nreference.",[669,2235,2236,2239,2240,2243,2244,2247,2248,2251],{},[697,2237,2238],{},"Copy it."," An add-on's chains and components are read-only. In the web UI,\nopen the chain under ",[697,2241,2242],{},"Templates › Chains",", or the component under\n",[697,2245,2246],{},"Templates › Library",", and click ",[697,2249,2250],{},"Copy to my library",". Kraft asks for a\nname and opens a draft that is yours to edit. A copy no longer follows the\nadd-on's updates. The phone layout has no copy button.",[662,2253,2255],{"id":2254},"keep-it-current","Keep it current",[703,2257,2259],{"id":2258},"update-by-hand","Update by hand",[715,2261,2263],{"className":1415,"code":2262,"language":1417,"meta":721,"style":721},"kraft admin addon update --check\n",[544,2264,2265],{"__ignoreMap":721},[725,2266,2267,2269,2271,2273,2276],{"class":728,"line":774},[725,2268,1425],{"class":1424},[725,2270,1428],{"class":791},[725,2272,1431],{"class":791},[725,2274,2275],{"class":791}," update",[725,2277,2278],{"class":1177}," --check\n",[715,2280,2283],{"className":2281,"code":2282,"language":720,"meta":721},[718],"release@acme 1.0.0 -> 1.1.0\nReach:\n  - release:ship.nodes[implementation].tasks[implement].policy: limit time_cap_minutes raised, 90 -> 120\nContent:\n  - component tasks.implementer changed\nrelease@acme: update waiting\n",[544,2284,2285,2289,2292,2296,2299,2303],{"__ignoreMap":721},[725,2286,2288],{"className":2287},[728],"release@acme 1.0.0 -> 1.1.0\n",[725,2290,1914],{"className":2291},[728],[725,2293,2295],{"className":2294},[728],"  - release:ship.nodes[implementation].tasks[implement].policy: limit time_cap_minutes raised, 90 -> 120\n",[725,2297,1930],{"className":2298},[728],[725,2300,2302],{"className":2301},[728],"  - component tasks.implementer changed\n",[725,2304,2306],{"className":2305},[728],"release@acme: update waiting\n",[526,2308,2309,2312,2313,2315],{},[544,2310,2311],{},"--check"," prints each review and changes nothing. It exits 0 when every add-on\nis current, 1 when an update is waiting, 2 when one would be refused and 3\nwhen a collection could not be checked, so a scheduled job can watch for one. ",[544,2314,647],{}," shows the same reviews and asks about each\nadd-on in turn.",[526,2317,2318],{},"An item that is already running keeps the add-on version it started with.",[703,2320,2322],{"id":2321},"let-an-add-on-update-itself","Let an add-on update itself",[715,2324,2326],{"className":1415,"code":2325,"language":1417,"meta":721,"style":721},"kraft admin addon auto-update release@acme on\n",[544,2327,2328],{"__ignoreMap":721},[725,2329,2330,2332,2334,2336,2339,2341],{"class":728,"line":774},[725,2331,1425],{"class":1424},[725,2333,1428],{"class":791},[725,2335,1431],{"class":791},[725,2337,2338],{"class":791}," auto-update",[725,2340,1987],{"class":791},[725,2342,2343],{"class":791}," on\n",[526,2345,2346,2347,2349,2350,2352,2353,2064],{},"After each server start, and once a day while the server runs, Kraft checks\nthe add-on and applies an update whose\nreview has no ",[697,2348,1895],{}," line: a new version that changes only content, such as\na prompt or a skill. It holds every other update for you and keeps the\ninstalled version running. ",[544,2351,2055],{}," shows a held or failed update\non its ",[544,2354,2355],{},"add-on updates",[526,2357,2358,2361,2362,2366],{},[544,2359,2360],{},"kraft admin addon collection auto-update acme on"," does the same for every\nadd-on installed from the collection.\n",[530,2363,2365],{"href":2364},"\u002Freference\u002Fconfiguration\u002Faddons#auto-update","Auto-update"," lists what is held.",[703,2368,2370],{"id":2369},"put-the-same-add-ons-on-another-machine","Put the same add-ons on another machine",[526,2372,2373,2374,2377,2378,2381,2382,2384,2385,2387,2388,2391],{},"Copy ",[544,2375,2376],{},"addons.yaml"," and ",[544,2379,2380],{},"addons.lock"," from ",[544,2383,1026],{}," to the other machine's\n",[544,2386,1026],{},", then start Kraft or run ",[544,2389,2390],{},"kraft admin reload",". Kraft fetches each\nadd-on at its locked commit in the background, so both machines run the same\nfiles. The other machine needs git access to the collection's URL.",[662,2393,655],{"id":2394},"remove-an-add-on",[715,2396,2398],{"className":1415,"code":2397,"language":1417,"meta":721,"style":721},"kraft admin addon uninstall release@acme\n",[544,2399,2400],{"__ignoreMap":721},[725,2401,2402,2404,2406,2408,2411],{"class":728,"line":774},[725,2403,1425],{"class":1424},[725,2405,1428],{"class":791},[725,2407,1431],{"class":791},[725,2409,2410],{"class":791}," uninstall",[725,2412,1537],{"class":791},[526,2414,2415,2416,2419],{},"Kraft refuses while one of your own files still names the add-on's namespace,\nand lists each reference. Change those first.\n",[544,2417,2418],{},"kraft admin addon disable release@acme"," keeps the add-on installed and stops\nloading it, under the same rule. Items that are running finish on the version\nthey started with.",[662,2421,2423],{"id":2422},"serve-claude-code-from-the-same-directory","Serve Claude Code from the same directory",[526,2425,2426,2427,795,2429,841,2431,841,2433,2377,2435,2437],{},"An add-on directory can also be a Claude Code plugin. Kraft reads ",[544,2428,1698],{},[544,2430,1051],{},[544,2432,1060],{},[544,2434,1054],{},[544,2436,1057],{},", and nothing else in\nthe directory:",[715,2439,2442],{"className":2440,"code":2441,"language":720,"meta":721},[718],"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",[544,2443,2444,2448,2452,2456,2460,2464,2468,2472],{"__ignoreMap":721},[725,2445,2447],{"className":2446},[728],"addons\u002Frelease\u002F\n",[725,2449,2451],{"className":2450},[728],"  .kraft\u002Faddon.json\n",[725,2453,2455],{"className":2454},[728],"  .claude-plugin\u002Fplugin.json\n",[725,2457,2459],{"className":2458},[728],"  library.yaml\n",[725,2461,2463],{"className":2462},[728],"  chains\u002Fship.yaml\n",[725,2465,2467],{"className":2466},[728],"  skills\u002Frelease-notes\u002FSKILL.md\n",[725,2469,2471],{"className":2470},[728],"  hooks\u002Fhooks.json\n",[725,2473,2475],{"className":2474},[728],"  .mcp.json\n",[666,2477,2478,2491,2503,2517],{},[669,2479,2480,2482,2483,2486,2487,2490],{},[544,2481,1057],{}," has the layout Claude Code uses, so both tools read the same\n",[544,2484,2485],{},"SKILL.md",". The skill is ",[544,2488,2489],{},"release:release-notes"," in both.",[669,2492,2493,841,2496,2377,2499,2502],{},[544,2494,2495],{},".claude-plugin\u002F",[544,2497,2498],{},"hooks\u002F",[544,2500,2501],{},".mcp.json"," never reach Kraft. It does not\ninstall the Claude Code half: do that in Claude Code.",[669,2504,2505,2506,2509,2510,2513,2514,2516],{},"An alias changes the name on Kraft's side only. An add-on installed with\n",[544,2507,2508],{},"--as acme-release"," has ",[544,2511,2512],{},"acme-release:release-notes"," in Kraft and\n",[544,2515,2489],{}," in Claude Code.",[669,2518,2519,2520,2523,2524,2526],{},"A chain of yours that already says ",[544,2521,2522],{},"skill: release:\u003Cname>"," hands that skill to\nthe agent. Once an add-on holds the namespace ",[544,2525,550],{},", Kraft reads the\nskill from the add-on, and the install review lists each such reference.",[662,2528,2530],{"id":2529},"next-steps","Next steps",[666,2532,2533,2541,2551,2556,2567],{},[669,2534,2535,2537,2538,2540],{},[530,2536,384],{"href":385},": every manifest field, ",[544,2539,2376],{},", the lock, and when an add-on loads.",[669,2542,2543,2546,2547,2550],{},[530,2544,286],{"href":2545},"\u002Freference\u002Fcli\u002Fadmin#install-and-update-add-ons",": every ",[544,2548,2549],{},"kraft admin addon"," verb and flag.",[669,2552,2553,2555],{},[530,2554,493],{"href":1805},": what an add-on can and cannot change.",[669,2557,2558,2560,2561,2563,2564,2566],{},[530,2559,219],{"href":220},": the message ",[544,2562,1086],{}," or a ",[544,2565,2549],{}," command printed when you add a collection, install, update or remove an add-on, and its fix.",[669,2568,2569,2571],{},[530,2570,102],{"href":103},": the chain and library keys an add-on's files use.",[2573,2574,2575],"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":721,"searchDepth":781,"depth":781,"links":2577},[2578,2579,2588,2589,2598,2600,2607,2609,2610],{"id":664,"depth":781,"text":560},{"id":701,"depth":781,"text":555,"children":2580},[2581,2582,2584,2585,2586,2587],{"id":705,"depth":798,"text":706},{"id":1019,"depth":798,"text":2583},"2. Write the add-​on's files",{"id":1411,"depth":798,"text":1412},{"id":1498,"depth":798,"text":1499},{"id":1559,"depth":798,"text":1560},{"id":1581,"depth":798,"text":1582},{"id":1686,"depth":781,"text":1687},{"id":1760,"depth":781,"text":2590,"children":2591},"Install an add-​on",[2592,2594,2595,2597],{"id":1763,"depth":798,"text":2593},"Bound what an add-​on's agents may do",{"id":1809,"depth":798,"text":1810},{"id":1871,"depth":798,"text":2596},"2. Install the add-​on",{"id":1996,"depth":798,"text":1997},{"id":2067,"depth":781,"text":2599},"Use what an add-​on ships",{"id":2254,"depth":781,"text":2255,"children":2601},[2602,2603,2605],{"id":2258,"depth":798,"text":2259},{"id":2321,"depth":798,"text":2604},"Let an add-​on update itself",{"id":2369,"depth":798,"text":2606},"Put the same add-​ons on another machine",{"id":2394,"depth":781,"text":2608},"Remove an add-​on",{"id":2422,"depth":781,"text":2423},{"id":2529,"depth":781,"text":2530},"Publish chains, library components, skills and agent profiles as a Kraft add-on in a collection, then install, use and update it on another instance.","md",null,{},{"title":114,"description":2611},"7Aj-HtIrUyiPEO46owcu5_KJYVloMNpdG-aThJV2LcE",[2618,2620],{"title":110,"path":111,"stem":112,"description":2619,"children":-1},"File a paused work item on a cron schedule or from a webhook, then check that it arrived.",{"title":123,"path":124,"stem":125,"description":2621,"children":-1},"Run some or all of a chain's agent tasks on Codex, Cursor, OpenCode, Gemini, Antigravity or Amp instead of Claude Code, and what changes when you do.",1791801170898]