[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ACF28GHCGGJBZPGP2SSYMN":3,"skill-same:01M6ACF28GHCGGJBZPGP2SSYMN":98},{"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":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":6,"updatedAt":57,"install":58,"resources":71},"01M6ACF28GHCGGJBZPGP2SSYMN","pr-review",null,"Review of a PR, branch, or your own uncommitted work across eight dimensions — security, correctness, test coverage, API\u002Fcompatibility, usability, documentation, code quality, performance. Sizes the diff, reviews inline or fans out reviewers off a shared brief, verifies findings against code, reports a grouped list with a shape verdict, fixes on approval. Use for \"review this PR\", \"\u002Fpr-review 3011\", or a pre-flight self-review before submitting; add \"thorough\" for adversarial verification.","apache\u002Ftika","apache","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47359?v=4","01M6AC83E6K4FDKK7HZ8WNMQKE","The Apache Software Foundation","01M6ACEMPJD6J74AGZBFFEGEYV",4141,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fapache\u002Ftika\u002Fblob\u002Fmain\u002F.skills\u002Fdevs\u002Fpr-review\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"pr review","pr","review","api","inline","reviews","shared","across","self","dimensions","reports","usability","coverage","branch","work","brief","verification","code","documentation","code quality","test","performance","security","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":47,"description":48},"struts-to-spring","Migration guideline for transforming Apache Struts 2 applications to Spring Boot 3.x and Spring MVC.","main","a9c9469d86e9dc078018e8fb391abc7744088078",".skills\u002Fdevs\u002Fpr-review",1038,"https:\u002F\u002Fgithub.com\u002Fapache\u002Ftika","https:\u002F\u002Ftika.apache.org\u002F","https:\u002F\u002Fgithub.com\u002Fapache","https:\u002F\u002Fwww.apache.org\u002F","2026-11-10 06:13:36",{"source":8,"skillName":47,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add apache\u002Ftika --skill struts-to-spring",{"tool":64,"command":65},"bunx","bunx skills add apache\u002Ftika --skill struts-to-spring",{"tool":67,"command":68},"pnpm","pnpm dlx skills add apache\u002Ftika --skill struts-to-spring","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fapache\u002Ftika\u002Fblob\u002Fmain\u002F.skills\u002Fdevs\u002Fpr-review\u002FSKILL.md",true,[72,78,82,86,90,94],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"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":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"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":83,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":84,"sourceHtmlUrl":85},"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":87,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":88,"sourceHtmlUrl":89},"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":91,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":92,"sourceHtmlUrl":93},"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":95,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":96,"sourceHtmlUrl":97},"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",[99,141,166,191,217,242],{"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":116,"publishedAt":42},"01M6ACFKZR081Z7QX5XB1ZA2R2","file-to-markdown","Turn almost any file into Markdown plus metadata — PDF, Office, HTML, email, archives, images, audio\u002Fvideo, 1000+ formats — powered by Apache Tika, either via the tika-app CLI (zero setup, one file) or a running tika-server (curl, warm process, many calls). Leads with rmeta (structured, embedded-item-aware output) as the default operation rather than flat concatenated text, since you can't tell whether a file has embedded content from its extension. Covers metadata-only triage, type and language detection, OCR, and output-size discipline for agent context. Use whenever a task involves reading the content of a file whose format you don't want to hand-parse.","https:\u002F\u002Fgithub.com\u002Fapache\u002Ftika\u002Fblob\u002Fmain\u002F.skills\u002Fusers\u002Ffile-to-markdown\u002FSKILL.md",[105,110,113],{"categoryNo":106,"categoryName":107,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",{"categoryNo":111,"categoryName":112,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":114,"categoryName":115,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000023","Skill与智能体开发",[117,118,119,120,121,122,123,9,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140],"file to markdown","file","markdown","PDF","cli","triage","setup","content","metadata","tika","server","ocr","Video","Audio","text","discipline","only","images","default","either","app","you","hand","parse",{"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":151,"publishedAt":42},"01M6ACFHJR3612ZE6RNX1P5WG9","file-to-markdown-docker","Run Apache Tika as a Docker container when you need guaranteed OCR (scanned PDFs, images) or geospatial raster support with zero local install — `apache\u002Ftika:\u003Cversion>-full` bundles Tesseract, GDAL, ImageMagick, and fonts. Also covers the minimal image, port\u002Fvolume\u002Fmemory conventions, the path-identity mount gotcha, and how to confirm OCR actually ran rather than silently returning no text. Powered by Apache Tika. Use when a local `tika-app`\u002F`tika-server` doesn't have Tesseract installed, or you want a disposable, self-contained parsing environment. Companion to the `file-to-markdown` skill, which covers the parsing calls themselves once a server is up.","https:\u002F\u002Fgithub.com\u002Fapache\u002Ftika\u002Fblob\u002Fmain\u002F.skills\u002Fusers\u002Ffile-to-markdown-docker\u002FSKILL.md",[147,148],{"categoryNo":106,"categoryName":107,"taxonomyType":108,"taxonomyTypeDesc":109},{"categoryNo":149,"categoryName":150,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000011","运维与部署",[152,153,117,118,119,154,155,156,157,158,9,126,128,131,159,134,27,160,161,137,162,138,163,164,165],"docker","file to markdown docker","image","memory","support","identity","run","up","volume","local","how to","fonts","which","when",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":173,"publishedAt":42},"01M6ACFE1684DE184VE0D7PQVY","file-forensics","Examine what a file claims about itself and what it actually contains — powered by Apache Tika. True content-based type detection (extensions lie), provenance claims (authors, dates, creating application), revision and tamper signals (PDF incremental updates, tracked changes, hidden slides, zip integrity), hidden and embedded content (attachments, macros), risk indicators (PDF JavaScript actions, encryption), and content digests. Evidence gathering, not verdicts: Tika reports what the file asserts and what parsing observed; it does not attribute authorship or validate signatures. Use for triaging suspicious files, provenance questions, e-discovery-style review, or \"is this file what it claims to be.\"","https:\u002F\u002Fgithub.com\u002Fapache\u002Ftika\u002Fblob\u002Fmain\u002F.skills\u002Fusers\u002Ffile-forensics\u002FSKILL.md",[172],{"categoryNo":106,"categoryName":107,"taxonomyType":108,"taxonomyTypeDesc":109},[174,118,175,120,21,176,177,178,9,124,126,179,180,181,182,183,29,184,185,186,187,188,189,190],"file forensics","forensics","suspicious","javascript","validate","actions","encryption","risk","integrity","evidence","files","signatures","signals","revision","zip","updates","claims",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":197,"publishedAt":42},"01M6ACFB92SPADF0FY4490B847","update-site-for-release","Update\u002Fpublish the Apache Tika website (tika-site SVN repo) for a release — step 17 of the Release Process. Handles the 4.x track (Changes page + aggregate javadoc + Antora docs branch) vs the 3.x maintenance track (full per-version apt docs + javadoc). Use for \"update the site\", \"publish the site for X.Y.Z\", \"the website part of the release\".","https:\u002F\u002Fgithub.com\u002Fapache\u002Ftika\u002Fblob\u002Fmain\u002F.skills\u002Fdevs\u002Fupdate-site-for-release\u002FSKILL.md",[],[198,199,200,201,202,203,204,9,126,205,206,207,208,32,209,210,211,212,213,214,215,216],"update","release","update site for release","site","for","docs","release process","website","apt","publish","page","repo","use","version","maintenance","full","svn","changes","track",{"skillNo":218,"name":219,"nameZh":6,"description":220,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":221,"categories":222,"keywords":229,"publishedAt":42},"01M6ACF9G52NYHXQ0BVSJ3VH6E","tika-eval-h2-query","Query the tika-eval H2 database directly for counts and joins the canned reports do not compute — connection gotchas, key tables, example queries. Use when the xlsx\u002Fsummary.md reports are not enough.","https:\u002F\u002Fgithub.com\u002Fapache\u002Ftika\u002Fblob\u002Fmain\u002F.skills\u002Fdevs\u002Ftika-eval-h2-query\u002FSKILL.md",[223,226],{"categoryNo":224,"categoryName":225,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000004","电子表格",{"categoryNo":227,"categoryName":228,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000010","后端与接口",[126,230,231,232,233,234,210,235,29,236,237,238,239,240,241,202,165],"tika eval h2 query","eval","query","xlsx","database","example","queries","do","summary","compute","connection","tables",{"skillNo":243,"name":244,"nameZh":6,"description":245,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":246,"categories":247,"keywords":248,"publishedAt":42},"01M6ACF7V56CCWHNVR614VBNX5","tika-eval-encoding-regression","Condensed tika-eval pattern for charset-detector regression hunts (\"A picks encoding X, B picks Y\") using one build and two configs — encoding-pair flip queries, OOV\u002Flanguageness\u002FFFFD signals, per-file detector attribution.","https:\u002F\u002Fgithub.com\u002Fapache\u002Ftika\u002Fblob\u002Fmain\u002F.skills\u002Fdevs\u002Ftika-eval-encoding-regression\u002FSKILL.md",[],[126,249,250,251,231,118,252,253,236,254,255,186,256,202],"tika eval encoding regression","encoding","regression","attribution","pair","build","pattern","detector"]