[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69B56JVPKCS2WWVSCZXHEZJ":3,"skill-same:01M69B56JVPKCS2WWVSCZXHEZJ":75},{"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":21,"linkOnly":22,"markdownContent":23,"markdownBody":24,"frontMatter":25,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":29,"repositoryHtmlUrl":30,"repositoryHomepageUrl":6,"ownerHtmlUrl":31,"ownerBlogUrl":32,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M69B56JVPKCS2WWVSCZXHEZJ","struts-to-spring",null,"Migration guideline for transforming Apache Struts 2 applications to Spring Boot 3.x and Spring MVC.","microsoft\u002Fgithub-copilot-modernization","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69B2DAY0HTBHWQN4WF3JDBQ",55,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fstruts-to-spring\u002FSKILL.md",[],[19,20],"struts to spring","boot","2026-11-10 10:12:30",false,"---\nname: struts-to-spring\ndescription: Migration guideline for transforming Apache Struts 2 applications to Spring Boot 3.x and Spring MVC.\n---\n\n# Struts 2 to Spring Boot 3.x Migration Guideline\n\n## Metadata\n\n- **Source Technology**: Apache Struts 2 (struts2-core)\n- **Target Technology**: Spring Boot 3.x with Spring MVC\n- **Trigger Keywords**: struts, struts2, ActionSupport, struts.xml, xwork2, opensymphony, struts-tags\n- **Version**: 1.0.0\n- **Last Updated**: 2025-01-22\n\n## Overview\n\nThis guideline provides comprehensive skills for migrating Apache Struts 2 applications to Spring Boot 3.x. Each skill addresses a specific migration concern with concrete transformation rules, examples, and validation criteria.\n\n## Skill Files\n\n| File | Skills | Description |\n|------|--------|-------------|\n| [SKILL-config.md](SKILL-config.md) | migrate-maven-dependencies, create-spring-boot-application, create-application-properties | Project setup and configuration |\n| [SKILL-action.md](SKILL-action.md) | convert-action-to-controller, convert-action-properties | Action to Controller conversion |\n| [SKILL-view.md](SKILL-view.md) | convert-jsp-tags, convert-ognl-to-el, convert-result-types | View layer migration |\n| [SKILL-interceptor.md](SKILL-interceptor.md) | convert-interceptor, convert-validation | Interceptors and validation |\n| [SKILL-xml.md](SKILL-xml.md) | migrate-struts-xml, migrate-web-xml | XML configuration migration |\n| [SKILL-test.md](SKILL-test.md) | convert-test-classes, create-exception-handler | Testing and exception handling |\n\n---\n\n## Migration Checklist\n\nExecute skills in this order:\n\n### Phase 1: Project Setup\n1. [ ] `migrate-maven-dependencies` - Update pom.xml ([SKILL-config.md](SKILL-config.md))\n2. [ ] `create-spring-boot-application` - Create main class ([SKILL-config.md](SKILL-config.md))\n3. [ ] `create-application-properties` - Create configuration ([SKILL-config.md](SKILL-config.md))\n\n### Phase 2: Configuration Migration\n4. [ ] `migrate-struts-xml` - Plan controller structure ([SKILL-xml.md](SKILL-xml.md))\n5. [ ] `migrate-web-xml` - Remove Struts filter ([SKILL-xml.md](SKILL-xml.md))\n\n### Phase 3: Action Conversion\n6. [ ] `convert-action-to-controller` - Convert each Action class ([SKILL-action.md](SKILL-action.md))\n7. [ ] `convert-action-properties` - Handle Action properties ([SKILL-action.md](SKILL-action.md))\n\n### Phase 4: Cross-cutting Concerns\n8. [ ] `convert-validation` - Migrate validation logic ([SKILL-interceptor.md](SKILL-interceptor.md))\n9. [ ] `convert-interceptor` - Convert interceptors ([SKILL-interceptor.md](SKILL-interceptor.md))\n\n### Phase 5: View Layer\n10. [ ] `convert-result-types` - Handle result mappings ([SKILL-view.md](SKILL-view.md))\n11. [ ] `convert-jsp-tags` - Update JSP files ([SKILL-view.md](SKILL-view.md))\n12. [ ] `convert-ognl-to-el` - Fix expressions ([SKILL-view.md](SKILL-view.md))\n\n### Phase 6: Testing & Polish\n13. [ ] `convert-test-classes` - Update tests ([SKILL-test.md](SKILL-test.md))\n14. [ ] `create-exception-handler` - Global exception handling ([SKILL-test.md](SKILL-test.md))\n\n---\n\n## Complete Transformation Example\n\n### Before (Struts)\n\n**HelloAction.java:**\n```java\npackage com.example.action;\n\nimport com.opensymphony.xwork2.ActionSupport;\n\npublic class HelloAction extends ActionSupport {\n    private String name;\n    private String message;\n    \n    public String execute() {\n        if (name == null || name.isEmpty()) {\n            return INPUT;\n        }\n        message = \"Hello, \" + name + \"!\";\n        return SUCCESS;\n    }\n    \n    public void validate() {\n        if (name != null && name.length() > 50) {\n            addFieldError(\"name\", \"Name too long\");\n        }\n    }\n    \n    \u002F\u002F getters and setters\n    public String getName() { return name; }\n    public void setName(String name) { this.name = name; }\n    public String getMessage() { return message; }\n}\n```\n\n**struts.xml:**\n```xml\n\u003Caction name=\"hello\" class=\"com.example.action.HelloAction\">\n    \u003Cresult name=\"success\">\u002FWEB-INF\u002Fjsp\u002Fhello.jsp\u003C\u002Fresult>\n    \u003Cresult name=\"input\">\u002FWEB-INF\u002Fjsp\u002Fhello-form.jsp\u003C\u002Fresult>\n\u003C\u002Faction>\n```\n\n**hello.jsp:**\n```jsp\n\u003C%@ taglib prefix=\"s\" uri=\"\u002Fstruts-tags\" %>\n\u003Chtml>\n\u003Cbody>\n    \u003Cs:property value=\"message\"\u002F>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n### After (Spring Boot)\n\n**HelloForm.java:**\n```java\npackage com.example.form;\n\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.Size;\n\npublic class HelloForm {\n    @NotBlank(message = \"Name is required\")\n    @Size(max = 50, message = \"Name too long\")\n    private String name;\n    \n    public String getName() { return name; }\n    public void setName(String name) { this.name = name; }\n}\n```\n\n**HelloController.java:**\n```java\npackage com.example.controller;\n\nimport com.example.form.HelloForm;\nimport jakarta.validation.Valid;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.PostMapping;\n\n@Controller\npublic class HelloController {\n    \n    @GetMapping(\"\u002Fhello\")\n    public String showForm(Model model) {\n        model.addAttribute(\"helloForm\", new HelloForm());\n        return \"hello-form\";\n    }\n    \n    @PostMapping(\"\u002Fhello\")\n    public String execute(@Valid @ModelAttribute HelloForm form,\n                         BindingResult result,\n                         Model model) {\n        if (result.hasErrors()) {\n            return \"hello-form\";\n        }\n        String message = \"Hello, \" + form.getName() + \"!\";\n        model.addAttribute(\"message\", message);\n        return \"hello\";\n    }\n}\n```\n\n**hello.jsp:**\n```jsp\n\u003C%@ taglib prefix=\"c\" uri=\"http:\u002F\u002Fjava.sun.com\u002Fjsp\u002Fjstl\u002Fcore\" %>\n\u003Chtml>\n\u003Cbody>\n    ${message}\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n**Application.java:**\n```java\npackage com.example;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n    public static void main(String[] args) {\n        SpringApplication.run(Application.class, args);\n    }\n}\n```\n\n**application.properties:**\n```properties\nserver.port=8080\nspring.mvc.view.prefix=\u002FWEB-INF\u002Fjsp\u002F\nspring.mvc.view.suffix=.jsp\n```\n","# Struts 2 to Spring Boot 3.x Migration Guideline\n\n## Metadata\n\n- **Source Technology**: Apache Struts 2 (struts2-core)\n- **Target Technology**: Spring Boot 3.x with Spring MVC\n- **Trigger Keywords**: struts, struts2, ActionSupport, struts.xml, xwork2, opensymphony, struts-tags\n- **Version**: 1.0.0\n- **Last Updated**: 2025-01-22\n\n## Overview\n\nThis guideline provides comprehensive skills for migrating Apache Struts 2 applications to Spring Boot 3.x. Each skill addresses a specific migration concern with concrete transformation rules, examples, and validation criteria.\n\n## Skill Files\n\n| File | Skills | Description |\n|------|--------|-------------|\n| [SKILL-config.md](SKILL-config.md) | migrate-maven-dependencies, create-spring-boot-application, create-application-properties | Project setup and configuration |\n| [SKILL-action.md](SKILL-action.md) | convert-action-to-controller, convert-action-properties | Action to Controller conversion |\n| [SKILL-view.md](SKILL-view.md) | convert-jsp-tags, convert-ognl-to-el, convert-result-types | View layer migration |\n| [SKILL-interceptor.md](SKILL-interceptor.md) | convert-interceptor, convert-validation | Interceptors and validation |\n| [SKILL-xml.md](SKILL-xml.md) | migrate-struts-xml, migrate-web-xml | XML configuration migration |\n| [SKILL-test.md](SKILL-test.md) | convert-test-classes, create-exception-handler | Testing and exception handling |\n\n---\n\n## Migration Checklist\n\nExecute skills in this order:\n\n### Phase 1: Project Setup\n1. [ ] `migrate-maven-dependencies` - Update pom.xml ([SKILL-config.md](SKILL-config.md))\n2. [ ] `create-spring-boot-application` - Create main class ([SKILL-config.md](SKILL-config.md))\n3. [ ] `create-application-properties` - Create configuration ([SKILL-config.md](SKILL-config.md))\n\n### Phase 2: Configuration Migration\n4. [ ] `migrate-struts-xml` - Plan controller structure ([SKILL-xml.md](SKILL-xml.md))\n5. [ ] `migrate-web-xml` - Remove Struts filter ([SKILL-xml.md](SKILL-xml.md))\n\n### Phase 3: Action Conversion\n6. [ ] `convert-action-to-controller` - Convert each Action class ([SKILL-action.md](SKILL-action.md))\n7. [ ] `convert-action-properties` - Handle Action properties ([SKILL-action.md](SKILL-action.md))\n\n### Phase 4: Cross-cutting Concerns\n8. [ ] `convert-validation` - Migrate validation logic ([SKILL-interceptor.md](SKILL-interceptor.md))\n9. [ ] `convert-interceptor` - Convert interceptors ([SKILL-interceptor.md](SKILL-interceptor.md))\n\n### Phase 5: View Layer\n10. [ ] `convert-result-types` - Handle result mappings ([SKILL-view.md](SKILL-view.md))\n11. [ ] `convert-jsp-tags` - Update JSP files ([SKILL-view.md](SKILL-view.md))\n12. [ ] `convert-ognl-to-el` - Fix expressions ([SKILL-view.md](SKILL-view.md))\n\n### Phase 6: Testing & Polish\n13. [ ] `convert-test-classes` - Update tests ([SKILL-test.md](SKILL-test.md))\n14. [ ] `create-exception-handler` - Global exception handling ([SKILL-test.md](SKILL-test.md))\n\n---\n\n## Complete Transformation Example\n\n### Before (Struts)\n\n**HelloAction.java:**\n```java\npackage com.example.action;\n\nimport com.opensymphony.xwork2.ActionSupport;\n\npublic class HelloAction extends ActionSupport {\n    private String name;\n    private String message;\n    \n    public String execute() {\n        if (name == null || name.isEmpty()) {\n            return INPUT;\n        }\n        message = \"Hello, \" + name + \"!\";\n        return SUCCESS;\n    }\n    \n    public void validate() {\n        if (name != null && name.length() > 50) {\n            addFieldError(\"name\", \"Name too long\");\n        }\n    }\n    \n    \u002F\u002F getters and setters\n    public String getName() { return name; }\n    public void setName(String name) { this.name = name; }\n    public String getMessage() { return message; }\n}\n```\n\n**struts.xml:**\n```xml\n\u003Caction name=\"hello\" class=\"com.example.action.HelloAction\">\n    \u003Cresult name=\"success\">\u002FWEB-INF\u002Fjsp\u002Fhello.jsp\u003C\u002Fresult>\n    \u003Cresult name=\"input\">\u002FWEB-INF\u002Fjsp\u002Fhello-form.jsp\u003C\u002Fresult>\n\u003C\u002Faction>\n```\n\n**hello.jsp:**\n```jsp\n\u003C%@ taglib prefix=\"s\" uri=\"\u002Fstruts-tags\" %>\n\u003Chtml>\n\u003Cbody>\n    \u003Cs:property value=\"message\"\u002F>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n### After (Spring Boot)\n\n**HelloForm.java:**\n```java\npackage com.example.form;\n\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.Size;\n\npublic class HelloForm {\n    @NotBlank(message = \"Name is required\")\n    @Size(max = 50, message = \"Name too long\")\n    private String name;\n    \n    public String getName() { return name; }\n    public void setName(String name) { this.name = name; }\n}\n```\n\n**HelloController.java:**\n```java\npackage com.example.controller;\n\nimport com.example.form.HelloForm;\nimport jakarta.validation.Valid;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.PostMapping;\n\n@Controller\npublic class HelloController {\n    \n    @GetMapping(\"\u002Fhello\")\n    public String showForm(Model model) {\n        model.addAttribute(\"helloForm\", new HelloForm());\n        return \"hello-form\";\n    }\n    \n    @PostMapping(\"\u002Fhello\")\n    public String execute(@Valid @ModelAttribute HelloForm form,\n                         BindingResult result,\n                         Model model) {\n        if (result.hasErrors()) {\n            return \"hello-form\";\n        }\n        String message = \"Hello, \" + form.getName() + \"!\";\n        model.addAttribute(\"message\", message);\n        return \"hello\";\n    }\n}\n```\n\n**hello.jsp:**\n```jsp\n\u003C%@ taglib prefix=\"c\" uri=\"http:\u002F\u002Fjava.sun.com\u002Fjsp\u002Fjstl\u002Fcore\" %>\n\u003Chtml>\n\u003Cbody>\n    ${message}\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n**Application.java:**\n```java\npackage com.example;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class Application {\n    public static void main(String[] args) {\n        SpringApplication.run(Application.class, args);\n    }\n}\n```\n\n**application.properties:**\n```properties\nserver.port=8080\nspring.mvc.view.prefix=\u002FWEB-INF\u002Fjsp\u002F\nspring.mvc.view.suffix=.jsp\n```\n",{"name":5,"description":7},"main","a9c9469d86e9dc078018e8fb391abc7744088078","plugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fstruts-to-spring",15,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-09-24 00:17:59",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add microsoft\u002Fgithub-copilot-modernization --skill struts-to-spring",{"tool":41,"command":42},"bunx","bunx skills add microsoft\u002Fgithub-copilot-modernization --skill struts-to-spring",{"tool":44,"command":45},"pnpm","pnpm dlx skills add microsoft\u002Fgithub-copilot-modernization --skill struts-to-spring","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fstruts-to-spring\u002FSKILL.md",true,[49,55,59,63,67,71],{"path":50,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":53,"sourceHtmlUrl":54},"SKILL-action.md","REFERENCE","参考文档",5195,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fstruts-to-spring\u002FSKILL-action.md",{"path":56,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":57,"sourceHtmlUrl":58},"SKILL-config.md",3084,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fstruts-to-spring\u002FSKILL-config.md",{"path":60,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":61,"sourceHtmlUrl":62},"SKILL-interceptor.md",4570,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fstruts-to-spring\u002FSKILL-interceptor.md",{"path":64,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":65,"sourceHtmlUrl":66},"SKILL-test.md",4181,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fstruts-to-spring\u002FSKILL-test.md",{"path":68,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":69,"sourceHtmlUrl":70},"SKILL-view.md",4823,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fstruts-to-spring\u002FSKILL-view.md",{"path":72,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":73,"sourceHtmlUrl":74},"SKILL-xml.md",3270,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fstruts-to-spring\u002FSKILL-xml.md",[76,90,99,108,116,124],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":87,"publishedAt":21},"01M69B5DBRA354JMQRZP3D1X3X","verify-test-baseline","Generate and run post-migration tests from the frozen baseline specification.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fverify-test-baseline\u002FSKILL.md",[82],{"categoryNo":83,"categoryName":84,"taxonomyType":85,"taxonomyTypeDesc":86},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[88,89],"test","verify test baseline",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":21},"01M69B5BJWPCN41J5ZAR2XFMBR","team-request","How team members request infrastructure connection info and handle secrets in team mode","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fteam-request\u002FSKILL.md",[],[97,98],"team request","infrastructure",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":21},"01M69B58TZ7SNTPB6C508M5HWX","team-charters","Provides role charters (mission, ownership, core principles, quality bar) for a multi-agent coding team. Each charter defines the role's mission, ownership scope, core principle (boundary constraints), and quality bar. Most roles also include communication rules. Consumed by the coordinator during task decomposition to assign work to the correct role.\nTriggers: \"look up role charter\", \"what does the architect own\", \"check role boundaries\", \"find team roles\", \"which role handles X\", \"list agent charters\", \"role responsibilities\".\nNOT for: task decomposition (use breaking-down-tasks), implementation (use implementing-code), architecture analysis (use analyzing-architecture).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fteam-charters\u002FSKILL.md",[],[106,107],"team charters","architecture",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":21},"01M69B54QQ6K8SDZ8MJYEKBYHJ","spring-boot-scaffolding","Reference guide for creating a new Spring Boot project during rewrite migration.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fspring-boot-scaffolding\u002FSKILL.md",[],[20,115],"spring boot scaffolding",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":21},"01M69B52T5G9CZWHYXWP22WEKY","sharing-learnings","How to record project learnings so that later-phase workers and future agent runs can consume them.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fsharing-learnings\u002FSKILL.md",[],[123],"sharing learnings",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":21},"01M69B515J558MRDVXPRS7NCFM","setting-up-constitution","Creates or updates the project constitution that defines migration principles, constraints, and conventions.\nTriggers: \"set up constitution\", \"define migration principles\", \"create project rules\", \"establish conventions\", \"establish migration constitution\".\nNOT for: implementation, implementation planning, task generation.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fgithub-copilot-modernization\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-copilot-modernization\u002Fskills\u002Fsetting-up-constitution\u002FSKILL.md",[],[131],"setting up constitution"]