[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-knock-knock-cli":3,"mdc-cn8idb-key":32,"related-org-knock-knock-cli":1956,"related-repo-knock-knock-cli":2054},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":23,"topics":27,"repo":28,"sourceUrl":30,"mdContent":31},"knock-cli","manage Knock notification resources via CLI","Guidelines for working with the Knock CLI to manage workflows, templates, and other notification resources in a Knock project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"knock","Knock","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fknock.png","knocklabs",[13,17,20],{"name":14,"slug":15,"type":16},"CLI","cli","tag",{"name":18,"slug":19,"type":16},"Messaging","messaging",{"name":21,"slug":22,"type":16},"Notifications","notifications",0,"https:\u002F\u002Fgithub.com\u002Fknocklabs\u002Fskills","2026-07-14T05:23:51.065051",null,[],{"repoUrl":24,"stars":23,"forks":23,"topics":29,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fknocklabs\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fknock-cli","---\nname: knock-cli\ndescription: Guidelines for working with the Knock CLI to manage workflows, templates, and other notification resources in a Knock project.\n---\n\n# Knock CLI skill\n\nThis skill provides comprehensive guidelines for working with the Knock CLI to manage workflows, templates, and other notification resources.\n\n## Overview\n\nThe Knock CLI skill includes detailed rule sets covering:\n\n1. **CLI installation and authentication** - How to install and authenticate with the Knock CLI\n2. **Knock directory structure** - Understanding the knock directory layout and configuration\n3. **CLI commands reference** - Pull, push, and resource management commands\n4. **Workflow templates** - Structures, patterns, and best practices for workflows and templates\n5. **Guides and message types** - Working with in-app guides for lifecycle messaging and message types as their schema\n6. **Partials** - Reusable template building blocks for email design systems\n\n## How to use this skill\n\n### For initial setup\n\nWhen setting up a new project with Knock:\n\n1. **Start with installation and authentication** (`rules\u002Fcli-installation-authentication.md`)\n   - Verify the CLI is installed\n   - Authenticate with a service token or dashboard account\n   - Initialize the project with `knock init`\n\n2. **Understand the directory structure** (`rules\u002Fknock-directory-structure.md`)\n   - Learn the knock.json configuration\n   - Understand resource organization\n\n### For managing resources\n\nWhen working with Knock resources:\n\n1. **Use the CLI commands reference** (`rules\u002Fcli-commands-reference.md`)\n   - Pull resources from Knock to your local project\n   - Push changes back to Knock\n   - Work with specific resource types\n\n2. **Follow workflow and template guidelines** (`rules\u002Fworkflow-templates.md`)\n   - Understand template modes and structures\n   - Avoid common mistakes with file paths and variables\n   - Follow best practices for workflow modifications\n\n### For managing guides and message types\n\nWhen working with in-app guides (banners, modals, announcements):\n\n1. **Start with guides and message types** (`rules\u002Fguides-and-message-types.md`)\n   - Understand that guides are separate from workflows (lifecycle messaging vs notifications)\n   - Message types define the schema; guides reference them via `schema_key` and `schema_variant_key`\n   - Use built-in types (banner, modal, card) when possible; create custom message types when needed\n\n2. **Discover before creating**\n   - Run `knock message-type list` to see available message type keys\n   - Run `knock guide list` to see existing guides\n   - Use exact keys from output when creating new guides\n\n### For working with partials\n\nWhen building reusable email components (callouts, quote blocks, comment cards):\n\n1. **Start with partials** (`rules\u002Fpartials.md`)\n   - Understand partial file structure and `partial.json` schema\n   - Define `input_schema` for block editor fields (same format as message type variant fields)\n   - Use `visual_block_enabled: true` for partials that appear in the email visual block editor\n\n2. **Create and push**\n   - Run `knock partial new -k \u003Ckey> -n \"Name\" -t html --force` to scaffold\n   - Add `input_schema` and edit content; validate and push with `knock partial push \u003Ckey>`\n\n### For modifying workflows and templates\n\nWhen making changes to workflows or templates:\n\n1. **Always read before writing** - Understand existing structure before modifying\n2. **Use visual blocks for new emails** - Always default to visual blocks mode; only use HTML mode if explicitly requested\n3. **Use correct variable namespaces** - `data` for trigger payload, `vars` for environment variables\n4. **Verify file path references** - Paths are relative to the file containing the reference\n5. **Push after modifying** - Local file changes are not synced to Knock until you push. Run `knock workflow push \u003Ckey>` (or the equivalent for other resource types) for changes to take effect.\n\n## Rule files reference\n\n- `rules\u002Fcli-installation-authentication.md` - Installation and authentication setup\n- `rules\u002Fknock-directory-structure.md` - Directory structure and configuration\n- `rules\u002Fcli-commands-reference.md` - CLI commands for resource management\n- `rules\u002Fworkflow-templates.md` - Workflow and template structures and best practices\n- `rules\u002Fguides-and-message-types.md` - Guides and message types for lifecycle messaging\n- `rules\u002Fpartials.md` - Partials and reusable template building blocks\n\n## Quick reference\n\n### Common commands\n\n```bash\n# Initialize a new project (interactive; use --knock-dir to skip prompts)\nknock init --knock-dir=.\u002Fknock\n\n# Pull all resources from Knock (--force skips confirmation prompts)\nknock pull --all --force\n\n# Pull a specific workflow\nknock workflow pull \u003Cworkflow-key> --force\n\n# Push all resources to Knock (push never prompts)\nknock push --all\n\n# Push a specific workflow\nknock workflow push \u003Cworkflow-key>\n\n# Push a specific email layout\nknock email-layout push \u003Clayout-key>\n\n# List channels (discover valid channel_key values before creating workflows)\nknock channel list\n\n# Guide and message type commands\nknock message-type list          # Discover message type keys before creating guides\nknock guide list                 # List existing guides\nknock guide push \u003Cguide-key>     # Push a guide after modifying\nknock message-type push \u003Ckey>    # Push a message type after modifying\n\n# Partial commands (email design system building blocks)\nknock partial list               # List existing partials\nknock partial new -k \u003Ckey> -n \"Name\" -t html --force   # Create a new partial\nknock partial pull \u003Ckey> --force # Pull a partial from Knock\nknock partial push \u003Ckey>         # Push a partial after modifying\nknock partial validate \u003Ckey>     # Validate a partial locally\n\n# Commit and promote a specific resource only (safe when other resources have pending changes)\nknock commit -m \"message\" --resource-type=workflow --resource-id=\u003Ckey> --force\nknock commit list --resource-type=workflow --resource-id=\u003Ckey>   # get the commit ID\nknock commit promote --only=\u003Ccommit-id> --force\n```\n\n### Key concepts\n\n- **knockDir**: The directory where Knock resources are stored (configured in knock.json)\n- **Resource types**: workflows, email-layouts, guides, message-types, translations, partials, commits\n- **Guides vs workflows**: Guides are for lifecycle messaging (banners, modals); workflows are for notifications\n- **Template modes**: Visual blocks (default for new emails) vs HTML (only when explicitly requested)\n- **Variable namespaces**: `data` (trigger payload), `vars` (environment variables), `recipient`, `actor`, `tenant`\n\n### Important patterns\n\n1. **Use `--force` on commands with prompts** - Many CLI commands (pull, commit, promote, activate) display interactive confirmation prompts. Always pass `--force` to skip them in automated\u002Fagent contexts.\n2. **Push after every change** - Local edits stay local until pushed. No push = no update in Knock.\n3. **File path references use `@` suffix**: `\"content@\": \"visual_blocks\u002F1.content.md\"`\n4. **Paths are relative to containing file**: Don't double the step directory\n5. **Always use `data.` for trigger payload values**, not `vars.`\n6. **Read existing files before modifying** to preserve structure\n7. **Discover channel keys before creating workflows** - Run `knock channel list` to get valid `channel_key` values\n8. **Discover message type keys before creating guides** - Run `knock message-type list` to get valid message type keys\n9. **Scope commits and promotes when working on a single resource** - `knock commit promote --to=\u003Cenv>` promotes ALL unpromoted commits across all resources. When working on one resource, use `--resource-type` and `--resource-id` to commit only that resource, then use `knock commit promote --only=\u003Ccommit-id>` to promote only that commit. See the \"Promote a specific resource only\" workflow below.\n\n## Best practices summary\n\n1. **Pull before editing** - Sync latest changes before making modifications\n2. **Push after modifying** - Local changes are not persisted to Knock until explicitly pushed\n3. **Read before writing** - Understand existing structure to avoid data loss\n4. **Use correct namespaces** - `data` for dynamic payload, `vars` for environment constants\n5. **Visual blocks by default** - Use visual blocks for new emails; preserve existing mode when editing\n6. **Verify paths** - File references are relative to the containing file\n7. **Test changes** - Validate workflows after pushing changes\n8. **Scope commits and promotes** - Default to `--resource-type`\u002F`--resource-id` on commit and `--only` on promote when working on a single resource. Only use `knock commit promote --to=\u003Cenv>` when you intend to promote all pending changes across every resource.\n",{"data":33,"body":34},{"name":4,"description":6},{"type":35,"children":36},"root",[37,46,52,59,64,130,136,143,148,224,230,235,306,312,317,409,415,420,522,528,533,610,616,679,685,691,1534,1540,1628,1634,1820,1826,1950],{"type":38,"tag":39,"props":40,"children":42},"element","h1",{"id":41},"knock-cli-skill",[43],{"type":44,"value":45},"text","Knock CLI skill",{"type":38,"tag":47,"props":48,"children":49},"p",{},[50],{"type":44,"value":51},"This skill provides comprehensive guidelines for working with the Knock CLI to manage workflows, templates, and other notification resources.",{"type":38,"tag":53,"props":54,"children":56},"h2",{"id":55},"overview",[57],{"type":44,"value":58},"Overview",{"type":38,"tag":47,"props":60,"children":61},{},[62],{"type":44,"value":63},"The Knock CLI skill includes detailed rule sets covering:",{"type":38,"tag":65,"props":66,"children":67},"ol",{},[68,80,90,100,110,120],{"type":38,"tag":69,"props":70,"children":71},"li",{},[72,78],{"type":38,"tag":73,"props":74,"children":75},"strong",{},[76],{"type":44,"value":77},"CLI installation and authentication",{"type":44,"value":79}," - How to install and authenticate with the Knock CLI",{"type":38,"tag":69,"props":81,"children":82},{},[83,88],{"type":38,"tag":73,"props":84,"children":85},{},[86],{"type":44,"value":87},"Knock directory structure",{"type":44,"value":89}," - Understanding the knock directory layout and configuration",{"type":38,"tag":69,"props":91,"children":92},{},[93,98],{"type":38,"tag":73,"props":94,"children":95},{},[96],{"type":44,"value":97},"CLI commands reference",{"type":44,"value":99}," - Pull, push, and resource management commands",{"type":38,"tag":69,"props":101,"children":102},{},[103,108],{"type":38,"tag":73,"props":104,"children":105},{},[106],{"type":44,"value":107},"Workflow templates",{"type":44,"value":109}," - Structures, patterns, and best practices for workflows and templates",{"type":38,"tag":69,"props":111,"children":112},{},[113,118],{"type":38,"tag":73,"props":114,"children":115},{},[116],{"type":44,"value":117},"Guides and message types",{"type":44,"value":119}," - Working with in-app guides for lifecycle messaging and message types as their schema",{"type":38,"tag":69,"props":121,"children":122},{},[123,128],{"type":38,"tag":73,"props":124,"children":125},{},[126],{"type":44,"value":127},"Partials",{"type":44,"value":129}," - Reusable template building blocks for email design systems",{"type":38,"tag":53,"props":131,"children":133},{"id":132},"how-to-use-this-skill",[134],{"type":44,"value":135},"How to use this skill",{"type":38,"tag":137,"props":138,"children":140},"h3",{"id":139},"for-initial-setup",[141],{"type":44,"value":142},"For initial setup",{"type":38,"tag":47,"props":144,"children":145},{},[146],{"type":44,"value":147},"When setting up a new project with Knock:",{"type":38,"tag":65,"props":149,"children":150},{},[151,195],{"type":38,"tag":69,"props":152,"children":153},{},[154,159,161,168,170],{"type":38,"tag":73,"props":155,"children":156},{},[157],{"type":44,"value":158},"Start with installation and authentication",{"type":44,"value":160}," (",{"type":38,"tag":162,"props":163,"children":165},"code",{"className":164},[],[166],{"type":44,"value":167},"rules\u002Fcli-installation-authentication.md",{"type":44,"value":169},")",{"type":38,"tag":171,"props":172,"children":173},"ul",{},[174,179,184],{"type":38,"tag":69,"props":175,"children":176},{},[177],{"type":44,"value":178},"Verify the CLI is installed",{"type":38,"tag":69,"props":180,"children":181},{},[182],{"type":44,"value":183},"Authenticate with a service token or dashboard account",{"type":38,"tag":69,"props":185,"children":186},{},[187,189],{"type":44,"value":188},"Initialize the project with ",{"type":38,"tag":162,"props":190,"children":192},{"className":191},[],[193],{"type":44,"value":194},"knock init",{"type":38,"tag":69,"props":196,"children":197},{},[198,203,204,210,211],{"type":38,"tag":73,"props":199,"children":200},{},[201],{"type":44,"value":202},"Understand the directory structure",{"type":44,"value":160},{"type":38,"tag":162,"props":205,"children":207},{"className":206},[],[208],{"type":44,"value":209},"rules\u002Fknock-directory-structure.md",{"type":44,"value":169},{"type":38,"tag":171,"props":212,"children":213},{},[214,219],{"type":38,"tag":69,"props":215,"children":216},{},[217],{"type":44,"value":218},"Learn the knock.json configuration",{"type":38,"tag":69,"props":220,"children":221},{},[222],{"type":44,"value":223},"Understand resource organization",{"type":38,"tag":137,"props":225,"children":227},{"id":226},"for-managing-resources",[228],{"type":44,"value":229},"For managing resources",{"type":38,"tag":47,"props":231,"children":232},{},[233],{"type":44,"value":234},"When working with Knock resources:",{"type":38,"tag":65,"props":236,"children":237},{},[238,272],{"type":38,"tag":69,"props":239,"children":240},{},[241,246,247,253,254],{"type":38,"tag":73,"props":242,"children":243},{},[244],{"type":44,"value":245},"Use the CLI commands reference",{"type":44,"value":160},{"type":38,"tag":162,"props":248,"children":250},{"className":249},[],[251],{"type":44,"value":252},"rules\u002Fcli-commands-reference.md",{"type":44,"value":169},{"type":38,"tag":171,"props":255,"children":256},{},[257,262,267],{"type":38,"tag":69,"props":258,"children":259},{},[260],{"type":44,"value":261},"Pull resources from Knock to your local project",{"type":38,"tag":69,"props":263,"children":264},{},[265],{"type":44,"value":266},"Push changes back to Knock",{"type":38,"tag":69,"props":268,"children":269},{},[270],{"type":44,"value":271},"Work with specific resource types",{"type":38,"tag":69,"props":273,"children":274},{},[275,280,281,287,288],{"type":38,"tag":73,"props":276,"children":277},{},[278],{"type":44,"value":279},"Follow workflow and template guidelines",{"type":44,"value":160},{"type":38,"tag":162,"props":282,"children":284},{"className":283},[],[285],{"type":44,"value":286},"rules\u002Fworkflow-templates.md",{"type":44,"value":169},{"type":38,"tag":171,"props":289,"children":290},{},[291,296,301],{"type":38,"tag":69,"props":292,"children":293},{},[294],{"type":44,"value":295},"Understand template modes and structures",{"type":38,"tag":69,"props":297,"children":298},{},[299],{"type":44,"value":300},"Avoid common mistakes with file paths and variables",{"type":38,"tag":69,"props":302,"children":303},{},[304],{"type":44,"value":305},"Follow best practices for workflow modifications",{"type":38,"tag":137,"props":307,"children":309},{"id":308},"for-managing-guides-and-message-types",[310],{"type":44,"value":311},"For managing guides and message types",{"type":38,"tag":47,"props":313,"children":314},{},[315],{"type":44,"value":316},"When working with in-app guides (banners, modals, announcements):",{"type":38,"tag":65,"props":318,"children":319},{},[320,368],{"type":38,"tag":69,"props":321,"children":322},{},[323,328,329,335,336],{"type":38,"tag":73,"props":324,"children":325},{},[326],{"type":44,"value":327},"Start with guides and message types",{"type":44,"value":160},{"type":38,"tag":162,"props":330,"children":332},{"className":331},[],[333],{"type":44,"value":334},"rules\u002Fguides-and-message-types.md",{"type":44,"value":169},{"type":38,"tag":171,"props":337,"children":338},{},[339,344,363],{"type":38,"tag":69,"props":340,"children":341},{},[342],{"type":44,"value":343},"Understand that guides are separate from workflows (lifecycle messaging vs notifications)",{"type":38,"tag":69,"props":345,"children":346},{},[347,349,355,357],{"type":44,"value":348},"Message types define the schema; guides reference them via ",{"type":38,"tag":162,"props":350,"children":352},{"className":351},[],[353],{"type":44,"value":354},"schema_key",{"type":44,"value":356}," and ",{"type":38,"tag":162,"props":358,"children":360},{"className":359},[],[361],{"type":44,"value":362},"schema_variant_key",{"type":38,"tag":69,"props":364,"children":365},{},[366],{"type":44,"value":367},"Use built-in types (banner, modal, card) when possible; create custom message types when needed",{"type":38,"tag":69,"props":369,"children":370},{},[371,376],{"type":38,"tag":73,"props":372,"children":373},{},[374],{"type":44,"value":375},"Discover before creating",{"type":38,"tag":171,"props":377,"children":378},{},[379,392,404],{"type":38,"tag":69,"props":380,"children":381},{},[382,384,390],{"type":44,"value":383},"Run ",{"type":38,"tag":162,"props":385,"children":387},{"className":386},[],[388],{"type":44,"value":389},"knock message-type list",{"type":44,"value":391}," to see available message type keys",{"type":38,"tag":69,"props":393,"children":394},{},[395,396,402],{"type":44,"value":383},{"type":38,"tag":162,"props":397,"children":399},{"className":398},[],[400],{"type":44,"value":401},"knock guide list",{"type":44,"value":403}," to see existing guides",{"type":38,"tag":69,"props":405,"children":406},{},[407],{"type":44,"value":408},"Use exact keys from output when creating new guides",{"type":38,"tag":137,"props":410,"children":412},{"id":411},"for-working-with-partials",[413],{"type":44,"value":414},"For working with partials",{"type":38,"tag":47,"props":416,"children":417},{},[418],{"type":44,"value":419},"When building reusable email components (callouts, quote blocks, comment cards):",{"type":38,"tag":65,"props":421,"children":422},{},[423,481],{"type":38,"tag":69,"props":424,"children":425},{},[426,431,432,438,439],{"type":38,"tag":73,"props":427,"children":428},{},[429],{"type":44,"value":430},"Start with partials",{"type":44,"value":160},{"type":38,"tag":162,"props":433,"children":435},{"className":434},[],[436],{"type":44,"value":437},"rules\u002Fpartials.md",{"type":44,"value":169},{"type":38,"tag":171,"props":440,"children":441},{},[442,455,468],{"type":38,"tag":69,"props":443,"children":444},{},[445,447,453],{"type":44,"value":446},"Understand partial file structure and ",{"type":38,"tag":162,"props":448,"children":450},{"className":449},[],[451],{"type":44,"value":452},"partial.json",{"type":44,"value":454}," schema",{"type":38,"tag":69,"props":456,"children":457},{},[458,460,466],{"type":44,"value":459},"Define ",{"type":38,"tag":162,"props":461,"children":463},{"className":462},[],[464],{"type":44,"value":465},"input_schema",{"type":44,"value":467}," for block editor fields (same format as message type variant fields)",{"type":38,"tag":69,"props":469,"children":470},{},[471,473,479],{"type":44,"value":472},"Use ",{"type":38,"tag":162,"props":474,"children":476},{"className":475},[],[477],{"type":44,"value":478},"visual_block_enabled: true",{"type":44,"value":480}," for partials that appear in the email visual block editor",{"type":38,"tag":69,"props":482,"children":483},{},[484,489],{"type":38,"tag":73,"props":485,"children":486},{},[487],{"type":44,"value":488},"Create and push",{"type":38,"tag":171,"props":490,"children":491},{},[492,504],{"type":38,"tag":69,"props":493,"children":494},{},[495,496,502],{"type":44,"value":383},{"type":38,"tag":162,"props":497,"children":499},{"className":498},[],[500],{"type":44,"value":501},"knock partial new -k \u003Ckey> -n \"Name\" -t html --force",{"type":44,"value":503}," to scaffold",{"type":38,"tag":69,"props":505,"children":506},{},[507,509,514,516],{"type":44,"value":508},"Add ",{"type":38,"tag":162,"props":510,"children":512},{"className":511},[],[513],{"type":44,"value":465},{"type":44,"value":515}," and edit content; validate and push with ",{"type":38,"tag":162,"props":517,"children":519},{"className":518},[],[520],{"type":44,"value":521},"knock partial push \u003Ckey>",{"type":38,"tag":137,"props":523,"children":525},{"id":524},"for-modifying-workflows-and-templates",[526],{"type":44,"value":527},"For modifying workflows and templates",{"type":38,"tag":47,"props":529,"children":530},{},[531],{"type":44,"value":532},"When making changes to workflows or templates:",{"type":38,"tag":65,"props":534,"children":535},{},[536,546,556,582,592],{"type":38,"tag":69,"props":537,"children":538},{},[539,544],{"type":38,"tag":73,"props":540,"children":541},{},[542],{"type":44,"value":543},"Always read before writing",{"type":44,"value":545}," - Understand existing structure before modifying",{"type":38,"tag":69,"props":547,"children":548},{},[549,554],{"type":38,"tag":73,"props":550,"children":551},{},[552],{"type":44,"value":553},"Use visual blocks for new emails",{"type":44,"value":555}," - Always default to visual blocks mode; only use HTML mode if explicitly requested",{"type":38,"tag":69,"props":557,"children":558},{},[559,564,566,572,574,580],{"type":38,"tag":73,"props":560,"children":561},{},[562],{"type":44,"value":563},"Use correct variable namespaces",{"type":44,"value":565}," - ",{"type":38,"tag":162,"props":567,"children":569},{"className":568},[],[570],{"type":44,"value":571},"data",{"type":44,"value":573}," for trigger payload, ",{"type":38,"tag":162,"props":575,"children":577},{"className":576},[],[578],{"type":44,"value":579},"vars",{"type":44,"value":581}," for environment variables",{"type":38,"tag":69,"props":583,"children":584},{},[585,590],{"type":38,"tag":73,"props":586,"children":587},{},[588],{"type":44,"value":589},"Verify file path references",{"type":44,"value":591}," - Paths are relative to the file containing the reference",{"type":38,"tag":69,"props":593,"children":594},{},[595,600,602,608],{"type":38,"tag":73,"props":596,"children":597},{},[598],{"type":44,"value":599},"Push after modifying",{"type":44,"value":601}," - Local file changes are not synced to Knock until you push. Run ",{"type":38,"tag":162,"props":603,"children":605},{"className":604},[],[606],{"type":44,"value":607},"knock workflow push \u003Ckey>",{"type":44,"value":609}," (or the equivalent for other resource types) for changes to take effect.",{"type":38,"tag":53,"props":611,"children":613},{"id":612},"rule-files-reference",[614],{"type":44,"value":615},"Rule files reference",{"type":38,"tag":171,"props":617,"children":618},{},[619,629,639,649,659,669],{"type":38,"tag":69,"props":620,"children":621},{},[622,627],{"type":38,"tag":162,"props":623,"children":625},{"className":624},[],[626],{"type":44,"value":167},{"type":44,"value":628}," - Installation and authentication setup",{"type":38,"tag":69,"props":630,"children":631},{},[632,637],{"type":38,"tag":162,"props":633,"children":635},{"className":634},[],[636],{"type":44,"value":209},{"type":44,"value":638}," - Directory structure and configuration",{"type":38,"tag":69,"props":640,"children":641},{},[642,647],{"type":38,"tag":162,"props":643,"children":645},{"className":644},[],[646],{"type":44,"value":252},{"type":44,"value":648}," - CLI commands for resource management",{"type":38,"tag":69,"props":650,"children":651},{},[652,657],{"type":38,"tag":162,"props":653,"children":655},{"className":654},[],[656],{"type":44,"value":286},{"type":44,"value":658}," - Workflow and template structures and best practices",{"type":38,"tag":69,"props":660,"children":661},{},[662,667],{"type":38,"tag":162,"props":663,"children":665},{"className":664},[],[666],{"type":44,"value":334},{"type":44,"value":668}," - Guides and message types for lifecycle messaging",{"type":38,"tag":69,"props":670,"children":671},{},[672,677],{"type":38,"tag":162,"props":673,"children":675},{"className":674},[],[676],{"type":44,"value":437},{"type":44,"value":678}," - Partials and reusable template building blocks",{"type":38,"tag":53,"props":680,"children":682},{"id":681},"quick-reference",[683],{"type":44,"value":684},"Quick reference",{"type":38,"tag":137,"props":686,"children":688},{"id":687},"common-commands",[689],{"type":44,"value":690},"Common commands",{"type":38,"tag":692,"props":693,"children":698},"pre",{"className":694,"code":695,"language":696,"meta":697,"style":697},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Initialize a new project (interactive; use --knock-dir to skip prompts)\nknock init --knock-dir=.\u002Fknock\n\n# Pull all resources from Knock (--force skips confirmation prompts)\nknock pull --all --force\n\n# Pull a specific workflow\nknock workflow pull \u003Cworkflow-key> --force\n\n# Push all resources to Knock (push never prompts)\nknock push --all\n\n# Push a specific workflow\nknock workflow push \u003Cworkflow-key>\n\n# Push a specific email layout\nknock email-layout push \u003Clayout-key>\n\n# List channels (discover valid channel_key values before creating workflows)\nknock channel list\n\n# Guide and message type commands\nknock message-type list          # Discover message type keys before creating guides\nknock guide list                 # List existing guides\nknock guide push \u003Cguide-key>     # Push a guide after modifying\nknock message-type push \u003Ckey>    # Push a message type after modifying\n\n# Partial commands (email design system building blocks)\nknock partial list               # List existing partials\nknock partial new -k \u003Ckey> -n \"Name\" -t html --force   # Create a new partial\nknock partial pull \u003Ckey> --force # Pull a partial from Knock\nknock partial push \u003Ckey>         # Push a partial after modifying\nknock partial validate \u003Ckey>     # Validate a partial locally\n\n# Commit and promote a specific resource only (safe when other resources have pending changes)\nknock commit -m \"message\" --resource-type=workflow --resource-id=\u003Ckey> --force\nknock commit list --resource-type=workflow --resource-id=\u003Ckey>   # get the commit ID\nknock commit promote --only=\u003Ccommit-id> --force\n","bash","",[699],{"type":38,"tag":162,"props":700,"children":701},{"__ignoreMap":697},[702,714,734,744,753,776,784,793,836,844,853,871,879,888,921,929,938,972,980,989,1007,1015,1024,1047,1069,1107,1145,1153,1162,1184,1262,1303,1340,1378,1386,1395,1454,1495],{"type":38,"tag":703,"props":704,"children":707},"span",{"class":705,"line":706},"line",1,[708],{"type":38,"tag":703,"props":709,"children":711},{"style":710},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[712],{"type":44,"value":713},"# Initialize a new project (interactive; use --knock-dir to skip prompts)\n",{"type":38,"tag":703,"props":715,"children":717},{"class":705,"line":716},2,[718,723,729],{"type":38,"tag":703,"props":719,"children":721},{"style":720},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[722],{"type":44,"value":8},{"type":38,"tag":703,"props":724,"children":726},{"style":725},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[727],{"type":44,"value":728}," init",{"type":38,"tag":703,"props":730,"children":731},{"style":725},[732],{"type":44,"value":733}," --knock-dir=.\u002Fknock\n",{"type":38,"tag":703,"props":735,"children":737},{"class":705,"line":736},3,[738],{"type":38,"tag":703,"props":739,"children":741},{"emptyLinePlaceholder":740},true,[742],{"type":44,"value":743},"\n",{"type":38,"tag":703,"props":745,"children":747},{"class":705,"line":746},4,[748],{"type":38,"tag":703,"props":749,"children":750},{"style":710},[751],{"type":44,"value":752},"# Pull all resources from Knock (--force skips confirmation prompts)\n",{"type":38,"tag":703,"props":754,"children":756},{"class":705,"line":755},5,[757,761,766,771],{"type":38,"tag":703,"props":758,"children":759},{"style":720},[760],{"type":44,"value":8},{"type":38,"tag":703,"props":762,"children":763},{"style":725},[764],{"type":44,"value":765}," pull",{"type":38,"tag":703,"props":767,"children":768},{"style":725},[769],{"type":44,"value":770}," --all",{"type":38,"tag":703,"props":772,"children":773},{"style":725},[774],{"type":44,"value":775}," --force\n",{"type":38,"tag":703,"props":777,"children":779},{"class":705,"line":778},6,[780],{"type":38,"tag":703,"props":781,"children":782},{"emptyLinePlaceholder":740},[783],{"type":44,"value":743},{"type":38,"tag":703,"props":785,"children":787},{"class":705,"line":786},7,[788],{"type":38,"tag":703,"props":789,"children":790},{"style":710},[791],{"type":44,"value":792},"# Pull a specific workflow\n",{"type":38,"tag":703,"props":794,"children":796},{"class":705,"line":795},8,[797,801,806,810,816,821,827,832],{"type":38,"tag":703,"props":798,"children":799},{"style":720},[800],{"type":44,"value":8},{"type":38,"tag":703,"props":802,"children":803},{"style":725},[804],{"type":44,"value":805}," workflow",{"type":38,"tag":703,"props":807,"children":808},{"style":725},[809],{"type":44,"value":765},{"type":38,"tag":703,"props":811,"children":813},{"style":812},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[814],{"type":44,"value":815}," \u003C",{"type":38,"tag":703,"props":817,"children":818},{"style":725},[819],{"type":44,"value":820},"workflow-ke",{"type":38,"tag":703,"props":822,"children":824},{"style":823},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[825],{"type":44,"value":826},"y",{"type":38,"tag":703,"props":828,"children":829},{"style":812},[830],{"type":44,"value":831},">",{"type":38,"tag":703,"props":833,"children":834},{"style":725},[835],{"type":44,"value":775},{"type":38,"tag":703,"props":837,"children":839},{"class":705,"line":838},9,[840],{"type":38,"tag":703,"props":841,"children":842},{"emptyLinePlaceholder":740},[843],{"type":44,"value":743},{"type":38,"tag":703,"props":845,"children":847},{"class":705,"line":846},10,[848],{"type":38,"tag":703,"props":849,"children":850},{"style":710},[851],{"type":44,"value":852},"# Push all resources to Knock (push never prompts)\n",{"type":38,"tag":703,"props":854,"children":856},{"class":705,"line":855},11,[857,861,866],{"type":38,"tag":703,"props":858,"children":859},{"style":720},[860],{"type":44,"value":8},{"type":38,"tag":703,"props":862,"children":863},{"style":725},[864],{"type":44,"value":865}," push",{"type":38,"tag":703,"props":867,"children":868},{"style":725},[869],{"type":44,"value":870}," --all\n",{"type":38,"tag":703,"props":872,"children":874},{"class":705,"line":873},12,[875],{"type":38,"tag":703,"props":876,"children":877},{"emptyLinePlaceholder":740},[878],{"type":44,"value":743},{"type":38,"tag":703,"props":880,"children":882},{"class":705,"line":881},13,[883],{"type":38,"tag":703,"props":884,"children":885},{"style":710},[886],{"type":44,"value":887},"# Push a specific workflow\n",{"type":38,"tag":703,"props":889,"children":891},{"class":705,"line":890},14,[892,896,900,904,908,912,916],{"type":38,"tag":703,"props":893,"children":894},{"style":720},[895],{"type":44,"value":8},{"type":38,"tag":703,"props":897,"children":898},{"style":725},[899],{"type":44,"value":805},{"type":38,"tag":703,"props":901,"children":902},{"style":725},[903],{"type":44,"value":865},{"type":38,"tag":703,"props":905,"children":906},{"style":812},[907],{"type":44,"value":815},{"type":38,"tag":703,"props":909,"children":910},{"style":725},[911],{"type":44,"value":820},{"type":38,"tag":703,"props":913,"children":914},{"style":823},[915],{"type":44,"value":826},{"type":38,"tag":703,"props":917,"children":918},{"style":812},[919],{"type":44,"value":920},">\n",{"type":38,"tag":703,"props":922,"children":924},{"class":705,"line":923},15,[925],{"type":38,"tag":703,"props":926,"children":927},{"emptyLinePlaceholder":740},[928],{"type":44,"value":743},{"type":38,"tag":703,"props":930,"children":932},{"class":705,"line":931},16,[933],{"type":38,"tag":703,"props":934,"children":935},{"style":710},[936],{"type":44,"value":937},"# Push a specific email layout\n",{"type":38,"tag":703,"props":939,"children":941},{"class":705,"line":940},17,[942,946,951,955,959,964,968],{"type":38,"tag":703,"props":943,"children":944},{"style":720},[945],{"type":44,"value":8},{"type":38,"tag":703,"props":947,"children":948},{"style":725},[949],{"type":44,"value":950}," email-layout",{"type":38,"tag":703,"props":952,"children":953},{"style":725},[954],{"type":44,"value":865},{"type":38,"tag":703,"props":956,"children":957},{"style":812},[958],{"type":44,"value":815},{"type":38,"tag":703,"props":960,"children":961},{"style":725},[962],{"type":44,"value":963},"layout-ke",{"type":38,"tag":703,"props":965,"children":966},{"style":823},[967],{"type":44,"value":826},{"type":38,"tag":703,"props":969,"children":970},{"style":812},[971],{"type":44,"value":920},{"type":38,"tag":703,"props":973,"children":975},{"class":705,"line":974},18,[976],{"type":38,"tag":703,"props":977,"children":978},{"emptyLinePlaceholder":740},[979],{"type":44,"value":743},{"type":38,"tag":703,"props":981,"children":983},{"class":705,"line":982},19,[984],{"type":38,"tag":703,"props":985,"children":986},{"style":710},[987],{"type":44,"value":988},"# List channels (discover valid channel_key values before creating workflows)\n",{"type":38,"tag":703,"props":990,"children":992},{"class":705,"line":991},20,[993,997,1002],{"type":38,"tag":703,"props":994,"children":995},{"style":720},[996],{"type":44,"value":8},{"type":38,"tag":703,"props":998,"children":999},{"style":725},[1000],{"type":44,"value":1001}," channel",{"type":38,"tag":703,"props":1003,"children":1004},{"style":725},[1005],{"type":44,"value":1006}," list\n",{"type":38,"tag":703,"props":1008,"children":1010},{"class":705,"line":1009},21,[1011],{"type":38,"tag":703,"props":1012,"children":1013},{"emptyLinePlaceholder":740},[1014],{"type":44,"value":743},{"type":38,"tag":703,"props":1016,"children":1018},{"class":705,"line":1017},22,[1019],{"type":38,"tag":703,"props":1020,"children":1021},{"style":710},[1022],{"type":44,"value":1023},"# Guide and message type commands\n",{"type":38,"tag":703,"props":1025,"children":1027},{"class":705,"line":1026},23,[1028,1032,1037,1042],{"type":38,"tag":703,"props":1029,"children":1030},{"style":720},[1031],{"type":44,"value":8},{"type":38,"tag":703,"props":1033,"children":1034},{"style":725},[1035],{"type":44,"value":1036}," message-type",{"type":38,"tag":703,"props":1038,"children":1039},{"style":725},[1040],{"type":44,"value":1041}," list",{"type":38,"tag":703,"props":1043,"children":1044},{"style":710},[1045],{"type":44,"value":1046},"          # Discover message type keys before creating guides\n",{"type":38,"tag":703,"props":1048,"children":1050},{"class":705,"line":1049},24,[1051,1055,1060,1064],{"type":38,"tag":703,"props":1052,"children":1053},{"style":720},[1054],{"type":44,"value":8},{"type":38,"tag":703,"props":1056,"children":1057},{"style":725},[1058],{"type":44,"value":1059}," guide",{"type":38,"tag":703,"props":1061,"children":1062},{"style":725},[1063],{"type":44,"value":1041},{"type":38,"tag":703,"props":1065,"children":1066},{"style":710},[1067],{"type":44,"value":1068},"                 # List existing guides\n",{"type":38,"tag":703,"props":1070,"children":1072},{"class":705,"line":1071},25,[1073,1077,1081,1085,1089,1094,1098,1102],{"type":38,"tag":703,"props":1074,"children":1075},{"style":720},[1076],{"type":44,"value":8},{"type":38,"tag":703,"props":1078,"children":1079},{"style":725},[1080],{"type":44,"value":1059},{"type":38,"tag":703,"props":1082,"children":1083},{"style":725},[1084],{"type":44,"value":865},{"type":38,"tag":703,"props":1086,"children":1087},{"style":812},[1088],{"type":44,"value":815},{"type":38,"tag":703,"props":1090,"children":1091},{"style":725},[1092],{"type":44,"value":1093},"guide-ke",{"type":38,"tag":703,"props":1095,"children":1096},{"style":823},[1097],{"type":44,"value":826},{"type":38,"tag":703,"props":1099,"children":1100},{"style":812},[1101],{"type":44,"value":831},{"type":38,"tag":703,"props":1103,"children":1104},{"style":710},[1105],{"type":44,"value":1106},"     # Push a guide after modifying\n",{"type":38,"tag":703,"props":1108,"children":1110},{"class":705,"line":1109},26,[1111,1115,1119,1123,1127,1132,1136,1140],{"type":38,"tag":703,"props":1112,"children":1113},{"style":720},[1114],{"type":44,"value":8},{"type":38,"tag":703,"props":1116,"children":1117},{"style":725},[1118],{"type":44,"value":1036},{"type":38,"tag":703,"props":1120,"children":1121},{"style":725},[1122],{"type":44,"value":865},{"type":38,"tag":703,"props":1124,"children":1125},{"style":812},[1126],{"type":44,"value":815},{"type":38,"tag":703,"props":1128,"children":1129},{"style":725},[1130],{"type":44,"value":1131},"ke",{"type":38,"tag":703,"props":1133,"children":1134},{"style":823},[1135],{"type":44,"value":826},{"type":38,"tag":703,"props":1137,"children":1138},{"style":812},[1139],{"type":44,"value":831},{"type":38,"tag":703,"props":1141,"children":1142},{"style":710},[1143],{"type":44,"value":1144},"    # Push a message type after modifying\n",{"type":38,"tag":703,"props":1146,"children":1148},{"class":705,"line":1147},27,[1149],{"type":38,"tag":703,"props":1150,"children":1151},{"emptyLinePlaceholder":740},[1152],{"type":44,"value":743},{"type":38,"tag":703,"props":1154,"children":1156},{"class":705,"line":1155},28,[1157],{"type":38,"tag":703,"props":1158,"children":1159},{"style":710},[1160],{"type":44,"value":1161},"# Partial commands (email design system building blocks)\n",{"type":38,"tag":703,"props":1163,"children":1165},{"class":705,"line":1164},29,[1166,1170,1175,1179],{"type":38,"tag":703,"props":1167,"children":1168},{"style":720},[1169],{"type":44,"value":8},{"type":38,"tag":703,"props":1171,"children":1172},{"style":725},[1173],{"type":44,"value":1174}," partial",{"type":38,"tag":703,"props":1176,"children":1177},{"style":725},[1178],{"type":44,"value":1041},{"type":38,"tag":703,"props":1180,"children":1181},{"style":710},[1182],{"type":44,"value":1183},"               # List existing partials\n",{"type":38,"tag":703,"props":1185,"children":1187},{"class":705,"line":1186},30,[1188,1192,1196,1201,1206,1210,1214,1218,1222,1227,1232,1237,1242,1247,1252,1257],{"type":38,"tag":703,"props":1189,"children":1190},{"style":720},[1191],{"type":44,"value":8},{"type":38,"tag":703,"props":1193,"children":1194},{"style":725},[1195],{"type":44,"value":1174},{"type":38,"tag":703,"props":1197,"children":1198},{"style":725},[1199],{"type":44,"value":1200}," new",{"type":38,"tag":703,"props":1202,"children":1203},{"style":725},[1204],{"type":44,"value":1205}," -k",{"type":38,"tag":703,"props":1207,"children":1208},{"style":812},[1209],{"type":44,"value":815},{"type":38,"tag":703,"props":1211,"children":1212},{"style":725},[1213],{"type":44,"value":1131},{"type":38,"tag":703,"props":1215,"children":1216},{"style":823},[1217],{"type":44,"value":826},{"type":38,"tag":703,"props":1219,"children":1220},{"style":812},[1221],{"type":44,"value":831},{"type":38,"tag":703,"props":1223,"children":1224},{"style":725},[1225],{"type":44,"value":1226}," -n",{"type":38,"tag":703,"props":1228,"children":1229},{"style":812},[1230],{"type":44,"value":1231}," \"",{"type":38,"tag":703,"props":1233,"children":1234},{"style":725},[1235],{"type":44,"value":1236},"Name",{"type":38,"tag":703,"props":1238,"children":1239},{"style":812},[1240],{"type":44,"value":1241},"\"",{"type":38,"tag":703,"props":1243,"children":1244},{"style":725},[1245],{"type":44,"value":1246}," -t",{"type":38,"tag":703,"props":1248,"children":1249},{"style":725},[1250],{"type":44,"value":1251}," html",{"type":38,"tag":703,"props":1253,"children":1254},{"style":725},[1255],{"type":44,"value":1256}," --force",{"type":38,"tag":703,"props":1258,"children":1259},{"style":710},[1260],{"type":44,"value":1261},"   # Create a new partial\n",{"type":38,"tag":703,"props":1263,"children":1265},{"class":705,"line":1264},31,[1266,1270,1274,1278,1282,1286,1290,1294,1298],{"type":38,"tag":703,"props":1267,"children":1268},{"style":720},[1269],{"type":44,"value":8},{"type":38,"tag":703,"props":1271,"children":1272},{"style":725},[1273],{"type":44,"value":1174},{"type":38,"tag":703,"props":1275,"children":1276},{"style":725},[1277],{"type":44,"value":765},{"type":38,"tag":703,"props":1279,"children":1280},{"style":812},[1281],{"type":44,"value":815},{"type":38,"tag":703,"props":1283,"children":1284},{"style":725},[1285],{"type":44,"value":1131},{"type":38,"tag":703,"props":1287,"children":1288},{"style":823},[1289],{"type":44,"value":826},{"type":38,"tag":703,"props":1291,"children":1292},{"style":812},[1293],{"type":44,"value":831},{"type":38,"tag":703,"props":1295,"children":1296},{"style":725},[1297],{"type":44,"value":1256},{"type":38,"tag":703,"props":1299,"children":1300},{"style":710},[1301],{"type":44,"value":1302}," # Pull a partial from Knock\n",{"type":38,"tag":703,"props":1304,"children":1306},{"class":705,"line":1305},32,[1307,1311,1315,1319,1323,1327,1331,1335],{"type":38,"tag":703,"props":1308,"children":1309},{"style":720},[1310],{"type":44,"value":8},{"type":38,"tag":703,"props":1312,"children":1313},{"style":725},[1314],{"type":44,"value":1174},{"type":38,"tag":703,"props":1316,"children":1317},{"style":725},[1318],{"type":44,"value":865},{"type":38,"tag":703,"props":1320,"children":1321},{"style":812},[1322],{"type":44,"value":815},{"type":38,"tag":703,"props":1324,"children":1325},{"style":725},[1326],{"type":44,"value":1131},{"type":38,"tag":703,"props":1328,"children":1329},{"style":823},[1330],{"type":44,"value":826},{"type":38,"tag":703,"props":1332,"children":1333},{"style":812},[1334],{"type":44,"value":831},{"type":38,"tag":703,"props":1336,"children":1337},{"style":710},[1338],{"type":44,"value":1339},"         # Push a partial after modifying\n",{"type":38,"tag":703,"props":1341,"children":1343},{"class":705,"line":1342},33,[1344,1348,1352,1357,1361,1365,1369,1373],{"type":38,"tag":703,"props":1345,"children":1346},{"style":720},[1347],{"type":44,"value":8},{"type":38,"tag":703,"props":1349,"children":1350},{"style":725},[1351],{"type":44,"value":1174},{"type":38,"tag":703,"props":1353,"children":1354},{"style":725},[1355],{"type":44,"value":1356}," validate",{"type":38,"tag":703,"props":1358,"children":1359},{"style":812},[1360],{"type":44,"value":815},{"type":38,"tag":703,"props":1362,"children":1363},{"style":725},[1364],{"type":44,"value":1131},{"type":38,"tag":703,"props":1366,"children":1367},{"style":823},[1368],{"type":44,"value":826},{"type":38,"tag":703,"props":1370,"children":1371},{"style":812},[1372],{"type":44,"value":831},{"type":38,"tag":703,"props":1374,"children":1375},{"style":710},[1376],{"type":44,"value":1377},"     # Validate a partial locally\n",{"type":38,"tag":703,"props":1379,"children":1381},{"class":705,"line":1380},34,[1382],{"type":38,"tag":703,"props":1383,"children":1384},{"emptyLinePlaceholder":740},[1385],{"type":44,"value":743},{"type":38,"tag":703,"props":1387,"children":1389},{"class":705,"line":1388},35,[1390],{"type":38,"tag":703,"props":1391,"children":1392},{"style":710},[1393],{"type":44,"value":1394},"# Commit and promote a specific resource only (safe when other resources have pending changes)\n",{"type":38,"tag":703,"props":1396,"children":1398},{"class":705,"line":1397},36,[1399,1403,1408,1413,1417,1422,1426,1431,1436,1441,1446,1450],{"type":38,"tag":703,"props":1400,"children":1401},{"style":720},[1402],{"type":44,"value":8},{"type":38,"tag":703,"props":1404,"children":1405},{"style":725},[1406],{"type":44,"value":1407}," commit",{"type":38,"tag":703,"props":1409,"children":1410},{"style":725},[1411],{"type":44,"value":1412}," -m",{"type":38,"tag":703,"props":1414,"children":1415},{"style":812},[1416],{"type":44,"value":1231},{"type":38,"tag":703,"props":1418,"children":1419},{"style":725},[1420],{"type":44,"value":1421},"message",{"type":38,"tag":703,"props":1423,"children":1424},{"style":812},[1425],{"type":44,"value":1241},{"type":38,"tag":703,"props":1427,"children":1428},{"style":725},[1429],{"type":44,"value":1430}," --resource-type=workflow",{"type":38,"tag":703,"props":1432,"children":1433},{"style":725},[1434],{"type":44,"value":1435}," --resource-id=",{"type":38,"tag":703,"props":1437,"children":1438},{"style":812},[1439],{"type":44,"value":1440},"\u003C",{"type":38,"tag":703,"props":1442,"children":1443},{"style":725},[1444],{"type":44,"value":1445},"key",{"type":38,"tag":703,"props":1447,"children":1448},{"style":812},[1449],{"type":44,"value":831},{"type":38,"tag":703,"props":1451,"children":1452},{"style":725},[1453],{"type":44,"value":775},{"type":38,"tag":703,"props":1455,"children":1457},{"class":705,"line":1456},37,[1458,1462,1466,1470,1474,1478,1482,1486,1490],{"type":38,"tag":703,"props":1459,"children":1460},{"style":720},[1461],{"type":44,"value":8},{"type":38,"tag":703,"props":1463,"children":1464},{"style":725},[1465],{"type":44,"value":1407},{"type":38,"tag":703,"props":1467,"children":1468},{"style":725},[1469],{"type":44,"value":1041},{"type":38,"tag":703,"props":1471,"children":1472},{"style":725},[1473],{"type":44,"value":1430},{"type":38,"tag":703,"props":1475,"children":1476},{"style":725},[1477],{"type":44,"value":1435},{"type":38,"tag":703,"props":1479,"children":1480},{"style":812},[1481],{"type":44,"value":1440},{"type":38,"tag":703,"props":1483,"children":1484},{"style":725},[1485],{"type":44,"value":1445},{"type":38,"tag":703,"props":1487,"children":1488},{"style":812},[1489],{"type":44,"value":831},{"type":38,"tag":703,"props":1491,"children":1492},{"style":710},[1493],{"type":44,"value":1494},"   # get the commit ID\n",{"type":38,"tag":703,"props":1496,"children":1498},{"class":705,"line":1497},38,[1499,1503,1507,1512,1517,1521,1526,1530],{"type":38,"tag":703,"props":1500,"children":1501},{"style":720},[1502],{"type":44,"value":8},{"type":38,"tag":703,"props":1504,"children":1505},{"style":725},[1506],{"type":44,"value":1407},{"type":38,"tag":703,"props":1508,"children":1509},{"style":725},[1510],{"type":44,"value":1511}," promote",{"type":38,"tag":703,"props":1513,"children":1514},{"style":725},[1515],{"type":44,"value":1516}," --only=",{"type":38,"tag":703,"props":1518,"children":1519},{"style":812},[1520],{"type":44,"value":1440},{"type":38,"tag":703,"props":1522,"children":1523},{"style":725},[1524],{"type":44,"value":1525},"commit-id",{"type":38,"tag":703,"props":1527,"children":1528},{"style":812},[1529],{"type":44,"value":831},{"type":38,"tag":703,"props":1531,"children":1532},{"style":725},[1533],{"type":44,"value":775},{"type":38,"tag":137,"props":1535,"children":1537},{"id":1536},"key-concepts",[1538],{"type":44,"value":1539},"Key concepts",{"type":38,"tag":171,"props":1541,"children":1542},{},[1543,1553,1563,1573,1583],{"type":38,"tag":69,"props":1544,"children":1545},{},[1546,1551],{"type":38,"tag":73,"props":1547,"children":1548},{},[1549],{"type":44,"value":1550},"knockDir",{"type":44,"value":1552},": The directory where Knock resources are stored (configured in knock.json)",{"type":38,"tag":69,"props":1554,"children":1555},{},[1556,1561],{"type":38,"tag":73,"props":1557,"children":1558},{},[1559],{"type":44,"value":1560},"Resource types",{"type":44,"value":1562},": workflows, email-layouts, guides, message-types, translations, partials, commits",{"type":38,"tag":69,"props":1564,"children":1565},{},[1566,1571],{"type":38,"tag":73,"props":1567,"children":1568},{},[1569],{"type":44,"value":1570},"Guides vs workflows",{"type":44,"value":1572},": Guides are for lifecycle messaging (banners, modals); workflows are for notifications",{"type":38,"tag":69,"props":1574,"children":1575},{},[1576,1581],{"type":38,"tag":73,"props":1577,"children":1578},{},[1579],{"type":44,"value":1580},"Template modes",{"type":44,"value":1582},": Visual blocks (default for new emails) vs HTML (only when explicitly requested)",{"type":38,"tag":69,"props":1584,"children":1585},{},[1586,1591,1593,1598,1600,1605,1607,1613,1615,1621,1622],{"type":38,"tag":73,"props":1587,"children":1588},{},[1589],{"type":44,"value":1590},"Variable namespaces",{"type":44,"value":1592},": ",{"type":38,"tag":162,"props":1594,"children":1596},{"className":1595},[],[1597],{"type":44,"value":571},{"type":44,"value":1599}," (trigger payload), ",{"type":38,"tag":162,"props":1601,"children":1603},{"className":1602},[],[1604],{"type":44,"value":579},{"type":44,"value":1606}," (environment variables), ",{"type":38,"tag":162,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":44,"value":1612},"recipient",{"type":44,"value":1614},", ",{"type":38,"tag":162,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":44,"value":1620},"actor",{"type":44,"value":1614},{"type":38,"tag":162,"props":1623,"children":1625},{"className":1624},[],[1626],{"type":44,"value":1627},"tenant",{"type":38,"tag":137,"props":1629,"children":1631},{"id":1630},"important-patterns",[1632],{"type":44,"value":1633},"Important patterns",{"type":38,"tag":65,"props":1635,"children":1636},{},[1637,1661,1671,1694,1704,1728,1738,1764,1780],{"type":38,"tag":69,"props":1638,"children":1639},{},[1640,1652,1654,1659],{"type":38,"tag":73,"props":1641,"children":1642},{},[1643,1644,1650],{"type":44,"value":472},{"type":38,"tag":162,"props":1645,"children":1647},{"className":1646},[],[1648],{"type":44,"value":1649},"--force",{"type":44,"value":1651}," on commands with prompts",{"type":44,"value":1653}," - Many CLI commands (pull, commit, promote, activate) display interactive confirmation prompts. Always pass ",{"type":38,"tag":162,"props":1655,"children":1657},{"className":1656},[],[1658],{"type":44,"value":1649},{"type":44,"value":1660}," to skip them in automated\u002Fagent contexts.",{"type":38,"tag":69,"props":1662,"children":1663},{},[1664,1669],{"type":38,"tag":73,"props":1665,"children":1666},{},[1667],{"type":44,"value":1668},"Push after every change",{"type":44,"value":1670}," - Local edits stay local until pushed. No push = no update in Knock.",{"type":38,"tag":69,"props":1672,"children":1673},{},[1674,1687,1688],{"type":38,"tag":73,"props":1675,"children":1676},{},[1677,1679,1685],{"type":44,"value":1678},"File path references use ",{"type":38,"tag":162,"props":1680,"children":1682},{"className":1681},[],[1683],{"type":44,"value":1684},"@",{"type":44,"value":1686}," suffix",{"type":44,"value":1592},{"type":38,"tag":162,"props":1689,"children":1691},{"className":1690},[],[1692],{"type":44,"value":1693},"\"content@\": \"visual_blocks\u002F1.content.md\"",{"type":38,"tag":69,"props":1695,"children":1696},{},[1697,1702],{"type":38,"tag":73,"props":1698,"children":1699},{},[1700],{"type":44,"value":1701},"Paths are relative to containing file",{"type":44,"value":1703},": Don't double the step directory",{"type":38,"tag":69,"props":1705,"children":1706},{},[1707,1720,1722],{"type":38,"tag":73,"props":1708,"children":1709},{},[1710,1712,1718],{"type":44,"value":1711},"Always use ",{"type":38,"tag":162,"props":1713,"children":1715},{"className":1714},[],[1716],{"type":44,"value":1717},"data.",{"type":44,"value":1719}," for trigger payload values",{"type":44,"value":1721},", not ",{"type":38,"tag":162,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":44,"value":1727},"vars.",{"type":38,"tag":69,"props":1729,"children":1730},{},[1731,1736],{"type":38,"tag":73,"props":1732,"children":1733},{},[1734],{"type":44,"value":1735},"Read existing files before modifying",{"type":44,"value":1737}," to preserve structure",{"type":38,"tag":69,"props":1739,"children":1740},{},[1741,1746,1748,1754,1756,1762],{"type":38,"tag":73,"props":1742,"children":1743},{},[1744],{"type":44,"value":1745},"Discover channel keys before creating workflows",{"type":44,"value":1747}," - Run ",{"type":38,"tag":162,"props":1749,"children":1751},{"className":1750},[],[1752],{"type":44,"value":1753},"knock channel list",{"type":44,"value":1755}," to get valid ",{"type":38,"tag":162,"props":1757,"children":1759},{"className":1758},[],[1760],{"type":44,"value":1761},"channel_key",{"type":44,"value":1763}," values",{"type":38,"tag":69,"props":1765,"children":1766},{},[1767,1772,1773,1778],{"type":38,"tag":73,"props":1768,"children":1769},{},[1770],{"type":44,"value":1771},"Discover message type keys before creating guides",{"type":44,"value":1747},{"type":38,"tag":162,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":44,"value":389},{"type":44,"value":1779}," to get valid message type keys",{"type":38,"tag":69,"props":1781,"children":1782},{},[1783,1788,1789,1795,1797,1803,1804,1810,1812,1818],{"type":38,"tag":73,"props":1784,"children":1785},{},[1786],{"type":44,"value":1787},"Scope commits and promotes when working on a single resource",{"type":44,"value":565},{"type":38,"tag":162,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":44,"value":1794},"knock commit promote --to=\u003Cenv>",{"type":44,"value":1796}," promotes ALL unpromoted commits across all resources. When working on one resource, use ",{"type":38,"tag":162,"props":1798,"children":1800},{"className":1799},[],[1801],{"type":44,"value":1802},"--resource-type",{"type":44,"value":356},{"type":38,"tag":162,"props":1805,"children":1807},{"className":1806},[],[1808],{"type":44,"value":1809},"--resource-id",{"type":44,"value":1811}," to commit only that resource, then use ",{"type":38,"tag":162,"props":1813,"children":1815},{"className":1814},[],[1816],{"type":44,"value":1817},"knock commit promote --only=\u003Ccommit-id>",{"type":44,"value":1819}," to promote only that commit. See the \"Promote a specific resource only\" workflow below.",{"type":38,"tag":53,"props":1821,"children":1823},{"id":1822},"best-practices-summary",[1824],{"type":44,"value":1825},"Best practices summary",{"type":38,"tag":65,"props":1827,"children":1828},{},[1829,1839,1848,1858,1881,1891,1901,1911],{"type":38,"tag":69,"props":1830,"children":1831},{},[1832,1837],{"type":38,"tag":73,"props":1833,"children":1834},{},[1835],{"type":44,"value":1836},"Pull before editing",{"type":44,"value":1838}," - Sync latest changes before making modifications",{"type":38,"tag":69,"props":1840,"children":1841},{},[1842,1846],{"type":38,"tag":73,"props":1843,"children":1844},{},[1845],{"type":44,"value":599},{"type":44,"value":1847}," - Local changes are not persisted to Knock until explicitly pushed",{"type":38,"tag":69,"props":1849,"children":1850},{},[1851,1856],{"type":38,"tag":73,"props":1852,"children":1853},{},[1854],{"type":44,"value":1855},"Read before writing",{"type":44,"value":1857}," - Understand existing structure to avoid data loss",{"type":38,"tag":69,"props":1859,"children":1860},{},[1861,1866,1867,1872,1874,1879],{"type":38,"tag":73,"props":1862,"children":1863},{},[1864],{"type":44,"value":1865},"Use correct namespaces",{"type":44,"value":565},{"type":38,"tag":162,"props":1868,"children":1870},{"className":1869},[],[1871],{"type":44,"value":571},{"type":44,"value":1873}," for dynamic payload, ",{"type":38,"tag":162,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":44,"value":579},{"type":44,"value":1880}," for environment constants",{"type":38,"tag":69,"props":1882,"children":1883},{},[1884,1889],{"type":38,"tag":73,"props":1885,"children":1886},{},[1887],{"type":44,"value":1888},"Visual blocks by default",{"type":44,"value":1890}," - Use visual blocks for new emails; preserve existing mode when editing",{"type":38,"tag":69,"props":1892,"children":1893},{},[1894,1899],{"type":38,"tag":73,"props":1895,"children":1896},{},[1897],{"type":44,"value":1898},"Verify paths",{"type":44,"value":1900}," - File references are relative to the containing file",{"type":38,"tag":69,"props":1902,"children":1903},{},[1904,1909],{"type":38,"tag":73,"props":1905,"children":1906},{},[1907],{"type":44,"value":1908},"Test changes",{"type":44,"value":1910}," - Validate workflows after pushing changes",{"type":38,"tag":69,"props":1912,"children":1913},{},[1914,1919,1921,1926,1928,1933,1935,1941,1943,1948],{"type":38,"tag":73,"props":1915,"children":1916},{},[1917],{"type":44,"value":1918},"Scope commits and promotes",{"type":44,"value":1920}," - Default to ",{"type":38,"tag":162,"props":1922,"children":1924},{"className":1923},[],[1925],{"type":44,"value":1802},{"type":44,"value":1927},"\u002F",{"type":38,"tag":162,"props":1929,"children":1931},{"className":1930},[],[1932],{"type":44,"value":1809},{"type":44,"value":1934}," on commit and ",{"type":38,"tag":162,"props":1936,"children":1938},{"className":1937},[],[1939],{"type":44,"value":1940},"--only",{"type":44,"value":1942}," on promote when working on a single resource. Only use ",{"type":38,"tag":162,"props":1944,"children":1946},{"className":1945},[],[1947],{"type":44,"value":1794},{"type":44,"value":1949}," when you intend to promote all pending changes across every resource.",{"type":38,"tag":1951,"props":1952,"children":1953},"style",{},[1954],{"type":44,"value":1955},"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);}",{"items":1957,"total":786},[1958,1964,1981,1998,2013,2027,2040],{"slug":4,"name":4,"fn":5,"description":6,"org":1959,"tags":1960,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1961,1962,1963],{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"slug":1965,"name":1965,"fn":1966,"description":1967,"org":1968,"tags":1969,"stars":23,"repoUrl":24,"updatedAt":1980},"knock-in-app-ui","implement Knock in-app UI in React","Guidance for implementing Knock in-app UI in a web app, with a focus on setting up, rendering, and debugging Knock guides in React.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1970,1973,1974,1977],{"name":1971,"slug":1972,"type":16},"Frontend","frontend",{"name":18,"slug":19,"type":16},{"name":1975,"slug":1976,"type":16},"React","react",{"name":1978,"slug":1979,"type":16},"UI Components","ui-components","2026-07-14T05:23:53.566839",{"slug":1982,"name":1982,"fn":1983,"description":1984,"org":1985,"tags":1986,"stars":23,"repoUrl":24,"updatedAt":1997},"knock-lifecycle-opportunities","identify lifecycle messaging opportunities","Scan a product codebase for activation, engagement, and retention moments and recommend lifecycle messaging opportunities. Use when finding onboarding, churn, trial, or habit-forming notification candidates without creating Knock resources.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1987,1990,1993,1994],{"name":1988,"slug":1989,"type":16},"Engagement","engagement",{"name":1991,"slug":1992,"type":16},"Marketing","marketing",{"name":18,"slug":19,"type":16},{"name":1995,"slug":1996,"type":16},"Product Management","product-management","2026-07-27T06:28:50.28638",{"slug":1999,"name":1999,"fn":2000,"description":2001,"org":2002,"tags":2003,"stars":23,"repoUrl":24,"updatedAt":2012},"knock-migrate-to-knock","migrate messaging infrastructure to Knock","Investigate existing messaging infrastructure in a codebase and recommend how it maps to Knock. Use when migrating from Braze, Courier, Customer.io, Iterable, SendGrid, or custom notification code, or when planning a move to Knock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2004,2007,2008,2011],{"name":2005,"slug":2006,"type":16},"Infrastructure","infrastructure",{"name":18,"slug":19,"type":16},{"name":2009,"slug":2010,"type":16},"Migration","migration",{"name":21,"slug":22,"type":16},"2026-07-27T06:28:49.594684",{"slug":2014,"name":2014,"fn":2015,"description":2016,"org":2017,"tags":2018,"stars":23,"repoUrl":24,"updatedAt":2026},"knock-notification-best-practices","design effective notification systems","Comprehensive guidelines for designing, writing, and implementing effective notification systems across email, push, SMS, in-app, and chat channels.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2019,2022,2025],{"name":2020,"slug":2021,"type":16},"Best Practices","best-practices",{"name":2023,"slug":2024,"type":16},"Communications","communications",{"name":18,"slug":19,"type":16},"2026-07-14T05:23:54.812153",{"slug":2028,"name":2028,"fn":2029,"description":2030,"org":2031,"tags":2032,"stars":23,"repoUrl":24,"updatedAt":2039},"knock-product-messaging-strategy","design cross-channel product messaging systems","Design a cross-channel product messaging system that drives activation, engagement, and retention while controlling fatigue. Use when planning lifecycle messaging, auditing notification strategy, prioritizing workflows, or turning product moments into Knock workflows, guides, preferences, and measurement.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2033,2034,2035,2036],{"name":1988,"slug":1989,"type":16},{"name":18,"slug":19,"type":16},{"name":1995,"slug":1996,"type":16},{"name":2037,"slug":2038,"type":16},"Strategy","strategy","2026-07-27T06:28:49.935507",{"slug":2041,"name":2041,"fn":2042,"description":2043,"org":2044,"tags":2045,"stars":23,"repoUrl":24,"updatedAt":2053},"knock-setup","integrate Knock notification workflows","Connect Knock to your coding agent, discover and build notification workflows, and recommend how to trigger them from your application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2046,2049,2052],{"name":2047,"slug":2048,"type":16},"API Development","api-development",{"name":2050,"slug":2051,"type":16},"Automation","automation",{"name":18,"slug":19,"type":16},"2026-07-27T06:06:35.280117",{"items":2055,"total":786},[2056,2062,2069,2076,2083,2089,2096],{"slug":4,"name":4,"fn":5,"description":6,"org":2057,"tags":2058,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2059,2060,2061],{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"slug":1965,"name":1965,"fn":1966,"description":1967,"org":2063,"tags":2064,"stars":23,"repoUrl":24,"updatedAt":1980},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2065,2066,2067,2068],{"name":1971,"slug":1972,"type":16},{"name":18,"slug":19,"type":16},{"name":1975,"slug":1976,"type":16},{"name":1978,"slug":1979,"type":16},{"slug":1982,"name":1982,"fn":1983,"description":1984,"org":2070,"tags":2071,"stars":23,"repoUrl":24,"updatedAt":1997},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2072,2073,2074,2075],{"name":1988,"slug":1989,"type":16},{"name":1991,"slug":1992,"type":16},{"name":18,"slug":19,"type":16},{"name":1995,"slug":1996,"type":16},{"slug":1999,"name":1999,"fn":2000,"description":2001,"org":2077,"tags":2078,"stars":23,"repoUrl":24,"updatedAt":2012},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2079,2080,2081,2082],{"name":2005,"slug":2006,"type":16},{"name":18,"slug":19,"type":16},{"name":2009,"slug":2010,"type":16},{"name":21,"slug":22,"type":16},{"slug":2014,"name":2014,"fn":2015,"description":2016,"org":2084,"tags":2085,"stars":23,"repoUrl":24,"updatedAt":2026},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2086,2087,2088],{"name":2020,"slug":2021,"type":16},{"name":2023,"slug":2024,"type":16},{"name":18,"slug":19,"type":16},{"slug":2028,"name":2028,"fn":2029,"description":2030,"org":2090,"tags":2091,"stars":23,"repoUrl":24,"updatedAt":2039},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2092,2093,2094,2095],{"name":1988,"slug":1989,"type":16},{"name":18,"slug":19,"type":16},{"name":1995,"slug":1996,"type":16},{"name":2037,"slug":2038,"type":16},{"slug":2041,"name":2041,"fn":2042,"description":2043,"org":2097,"tags":2098,"stars":23,"repoUrl":24,"updatedAt":2053},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2099,2100,2101],{"name":2047,"slug":2048,"type":16},{"name":2050,"slug":2051,"type":16},{"name":18,"slug":19,"type":16}]