[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E5BAH71MEA97X0S4MDZNRK":3,"skill-same:01M6E5BAH71MEA97X0S4MDZNRK":102},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":24,"linkOnly":25,"markdownContent":26,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":32,"repositoryHtmlUrl":33,"repositoryHomepageUrl":6,"ownerHtmlUrl":34,"ownerBlogUrl":35,"ownerDescription":36,"updatedAt":37,"install":38,"resources":51},"01M6E5BAH71MEA97X0S4MDZNRK","Create Tcl Command",null,"How to create a Tcl command in the firmware.","strickyak\u002Fcopico-centipede","strickyak","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F73520?v=4","01M6E5AZME5PX13AE3F7V3C2FW","Strick Yak (Henry Strickland) (whence, whither)","01M6E5AZY2RBB972X17XHZS3AJ",7,"MIT","https:\u002F\u002Fgithub.com\u002Fstrickyak\u002Fcopico-centipede\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate_tcl_command\u002FSKILL.md",[],[19,20,5,21,22,23],"create","command","firmware","how","how to","2026-11-10 10:12:30",false,"---\nname: Create Tcl Command\ndescription: How to create a Tcl command in the firmware.\n---\n\nWhen asked to create or add a new Tcl command or ensemble command to the firmware, follow these steps:\n\n1. **Locate the command definitions**:\n   Tcl commands are typically defined as C functions (e.g., `centipede_cmd`) in `v1\u002Ffirmware\u002Ftcl_commands.h`. They follow the signature:\n   `int command_name(ClientData clientData, Tcl_Interp* interp, int argc, char* argv[])`. \n   The commands are registered at the bottom of the file in `register_tcl_commands(Tcl_Interp* interp)` using `Tcl_CreateCommand`.\n\n2. **Implement the logic**:\n   - Parse `argc` and `argv` to determine the subcommand and arguments. For ensemble commands, use `strcmp(argv[1], \"subcommand\")` for routing.\n   - Return errors by placing a message in the interpreter result using `Tcl_SetResult(interp, \"message\", TCL_STATIC\u002FTCL_VOLATILE)` or `Tcl_AppendResult(interp, ...)` and returning `TCL_ERROR`.\n   - On success, set the result (if any) and return `TCL_OK`.\n\n3. **Update the documentation**:\n   Always document the new command or subcommand in the Tcl scripting manual located at `v1\u002Fdoc\u002Fcentipede_scripting_manual.md`. Place it in the appropriate section (Filesystem, Control, or Utilities).\n\n4. **Recompile to verify**:\n   Verify that the C++ code compiles successfully by running the \"Compile Firmware\" skill (`cd v1\u002Ffirmware && .\u002Fbuild.sh`).\n","When asked to create or add a new Tcl command or ensemble command to the firmware, follow these steps:\n\n1. **Locate the command definitions**:\n   Tcl commands are typically defined as C functions (e.g., `centipede_cmd`) in `v1\u002Ffirmware\u002Ftcl_commands.h`. They follow the signature:\n   `int command_name(ClientData clientData, Tcl_Interp* interp, int argc, char* argv[])`. \n   The commands are registered at the bottom of the file in `register_tcl_commands(Tcl_Interp* interp)` using `Tcl_CreateCommand`.\n\n2. **Implement the logic**:\n   - Parse `argc` and `argv` to determine the subcommand and arguments. For ensemble commands, use `strcmp(argv[1], \"subcommand\")` for routing.\n   - Return errors by placing a message in the interpreter result using `Tcl_SetResult(interp, \"message\", TCL_STATIC\u002FTCL_VOLATILE)` or `Tcl_AppendResult(interp, ...)` and returning `TCL_ERROR`.\n   - On success, set the result (if any) and return `TCL_OK`.\n\n3. **Update the documentation**:\n   Always document the new command or subcommand in the Tcl scripting manual located at `v1\u002Fdoc\u002Fcentipede_scripting_manual.md`. Place it in the appropriate section (Filesystem, Control, or Utilities).\n\n4. **Recompile to verify**:\n   Verify that the C++ code compiles successfully by running the \"Compile Firmware\" skill (`cd v1\u002Ffirmware && .\u002Fbuild.sh`).\n",{"name":5,"description":7},"main","6095e43e2490573a7a5b90251e308a474965282a",".agents\u002Fskills\u002Fcreate_tcl_command",4,"https:\u002F\u002Fgithub.com\u002Fstrickyak\u002Fcopico-centipede","https:\u002F\u002Fgithub.com\u002Fstrickyak","http:\u002F\u002Fwiki.yak.net\u002F","frobnovich -- W6REK -- ʞ\r\n","2026-09-07 06:14:07",{"source":8,"skillName":5,"commands":39,"prompt":49,"zipAvailable":50},[40,43,46],{"tool":41,"command":42},"npx","npx skills add strickyak\u002Fcopico-centipede --skill \"Create Tcl Command\"",{"tool":44,"command":45},"bunx","bunx skills add strickyak\u002Fcopico-centipede --skill \"Create Tcl Command\"",{"tool":47,"command":48},"pnpm","pnpm dlx skills add strickyak\u002Fcopico-centipede --skill \"Create Tcl Command\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fstrickyak\u002Fcopico-centipede\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate_tcl_command\u002FSKILL.md",true,[52,58,64,68,74,78,82,86,90,94,98],{"path":53,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":56,"sourceHtmlUrl":57},"forms.md","REFERENCE","参考文档",9438,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Fforms.md",{"path":59,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":63},"LICENSE.txt","LICENSE","许可证",1467,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002FLICENSE.txt",{"path":65,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":66,"sourceHtmlUrl":67},"reference.md",16692,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Freference.md",{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"scripts\u002Fcheck_bounding_boxes_test.py","SCRIPT","脚本",8818,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Fscripts\u002Fcheck_bounding_boxes_test.py",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"scripts\u002Fcheck_bounding_boxes.py",3139,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Fscripts\u002Fcheck_bounding_boxes.py",{"path":79,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":80,"sourceHtmlUrl":81},"scripts\u002Fcheck_fillable_fields.py",362,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Fscripts\u002Fcheck_fillable_fields.py",{"path":83,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":84,"sourceHtmlUrl":85},"scripts\u002Fconvert_pdf_to_images.py",1123,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Fscripts\u002Fconvert_pdf_to_images.py",{"path":87,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":88,"sourceHtmlUrl":89},"scripts\u002Fcreate_validation_image.py",1603,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Fscripts\u002Fcreate_validation_image.py",{"path":91,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":92,"sourceHtmlUrl":93},"scripts\u002Fextract_form_field_info.py",6127,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Fscripts\u002Fextract_form_field_info.py",{"path":95,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":96,"sourceHtmlUrl":97},"scripts\u002Ffill_fillable_fields.py",4863,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Fscripts\u002Ffill_fillable_fields.py",{"path":99,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":100,"sourceHtmlUrl":101},"scripts\u002Ffill_pdf_form_with_annotations.py",3596,"https:\u002F\u002Fgithub.com\u002Ftoanil315\u002Fbike-leads\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fdocument-skills\u002Fpdf\u002Fscripts\u002Ffill_pdf_form_with_annotations.py",[103,114,131,141,149],{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":109,"publishedAt":24},"01M6E5BMGG9RPY923SRBQNM5CW","Using git","Guidelines and constraints for using git in this repository.","https:\u002F\u002Fgithub.com\u002Fstrickyak\u002Fcopico-centipede\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fusing_git\u002FSKILL.md",[],[105,110,111,112,113],"git","constraints","repository","guidelines",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":125,"publishedAt":24},"01M6E5BHSP5TXXEE64WCXQRN6Z","Test Tether with Expect","How to run tests against the tether and firmware using Expect scripts","https:\u002F\u002Fgithub.com\u002Fstrickyak\u002Fcopico-centipede\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ftest_tether_with_expect\u002FSKILL.md",[120],{"categoryNo":121,"categoryName":122,"taxonomyType":123,"taxonomyTypeDesc":124},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[116,126,127,23,128,22,21,129,130],"test","tests","scripts","run","run tests",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":24},"01M6E5BE0YB3WX9240JWEB0CKQ","Execute Tcl Scenario","Execute some Tcl code on the Centipede firmware without a Coco connected to it.","https:\u002F\u002Fgithub.com\u002Fstrickyak\u002Fcopico-centipede\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fexecute_tcl_scenario\u002FSKILL.md",[],[133,138,139,140,21],"scenario","execute","code",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":24},"01M6E5B78NAQ5HVJWG9E4JGYAR","Compile Tether","Compile the tether program.","https:\u002F\u002Fgithub.com\u002Fstrickyak\u002Fcopico-centipede\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcompile_tether\u002FSKILL.md",[],[143,148],"compile",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":24},"01M6E5B3HWN82KZVSYB4HFX2VG","Compile Firmware","Compile the Centipede firmware.","https:\u002F\u002Fgithub.com\u002Fstrickyak\u002Fcopico-centipede\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcompile_firmware\u002FSKILL.md",[],[21,148,151]]