devskill 2.0.7 → 2.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1016) hide show
  1. package/meta.ts +4 -0
  2. package/package.json +1 -1
  3. package/skills/add-educational-comments/LICENSE.md +21 -0
  4. package/skills/add-educational-comments/SKILL.md +128 -0
  5. package/skills/add-educational-comments/SYNC.md +5 -0
  6. package/skills/agent-governance/LICENSE.md +21 -0
  7. package/skills/agent-governance/SKILL.md +569 -0
  8. package/skills/agent-governance/SYNC.md +5 -0
  9. package/skills/agentic-eval/LICENSE.md +21 -0
  10. package/skills/agentic-eval/SKILL.md +189 -0
  11. package/skills/agentic-eval/SYNC.md +5 -0
  12. package/skills/ai-prompt-engineering-safety-review/LICENSE.md +21 -0
  13. package/skills/ai-prompt-engineering-safety-review/SKILL.md +230 -0
  14. package/skills/ai-prompt-engineering-safety-review/SYNC.md +5 -0
  15. package/skills/appinsights-instrumentation/LICENSE.md +21 -0
  16. package/skills/appinsights-instrumentation/LICENSE.txt +21 -0
  17. package/skills/appinsights-instrumentation/SKILL.md +48 -0
  18. package/skills/appinsights-instrumentation/SYNC.md +5 -0
  19. package/skills/appinsights-instrumentation/examples/appinsights.bicep +30 -0
  20. package/skills/appinsights-instrumentation/references/ASPNETCORE.md +29 -0
  21. package/skills/appinsights-instrumentation/references/AUTO.md +13 -0
  22. package/skills/appinsights-instrumentation/references/NODEJS.md +28 -0
  23. package/skills/appinsights-instrumentation/references/PYTHON.md +48 -0
  24. package/skills/appinsights-instrumentation/scripts/appinsights.ps1 +20 -0
  25. package/skills/apple-appstore-reviewer/LICENSE.md +21 -0
  26. package/skills/apple-appstore-reviewer/SKILL.md +305 -0
  27. package/skills/apple-appstore-reviewer/SYNC.md +5 -0
  28. package/skills/arch-linux-triage/LICENSE.md +21 -0
  29. package/skills/arch-linux-triage/SKILL.md +31 -0
  30. package/skills/arch-linux-triage/SYNC.md +5 -0
  31. package/skills/architecture-blueprint-generator/LICENSE.md +21 -0
  32. package/skills/architecture-blueprint-generator/SKILL.md +322 -0
  33. package/skills/architecture-blueprint-generator/SYNC.md +5 -0
  34. package/skills/aspire/LICENSE.md +21 -0
  35. package/skills/aspire/SKILL.md +231 -0
  36. package/skills/aspire/SYNC.md +5 -0
  37. package/skills/aspire/references/architecture.md +341 -0
  38. package/skills/aspire/references/cli-reference.md +307 -0
  39. package/skills/aspire/references/dashboard.md +226 -0
  40. package/skills/aspire/references/deployment.md +237 -0
  41. package/skills/aspire/references/integrations-catalog.md +68 -0
  42. package/skills/aspire/references/mcp-server.md +195 -0
  43. package/skills/aspire/references/polyglot-apis.md +296 -0
  44. package/skills/aspire/references/testing.md +281 -0
  45. package/skills/aspire/references/troubleshooting.md +194 -0
  46. package/skills/aspnet-minimal-api-openapi/LICENSE.md +21 -0
  47. package/skills/aspnet-minimal-api-openapi/SKILL.md +41 -0
  48. package/skills/aspnet-minimal-api-openapi/SYNC.md +5 -0
  49. package/skills/automate-this/LICENSE.md +21 -0
  50. package/skills/automate-this/SKILL.md +244 -0
  51. package/skills/automate-this/SYNC.md +5 -0
  52. package/skills/autoresearch/LICENSE.md +21 -0
  53. package/skills/autoresearch/SKILL.md +275 -0
  54. package/skills/autoresearch/SYNC.md +5 -0
  55. package/skills/aws-cdk-python-setup/LICENSE.md +21 -0
  56. package/skills/aws-cdk-python-setup/SKILL.md +111 -0
  57. package/skills/aws-cdk-python-setup/SYNC.md +5 -0
  58. package/skills/az-cost-optimize/LICENSE.md +21 -0
  59. package/skills/az-cost-optimize/SKILL.md +305 -0
  60. package/skills/az-cost-optimize/SYNC.md +5 -0
  61. package/skills/azure-deployment-preflight/LICENSE.md +21 -0
  62. package/skills/azure-deployment-preflight/SKILL.md +216 -0
  63. package/skills/azure-deployment-preflight/SYNC.md +5 -0
  64. package/skills/azure-deployment-preflight/references/ERROR-HANDLING.md +392 -0
  65. package/skills/azure-deployment-preflight/references/REPORT-TEMPLATE.md +352 -0
  66. package/skills/azure-deployment-preflight/references/VALIDATION-COMMANDS.md +379 -0
  67. package/skills/azure-devops-cli/LICENSE.md +21 -0
  68. package/skills/azure-devops-cli/SKILL.md +94 -0
  69. package/skills/azure-devops-cli/SYNC.md +5 -0
  70. package/skills/azure-devops-cli/references/advanced-usage.md +197 -0
  71. package/skills/azure-devops-cli/references/boards-and-iterations.md +258 -0
  72. package/skills/azure-devops-cli/references/org-and-security.md +469 -0
  73. package/skills/azure-devops-cli/references/pipelines-and-builds.md +245 -0
  74. package/skills/azure-devops-cli/references/repos-and-prs.md +333 -0
  75. package/skills/azure-devops-cli/references/variables-and-agents.md +212 -0
  76. package/skills/azure-devops-cli/references/workflows-and-patterns.md +668 -0
  77. package/skills/azure-pricing/LICENSE.md +21 -0
  78. package/skills/azure-pricing/SKILL.md +189 -0
  79. package/skills/azure-pricing/SYNC.md +5 -0
  80. package/skills/azure-pricing/references/COPILOT-STUDIO-RATES.md +135 -0
  81. package/skills/azure-pricing/references/COST-ESTIMATOR.md +142 -0
  82. package/skills/azure-pricing/references/REGIONS.md +84 -0
  83. package/skills/azure-pricing/references/SERVICE-NAMES.md +106 -0
  84. package/skills/azure-resource-health-diagnose/LICENSE.md +21 -0
  85. package/skills/azure-resource-health-diagnose/SKILL.md +290 -0
  86. package/skills/azure-resource-health-diagnose/SYNC.md +5 -0
  87. package/skills/azure-resource-visualizer/LICENSE.md +21 -0
  88. package/skills/azure-resource-visualizer/LICENSE.txt +21 -0
  89. package/skills/azure-resource-visualizer/SKILL.md +233 -0
  90. package/skills/azure-resource-visualizer/SYNC.md +5 -0
  91. package/skills/azure-resource-visualizer/assets/template-architecture.md +41 -0
  92. package/skills/azure-role-selector/LICENSE.md +21 -0
  93. package/skills/azure-role-selector/LICENSE.txt +21 -0
  94. package/skills/azure-role-selector/SKILL.md +6 -0
  95. package/skills/azure-role-selector/SYNC.md +5 -0
  96. package/skills/azure-static-web-apps/LICENSE.md +21 -0
  97. package/skills/azure-static-web-apps/SKILL.md +315 -0
  98. package/skills/azure-static-web-apps/SYNC.md +5 -0
  99. package/skills/bigquery-pipeline-audit/LICENSE.md +21 -0
  100. package/skills/bigquery-pipeline-audit/SKILL.md +129 -0
  101. package/skills/bigquery-pipeline-audit/SYNC.md +5 -0
  102. package/skills/boost-prompt/LICENSE.md +21 -0
  103. package/skills/boost-prompt/SKILL.md +25 -0
  104. package/skills/boost-prompt/SYNC.md +5 -0
  105. package/skills/breakdown-epic-arch/LICENSE.md +21 -0
  106. package/skills/breakdown-epic-arch/SKILL.md +66 -0
  107. package/skills/breakdown-epic-arch/SYNC.md +5 -0
  108. package/skills/breakdown-epic-pm/LICENSE.md +21 -0
  109. package/skills/breakdown-epic-pm/SKILL.md +58 -0
  110. package/skills/breakdown-epic-pm/SYNC.md +5 -0
  111. package/skills/breakdown-feature-implementation/LICENSE.md +21 -0
  112. package/skills/breakdown-feature-implementation/SKILL.md +128 -0
  113. package/skills/breakdown-feature-implementation/SYNC.md +5 -0
  114. package/skills/breakdown-feature-prd/LICENSE.md +21 -0
  115. package/skills/breakdown-feature-prd/SKILL.md +61 -0
  116. package/skills/breakdown-feature-prd/SYNC.md +5 -0
  117. package/skills/breakdown-plan/LICENSE.md +21 -0
  118. package/skills/breakdown-plan/SKILL.md +509 -0
  119. package/skills/breakdown-plan/SYNC.md +5 -0
  120. package/skills/breakdown-test/LICENSE.md +21 -0
  121. package/skills/breakdown-test/SKILL.md +365 -0
  122. package/skills/breakdown-test/SYNC.md +5 -0
  123. package/skills/centos-linux-triage/LICENSE.md +21 -0
  124. package/skills/centos-linux-triage/SKILL.md +31 -0
  125. package/skills/centos-linux-triage/SYNC.md +5 -0
  126. package/skills/chrome-devtools/LICENSE.md +21 -0
  127. package/skills/chrome-devtools/SKILL.md +97 -0
  128. package/skills/chrome-devtools/SYNC.md +5 -0
  129. package/skills/cli-mastery/LICENSE.md +21 -0
  130. package/skills/cli-mastery/SKILL.md +43 -0
  131. package/skills/cli-mastery/SYNC.md +5 -0
  132. package/skills/cli-mastery/references/final-exam.md +24 -0
  133. package/skills/cli-mastery/references/module-1-slash-commands.md +88 -0
  134. package/skills/cli-mastery/references/module-2-keyboard-shortcuts.md +38 -0
  135. package/skills/cli-mastery/references/module-3-modes.md +33 -0
  136. package/skills/cli-mastery/references/module-4-agents.md +42 -0
  137. package/skills/cli-mastery/references/module-5-skills.md +33 -0
  138. package/skills/cli-mastery/references/module-6-mcp.md +50 -0
  139. package/skills/cli-mastery/references/module-7-advanced.md +38 -0
  140. package/skills/cli-mastery/references/module-8-configuration.md +34 -0
  141. package/skills/cli-mastery/references/scenarios.md +44 -0
  142. package/skills/cloud-design-patterns/LICENSE.md +21 -0
  143. package/skills/cloud-design-patterns/SKILL.md +62 -0
  144. package/skills/cloud-design-patterns/SYNC.md +5 -0
  145. package/skills/cloud-design-patterns/references/architecture-design.md +127 -0
  146. package/skills/cloud-design-patterns/references/azure-service-mappings.md +13 -0
  147. package/skills/cloud-design-patterns/references/best-practices.md +34 -0
  148. package/skills/cloud-design-patterns/references/deployment-operational.md +91 -0
  149. package/skills/cloud-design-patterns/references/event-driven.md +21 -0
  150. package/skills/cloud-design-patterns/references/messaging-integration.md +127 -0
  151. package/skills/cloud-design-patterns/references/performance.md +180 -0
  152. package/skills/cloud-design-patterns/references/reliability-resilience.md +156 -0
  153. package/skills/cloud-design-patterns/references/security.md +55 -0
  154. package/skills/code-exemplars-blueprint-generator/LICENSE.md +21 -0
  155. package/skills/code-exemplars-blueprint-generator/SKILL.md +126 -0
  156. package/skills/code-exemplars-blueprint-generator/SYNC.md +5 -0
  157. package/skills/codeql/LICENSE.md +21 -0
  158. package/skills/codeql/SKILL.md +405 -0
  159. package/skills/codeql/SYNC.md +5 -0
  160. package/skills/codeql/references/alert-management.md +170 -0
  161. package/skills/codeql/references/cli-commands.md +283 -0
  162. package/skills/codeql/references/compiled-languages.md +284 -0
  163. package/skills/codeql/references/sarif-output.md +265 -0
  164. package/skills/codeql/references/troubleshooting.md +259 -0
  165. package/skills/codeql/references/workflow-configuration.md +398 -0
  166. package/skills/comment-code-generate-a-tutorial/LICENSE.md +21 -0
  167. package/skills/comment-code-generate-a-tutorial/SKILL.md +26 -0
  168. package/skills/comment-code-generate-a-tutorial/SYNC.md +5 -0
  169. package/skills/containerize-aspnet-framework/LICENSE.md +21 -0
  170. package/skills/containerize-aspnet-framework/SKILL.md +454 -0
  171. package/skills/containerize-aspnet-framework/SYNC.md +5 -0
  172. package/skills/containerize-aspnetcore/LICENSE.md +21 -0
  173. package/skills/containerize-aspnetcore/SKILL.md +392 -0
  174. package/skills/containerize-aspnetcore/SYNC.md +5 -0
  175. package/skills/context-map/LICENSE.md +21 -0
  176. package/skills/context-map/SKILL.md +52 -0
  177. package/skills/context-map/SYNC.md +5 -0
  178. package/skills/conventional-commit/LICENSE.md +21 -0
  179. package/skills/conventional-commit/SKILL.md +72 -0
  180. package/skills/conventional-commit/SYNC.md +5 -0
  181. package/skills/convert-plaintext-to-md/LICENSE.md +21 -0
  182. package/skills/convert-plaintext-to-md/SKILL.md +362 -0
  183. package/skills/convert-plaintext-to-md/SYNC.md +5 -0
  184. package/skills/copilot-cli-quickstart/LICENSE.md +21 -0
  185. package/skills/copilot-cli-quickstart/SKILL.md +774 -0
  186. package/skills/copilot-cli-quickstart/SYNC.md +5 -0
  187. package/skills/copilot-instructions-blueprint-generator/LICENSE.md +21 -0
  188. package/skills/copilot-instructions-blueprint-generator/SKILL.md +294 -0
  189. package/skills/copilot-instructions-blueprint-generator/SYNC.md +5 -0
  190. package/skills/copilot-sdk/LICENSE.md +21 -0
  191. package/skills/copilot-sdk/SKILL.md +914 -0
  192. package/skills/copilot-sdk/SYNC.md +5 -0
  193. package/skills/copilot-spaces/LICENSE.md +21 -0
  194. package/skills/copilot-spaces/SKILL.md +205 -0
  195. package/skills/copilot-spaces/SYNC.md +5 -0
  196. package/skills/copilot-usage-metrics/LICENSE.md +21 -0
  197. package/skills/copilot-usage-metrics/SKILL.md +52 -0
  198. package/skills/copilot-usage-metrics/SYNC.md +5 -0
  199. package/skills/copilot-usage-metrics/get-enterprise-metrics.sh +22 -0
  200. package/skills/copilot-usage-metrics/get-enterprise-user-metrics.sh +22 -0
  201. package/skills/copilot-usage-metrics/get-org-metrics.sh +22 -0
  202. package/skills/copilot-usage-metrics/get-org-user-metrics.sh +22 -0
  203. package/skills/cosmosdb-datamodeling/LICENSE.md +21 -0
  204. package/skills/cosmosdb-datamodeling/SKILL.md +1045 -0
  205. package/skills/cosmosdb-datamodeling/SYNC.md +5 -0
  206. package/skills/create-agentsmd/LICENSE.md +21 -0
  207. package/skills/create-agentsmd/SKILL.md +249 -0
  208. package/skills/create-agentsmd/SYNC.md +5 -0
  209. package/skills/create-architectural-decision-record/LICENSE.md +21 -0
  210. package/skills/create-architectural-decision-record/SKILL.md +97 -0
  211. package/skills/create-architectural-decision-record/SYNC.md +5 -0
  212. package/skills/create-github-action-workflow-specification/LICENSE.md +21 -0
  213. package/skills/create-github-action-workflow-specification/SKILL.md +276 -0
  214. package/skills/create-github-action-workflow-specification/SYNC.md +5 -0
  215. package/skills/create-github-issue-feature-from-specification/LICENSE.md +21 -0
  216. package/skills/create-github-issue-feature-from-specification/SKILL.md +28 -0
  217. package/skills/create-github-issue-feature-from-specification/SYNC.md +5 -0
  218. package/skills/create-github-issues-feature-from-implementation-plan/LICENSE.md +21 -0
  219. package/skills/create-github-issues-feature-from-implementation-plan/SKILL.md +28 -0
  220. package/skills/create-github-issues-feature-from-implementation-plan/SYNC.md +5 -0
  221. package/skills/create-github-issues-for-unmet-specification-requirements/LICENSE.md +21 -0
  222. package/skills/create-github-issues-for-unmet-specification-requirements/SKILL.md +35 -0
  223. package/skills/create-github-issues-for-unmet-specification-requirements/SYNC.md +5 -0
  224. package/skills/create-github-pull-request-from-specification/LICENSE.md +21 -0
  225. package/skills/create-github-pull-request-from-specification/SKILL.md +24 -0
  226. package/skills/create-github-pull-request-from-specification/SYNC.md +5 -0
  227. package/skills/create-implementation-plan/LICENSE.md +21 -0
  228. package/skills/create-implementation-plan/SKILL.md +157 -0
  229. package/skills/create-implementation-plan/SYNC.md +5 -0
  230. package/skills/create-llms/LICENSE.md +21 -0
  231. package/skills/create-llms/SKILL.md +210 -0
  232. package/skills/create-llms/SYNC.md +5 -0
  233. package/skills/create-readme/LICENSE.md +21 -0
  234. package/skills/create-readme/SKILL.md +21 -0
  235. package/skills/create-readme/SYNC.md +5 -0
  236. package/skills/create-specification/LICENSE.md +21 -0
  237. package/skills/create-specification/SKILL.md +127 -0
  238. package/skills/create-specification/SYNC.md +5 -0
  239. package/skills/create-spring-boot-java-project/LICENSE.md +21 -0
  240. package/skills/create-spring-boot-java-project/SKILL.md +163 -0
  241. package/skills/create-spring-boot-java-project/SYNC.md +5 -0
  242. package/skills/create-spring-boot-kotlin-project/LICENSE.md +21 -0
  243. package/skills/create-spring-boot-kotlin-project/SKILL.md +147 -0
  244. package/skills/create-spring-boot-kotlin-project/SYNC.md +5 -0
  245. package/skills/create-technical-spike/LICENSE.md +21 -0
  246. package/skills/create-technical-spike/SKILL.md +230 -0
  247. package/skills/create-technical-spike/SYNC.md +5 -0
  248. package/skills/create-tldr-page/LICENSE.md +21 -0
  249. package/skills/create-tldr-page/SKILL.md +210 -0
  250. package/skills/create-tldr-page/SYNC.md +5 -0
  251. package/skills/creating-oracle-to-postgres-master-migration-plan/LICENSE.md +21 -0
  252. package/skills/creating-oracle-to-postgres-master-migration-plan/SKILL.md +83 -0
  253. package/skills/creating-oracle-to-postgres-master-migration-plan/SYNC.md +5 -0
  254. package/skills/creating-oracle-to-postgres-migration-bug-report/LICENSE.md +21 -0
  255. package/skills/creating-oracle-to-postgres-migration-bug-report/SKILL.md +43 -0
  256. package/skills/creating-oracle-to-postgres-migration-bug-report/SYNC.md +5 -0
  257. package/skills/creating-oracle-to-postgres-migration-bug-report/references/BUG-REPORT-TEMPLATE.md +79 -0
  258. package/skills/creating-oracle-to-postgres-migration-integration-tests/LICENSE.md +21 -0
  259. package/skills/creating-oracle-to-postgres-migration-integration-tests/SKILL.md +60 -0
  260. package/skills/creating-oracle-to-postgres-migration-integration-tests/SYNC.md +5 -0
  261. package/skills/csharp-async/LICENSE.md +21 -0
  262. package/skills/csharp-async/SKILL.md +49 -0
  263. package/skills/csharp-async/SYNC.md +5 -0
  264. package/skills/csharp-docs/LICENSE.md +21 -0
  265. package/skills/csharp-docs/SKILL.md +62 -0
  266. package/skills/csharp-docs/SYNC.md +5 -0
  267. package/skills/csharp-mcp-server-generator/LICENSE.md +21 -0
  268. package/skills/csharp-mcp-server-generator/SKILL.md +59 -0
  269. package/skills/csharp-mcp-server-generator/SYNC.md +5 -0
  270. package/skills/csharp-mstest/LICENSE.md +21 -0
  271. package/skills/csharp-mstest/SKILL.md +478 -0
  272. package/skills/csharp-mstest/SYNC.md +5 -0
  273. package/skills/csharp-nunit/LICENSE.md +21 -0
  274. package/skills/csharp-nunit/SKILL.md +71 -0
  275. package/skills/csharp-nunit/SYNC.md +5 -0
  276. package/skills/csharp-tunit/LICENSE.md +21 -0
  277. package/skills/csharp-tunit/SKILL.md +100 -0
  278. package/skills/csharp-tunit/SYNC.md +5 -0
  279. package/skills/csharp-xunit/LICENSE.md +21 -0
  280. package/skills/csharp-xunit/SKILL.md +68 -0
  281. package/skills/csharp-xunit/SYNC.md +5 -0
  282. package/skills/datanalysis-credit-risk/LICENSE.md +21 -0
  283. package/skills/datanalysis-credit-risk/SKILL.md +113 -0
  284. package/skills/datanalysis-credit-risk/SYNC.md +5 -0
  285. package/skills/datanalysis-credit-risk/references/analysis.py +1223 -0
  286. package/skills/datanalysis-credit-risk/references/func.py +228 -0
  287. package/skills/datanalysis-credit-risk/scripts/example.py +391 -0
  288. package/skills/dataverse-python-advanced-patterns/LICENSE.md +21 -0
  289. package/skills/dataverse-python-advanced-patterns/SKILL.md +17 -0
  290. package/skills/dataverse-python-advanced-patterns/SYNC.md +5 -0
  291. package/skills/dataverse-python-production-code/LICENSE.md +21 -0
  292. package/skills/dataverse-python-production-code/SKILL.md +116 -0
  293. package/skills/dataverse-python-production-code/SYNC.md +5 -0
  294. package/skills/dataverse-python-quickstart/LICENSE.md +21 -0
  295. package/skills/dataverse-python-quickstart/SKILL.md +14 -0
  296. package/skills/dataverse-python-quickstart/SYNC.md +5 -0
  297. package/skills/dataverse-python-usecase-builder/LICENSE.md +21 -0
  298. package/skills/dataverse-python-usecase-builder/SKILL.md +246 -0
  299. package/skills/dataverse-python-usecase-builder/SYNC.md +5 -0
  300. package/skills/debian-linux-triage/LICENSE.md +21 -0
  301. package/skills/debian-linux-triage/SKILL.md +31 -0
  302. package/skills/debian-linux-triage/SYNC.md +5 -0
  303. package/skills/declarative-agents/LICENSE.md +21 -0
  304. package/skills/declarative-agents/SKILL.md +94 -0
  305. package/skills/declarative-agents/SYNC.md +5 -0
  306. package/skills/dependabot/LICENSE.md +21 -0
  307. package/skills/dependabot/SKILL.md +422 -0
  308. package/skills/dependabot/SYNC.md +5 -0
  309. package/skills/dependabot/references/dependabot-yml-reference.md +374 -0
  310. package/skills/dependabot/references/example-configs.md +409 -0
  311. package/skills/dependabot/references/pr-commands.md +91 -0
  312. package/skills/devops-rollout-plan/LICENSE.md +21 -0
  313. package/skills/devops-rollout-plan/SKILL.md +117 -0
  314. package/skills/devops-rollout-plan/SYNC.md +5 -0
  315. package/skills/documentation-writer/LICENSE.md +21 -0
  316. package/skills/documentation-writer/SKILL.md +45 -0
  317. package/skills/documentation-writer/SYNC.md +5 -0
  318. package/skills/dotnet-best-practices/LICENSE.md +21 -0
  319. package/skills/dotnet-best-practices/SKILL.md +85 -0
  320. package/skills/dotnet-best-practices/SYNC.md +5 -0
  321. package/skills/dotnet-design-pattern-review/LICENSE.md +21 -0
  322. package/skills/dotnet-design-pattern-review/SKILL.md +42 -0
  323. package/skills/dotnet-design-pattern-review/SYNC.md +5 -0
  324. package/skills/dotnet-timezone/LICENSE.md +21 -0
  325. package/skills/dotnet-timezone/SKILL.md +109 -0
  326. package/skills/dotnet-timezone/SYNC.md +5 -0
  327. package/skills/dotnet-timezone/references/code-patterns.md +153 -0
  328. package/skills/dotnet-timezone/references/timezone-index.md +87 -0
  329. package/skills/dotnet-upgrade/LICENSE.md +21 -0
  330. package/skills/dotnet-upgrade/SKILL.md +116 -0
  331. package/skills/dotnet-upgrade/SYNC.md +5 -0
  332. package/skills/doublecheck/LICENSE.md +21 -0
  333. package/skills/doublecheck/SKILL.md +277 -0
  334. package/skills/doublecheck/SYNC.md +5 -0
  335. package/skills/doublecheck/assets/verification-report-template.md +92 -0
  336. package/skills/editorconfig/LICENSE.md +21 -0
  337. package/skills/editorconfig/SKILL.md +63 -0
  338. package/skills/editorconfig/SYNC.md +5 -0
  339. package/skills/ef-core/LICENSE.md +21 -0
  340. package/skills/ef-core/SKILL.md +75 -0
  341. package/skills/ef-core/SYNC.md +5 -0
  342. package/skills/entra-agent-user/LICENSE.md +21 -0
  343. package/skills/entra-agent-user/SKILL.md +270 -0
  344. package/skills/entra-agent-user/SYNC.md +5 -0
  345. package/skills/eval-driven-dev/LICENSE.md +21 -0
  346. package/skills/eval-driven-dev/SKILL.md +862 -0
  347. package/skills/eval-driven-dev/SYNC.md +5 -0
  348. package/skills/eval-driven-dev/references/pixie-api.md +195 -0
  349. package/skills/excalidraw-diagram-generator/LICENSE.md +21 -0
  350. package/skills/excalidraw-diagram-generator/SKILL.md +613 -0
  351. package/skills/excalidraw-diagram-generator/SYNC.md +5 -0
  352. package/skills/excalidraw-diagram-generator/references/element-types.md +497 -0
  353. package/skills/excalidraw-diagram-generator/references/excalidraw-schema.md +350 -0
  354. package/skills/excalidraw-diagram-generator/scripts/README.md +193 -0
  355. package/skills/excalidraw-diagram-generator/scripts/add-arrow.py +312 -0
  356. package/skills/excalidraw-diagram-generator/scripts/add-icon-to-diagram.py +404 -0
  357. package/skills/excalidraw-diagram-generator/scripts/split-excalidraw-library.py +183 -0
  358. package/skills/excalidraw-diagram-generator/templates/business-flow-swimlane-template.excalidraw +334 -0
  359. package/skills/excalidraw-diagram-generator/templates/class-diagram-template.excalidraw +558 -0
  360. package/skills/excalidraw-diagram-generator/templates/data-flow-diagram-template.excalidraw +279 -0
  361. package/skills/excalidraw-diagram-generator/templates/er-diagram-template.excalidraw +662 -0
  362. package/skills/excalidraw-diagram-generator/templates/flowchart-template.excalidraw +179 -0
  363. package/skills/excalidraw-diagram-generator/templates/mindmap-template.excalidraw +244 -0
  364. package/skills/excalidraw-diagram-generator/templates/relationship-template.excalidraw +145 -0
  365. package/skills/excalidraw-diagram-generator/templates/sequence-diagram-template.excalidraw +509 -0
  366. package/skills/fabric-lakehouse/LICENSE.md +21 -0
  367. package/skills/fabric-lakehouse/SKILL.md +106 -0
  368. package/skills/fabric-lakehouse/SYNC.md +5 -0
  369. package/skills/fabric-lakehouse/references/getdata.md +36 -0
  370. package/skills/fabric-lakehouse/references/pyspark.md +189 -0
  371. package/skills/fedora-linux-triage/LICENSE.md +21 -0
  372. package/skills/fedora-linux-triage/SKILL.md +31 -0
  373. package/skills/fedora-linux-triage/SYNC.md +5 -0
  374. package/skills/finalize-agent-prompt/LICENSE.md +21 -0
  375. package/skills/finalize-agent-prompt/SKILL.md +26 -0
  376. package/skills/finalize-agent-prompt/SYNC.md +5 -0
  377. package/skills/finnish-humanizer/LICENSE.md +21 -0
  378. package/skills/finnish-humanizer/SKILL.md +145 -0
  379. package/skills/finnish-humanizer/SYNC.md +5 -0
  380. package/skills/finnish-humanizer/references/patterns.md +338 -0
  381. package/skills/first-ask/LICENSE.md +21 -0
  382. package/skills/first-ask/SKILL.md +30 -0
  383. package/skills/first-ask/SYNC.md +5 -0
  384. package/skills/flowstudio-power-automate-build/LICENSE.md +21 -0
  385. package/skills/flowstudio-power-automate-build/SKILL.md +460 -0
  386. package/skills/flowstudio-power-automate-build/SYNC.md +5 -0
  387. package/skills/flowstudio-power-automate-build/references/action-patterns-connectors.md +542 -0
  388. package/skills/flowstudio-power-automate-build/references/action-patterns-core.md +542 -0
  389. package/skills/flowstudio-power-automate-build/references/action-patterns-data.md +735 -0
  390. package/skills/flowstudio-power-automate-build/references/build-patterns.md +108 -0
  391. package/skills/flowstudio-power-automate-build/references/flow-schema.md +225 -0
  392. package/skills/flowstudio-power-automate-build/references/trigger-types.md +211 -0
  393. package/skills/flowstudio-power-automate-debug/LICENSE.md +21 -0
  394. package/skills/flowstudio-power-automate-debug/SKILL.md +322 -0
  395. package/skills/flowstudio-power-automate-debug/SYNC.md +5 -0
  396. package/skills/flowstudio-power-automate-debug/references/common-errors.md +188 -0
  397. package/skills/flowstudio-power-automate-debug/references/debug-workflow.md +157 -0
  398. package/skills/flowstudio-power-automate-mcp/LICENSE.md +21 -0
  399. package/skills/flowstudio-power-automate-mcp/SKILL.md +450 -0
  400. package/skills/flowstudio-power-automate-mcp/SYNC.md +5 -0
  401. package/skills/flowstudio-power-automate-mcp/references/MCP-BOOTSTRAP.md +53 -0
  402. package/skills/flowstudio-power-automate-mcp/references/action-types.md +79 -0
  403. package/skills/flowstudio-power-automate-mcp/references/connection-references.md +115 -0
  404. package/skills/flowstudio-power-automate-mcp/references/tool-reference.md +445 -0
  405. package/skills/fluentui-blazor/LICENSE.md +21 -0
  406. package/skills/fluentui-blazor/SKILL.md +231 -0
  407. package/skills/fluentui-blazor/SYNC.md +5 -0
  408. package/skills/fluentui-blazor/references/DATAGRID.md +162 -0
  409. package/skills/fluentui-blazor/references/LAYOUT-AND-NAVIGATION.md +173 -0
  410. package/skills/fluentui-blazor/references/SETUP.md +129 -0
  411. package/skills/fluentui-blazor/references/THEMING.md +103 -0
  412. package/skills/folder-structure-blueprint-generator/LICENSE.md +21 -0
  413. package/skills/folder-structure-blueprint-generator/SKILL.md +405 -0
  414. package/skills/folder-structure-blueprint-generator/SYNC.md +5 -0
  415. package/skills/game-engine/LICENSE.md +21 -0
  416. package/skills/game-engine/SKILL.md +139 -0
  417. package/skills/game-engine/SYNC.md +5 -0
  418. package/skills/game-engine/assets/2d-maze-game.md +528 -0
  419. package/skills/game-engine/assets/2d-platform-game.md +1855 -0
  420. package/skills/game-engine/assets/gameBase-template-repo.md +310 -0
  421. package/skills/game-engine/assets/paddle-game-template.md +1528 -0
  422. package/skills/game-engine/assets/simple-2d-engine.md +507 -0
  423. package/skills/game-engine/references/3d-web-games.md +754 -0
  424. package/skills/game-engine/references/algorithms.md +843 -0
  425. package/skills/game-engine/references/basics.md +343 -0
  426. package/skills/game-engine/references/game-control-mechanisms.md +617 -0
  427. package/skills/game-engine/references/game-engine-core-principles.md +695 -0
  428. package/skills/game-engine/references/game-publishing.md +352 -0
  429. package/skills/game-engine/references/techniques.md +894 -0
  430. package/skills/game-engine/references/terminology.md +354 -0
  431. package/skills/game-engine/references/web-apis.md +1394 -0
  432. package/skills/gen-specs-as-issues/LICENSE.md +21 -0
  433. package/skills/gen-specs-as-issues/SKILL.md +165 -0
  434. package/skills/gen-specs-as-issues/SYNC.md +5 -0
  435. package/skills/generate-custom-instructions-from-codebase/LICENSE.md +21 -0
  436. package/skills/generate-custom-instructions-from-codebase/SKILL.md +240 -0
  437. package/skills/generate-custom-instructions-from-codebase/SYNC.md +5 -0
  438. package/skills/geofeed-tuner/LICENSE.md +21 -0
  439. package/skills/geofeed-tuner/SKILL.md +864 -0
  440. package/skills/geofeed-tuner/SYNC.md +5 -0
  441. package/skills/geofeed-tuner/assets/example/01-user-input-rfc8805-feed.csv +5 -0
  442. package/skills/geofeed-tuner/assets/iso3166-1.json +1249 -0
  443. package/skills/geofeed-tuner/assets/iso3166-2.json +20188 -0
  444. package/skills/geofeed-tuner/assets/small-territories.json +106 -0
  445. package/skills/geofeed-tuner/references/rfc8805.txt +735 -0
  446. package/skills/geofeed-tuner/references/snippets-python3.md +85 -0
  447. package/skills/geofeed-tuner/scripts/templates/index.html +2305 -0
  448. package/skills/gh-cli/LICENSE.md +21 -0
  449. package/skills/gh-cli/SKILL.md +2187 -0
  450. package/skills/gh-cli/SYNC.md +5 -0
  451. package/skills/git-commit/LICENSE.md +21 -0
  452. package/skills/git-commit/SKILL.md +124 -0
  453. package/skills/git-commit/SYNC.md +5 -0
  454. package/skills/git-flow-branch-creator/LICENSE.md +21 -0
  455. package/skills/git-flow-branch-creator/SKILL.md +292 -0
  456. package/skills/git-flow-branch-creator/SYNC.md +5 -0
  457. package/skills/github-copilot-starter/LICENSE.md +21 -0
  458. package/skills/github-copilot-starter/SKILL.md +402 -0
  459. package/skills/github-copilot-starter/SYNC.md +5 -0
  460. package/skills/github-issues/LICENSE.md +21 -0
  461. package/skills/github-issues/SKILL.md +201 -0
  462. package/skills/github-issues/SYNC.md +5 -0
  463. package/skills/github-issues/references/dependencies.md +71 -0
  464. package/skills/github-issues/references/images.md +116 -0
  465. package/skills/github-issues/references/issue-fields.md +191 -0
  466. package/skills/github-issues/references/issue-types.md +72 -0
  467. package/skills/github-issues/references/projects.md +273 -0
  468. package/skills/github-issues/references/search.md +231 -0
  469. package/skills/github-issues/references/sub-issues.md +137 -0
  470. package/skills/github-issues/references/templates.md +90 -0
  471. package/skills/go-mcp-server-generator/LICENSE.md +21 -0
  472. package/skills/go-mcp-server-generator/SKILL.md +334 -0
  473. package/skills/go-mcp-server-generator/SYNC.md +5 -0
  474. package/skills/gtm-0-to-1-launch/LICENSE.md +21 -0
  475. package/skills/gtm-0-to-1-launch/SKILL.md +321 -0
  476. package/skills/gtm-0-to-1-launch/SYNC.md +5 -0
  477. package/skills/gtm-ai-gtm/LICENSE.md +21 -0
  478. package/skills/gtm-ai-gtm/SKILL.md +569 -0
  479. package/skills/gtm-ai-gtm/SYNC.md +5 -0
  480. package/skills/gtm-board-and-investor-communication/LICENSE.md +21 -0
  481. package/skills/gtm-board-and-investor-communication/SKILL.md +456 -0
  482. package/skills/gtm-board-and-investor-communication/SYNC.md +5 -0
  483. package/skills/gtm-developer-ecosystem/LICENSE.md +21 -0
  484. package/skills/gtm-developer-ecosystem/SKILL.md +310 -0
  485. package/skills/gtm-developer-ecosystem/SYNC.md +5 -0
  486. package/skills/gtm-enterprise-account-planning/LICENSE.md +21 -0
  487. package/skills/gtm-enterprise-account-planning/SKILL.md +429 -0
  488. package/skills/gtm-enterprise-account-planning/SYNC.md +5 -0
  489. package/skills/gtm-enterprise-onboarding/LICENSE.md +21 -0
  490. package/skills/gtm-enterprise-onboarding/SKILL.md +457 -0
  491. package/skills/gtm-enterprise-onboarding/SYNC.md +5 -0
  492. package/skills/gtm-operating-cadence/LICENSE.md +21 -0
  493. package/skills/gtm-operating-cadence/SKILL.md +420 -0
  494. package/skills/gtm-operating-cadence/SYNC.md +5 -0
  495. package/skills/gtm-partnership-architecture/LICENSE.md +21 -0
  496. package/skills/gtm-partnership-architecture/SKILL.md +470 -0
  497. package/skills/gtm-partnership-architecture/SYNC.md +5 -0
  498. package/skills/gtm-positioning-strategy/LICENSE.md +21 -0
  499. package/skills/gtm-positioning-strategy/SKILL.md +438 -0
  500. package/skills/gtm-positioning-strategy/SYNC.md +5 -0
  501. package/skills/gtm-product-led-growth/LICENSE.md +21 -0
  502. package/skills/gtm-product-led-growth/SKILL.md +339 -0
  503. package/skills/gtm-product-led-growth/SYNC.md +5 -0
  504. package/skills/gtm-technical-product-pricing/LICENSE.md +21 -0
  505. package/skills/gtm-technical-product-pricing/SKILL.md +353 -0
  506. package/skills/gtm-technical-product-pricing/SYNC.md +5 -0
  507. package/skills/image-manipulation-image-magick/LICENSE.md +21 -0
  508. package/skills/image-manipulation-image-magick/SKILL.md +252 -0
  509. package/skills/image-manipulation-image-magick/SYNC.md +5 -0
  510. package/skills/import-infrastructure-as-code/LICENSE.md +21 -0
  511. package/skills/import-infrastructure-as-code/SKILL.md +367 -0
  512. package/skills/import-infrastructure-as-code/SYNC.md +5 -0
  513. package/skills/issue-fields-migration/LICENSE.md +21 -0
  514. package/skills/issue-fields-migration/SKILL.md +533 -0
  515. package/skills/issue-fields-migration/SYNC.md +5 -0
  516. package/skills/issue-fields-migration/references/issue-fields-api.md +129 -0
  517. package/skills/issue-fields-migration/references/labels-api.md +74 -0
  518. package/skills/issue-fields-migration/references/projects-api.md +116 -0
  519. package/skills/java-add-graalvm-native-image-support/LICENSE.md +21 -0
  520. package/skills/java-add-graalvm-native-image-support/SKILL.md +449 -0
  521. package/skills/java-add-graalvm-native-image-support/SYNC.md +5 -0
  522. package/skills/java-docs/LICENSE.md +21 -0
  523. package/skills/java-docs/SKILL.md +23 -0
  524. package/skills/java-docs/SYNC.md +5 -0
  525. package/skills/java-junit/LICENSE.md +21 -0
  526. package/skills/java-junit/SKILL.md +63 -0
  527. package/skills/java-junit/SYNC.md +5 -0
  528. package/skills/java-mcp-server-generator/LICENSE.md +21 -0
  529. package/skills/java-mcp-server-generator/SKILL.md +756 -0
  530. package/skills/java-mcp-server-generator/SYNC.md +5 -0
  531. package/skills/java-refactoring-extract-method/LICENSE.md +21 -0
  532. package/skills/java-refactoring-extract-method/SKILL.md +104 -0
  533. package/skills/java-refactoring-extract-method/SYNC.md +5 -0
  534. package/skills/java-refactoring-remove-parameter/LICENSE.md +21 -0
  535. package/skills/java-refactoring-remove-parameter/SKILL.md +84 -0
  536. package/skills/java-refactoring-remove-parameter/SYNC.md +5 -0
  537. package/skills/java-springboot/LICENSE.md +21 -0
  538. package/skills/java-springboot/SKILL.md +65 -0
  539. package/skills/java-springboot/SYNC.md +5 -0
  540. package/skills/javascript-typescript-jest/LICENSE.md +21 -0
  541. package/skills/javascript-typescript-jest/SKILL.md +44 -0
  542. package/skills/javascript-typescript-jest/SYNC.md +5 -0
  543. package/skills/kotlin-mcp-server-generator/LICENSE.md +21 -0
  544. package/skills/kotlin-mcp-server-generator/SKILL.md +449 -0
  545. package/skills/kotlin-mcp-server-generator/SYNC.md +5 -0
  546. package/skills/kotlin-springboot/LICENSE.md +21 -0
  547. package/skills/kotlin-springboot/SKILL.md +70 -0
  548. package/skills/kotlin-springboot/SYNC.md +5 -0
  549. package/skills/legacy-circuit-mockups/LICENSE.md +21 -0
  550. package/skills/legacy-circuit-mockups/SKILL.md +276 -0
  551. package/skills/legacy-circuit-mockups/SYNC.md +5 -0
  552. package/skills/legacy-circuit-mockups/references/28256-eeprom.md +190 -0
  553. package/skills/legacy-circuit-mockups/references/555.md +861 -0
  554. package/skills/legacy-circuit-mockups/references/6502.md +221 -0
  555. package/skills/legacy-circuit-mockups/references/6522.md +211 -0
  556. package/skills/legacy-circuit-mockups/references/6C62256.md +177 -0
  557. package/skills/legacy-circuit-mockups/references/7400-series.md +177 -0
  558. package/skills/legacy-circuit-mockups/references/assembly-compiler.md +258 -0
  559. package/skills/legacy-circuit-mockups/references/assembly-language.md +226 -0
  560. package/skills/legacy-circuit-mockups/references/basic-electronic-components.md +86 -0
  561. package/skills/legacy-circuit-mockups/references/breadboard.md +214 -0
  562. package/skills/legacy-circuit-mockups/references/common-breadboard-components.md +281 -0
  563. package/skills/legacy-circuit-mockups/references/connecting-electronic-components.md +310 -0
  564. package/skills/legacy-circuit-mockups/references/emulator-28256-eeprom.md +245 -0
  565. package/skills/legacy-circuit-mockups/references/emulator-6502.md +251 -0
  566. package/skills/legacy-circuit-mockups/references/emulator-6522.md +288 -0
  567. package/skills/legacy-circuit-mockups/references/emulator-6C62256.md +233 -0
  568. package/skills/legacy-circuit-mockups/references/emulator-lcd.md +266 -0
  569. package/skills/legacy-circuit-mockups/references/lcd.md +208 -0
  570. package/skills/legacy-circuit-mockups/references/minipro.md +211 -0
  571. package/skills/legacy-circuit-mockups/references/t48eeprom-programmer.md +174 -0
  572. package/skills/make-repo-contribution/LICENSE.md +21 -0
  573. package/skills/make-repo-contribution/SKILL.md +90 -0
  574. package/skills/make-repo-contribution/SYNC.md +5 -0
  575. package/skills/make-repo-contribution/assets/issue-template.md +37 -0
  576. package/skills/make-repo-contribution/assets/pr-template.md +36 -0
  577. package/skills/make-skill-template/LICENSE.md +21 -0
  578. package/skills/make-skill-template/SKILL.md +147 -0
  579. package/skills/make-skill-template/SYNC.md +5 -0
  580. package/skills/markdown-to-html/LICENSE.md +21 -0
  581. package/skills/markdown-to-html/SKILL.md +916 -0
  582. package/skills/markdown-to-html/SYNC.md +5 -0
  583. package/skills/markdown-to-html/references/basic-markdown-to-html.md +420 -0
  584. package/skills/markdown-to-html/references/basic-markdown.md +496 -0
  585. package/skills/markdown-to-html/references/code-blocks-to-html.md +165 -0
  586. package/skills/markdown-to-html/references/code-blocks.md +70 -0
  587. package/skills/markdown-to-html/references/collapsed-sections-to-html.md +136 -0
  588. package/skills/markdown-to-html/references/collapsed-sections.md +48 -0
  589. package/skills/markdown-to-html/references/gomarkdown.md +253 -0
  590. package/skills/markdown-to-html/references/hugo.md +394 -0
  591. package/skills/markdown-to-html/references/jekyll.md +321 -0
  592. package/skills/markdown-to-html/references/marked.md +121 -0
  593. package/skills/markdown-to-html/references/pandoc.md +226 -0
  594. package/skills/markdown-to-html/references/tables-to-html.md +169 -0
  595. package/skills/markdown-to-html/references/tables.md +72 -0
  596. package/skills/markdown-to-html/references/writing-mathematical-expressions-to-html.md +350 -0
  597. package/skills/markdown-to-html/references/writing-mathematical-expressions.md +76 -0
  598. package/skills/mcp-cli/LICENSE.md +21 -0
  599. package/skills/mcp-cli/SKILL.md +78 -0
  600. package/skills/mcp-cli/SYNC.md +5 -0
  601. package/skills/mcp-copilot-studio-server-generator/LICENSE.md +21 -0
  602. package/skills/mcp-copilot-studio-server-generator/SKILL.md +118 -0
  603. package/skills/mcp-copilot-studio-server-generator/SYNC.md +5 -0
  604. package/skills/mcp-create-adaptive-cards/LICENSE.md +21 -0
  605. package/skills/mcp-create-adaptive-cards/SKILL.md +532 -0
  606. package/skills/mcp-create-adaptive-cards/SYNC.md +5 -0
  607. package/skills/mcp-create-declarative-agent/LICENSE.md +21 -0
  608. package/skills/mcp-create-declarative-agent/SKILL.md +315 -0
  609. package/skills/mcp-create-declarative-agent/SYNC.md +5 -0
  610. package/skills/mcp-deploy-manage-agents/LICENSE.md +21 -0
  611. package/skills/mcp-deploy-manage-agents/SKILL.md +341 -0
  612. package/skills/mcp-deploy-manage-agents/SYNC.md +5 -0
  613. package/skills/meeting-minutes/LICENSE.md +21 -0
  614. package/skills/meeting-minutes/SKILL.md +235 -0
  615. package/skills/meeting-minutes/SYNC.md +5 -0
  616. package/skills/memory-merger/LICENSE.md +21 -0
  617. package/skills/memory-merger/SKILL.md +108 -0
  618. package/skills/memory-merger/SYNC.md +5 -0
  619. package/skills/mentoring-juniors/LICENSE.md +21 -0
  620. package/skills/mentoring-juniors/SKILL.md +310 -0
  621. package/skills/mentoring-juniors/SYNC.md +5 -0
  622. package/skills/microsoft-agent-framework/LICENSE.md +21 -0
  623. package/skills/microsoft-agent-framework/SKILL.md +65 -0
  624. package/skills/microsoft-agent-framework/SYNC.md +5 -0
  625. package/skills/microsoft-agent-framework/references/dotnet.md +24 -0
  626. package/skills/microsoft-agent-framework/references/python.md +24 -0
  627. package/skills/microsoft-code-reference/LICENSE.md +21 -0
  628. package/skills/microsoft-code-reference/SKILL.md +99 -0
  629. package/skills/microsoft-code-reference/SYNC.md +5 -0
  630. package/skills/microsoft-docs/LICENSE.md +21 -0
  631. package/skills/microsoft-docs/SKILL.md +134 -0
  632. package/skills/microsoft-docs/SYNC.md +5 -0
  633. package/skills/microsoft-skill-creator/LICENSE.md +21 -0
  634. package/skills/microsoft-skill-creator/SKILL.md +250 -0
  635. package/skills/microsoft-skill-creator/SYNC.md +5 -0
  636. package/skills/microsoft-skill-creator/references/skill-templates.md +345 -0
  637. package/skills/migrating-oracle-to-postgres-stored-procedures/LICENSE.md +21 -0
  638. package/skills/migrating-oracle-to-postgres-stored-procedures/SKILL.md +42 -0
  639. package/skills/migrating-oracle-to-postgres-stored-procedures/SYNC.md +5 -0
  640. package/skills/mkdocs-translations/LICENSE.md +21 -0
  641. package/skills/mkdocs-translations/SKILL.md +108 -0
  642. package/skills/mkdocs-translations/SYNC.md +5 -0
  643. package/skills/model-recommendation/LICENSE.md +21 -0
  644. package/skills/model-recommendation/SKILL.md +672 -0
  645. package/skills/model-recommendation/SYNC.md +5 -0
  646. package/skills/msstore-cli/LICENSE.md +21 -0
  647. package/skills/msstore-cli/SKILL.md +600 -0
  648. package/skills/msstore-cli/SYNC.md +5 -0
  649. package/skills/multi-stage-dockerfile/LICENSE.md +21 -0
  650. package/skills/multi-stage-dockerfile/SKILL.md +46 -0
  651. package/skills/multi-stage-dockerfile/SYNC.md +5 -0
  652. package/skills/my-issues/LICENSE.md +21 -0
  653. package/skills/my-issues/SKILL.md +8 -0
  654. package/skills/my-issues/SYNC.md +5 -0
  655. package/skills/my-pull-requests/LICENSE.md +21 -0
  656. package/skills/my-pull-requests/SKILL.md +14 -0
  657. package/skills/my-pull-requests/SYNC.md +5 -0
  658. package/skills/nano-banana-pro-openrouter/LICENSE.md +21 -0
  659. package/skills/nano-banana-pro-openrouter/SKILL.md +74 -0
  660. package/skills/nano-banana-pro-openrouter/SYNC.md +5 -0
  661. package/skills/nano-banana-pro-openrouter/assets/SYSTEM_TEMPLATE +14 -0
  662. package/skills/nano-banana-pro-openrouter/scripts/generate_image.py +191 -0
  663. package/skills/napkin/LICENSE.md +21 -0
  664. package/skills/napkin/SKILL.md +154 -0
  665. package/skills/napkin/SYNC.md +5 -0
  666. package/skills/napkin/assets/napkin.html +2019 -0
  667. package/skills/napkin/assets/step1-activate.svg +107 -0
  668. package/skills/napkin/assets/step2-whiteboard.svg +157 -0
  669. package/skills/napkin/assets/step3-draw.svg +143 -0
  670. package/skills/napkin/assets/step4-share.svg +98 -0
  671. package/skills/napkin/assets/step5-response.svg +112 -0
  672. package/skills/next-intl-add-language/LICENSE.md +21 -0
  673. package/skills/next-intl-add-language/SKILL.md +19 -0
  674. package/skills/next-intl-add-language/SYNC.md +5 -0
  675. package/skills/noob-mode/LICENSE.md +21 -0
  676. package/skills/noob-mode/SKILL.md +263 -0
  677. package/skills/noob-mode/SYNC.md +5 -0
  678. package/skills/noob-mode/references/examples.md +418 -0
  679. package/skills/noob-mode/references/glossary.md +368 -0
  680. package/skills/nuget-manager/LICENSE.md +21 -0
  681. package/skills/nuget-manager/SKILL.md +68 -0
  682. package/skills/nuget-manager/SYNC.md +5 -0
  683. package/skills/oo-component-documentation/LICENSE.md +21 -0
  684. package/skills/oo-component-documentation/SKILL.md +74 -0
  685. package/skills/oo-component-documentation/SYNC.md +5 -0
  686. package/skills/oo-component-documentation/assets/documentation-template.md +97 -0
  687. package/skills/oo-component-documentation/references/create-mode.md +32 -0
  688. package/skills/oo-component-documentation/references/update-mode.md +32 -0
  689. package/skills/openapi-to-application-code/LICENSE.md +21 -0
  690. package/skills/openapi-to-application-code/SKILL.md +112 -0
  691. package/skills/openapi-to-application-code/SYNC.md +5 -0
  692. package/skills/pdftk-server/LICENSE.md +21 -0
  693. package/skills/pdftk-server/SKILL.md +162 -0
  694. package/skills/pdftk-server/SYNC.md +5 -0
  695. package/skills/pdftk-server/references/download.md +75 -0
  696. package/skills/pdftk-server/references/pdftk-cli-examples.md +193 -0
  697. package/skills/pdftk-server/references/pdftk-man-page.md +232 -0
  698. package/skills/pdftk-server/references/pdftk-server-license.md +25 -0
  699. package/skills/pdftk-server/references/third-party-materials.md +103 -0
  700. package/skills/penpot-uiux-design/LICENSE.md +21 -0
  701. package/skills/penpot-uiux-design/SKILL.md +342 -0
  702. package/skills/penpot-uiux-design/SYNC.md +5 -0
  703. package/skills/penpot-uiux-design/references/accessibility.md +329 -0
  704. package/skills/penpot-uiux-design/references/component-patterns.md +339 -0
  705. package/skills/penpot-uiux-design/references/platform-guidelines.md +367 -0
  706. package/skills/penpot-uiux-design/references/setup-troubleshooting.md +328 -0
  707. package/skills/php-mcp-server-generator/LICENSE.md +21 -0
  708. package/skills/php-mcp-server-generator/SKILL.md +522 -0
  709. package/skills/php-mcp-server-generator/SYNC.md +5 -0
  710. package/skills/planning-oracle-to-postgres-migration-integration-testing/LICENSE.md +21 -0
  711. package/skills/planning-oracle-to-postgres-migration-integration-testing/SKILL.md +44 -0
  712. package/skills/planning-oracle-to-postgres-migration-integration-testing/SYNC.md +5 -0
  713. package/skills/plantuml-ascii/LICENSE.md +21 -0
  714. package/skills/plantuml-ascii/SKILL.md +305 -0
  715. package/skills/plantuml-ascii/SYNC.md +5 -0
  716. package/skills/playwright-automation-fill-in-form/LICENSE.md +21 -0
  717. package/skills/playwright-automation-fill-in-form/SKILL.md +28 -0
  718. package/skills/playwright-automation-fill-in-form/SYNC.md +5 -0
  719. package/skills/playwright-explore-website/LICENSE.md +21 -0
  720. package/skills/playwright-explore-website/SKILL.md +17 -0
  721. package/skills/playwright-explore-website/SYNC.md +5 -0
  722. package/skills/playwright-generate-test/LICENSE.md +21 -0
  723. package/skills/playwright-generate-test/SKILL.md +17 -0
  724. package/skills/playwright-generate-test/SYNC.md +5 -0
  725. package/skills/polyglot-test-agent/LICENSE.md +21 -0
  726. package/skills/polyglot-test-agent/SKILL.md +161 -0
  727. package/skills/polyglot-test-agent/SYNC.md +5 -0
  728. package/skills/polyglot-test-agent/unit-test-generation.prompt.md +155 -0
  729. package/skills/postgresql-code-review/LICENSE.md +21 -0
  730. package/skills/postgresql-code-review/SKILL.md +212 -0
  731. package/skills/postgresql-code-review/SYNC.md +5 -0
  732. package/skills/postgresql-optimization/LICENSE.md +21 -0
  733. package/skills/postgresql-optimization/SKILL.md +404 -0
  734. package/skills/postgresql-optimization/SYNC.md +5 -0
  735. package/skills/power-apps-code-app-scaffold/LICENSE.md +21 -0
  736. package/skills/power-apps-code-app-scaffold/SKILL.md +146 -0
  737. package/skills/power-apps-code-app-scaffold/SYNC.md +5 -0
  738. package/skills/power-bi-dax-optimization/LICENSE.md +21 -0
  739. package/skills/power-bi-dax-optimization/SKILL.md +173 -0
  740. package/skills/power-bi-dax-optimization/SYNC.md +5 -0
  741. package/skills/power-bi-model-design-review/LICENSE.md +21 -0
  742. package/skills/power-bi-model-design-review/SKILL.md +403 -0
  743. package/skills/power-bi-model-design-review/SYNC.md +5 -0
  744. package/skills/power-bi-performance-troubleshooting/LICENSE.md +21 -0
  745. package/skills/power-bi-performance-troubleshooting/SKILL.md +382 -0
  746. package/skills/power-bi-performance-troubleshooting/SYNC.md +5 -0
  747. package/skills/power-bi-report-design-consultation/LICENSE.md +21 -0
  748. package/skills/power-bi-report-design-consultation/SKILL.md +351 -0
  749. package/skills/power-bi-report-design-consultation/SYNC.md +5 -0
  750. package/skills/power-platform-mcp-connector-suite/LICENSE.md +21 -0
  751. package/skills/power-platform-mcp-connector-suite/SKILL.md +156 -0
  752. package/skills/power-platform-mcp-connector-suite/SYNC.md +5 -0
  753. package/skills/powerbi-modeling/LICENSE.md +21 -0
  754. package/skills/powerbi-modeling/SKILL.md +153 -0
  755. package/skills/powerbi-modeling/SYNC.md +5 -0
  756. package/skills/powerbi-modeling/references/MEASURES-DAX.md +195 -0
  757. package/skills/powerbi-modeling/references/PERFORMANCE.md +215 -0
  758. package/skills/powerbi-modeling/references/RELATIONSHIPS.md +147 -0
  759. package/skills/powerbi-modeling/references/RLS.md +226 -0
  760. package/skills/powerbi-modeling/references/STAR-SCHEMA.md +103 -0
  761. package/skills/prd/LICENSE.md +21 -0
  762. package/skills/prd/SKILL.md +143 -0
  763. package/skills/prd/SYNC.md +5 -0
  764. package/skills/premium-frontend-ui/LICENSE.md +21 -0
  765. package/skills/premium-frontend-ui/SKILL.md +110 -0
  766. package/skills/premium-frontend-ui/SYNC.md +5 -0
  767. package/skills/project-workflow-analysis-blueprint-generator/LICENSE.md +21 -0
  768. package/skills/project-workflow-analysis-blueprint-generator/SKILL.md +293 -0
  769. package/skills/project-workflow-analysis-blueprint-generator/SYNC.md +5 -0
  770. package/skills/prompt-builder/LICENSE.md +21 -0
  771. package/skills/prompt-builder/SKILL.md +141 -0
  772. package/skills/prompt-builder/SYNC.md +5 -0
  773. package/skills/publish-to-pages/LICENSE.md +21 -0
  774. package/skills/publish-to-pages/SKILL.md +107 -0
  775. package/skills/publish-to-pages/SYNC.md +5 -0
  776. package/skills/publish-to-pages/scripts/convert-pdf.py +176 -0
  777. package/skills/publish-to-pages/scripts/convert-pptx.py +376 -0
  778. package/skills/publish-to-pages/scripts/publish.sh +51 -0
  779. package/skills/pytest-coverage/LICENSE.md +21 -0
  780. package/skills/pytest-coverage/SKILL.md +28 -0
  781. package/skills/pytest-coverage/SYNC.md +5 -0
  782. package/skills/python-mcp-server-generator/LICENSE.md +21 -0
  783. package/skills/python-mcp-server-generator/SKILL.md +105 -0
  784. package/skills/python-mcp-server-generator/SYNC.md +5 -0
  785. package/skills/quasi-coder/LICENSE.md +21 -0
  786. package/skills/quasi-coder/SKILL.md +369 -0
  787. package/skills/quasi-coder/SYNC.md +5 -0
  788. package/skills/readme-blueprint-generator/LICENSE.md +21 -0
  789. package/skills/readme-blueprint-generator/SKILL.md +78 -0
  790. package/skills/readme-blueprint-generator/SYNC.md +5 -0
  791. package/skills/refactor/LICENSE.md +21 -0
  792. package/skills/refactor/SKILL.md +645 -0
  793. package/skills/refactor/SYNC.md +5 -0
  794. package/skills/refactor-method-complexity-reduce/LICENSE.md +21 -0
  795. package/skills/refactor-method-complexity-reduce/SKILL.md +98 -0
  796. package/skills/refactor-method-complexity-reduce/SYNC.md +5 -0
  797. package/skills/refactor-plan/LICENSE.md +21 -0
  798. package/skills/refactor-plan/SKILL.md +65 -0
  799. package/skills/refactor-plan/SYNC.md +5 -0
  800. package/skills/remember/LICENSE.md +21 -0
  801. package/skills/remember/SKILL.md +126 -0
  802. package/skills/remember/SYNC.md +5 -0
  803. package/skills/remember-interactive-programming/LICENSE.md +21 -0
  804. package/skills/remember-interactive-programming/SKILL.md +13 -0
  805. package/skills/remember-interactive-programming/SYNC.md +5 -0
  806. package/skills/repo-story-time/LICENSE.md +21 -0
  807. package/skills/repo-story-time/SKILL.md +154 -0
  808. package/skills/repo-story-time/SYNC.md +5 -0
  809. package/skills/review-and-refactor/LICENSE.md +21 -0
  810. package/skills/review-and-refactor/SKILL.md +15 -0
  811. package/skills/review-and-refactor/SYNC.md +5 -0
  812. package/skills/reviewing-oracle-to-postgres-migration/LICENSE.md +21 -0
  813. package/skills/reviewing-oracle-to-postgres-migration/SKILL.md +67 -0
  814. package/skills/reviewing-oracle-to-postgres-migration/SYNC.md +5 -0
  815. package/skills/reviewing-oracle-to-postgres-migration/references/REFERENCE.md +13 -0
  816. package/skills/reviewing-oracle-to-postgres-migration/references/empty-strings-handling.md +69 -0
  817. package/skills/reviewing-oracle-to-postgres-migration/references/no-data-found-exceptions.md +99 -0
  818. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-parentheses-from-clause.md +190 -0
  819. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-to-postgres-sorting.md +51 -0
  820. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-to-postgres-timestamp-timezone.md +187 -0
  821. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-to-postgres-to-char-numeric.md +145 -0
  822. package/skills/reviewing-oracle-to-postgres-migration/references/oracle-to-postgres-type-coercion.md +182 -0
  823. package/skills/reviewing-oracle-to-postgres-migration/references/postgres-concurrent-transactions.md +259 -0
  824. package/skills/reviewing-oracle-to-postgres-migration/references/postgres-refcursor-handling.md +148 -0
  825. package/skills/ruby-mcp-server-generator/LICENSE.md +21 -0
  826. package/skills/ruby-mcp-server-generator/SKILL.md +660 -0
  827. package/skills/ruby-mcp-server-generator/SYNC.md +5 -0
  828. package/skills/rust-mcp-server-generator/LICENSE.md +21 -0
  829. package/skills/rust-mcp-server-generator/SKILL.md +577 -0
  830. package/skills/rust-mcp-server-generator/SYNC.md +5 -0
  831. package/skills/sandbox-npm-install/LICENSE.md +21 -0
  832. package/skills/sandbox-npm-install/SKILL.md +80 -0
  833. package/skills/sandbox-npm-install/SYNC.md +5 -0
  834. package/skills/sandbox-npm-install/scripts/install.sh +193 -0
  835. package/skills/scaffolding-oracle-to-postgres-migration-test-project/LICENSE.md +21 -0
  836. package/skills/scaffolding-oracle-to-postgres-migration-test-project/SKILL.md +54 -0
  837. package/skills/scaffolding-oracle-to-postgres-migration-test-project/SYNC.md +5 -0
  838. package/skills/scoutqa-test/LICENSE.md +21 -0
  839. package/skills/scoutqa-test/SKILL.md +375 -0
  840. package/skills/scoutqa-test/SYNC.md +5 -0
  841. package/skills/secret-scanning/LICENSE.md +21 -0
  842. package/skills/secret-scanning/SKILL.md +224 -0
  843. package/skills/secret-scanning/SYNC.md +5 -0
  844. package/skills/secret-scanning/references/alerts-and-remediation.md +245 -0
  845. package/skills/secret-scanning/references/custom-patterns.md +158 -0
  846. package/skills/secret-scanning/references/push-protection.md +164 -0
  847. package/skills/semantic-kernel/LICENSE.md +21 -0
  848. package/skills/semantic-kernel/SKILL.md +56 -0
  849. package/skills/semantic-kernel/SYNC.md +5 -0
  850. package/skills/semantic-kernel/references/dotnet.md +15 -0
  851. package/skills/semantic-kernel/references/python.md +15 -0
  852. package/skills/shuffle-json-data/LICENSE.md +21 -0
  853. package/skills/shuffle-json-data/SKILL.md +150 -0
  854. package/skills/shuffle-json-data/SYNC.md +5 -0
  855. package/skills/snowflake-semanticview/LICENSE.md +21 -0
  856. package/skills/snowflake-semanticview/SKILL.md +83 -0
  857. package/skills/snowflake-semanticview/SYNC.md +5 -0
  858. package/skills/sponsor-finder/LICENSE.md +21 -0
  859. package/skills/sponsor-finder/SKILL.md +258 -0
  860. package/skills/sponsor-finder/SYNC.md +5 -0
  861. package/skills/spring-boot-testing/LICENSE.md +21 -0
  862. package/skills/spring-boot-testing/SKILL.md +189 -0
  863. package/skills/spring-boot-testing/SYNC.md +5 -0
  864. package/skills/spring-boot-testing/references/assertj-basics.md +207 -0
  865. package/skills/spring-boot-testing/references/assertj-collections.md +183 -0
  866. package/skills/spring-boot-testing/references/context-caching.md +115 -0
  867. package/skills/spring-boot-testing/references/datajpatest.md +197 -0
  868. package/skills/spring-boot-testing/references/instancio.md +230 -0
  869. package/skills/spring-boot-testing/references/mockitobean.md +232 -0
  870. package/skills/spring-boot-testing/references/mockmvc-classic.md +206 -0
  871. package/skills/spring-boot-testing/references/mockmvc-tester.md +311 -0
  872. package/skills/spring-boot-testing/references/restclienttest.md +227 -0
  873. package/skills/spring-boot-testing/references/resttestclient.md +278 -0
  874. package/skills/spring-boot-testing/references/sb4-migration.md +181 -0
  875. package/skills/spring-boot-testing/references/test-slices-overview.md +203 -0
  876. package/skills/spring-boot-testing/references/testcontainers-jdbc.md +234 -0
  877. package/skills/spring-boot-testing/references/webmvctest.md +177 -0
  878. package/skills/sql-code-review/LICENSE.md +21 -0
  879. package/skills/sql-code-review/SKILL.md +301 -0
  880. package/skills/sql-code-review/SYNC.md +5 -0
  881. package/skills/sql-optimization/LICENSE.md +21 -0
  882. package/skills/sql-optimization/SKILL.md +296 -0
  883. package/skills/sql-optimization/SYNC.md +5 -0
  884. package/skills/structured-autonomy-generate/LICENSE.md +21 -0
  885. package/skills/structured-autonomy-generate/SKILL.md +125 -0
  886. package/skills/structured-autonomy-generate/SYNC.md +5 -0
  887. package/skills/structured-autonomy-implement/LICENSE.md +21 -0
  888. package/skills/structured-autonomy-implement/SKILL.md +19 -0
  889. package/skills/structured-autonomy-implement/SYNC.md +5 -0
  890. package/skills/structured-autonomy-plan/LICENSE.md +21 -0
  891. package/skills/structured-autonomy-plan/SKILL.md +81 -0
  892. package/skills/structured-autonomy-plan/SYNC.md +5 -0
  893. package/skills/suggest-awesome-github-copilot-agents/LICENSE.md +21 -0
  894. package/skills/suggest-awesome-github-copilot-agents/SKILL.md +106 -0
  895. package/skills/suggest-awesome-github-copilot-agents/SYNC.md +5 -0
  896. package/skills/suggest-awesome-github-copilot-instructions/LICENSE.md +21 -0
  897. package/skills/suggest-awesome-github-copilot-instructions/SKILL.md +122 -0
  898. package/skills/suggest-awesome-github-copilot-instructions/SYNC.md +5 -0
  899. package/skills/suggest-awesome-github-copilot-skills/LICENSE.md +21 -0
  900. package/skills/suggest-awesome-github-copilot-skills/SKILL.md +130 -0
  901. package/skills/suggest-awesome-github-copilot-skills/SYNC.md +5 -0
  902. package/skills/swift-mcp-server-generator/LICENSE.md +21 -0
  903. package/skills/swift-mcp-server-generator/SKILL.md +669 -0
  904. package/skills/swift-mcp-server-generator/SYNC.md +5 -0
  905. package/skills/technology-stack-blueprint-generator/LICENSE.md +21 -0
  906. package/skills/technology-stack-blueprint-generator/SKILL.md +242 -0
  907. package/skills/technology-stack-blueprint-generator/SYNC.md +5 -0
  908. package/skills/terraform-azurerm-set-diff-analyzer/LICENSE.md +21 -0
  909. package/skills/terraform-azurerm-set-diff-analyzer/SKILL.md +48 -0
  910. package/skills/terraform-azurerm-set-diff-analyzer/SYNC.md +5 -0
  911. package/skills/terraform-azurerm-set-diff-analyzer/references/azurerm_set_attributes.json +154 -0
  912. package/skills/terraform-azurerm-set-diff-analyzer/references/azurerm_set_attributes.md +145 -0
  913. package/skills/terraform-azurerm-set-diff-analyzer/scripts/README.md +205 -0
  914. package/skills/terraform-azurerm-set-diff-analyzer/scripts/analyze_plan.py +940 -0
  915. package/skills/tldr-prompt/LICENSE.md +21 -0
  916. package/skills/tldr-prompt/SKILL.md +304 -0
  917. package/skills/tldr-prompt/SYNC.md +5 -0
  918. package/skills/transloadit-media-processing/LICENSE.md +21 -0
  919. package/skills/transloadit-media-processing/SKILL.md +194 -0
  920. package/skills/transloadit-media-processing/SYNC.md +5 -0
  921. package/skills/typescript-mcp-server-generator/LICENSE.md +21 -0
  922. package/skills/typescript-mcp-server-generator/SKILL.md +90 -0
  923. package/skills/typescript-mcp-server-generator/SYNC.md +5 -0
  924. package/skills/typespec-api-operations/LICENSE.md +21 -0
  925. package/skills/typespec-api-operations/SKILL.md +418 -0
  926. package/skills/typespec-api-operations/SYNC.md +5 -0
  927. package/skills/typespec-create-agent/LICENSE.md +21 -0
  928. package/skills/typespec-create-agent/SKILL.md +91 -0
  929. package/skills/typespec-create-agent/SYNC.md +5 -0
  930. package/skills/typespec-create-api-plugin/LICENSE.md +21 -0
  931. package/skills/typespec-create-api-plugin/SKILL.md +164 -0
  932. package/skills/typespec-create-api-plugin/SYNC.md +5 -0
  933. package/skills/unit-test-vue-pinia/LICENSE.md +21 -0
  934. package/skills/unit-test-vue-pinia/SKILL.md +198 -0
  935. package/skills/unit-test-vue-pinia/SYNC.md +5 -0
  936. package/skills/unit-test-vue-pinia/references/pinia-patterns.md +95 -0
  937. package/skills/update-avm-modules-in-bicep/LICENSE.md +21 -0
  938. package/skills/update-avm-modules-in-bicep/SKILL.md +60 -0
  939. package/skills/update-avm-modules-in-bicep/SYNC.md +5 -0
  940. package/skills/update-implementation-plan/LICENSE.md +21 -0
  941. package/skills/update-implementation-plan/SKILL.md +157 -0
  942. package/skills/update-implementation-plan/SYNC.md +5 -0
  943. package/skills/update-llms/LICENSE.md +21 -0
  944. package/skills/update-llms/SKILL.md +216 -0
  945. package/skills/update-llms/SYNC.md +5 -0
  946. package/skills/update-markdown-file-index/LICENSE.md +21 -0
  947. package/skills/update-markdown-file-index/SKILL.md +76 -0
  948. package/skills/update-markdown-file-index/SYNC.md +5 -0
  949. package/skills/update-specification/LICENSE.md +21 -0
  950. package/skills/update-specification/SKILL.md +127 -0
  951. package/skills/update-specification/SYNC.md +5 -0
  952. package/skills/vscode-ext-commands/LICENSE.md +21 -0
  953. package/skills/vscode-ext-commands/SKILL.md +21 -0
  954. package/skills/vscode-ext-commands/SYNC.md +5 -0
  955. package/skills/vscode-ext-localization/LICENSE.md +21 -0
  956. package/skills/vscode-ext-localization/SKILL.md +25 -0
  957. package/skills/vscode-ext-localization/SYNC.md +5 -0
  958. package/skills/web-coder/LICENSE.md +21 -0
  959. package/skills/web-coder/SKILL.md +563 -0
  960. package/skills/web-coder/SYNC.md +5 -0
  961. package/skills/web-coder/references/accessibility.md +346 -0
  962. package/skills/web-coder/references/architecture-patterns.md +625 -0
  963. package/skills/web-coder/references/browsers-engines.md +358 -0
  964. package/skills/web-coder/references/css-styling.md +696 -0
  965. package/skills/web-coder/references/data-formats-encoding.md +411 -0
  966. package/skills/web-coder/references/development-tools.md +502 -0
  967. package/skills/web-coder/references/glossary.md +649 -0
  968. package/skills/web-coder/references/html-markup.md +387 -0
  969. package/skills/web-coder/references/http-networking.md +538 -0
  970. package/skills/web-coder/references/javascript-programming.md +807 -0
  971. package/skills/web-coder/references/media-graphics.md +504 -0
  972. package/skills/web-coder/references/performance-optimization.md +546 -0
  973. package/skills/web-coder/references/security-authentication.md +603 -0
  974. package/skills/web-coder/references/servers-infrastructure.md +615 -0
  975. package/skills/web-coder/references/web-apis-dom.md +654 -0
  976. package/skills/web-coder/references/web-protocols-standards.md +265 -0
  977. package/skills/web-design-reviewer/LICENSE.md +21 -0
  978. package/skills/web-design-reviewer/SKILL.md +368 -0
  979. package/skills/web-design-reviewer/SYNC.md +5 -0
  980. package/skills/web-design-reviewer/references/framework-fixes.md +475 -0
  981. package/skills/web-design-reviewer/references/visual-checklist.md +236 -0
  982. package/skills/webapp-testing/LICENSE.md +21 -0
  983. package/skills/webapp-testing/SKILL.md +104 -67
  984. package/skills/webapp-testing/SYNC.md +2 -2
  985. package/skills/webapp-testing/assets/test-helper.js +56 -0
  986. package/skills/what-context-needed/LICENSE.md +21 -0
  987. package/skills/what-context-needed/SKILL.md +39 -0
  988. package/skills/what-context-needed/SYNC.md +5 -0
  989. package/skills/winapp-cli/LICENSE.md +21 -0
  990. package/skills/winapp-cli/SKILL.md +217 -0
  991. package/skills/winapp-cli/SYNC.md +5 -0
  992. package/skills/winmd-api-search/LICENSE.md +21 -0
  993. package/skills/winmd-api-search/LICENSE.txt +21 -0
  994. package/skills/winmd-api-search/SKILL.md +192 -0
  995. package/skills/winmd-api-search/SYNC.md +5 -0
  996. package/skills/winmd-api-search/scripts/Invoke-WinMdQuery.ps1 +505 -0
  997. package/skills/winmd-api-search/scripts/Update-WinMdCache.ps1 +208 -0
  998. package/skills/winmd-api-search/scripts/cache-generator/CacheGenerator.csproj +29 -0
  999. package/skills/winmd-api-search/scripts/cache-generator/Directory.Build.props +3 -0
  1000. package/skills/winmd-api-search/scripts/cache-generator/Directory.Build.targets +3 -0
  1001. package/skills/winmd-api-search/scripts/cache-generator/Directory.Packages.props +3 -0
  1002. package/skills/winmd-api-search/scripts/cache-generator/Program.cs +1222 -0
  1003. package/skills/winui3-migration-guide/LICENSE.md +21 -0
  1004. package/skills/winui3-migration-guide/SKILL.md +277 -0
  1005. package/skills/winui3-migration-guide/SYNC.md +5 -0
  1006. package/skills/workiq-copilot/LICENSE.md +21 -0
  1007. package/skills/workiq-copilot/SKILL.md +98 -0
  1008. package/skills/workiq-copilot/SYNC.md +5 -0
  1009. package/skills/write-coding-standards-from-file/LICENSE.md +21 -0
  1010. package/skills/write-coding-standards-from-file/SKILL.md +316 -0
  1011. package/skills/write-coding-standards-from-file/SYNC.md +5 -0
  1012. package/skills/webapp-testing/LICENSE.txt +0 -202
  1013. package/skills/webapp-testing/examples/console_logging.py +0 -35
  1014. package/skills/webapp-testing/examples/element_discovery.py +0 -40
  1015. package/skills/webapp-testing/examples/static_html_automation.py +0 -33
  1016. package/skills/webapp-testing/scripts/with_server.py +0 -106
@@ -0,0 +1,1222 @@
1
+ // Standalone WinMD cache generator — per-package deduplicate, multi-project support.
2
+ // Parses WinMD files from NuGet packages and Windows SDK, exports JSON cache
3
+ // keyed by package+version to avoid duplication across projects.
4
+ //
5
+ // Usage:
6
+ // CacheGenerator <project-dir> <output-dir>
7
+ // CacheGenerator --scan <root-dir> <output-dir>
8
+
9
+ using System.Collections.Immutable;
10
+ using System.Reflection;
11
+ using System.Reflection.Metadata;
12
+ using System.Reflection.PortableExecutable;
13
+ using System.Text.Json;
14
+ using System.Text.Json.Serialization;
15
+ using System.Security.Cryptography;
16
+ using System.Xml.Linq;
17
+
18
+ // --- Arg parsing ---
19
+
20
+ var scanMode = args.Contains("--scan");
21
+
22
+ // Parse --winappsdk-runtime <path> option
23
+ string? winAppSdkRuntimePath = null;
24
+ for (int i = 0; i < args.Length - 1; i++)
25
+ {
26
+ if (args[i].Equals("--winappsdk-runtime", StringComparison.OrdinalIgnoreCase))
27
+ {
28
+ winAppSdkRuntimePath = args[i + 1];
29
+ break;
30
+ }
31
+ }
32
+
33
+ var positionalArgs = args
34
+ .Where(a => !a.StartsWith('-'))
35
+ .Where(a => a != winAppSdkRuntimePath) // exclude the runtime path value
36
+ .ToArray();
37
+
38
+ if (positionalArgs.Length < 2)
39
+ {
40
+ Console.Error.WriteLine("Usage:");
41
+ Console.Error.WriteLine(" CacheGenerator <project-dir> <output-dir>");
42
+ Console.Error.WriteLine(" CacheGenerator --scan <root-dir> <output-dir>");
43
+ Console.Error.WriteLine(" CacheGenerator --winappsdk-runtime <path> <project-dir> <output-dir>");
44
+ Console.Error.WriteLine();
45
+ Console.Error.WriteLine(" project-dir: Path containing .csproj/.vcxproj (or a project file itself)");
46
+ Console.Error.WriteLine(" root-dir: Root to scan recursively for project files");
47
+ Console.Error.WriteLine(" output-dir: Cache output (e.g. \"Generated Files\\winmd-cache\")");
48
+ Console.Error.WriteLine(" --winappsdk-runtime: Path to installed WinAppSDK runtime (from Get-AppxPackage)");
49
+ return 1;
50
+ }
51
+
52
+ var inputPath = Path.GetFullPath(positionalArgs[0]);
53
+ var outputDir = Path.GetFullPath(positionalArgs[1]);
54
+
55
+ var jsonOptions = new JsonSerializerOptions
56
+ {
57
+ WriteIndented = true,
58
+ PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
59
+ Converters = { new JsonStringEnumConverter() },
60
+ };
61
+
62
+ // --- Discover project files ---
63
+
64
+ var projectFiles = new List<string>();
65
+
66
+ if (scanMode)
67
+ {
68
+ if (!Directory.Exists(inputPath))
69
+ {
70
+ Console.Error.WriteLine($"Error: Root directory not found: {inputPath}");
71
+ return 1;
72
+ }
73
+
74
+ var enumerationOptions = new EnumerationOptions
75
+ {
76
+ RecurseSubdirectories = true,
77
+ IgnoreInaccessible = true,
78
+ MatchType = MatchType.Simple,
79
+ };
80
+
81
+ projectFiles.AddRange(Directory.EnumerateFiles(inputPath, "*.csproj", enumerationOptions));
82
+ projectFiles.AddRange(Directory.EnumerateFiles(inputPath, "*.vcxproj", enumerationOptions));
83
+
84
+ // Exclude common non-source directories
85
+ projectFiles = projectFiles
86
+ .Where(f => !f.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}", StringComparison.OrdinalIgnoreCase))
87
+ .Where(f => !f.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}", StringComparison.OrdinalIgnoreCase))
88
+ .Where(f => !f.Contains($"{Path.DirectorySeparatorChar}node_modules{Path.DirectorySeparatorChar}", StringComparison.OrdinalIgnoreCase))
89
+ .ToList();
90
+ }
91
+ else if (File.Exists(inputPath) && (inputPath.EndsWith(".csproj", StringComparison.OrdinalIgnoreCase) ||
92
+ inputPath.EndsWith(".vcxproj", StringComparison.OrdinalIgnoreCase)))
93
+ {
94
+ projectFiles.Add(inputPath);
95
+ }
96
+ else if (Directory.Exists(inputPath))
97
+ {
98
+ projectFiles.AddRange(Directory.GetFiles(inputPath, "*.csproj"));
99
+ projectFiles.AddRange(Directory.GetFiles(inputPath, "*.vcxproj"));
100
+ }
101
+ else
102
+ {
103
+ Console.Error.WriteLine($"Error: Path not found: {inputPath}");
104
+ return 1;
105
+ }
106
+
107
+ if (projectFiles.Count == 0)
108
+ {
109
+ Console.Error.WriteLine($"No .csproj or .vcxproj files found in: {inputPath}");
110
+ return 1;
111
+ }
112
+
113
+ // Always include CacheGenerator.csproj as a baseline source of WinAppSDK WinMD files.
114
+ // It references Microsoft.WindowsAppSDK with ExcludeAssets="all" so the packages are
115
+ // downloaded during restore/build but don't affect the tool's compilation.
116
+ var selfCsproj = Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "CacheGenerator.csproj");
117
+ selfCsproj = Path.GetFullPath(selfCsproj);
118
+ if (File.Exists(selfCsproj) && !projectFiles.Any(f =>
119
+ Path.GetFullPath(f).Equals(selfCsproj, StringComparison.OrdinalIgnoreCase)))
120
+ {
121
+ projectFiles.Add(selfCsproj);
122
+ }
123
+
124
+ Console.WriteLine($"WinMD Cache Generator (per-package deduplicate)");
125
+ Console.WriteLine($" Output: {outputDir}");
126
+ Console.WriteLine($" Projects: {projectFiles.Count}");
127
+
128
+ // --- Process each project ---
129
+
130
+ var totalPackagesCached = 0;
131
+ var totalPackagesSkipped = 0;
132
+ var totalProjectsProcessed = 0;
133
+
134
+ foreach (var projectFile in projectFiles)
135
+ {
136
+ var projectDir = Path.GetDirectoryName(projectFile)!;
137
+ var projectName = Path.GetFileNameWithoutExtension(projectFile);
138
+
139
+ Console.WriteLine($"\n--- {projectName} ({Path.GetFileName(projectFile)}) ---");
140
+
141
+ // Find packages that contain WinMD files
142
+ var packages = NuGetResolver.FindPackagesWithWinMd(projectDir, projectFile, winAppSdkRuntimePath);
143
+
144
+ if (packages.Count == 0)
145
+ {
146
+ Console.WriteLine(" No packages with WinMD files (is the project restored?)");
147
+ continue;
148
+ }
149
+
150
+ Console.WriteLine($" {packages.Count} package(s) with WinMD files");
151
+ totalProjectsProcessed++;
152
+
153
+ var projectPackages = new List<ProjectPackageRef>();
154
+
155
+ foreach (var pkg in packages)
156
+ {
157
+ var pkgCacheDir = Path.Combine(outputDir, "packages", pkg.Id, pkg.Version);
158
+ var metaPath = Path.Combine(pkgCacheDir, "meta.json");
159
+
160
+ if (File.Exists(metaPath))
161
+ {
162
+ Console.WriteLine($" [cached] {pkg.Id}@{pkg.Version}");
163
+ totalPackagesSkipped++;
164
+ }
165
+ else
166
+ {
167
+ Console.WriteLine($" [parse] {pkg.Id}@{pkg.Version} ({pkg.WinMdFiles.Count} WinMD file(s))");
168
+ ExportPackageCache(pkg, pkgCacheDir);
169
+ totalPackagesCached++;
170
+ }
171
+
172
+ projectPackages.Add(new ProjectPackageRef { Id = pkg.Id, Version = pkg.Version });
173
+ }
174
+
175
+ // Write project manifest
176
+ var manifest = new ProjectManifest
177
+ {
178
+ ProjectName = projectName,
179
+ ProjectDir = projectDir,
180
+ ProjectFile = Path.GetFileName(projectFile),
181
+ Packages = projectPackages,
182
+ GeneratedAt = DateTime.UtcNow.ToString("o"),
183
+ };
184
+
185
+ var projectsDir = Path.Combine(outputDir, "projects");
186
+ Directory.CreateDirectory(projectsDir);
187
+
188
+ // In scan mode, different directories may contain same-named projects.
189
+ // Append a short path hash to avoid overwriting manifests.
190
+ var manifestFileName = projectName;
191
+ if (scanMode)
192
+ {
193
+ var hashBytes = SHA256.HashData(System.Text.Encoding.UTF8.GetBytes(projectFile));
194
+ var hashSuffix = Convert.ToHexString(hashBytes)[..8].ToLowerInvariant();
195
+ manifestFileName = $"{projectName}_{hashSuffix}";
196
+ }
197
+
198
+ File.WriteAllText(
199
+ Path.Combine(projectsDir, $"{manifestFileName}.json"),
200
+ JsonSerializer.Serialize(manifest, jsonOptions));
201
+ }
202
+
203
+ Console.WriteLine($"\nDone: {totalProjectsProcessed} project(s) processed, " +
204
+ $"{totalPackagesCached} package(s) parsed, " +
205
+ $"{totalPackagesSkipped} reused from cache");
206
+ return 0;
207
+
208
+ // =============================================================================
209
+ // Export a single package's WinMD data to cache
210
+ // =============================================================================
211
+
212
+ void ExportPackageCache(PackageWithWinMd pkg, string cacheDir)
213
+ {
214
+ var typesDir = Path.Combine(cacheDir, "types");
215
+ Directory.CreateDirectory(typesDir);
216
+
217
+ var allTypes = new List<WinMdTypeInfo>();
218
+ foreach (var file in pkg.WinMdFiles)
219
+ {
220
+ allTypes.AddRange(WinMdParser.ParseFile(file));
221
+ }
222
+
223
+ var typesByNamespace = allTypes
224
+ .GroupBy(t => t.Namespace)
225
+ .ToDictionary(g => g.Key, g => g.ToList());
226
+
227
+ var namespaces = typesByNamespace.Keys
228
+ .Where(ns => !string.IsNullOrEmpty(ns))
229
+ .OrderBy(ns => ns)
230
+ .ToList();
231
+
232
+ // Include global (empty) namespace types under a reserved bucket name
233
+ var hasGlobalNs = typesByNamespace.ContainsKey(string.Empty)
234
+ && typesByNamespace[string.Empty].Count > 0;
235
+ const string globalNsBucket = "_GlobalNamespace";
236
+ if (hasGlobalNs)
237
+ {
238
+ namespaces.Insert(0, globalNsBucket);
239
+ }
240
+
241
+ // meta.json
242
+ var meta = new
243
+ {
244
+ PackageId = pkg.Id,
245
+ Version = pkg.Version,
246
+ WinMdFiles = pkg.WinMdFiles
247
+ .Select(Path.GetFileName)
248
+ .Distinct(StringComparer.OrdinalIgnoreCase)
249
+ .ToList(),
250
+ TotalTypes = allTypes.Count,
251
+ TotalMembers = allTypes.Sum(t => t.Members.Count),
252
+ TotalNamespaces = namespaces.Count,
253
+ GeneratedAt = DateTime.UtcNow.ToString("o"),
254
+ };
255
+
256
+ File.WriteAllText(
257
+ Path.Combine(cacheDir, "meta.json"),
258
+ JsonSerializer.Serialize(meta, jsonOptions));
259
+
260
+ // namespaces.json
261
+ File.WriteAllText(
262
+ Path.Combine(cacheDir, "namespaces.json"),
263
+ JsonSerializer.Serialize(namespaces, jsonOptions));
264
+
265
+ // types/<Namespace>.json
266
+ foreach (var ns in namespaces)
267
+ {
268
+ var lookupKey = ns == globalNsBucket ? string.Empty : ns;
269
+ var types = typesByNamespace[lookupKey];
270
+ var safeFileName = ns.Replace('.', '_') + ".json";
271
+ File.WriteAllText(
272
+ Path.Combine(typesDir, safeFileName),
273
+ JsonSerializer.Serialize(types, jsonOptions));
274
+ }
275
+ }
276
+
277
+ // =============================================================================
278
+ // Data Models
279
+ // =============================================================================
280
+
281
+ enum TypeKind { Class, Struct, Enum, Interface, Delegate }
282
+
283
+ enum MemberKind { Method, Property, Event, Field }
284
+
285
+ sealed class WinMdTypeInfo
286
+ {
287
+ public required string Namespace { get; init; }
288
+ public required string Name { get; init; }
289
+ public required string FullName { get; init; }
290
+ public required TypeKind Kind { get; init; }
291
+ public string? BaseType { get; init; }
292
+ public required List<WinMdMemberInfo> Members { get; init; }
293
+ public List<string>? EnumValues { get; init; }
294
+ public required string SourceFile { get; init; }
295
+ }
296
+
297
+ sealed class WinMdMemberInfo
298
+ {
299
+ public required string Name { get; init; }
300
+ public required MemberKind Kind { get; init; }
301
+ public required string Signature { get; init; }
302
+ public string? ReturnType { get; init; }
303
+ public List<WinMdParameterInfo>? Parameters { get; init; }
304
+ }
305
+
306
+ sealed class WinMdParameterInfo
307
+ {
308
+ public required string Name { get; init; }
309
+ public required string Type { get; init; }
310
+ }
311
+
312
+ sealed class ProjectPackageRef
313
+ {
314
+ public required string Id { get; init; }
315
+ public required string Version { get; init; }
316
+ }
317
+
318
+ sealed class ProjectManifest
319
+ {
320
+ public required string ProjectName { get; init; }
321
+ public required string ProjectDir { get; init; }
322
+ public required string ProjectFile { get; init; }
323
+ public required List<ProjectPackageRef> Packages { get; init; }
324
+ public required string GeneratedAt { get; init; }
325
+ }
326
+
327
+ // =============================================================================
328
+ // NuGet Resolver — finds packages with WinMD files, returns structured data
329
+ // =============================================================================
330
+
331
+ record PackageWithWinMd(string Id, string Version, List<string> WinMdFiles);
332
+
333
+ static class NuGetResolver
334
+ {
335
+ public static List<PackageWithWinMd> FindPackagesWithWinMd(string projectDir, string projectFile, string? winAppSdkRuntimePath)
336
+ {
337
+ var result = new List<PackageWithWinMd>();
338
+
339
+ // 1. Try project.assets.json (PackageReference — .csproj and modern .vcxproj)
340
+ var assetsPath = FindProjectAssetsJson(projectDir);
341
+ if (assetsPath is not null)
342
+ {
343
+ result.AddRange(FindPackagesFromAssets(assetsPath));
344
+ }
345
+
346
+ // 2. Try packages.config (older .vcxproj / .csproj using NuGet packages.config)
347
+ if (result.Count == 0)
348
+ {
349
+ var packagesConfig = Path.Combine(projectDir, "packages.config");
350
+ if (File.Exists(packagesConfig))
351
+ {
352
+ result.AddRange(FindPackagesFromConfig(packagesConfig, projectDir));
353
+ }
354
+ }
355
+
356
+ // 3. Project references — parse <ProjectReference> from .csproj/.vcxproj XML,
357
+ // then check each referenced project's bin/ for .winmd build output.
358
+ // This is the reliable way to find class libraries that generate WinMD.
359
+ result.AddRange(FindWinMdFromProjectReferences(projectFile));
360
+
361
+ // 4. Windows SDK as a synthetic "package"
362
+ var sdkWinMd = FindWindowsSdkWinMd();
363
+ if (sdkWinMd.Files.Count > 0)
364
+ {
365
+ result.Add(new PackageWithWinMd("WindowsSDK", sdkWinMd.Version, sdkWinMd.Files));
366
+ }
367
+
368
+ // 5. Installed WinAppSDK runtime as a synthetic "package"
369
+ // Useful for Electron/Node.js apps that don't reference WinAppSDK via NuGet.
370
+ var runtimeWinMd = FindWinAppSdkRuntimeWinMd(winAppSdkRuntimePath);
371
+ if (runtimeWinMd.Files.Count > 0)
372
+ {
373
+ result.Add(new PackageWithWinMd("WinAppSdkRuntime", runtimeWinMd.Version, runtimeWinMd.Files));
374
+ }
375
+
376
+ // Deduplicate by (Id, Version), merging WinMdFiles from multiple sources
377
+ return result
378
+ .GroupBy(p => (p.Id.ToLowerInvariant(), p.Version.ToLowerInvariant()))
379
+ .Select(g =>
380
+ {
381
+ var merged = g.SelectMany(p => p.WinMdFiles)
382
+ .Distinct(StringComparer.OrdinalIgnoreCase)
383
+ .ToList();
384
+ var first = g.First();
385
+ return new PackageWithWinMd(first.Id, first.Version, merged);
386
+ })
387
+ .ToList();
388
+ }
389
+
390
+ /// <summary>
391
+ /// Parse &lt;ProjectReference&gt; from .csproj/.vcxproj and find .winmd output
392
+ /// from each referenced project's bin/ directory.
393
+ /// </summary>
394
+ internal static List<PackageWithWinMd> FindWinMdFromProjectReferences(string projectFile)
395
+ {
396
+ var result = new List<PackageWithWinMd>();
397
+
398
+ try
399
+ {
400
+ var doc = XDocument.Load(projectFile);
401
+ var ns = doc.Root?.Name.Namespace ?? XNamespace.None;
402
+ var projectRefs = doc.Descendants(ns + "ProjectReference")
403
+ .Select(e => e.Attribute("Include")?.Value)
404
+ .Where(v => v is not null)
405
+ .ToList();
406
+
407
+ if (projectRefs.Count == 0)
408
+ {
409
+ return result;
410
+ }
411
+
412
+ var projectDir = Path.GetDirectoryName(projectFile)!;
413
+
414
+ foreach (var refPath in projectRefs)
415
+ {
416
+ var refFullPath = Path.GetFullPath(Path.Combine(projectDir, refPath!));
417
+ if (!File.Exists(refFullPath))
418
+ {
419
+ continue;
420
+ }
421
+
422
+ var refProjectDir = Path.GetDirectoryName(refFullPath)!;
423
+ var refProjectName = Path.GetFileNameWithoutExtension(refFullPath);
424
+ var refBinDir = Path.Combine(refProjectDir, "bin");
425
+
426
+ if (!Directory.Exists(refBinDir))
427
+ {
428
+ continue;
429
+ }
430
+
431
+ var winmdFiles = Directory.GetFiles(refBinDir, "*.winmd", SearchOption.AllDirectories)
432
+ .Where(f => !Path.GetFileName(f).Equals("Windows.winmd", StringComparison.OrdinalIgnoreCase))
433
+ .ToList();
434
+
435
+ // Deduplicate by filename (same WinMD across Debug/Release/x64/etc.)
436
+ var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
437
+ winmdFiles = winmdFiles
438
+ .Where(f => seen.Add(Path.GetFileName(f)))
439
+ .ToList();
440
+
441
+ if (winmdFiles.Count > 0)
442
+ {
443
+ result.Add(new PackageWithWinMd($"ProjectRef.{refProjectName}", "local", winmdFiles));
444
+ }
445
+ }
446
+ }
447
+ catch (Exception ex)
448
+ {
449
+ Console.Error.WriteLine($"Warning: Failed to parse project references: {ex.Message}");
450
+ }
451
+
452
+ return result;
453
+ }
454
+
455
+ internal static string? FindProjectAssetsJson(string projectDir)
456
+ {
457
+ // Standard location
458
+ var assetsPath = Path.Combine(projectDir, "obj", "project.assets.json");
459
+ if (File.Exists(assetsPath))
460
+ {
461
+ return assetsPath;
462
+ }
463
+
464
+ // Sometimes under platform-specific subdirectories
465
+ var objDir = Path.Combine(projectDir, "obj");
466
+ if (Directory.Exists(objDir))
467
+ {
468
+ var found = Directory.GetFiles(objDir, "project.assets.json", SearchOption.AllDirectories);
469
+ if (found.Length > 0)
470
+ {
471
+ // Pick the most recently written file to avoid non-deterministic
472
+ // selection when multi-targeting creates multiple assets files.
473
+ string? bestPath = null;
474
+ DateTime bestWriteTime = DateTime.MinValue;
475
+
476
+ foreach (var path in found)
477
+ {
478
+ try
479
+ {
480
+ var writeTime = File.GetLastWriteTimeUtc(path);
481
+ if (writeTime > bestWriteTime)
482
+ {
483
+ bestWriteTime = writeTime;
484
+ bestPath = path;
485
+ }
486
+ }
487
+ catch
488
+ {
489
+ // Ignore files we cannot access metadata for
490
+ }
491
+ }
492
+
493
+ if (bestPath is not null)
494
+ {
495
+ return bestPath;
496
+ }
497
+ }
498
+ }
499
+
500
+ return null;
501
+ }
502
+
503
+ internal static List<PackageWithWinMd> FindPackagesFromAssets(string assetsPath)
504
+ {
505
+ var result = new List<PackageWithWinMd>();
506
+
507
+ try
508
+ {
509
+ using var doc = JsonDocument.Parse(File.ReadAllText(assetsPath));
510
+ var root = doc.RootElement;
511
+
512
+ var packageFolders = new List<string>();
513
+ if (root.TryGetProperty("packageFolders", out var folders))
514
+ {
515
+ foreach (var folder in folders.EnumerateObject())
516
+ {
517
+ packageFolders.Add(folder.Name);
518
+ }
519
+ }
520
+
521
+ if (!root.TryGetProperty("libraries", out var libraries))
522
+ {
523
+ return result;
524
+ }
525
+
526
+ foreach (var lib in libraries.EnumerateObject())
527
+ {
528
+ // Only treat libraries with type == "package" as NuGet packages;
529
+ // skip project references and other entry types.
530
+ if (!lib.Value.TryGetProperty("type", out var typeProp) ||
531
+ !string.Equals(typeProp.GetString(), "package", StringComparison.OrdinalIgnoreCase))
532
+ {
533
+ continue;
534
+ }
535
+
536
+ // Key format: "PackageId/Version"
537
+ var slashIdx = lib.Name.IndexOf('/');
538
+ if (slashIdx < 0)
539
+ {
540
+ continue;
541
+ }
542
+
543
+ var packageId = lib.Name[..slashIdx];
544
+ var version = lib.Name[(slashIdx + 1)..];
545
+
546
+ if (!lib.Value.TryGetProperty("path", out var pathProp))
547
+ {
548
+ continue;
549
+ }
550
+
551
+ var libPath = pathProp.GetString();
552
+ if (libPath is null)
553
+ {
554
+ continue;
555
+ }
556
+
557
+ var winmdFiles = new List<string>();
558
+ foreach (var folder in packageFolders)
559
+ {
560
+ var fullPath = Path.Combine(folder, libPath);
561
+ if (!Directory.Exists(fullPath))
562
+ {
563
+ continue;
564
+ }
565
+
566
+ winmdFiles.AddRange(
567
+ Directory.GetFiles(fullPath, "*.winmd", SearchOption.AllDirectories));
568
+ }
569
+
570
+ // Deduplicate by filename (WinMD is arch-neutral metadata)
571
+ var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
572
+ winmdFiles = winmdFiles
573
+ .Where(f => seen.Add(Path.GetFileName(f)))
574
+ .ToList();
575
+
576
+ if (winmdFiles.Count > 0)
577
+ {
578
+ result.Add(new PackageWithWinMd(packageId, version, winmdFiles));
579
+ }
580
+ }
581
+ }
582
+ catch (Exception ex)
583
+ {
584
+ Console.Error.WriteLine($"Warning: Failed to parse project.assets.json: {ex.Message}");
585
+ }
586
+
587
+ return result;
588
+ }
589
+
590
+ /// <summary>
591
+ /// Parses packages.config (older NuGet format used by some .vcxproj and legacy .csproj).
592
+ /// Looks for a solution-level "packages/" folder or the NuGet global cache.
593
+ /// </summary>
594
+ internal static List<PackageWithWinMd> FindPackagesFromConfig(string configPath, string projectDir)
595
+ {
596
+ var result = new List<PackageWithWinMd>();
597
+
598
+ try
599
+ {
600
+ var doc = System.Xml.Linq.XDocument.Load(configPath);
601
+ var packages = doc.Root?.Elements("package");
602
+ if (packages is null)
603
+ {
604
+ return result;
605
+ }
606
+
607
+ // packages.config repos typically have a solution-level "packages/" folder.
608
+ // Walk up from project dir to find it.
609
+ var packagesFolder = FindSolutionPackagesFolder(projectDir);
610
+
611
+ // Also check NuGet global packages cache (respect NUGET_PACKAGES override)
612
+ var globalPackages = Environment.GetEnvironmentVariable("NUGET_PACKAGES");
613
+ if (string.IsNullOrWhiteSpace(globalPackages))
614
+ {
615
+ globalPackages = Path.Combine(
616
+ Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
617
+ ".nuget", "packages");
618
+ }
619
+
620
+ foreach (var pkg in packages)
621
+ {
622
+ var id = pkg.Attribute("id")?.Value;
623
+ var version = pkg.Attribute("version")?.Value;
624
+ if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(version))
625
+ {
626
+ continue;
627
+ }
628
+
629
+ var winmdFiles = new List<string>();
630
+
631
+ // Check solution-level packages/ folder (format: packages/<id>.<version>/)
632
+ if (packagesFolder is not null)
633
+ {
634
+ var pkgDir = Path.Combine(packagesFolder, $"{id}.{version}");
635
+ if (Directory.Exists(pkgDir))
636
+ {
637
+ winmdFiles.AddRange(
638
+ Directory.GetFiles(pkgDir, "*.winmd", SearchOption.AllDirectories));
639
+ }
640
+ }
641
+
642
+ // Fallback: NuGet global cache (format: <id>/<version>/)
643
+ if (winmdFiles.Count == 0 && Directory.Exists(globalPackages))
644
+ {
645
+ var pkgDir = Path.Combine(globalPackages, id.ToLowerInvariant(), version);
646
+ if (Directory.Exists(pkgDir))
647
+ {
648
+ winmdFiles.AddRange(
649
+ Directory.GetFiles(pkgDir, "*.winmd", SearchOption.AllDirectories));
650
+ }
651
+ }
652
+
653
+ // Deduplicate by filename
654
+ var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
655
+ winmdFiles = winmdFiles
656
+ .Where(f => seen.Add(Path.GetFileName(f)))
657
+ .ToList();
658
+
659
+ if (winmdFiles.Count > 0)
660
+ {
661
+ result.Add(new PackageWithWinMd(id, version, winmdFiles));
662
+ }
663
+ }
664
+ }
665
+ catch (Exception ex)
666
+ {
667
+ Console.Error.WriteLine($"Warning: Failed to parse packages.config: {ex.Message}");
668
+ }
669
+
670
+ return result;
671
+ }
672
+
673
+ /// <summary>
674
+ /// Walk up from project dir to find a solution-level "packages/" folder.
675
+ /// </summary>
676
+ internal static string? FindSolutionPackagesFolder(string startDir)
677
+ {
678
+ var dir = startDir;
679
+ for (var i = 0; i < 5; i++) // Walk up at most 5 levels
680
+ {
681
+ var packagesDir = Path.Combine(dir, "packages");
682
+ if (Directory.Exists(packagesDir))
683
+ {
684
+ return packagesDir;
685
+ }
686
+
687
+ var parent = Directory.GetParent(dir);
688
+ if (parent is null)
689
+ {
690
+ break;
691
+ }
692
+
693
+ dir = parent.FullName;
694
+ }
695
+
696
+ return null;
697
+ }
698
+
699
+ internal static (List<string> Files, string Version) FindWindowsSdkWinMd()
700
+ {
701
+ var windowsKitsPath = Path.Combine(
702
+ Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
703
+ "Windows Kits", "10", "UnionMetadata");
704
+
705
+ if (!Directory.Exists(windowsKitsPath))
706
+ {
707
+ return ([], "unknown");
708
+ }
709
+
710
+ // Filter to version-numbered directories only (skip "Facade" etc.) and
711
+ // sort by numeric version, not lexicographically, to pick the highest SDK.
712
+ var versionDirs = Directory.GetDirectories(windowsKitsPath)
713
+ .Select(d => (Dir: d, Name: Path.GetFileName(d)))
714
+ .Where(x => !string.IsNullOrEmpty(x.Name) && char.IsDigit(x.Name[0]))
715
+ .Select(x => Version.TryParse(x.Name, out var v)
716
+ ? (Dir: x.Dir, Version: v)
717
+ : (Dir: (string?)null, Version: (Version?)null))
718
+ .Where(x => x.Dir is not null && x.Version is not null)
719
+ .OrderByDescending(x => x.Version)
720
+ .Select(x => x.Dir!)
721
+ .ToList();
722
+
723
+ foreach (var versionDir in versionDirs)
724
+ {
725
+ var windowsWinMd = Path.Combine(versionDir, "Windows.winmd");
726
+ if (File.Exists(windowsWinMd))
727
+ {
728
+ var version = Path.GetFileName(versionDir);
729
+ return ([windowsWinMd], version);
730
+ }
731
+ }
732
+
733
+ return ([], "unknown");
734
+ }
735
+
736
+ /// <summary>
737
+ /// Read WinMD files from the installed WinAppSDK runtime path (discovered via
738
+ /// Get-AppxPackage in PowerShell and passed as --winappsdk-runtime argument).
739
+ /// The WindowsApps folder is ACL-restricted so C# cannot enumerate it directly.
740
+ /// </summary>
741
+ internal static (List<string> Files, string Version) FindWinAppSdkRuntimeWinMd(string? runtimePath)
742
+ {
743
+ if (string.IsNullOrEmpty(runtimePath) || !Directory.Exists(runtimePath))
744
+ {
745
+ return ([], "unknown");
746
+ }
747
+
748
+ try
749
+ {
750
+ var winmdFiles = Directory.EnumerateFiles(runtimePath, "*.winmd", SearchOption.TopDirectoryOnly)
751
+ .ToList();
752
+
753
+ if (winmdFiles.Count > 0)
754
+ {
755
+ // Extract SDK version from path: ...Microsoft.WindowsAppRuntime.1.8_... -> "1.8"
756
+ var dirName = Path.GetFileName(runtimePath);
757
+ var prefix = dirName.Split('_')[0]; // "Microsoft.WindowsAppRuntime.1.8"
758
+ var sdkVersion = prefix.Length > "Microsoft.WindowsAppRuntime.".Length
759
+ ? prefix["Microsoft.WindowsAppRuntime.".Length..]
760
+ : dirName;
761
+
762
+ return (winmdFiles, sdkVersion);
763
+ }
764
+ }
765
+ catch
766
+ {
767
+ // Path may be inaccessible; degrade gracefully
768
+ }
769
+
770
+ return ([], "unknown");
771
+ }
772
+ }
773
+
774
+ // =============================================================================
775
+ // Signature Type Provider — decodes metadata signatures to readable strings
776
+ // =============================================================================
777
+
778
+ sealed class SimpleTypeProvider : ISignatureTypeProvider<string, object?>
779
+ {
780
+ public string GetPrimitiveType(PrimitiveTypeCode typeCode) => typeCode switch
781
+ {
782
+ PrimitiveTypeCode.Boolean => "Boolean",
783
+ PrimitiveTypeCode.Byte => "Byte",
784
+ PrimitiveTypeCode.SByte => "SByte",
785
+ PrimitiveTypeCode.Char => "Char",
786
+ PrimitiveTypeCode.Int16 => "Int16",
787
+ PrimitiveTypeCode.UInt16 => "UInt16",
788
+ PrimitiveTypeCode.Int32 => "Int32",
789
+ PrimitiveTypeCode.UInt32 => "UInt32",
790
+ PrimitiveTypeCode.Int64 => "Int64",
791
+ PrimitiveTypeCode.UInt64 => "UInt64",
792
+ PrimitiveTypeCode.Single => "Single",
793
+ PrimitiveTypeCode.Double => "Double",
794
+ PrimitiveTypeCode.String => "String",
795
+ PrimitiveTypeCode.Object => "Object",
796
+ PrimitiveTypeCode.Void => "void",
797
+ PrimitiveTypeCode.IntPtr => "IntPtr",
798
+ PrimitiveTypeCode.UIntPtr => "UIntPtr",
799
+ PrimitiveTypeCode.TypedReference => "TypedReference",
800
+ _ => typeCode.ToString(),
801
+ };
802
+
803
+ public string GetTypeFromDefinition(MetadataReader reader, TypeDefinitionHandle handle, byte rawTypeKind)
804
+ {
805
+ var typeDef = reader.GetTypeDefinition(handle);
806
+ var name = reader.GetString(typeDef.Name);
807
+ var ns = reader.GetString(typeDef.Namespace);
808
+ return string.IsNullOrEmpty(ns) ? name : $"{ns}.{name}";
809
+ }
810
+
811
+ public string GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind)
812
+ {
813
+ var typeRef = reader.GetTypeReference(handle);
814
+ var name = reader.GetString(typeRef.Name);
815
+ var ns = reader.GetString(typeRef.Namespace);
816
+ return string.IsNullOrEmpty(ns) ? name : $"{ns}.{name}";
817
+ }
818
+
819
+ public string GetSZArrayType(string elementType) => $"{elementType}[]";
820
+
821
+ public string GetArrayType(string elementType, ArrayShape shape) =>
822
+ $"{elementType}[{new string(',', shape.Rank - 1)}]";
823
+
824
+ public string GetByReferenceType(string elementType) => $"ref {elementType}";
825
+ public string GetPointerType(string elementType) => $"{elementType}*";
826
+ public string GetPinnedType(string elementType) => elementType;
827
+
828
+ public string GetGenericInstantiation(string genericType, ImmutableArray<string> typeArguments)
829
+ {
830
+ var name = genericType;
831
+ var backtick = name.IndexOf('`');
832
+ if (backtick >= 0)
833
+ {
834
+ name = name[..backtick];
835
+ }
836
+
837
+ return $"{name}<{string.Join(", ", typeArguments)}>";
838
+ }
839
+
840
+ public string GetGenericMethodParameter(object? genericContext, int index) => $"TMethod{index}";
841
+ public string GetGenericTypeParameter(object? genericContext, int index) => $"T{index}";
842
+ public string GetModifiedType(string modifier, string unmodifiedType, bool isRequired) => unmodifiedType;
843
+ public string GetFunctionPointerType(MethodSignature<string> signature) => "delegate*";
844
+
845
+ public string GetTypeFromSpecification(MetadataReader reader, object? genericContext,
846
+ TypeSpecificationHandle handle, byte rawTypeKind)
847
+ {
848
+ return reader.GetTypeSpecification(handle).DecodeSignature(this, genericContext);
849
+ }
850
+ }
851
+
852
+ // =============================================================================
853
+ // WinMD Parser — reads WinMD files into structured type info
854
+ // =============================================================================
855
+
856
+ static class WinMdParser
857
+ {
858
+ public static List<WinMdTypeInfo> ParseFile(string filePath)
859
+ {
860
+ var types = new List<WinMdTypeInfo>();
861
+
862
+ try
863
+ {
864
+ using var stream = File.OpenRead(filePath);
865
+ using var peReader = new PEReader(stream);
866
+
867
+ if (!peReader.HasMetadata)
868
+ {
869
+ return types;
870
+ }
871
+
872
+ var reader = peReader.GetMetadataReader();
873
+ var typeProvider = new SimpleTypeProvider();
874
+
875
+ foreach (var typeDefHandle in reader.TypeDefinitions)
876
+ {
877
+ var typeDef = reader.GetTypeDefinition(typeDefHandle);
878
+ var name = reader.GetString(typeDef.Name);
879
+ var ns = reader.GetString(typeDef.Namespace);
880
+
881
+ if (ShouldSkipType(name, typeDef))
882
+ {
883
+ continue;
884
+ }
885
+
886
+ var kind = DetermineTypeKind(reader, typeDef);
887
+ var baseType = GetBaseTypeName(reader, typeDef);
888
+ var members = ParseMembers(reader, typeDef, typeProvider);
889
+ var enumValues = kind == TypeKind.Enum ? ParseEnumValues(reader, typeDef) : null;
890
+ var fullName = string.IsNullOrEmpty(ns) ? name : $"{ns}.{name}";
891
+
892
+ types.Add(new WinMdTypeInfo
893
+ {
894
+ Namespace = ns,
895
+ Name = name,
896
+ FullName = fullName,
897
+ Kind = kind,
898
+ BaseType = baseType,
899
+ Members = members,
900
+ EnumValues = enumValues,
901
+ SourceFile = Path.GetFileName(filePath),
902
+ });
903
+ }
904
+ }
905
+ catch (Exception ex)
906
+ {
907
+ Console.Error.WriteLine($"Warning: Failed to parse {filePath}: {ex.Message}");
908
+ }
909
+
910
+ return types;
911
+ }
912
+
913
+ internal static bool ShouldSkipType(string name, TypeDefinition typeDef)
914
+ {
915
+ if (string.IsNullOrEmpty(name) || name == "<Module>" || name.StartsWith('<'))
916
+ {
917
+ return true;
918
+ }
919
+
920
+ var visibility = typeDef.Attributes & TypeAttributes.VisibilityMask;
921
+ return visibility != TypeAttributes.Public && visibility != TypeAttributes.NestedPublic;
922
+ }
923
+
924
+ internal static TypeKind DetermineTypeKind(MetadataReader reader, TypeDefinition typeDef)
925
+ {
926
+ if ((typeDef.Attributes & TypeAttributes.Interface) != 0)
927
+ {
928
+ return TypeKind.Interface;
929
+ }
930
+
931
+ var baseType = GetBaseTypeName(reader, typeDef);
932
+ return baseType switch
933
+ {
934
+ "System.Enum" => TypeKind.Enum,
935
+ "System.ValueType" => TypeKind.Struct,
936
+ "System.MulticastDelegate" or "System.Delegate" => TypeKind.Delegate,
937
+ _ => TypeKind.Class,
938
+ };
939
+ }
940
+
941
+ private static string? GetBaseTypeName(MetadataReader reader, TypeDefinition typeDef)
942
+ {
943
+ if (typeDef.BaseType.IsNil)
944
+ {
945
+ return null;
946
+ }
947
+
948
+ return typeDef.BaseType.Kind switch
949
+ {
950
+ HandleKind.TypeDefinition => GetTypeDefName(reader, (TypeDefinitionHandle)typeDef.BaseType),
951
+ HandleKind.TypeReference => GetTypeRefName(reader, (TypeReferenceHandle)typeDef.BaseType),
952
+ _ => null,
953
+ };
954
+ }
955
+
956
+ private static string GetTypeDefName(MetadataReader reader, TypeDefinitionHandle handle)
957
+ {
958
+ var td = reader.GetTypeDefinition(handle);
959
+ var ns = reader.GetString(td.Namespace);
960
+ var name = reader.GetString(td.Name);
961
+ return string.IsNullOrEmpty(ns) ? name : $"{ns}.{name}";
962
+ }
963
+
964
+ private static string GetTypeRefName(MetadataReader reader, TypeReferenceHandle handle)
965
+ {
966
+ var tr = reader.GetTypeReference(handle);
967
+ var ns = reader.GetString(tr.Namespace);
968
+ var name = reader.GetString(tr.Name);
969
+ return string.IsNullOrEmpty(ns) ? name : $"{ns}.{name}";
970
+ }
971
+
972
+ private static List<WinMdMemberInfo> ParseMembers(
973
+ MetadataReader reader, TypeDefinition typeDef, SimpleTypeProvider typeProvider)
974
+ {
975
+ var members = new List<WinMdMemberInfo>();
976
+
977
+ // Collect property/event accessor methods so we can skip them in the methods loop
978
+ var accessorMethods = new HashSet<MethodDefinitionHandle>();
979
+ foreach (var propHandle in typeDef.GetProperties())
980
+ {
981
+ var accessors = reader.GetPropertyDefinition(propHandle).GetAccessors();
982
+ if (!accessors.Getter.IsNil) accessorMethods.Add(accessors.Getter);
983
+ if (!accessors.Setter.IsNil) accessorMethods.Add(accessors.Setter);
984
+ }
985
+
986
+ foreach (var eventHandle in typeDef.GetEvents())
987
+ {
988
+ var accessors = reader.GetEventDefinition(eventHandle).GetAccessors();
989
+ if (!accessors.Adder.IsNil) accessorMethods.Add(accessors.Adder);
990
+ if (!accessors.Remover.IsNil) accessorMethods.Add(accessors.Remover);
991
+ if (!accessors.Raiser.IsNil) accessorMethods.Add(accessors.Raiser);
992
+ }
993
+
994
+ // Methods
995
+ foreach (var methodHandle in typeDef.GetMethods())
996
+ {
997
+ if (accessorMethods.Contains(methodHandle))
998
+ {
999
+ continue;
1000
+ }
1001
+
1002
+ var method = reader.GetMethodDefinition(methodHandle);
1003
+ var methodName = reader.GetString(method.Name);
1004
+
1005
+ if (methodName.StartsWith('.') || methodName.StartsWith('<'))
1006
+ {
1007
+ continue;
1008
+ }
1009
+
1010
+ if ((method.Attributes & MethodAttributes.MemberAccessMask) != MethodAttributes.Public)
1011
+ {
1012
+ continue;
1013
+ }
1014
+
1015
+ try
1016
+ {
1017
+ var sig = method.DecodeSignature(typeProvider, null);
1018
+ var parameters = GetMethodParameters(reader, method, sig);
1019
+ var paramStr = string.Join(", ", parameters.Select(p => $"{p.Type} {p.Name}"));
1020
+
1021
+ members.Add(new WinMdMemberInfo
1022
+ {
1023
+ Name = methodName,
1024
+ Kind = MemberKind.Method,
1025
+ Signature = $"{sig.ReturnType} {methodName}({paramStr})",
1026
+ ReturnType = sig.ReturnType,
1027
+ Parameters = parameters,
1028
+ });
1029
+ }
1030
+ catch
1031
+ {
1032
+ members.Add(new WinMdMemberInfo
1033
+ {
1034
+ Name = methodName,
1035
+ Kind = MemberKind.Method,
1036
+ Signature = $"{methodName}(/* signature not decodable */)",
1037
+ });
1038
+ }
1039
+ }
1040
+
1041
+ // Properties
1042
+ foreach (var propHandle in typeDef.GetProperties())
1043
+ {
1044
+ var prop = reader.GetPropertyDefinition(propHandle);
1045
+ var propName = reader.GetString(prop.Name);
1046
+
1047
+ try
1048
+ {
1049
+ var propSig = prop.DecodeSignature(typeProvider, null);
1050
+ var propType = propSig.ReturnType;
1051
+ var accessors = prop.GetAccessors();
1052
+
1053
+ var hasGetter = false;
1054
+ if (!accessors.Getter.IsNil)
1055
+ {
1056
+ var getterDef = reader.GetMethodDefinition(accessors.Getter);
1057
+ if ((getterDef.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public)
1058
+ {
1059
+ hasGetter = true;
1060
+ }
1061
+ }
1062
+
1063
+ var hasSetter = false;
1064
+ if (!accessors.Setter.IsNil)
1065
+ {
1066
+ var setterDef = reader.GetMethodDefinition(accessors.Setter);
1067
+ if ((setterDef.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public)
1068
+ {
1069
+ hasSetter = true;
1070
+ }
1071
+ }
1072
+
1073
+ // Skip properties where neither accessor is public
1074
+ if (!hasGetter && !hasSetter)
1075
+ {
1076
+ continue;
1077
+ }
1078
+ var accessStr = (hasGetter, hasSetter) switch
1079
+ {
1080
+ (true, true) => "{ get; set; }",
1081
+ (true, false) => "{ get; }",
1082
+ (false, true) => "{ set; }",
1083
+ _ => "{ }",
1084
+ };
1085
+
1086
+ members.Add(new WinMdMemberInfo
1087
+ {
1088
+ Name = propName,
1089
+ Kind = MemberKind.Property,
1090
+ Signature = $"{propType} {propName} {accessStr}",
1091
+ ReturnType = propType,
1092
+ });
1093
+ }
1094
+ catch
1095
+ {
1096
+ members.Add(new WinMdMemberInfo
1097
+ {
1098
+ Name = propName,
1099
+ Kind = MemberKind.Property,
1100
+ Signature = $"/* type not decodable */ {propName}",
1101
+ });
1102
+ }
1103
+ }
1104
+
1105
+ // Events
1106
+ foreach (var eventHandle in typeDef.GetEvents())
1107
+ {
1108
+ var evt = reader.GetEventDefinition(eventHandle);
1109
+ var evtName = reader.GetString(evt.Name);
1110
+ var accessors = evt.GetAccessors();
1111
+
1112
+ var isPublicEvent = false;
1113
+ if (!accessors.Adder.IsNil)
1114
+ {
1115
+ var adder = reader.GetMethodDefinition(accessors.Adder);
1116
+ if ((adder.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public)
1117
+ {
1118
+ isPublicEvent = true;
1119
+ }
1120
+ }
1121
+
1122
+ if (!isPublicEvent && !accessors.Remover.IsNil)
1123
+ {
1124
+ var remover = reader.GetMethodDefinition(accessors.Remover);
1125
+ if ((remover.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public)
1126
+ {
1127
+ isPublicEvent = true;
1128
+ }
1129
+ }
1130
+
1131
+ if (!isPublicEvent)
1132
+ {
1133
+ continue;
1134
+ }
1135
+
1136
+ var evtType = GetHandleTypeName(reader, evt.Type);
1137
+
1138
+ members.Add(new WinMdMemberInfo
1139
+ {
1140
+ Name = evtName,
1141
+ Kind = MemberKind.Event,
1142
+ Signature = $"event {evtType} {evtName}",
1143
+ ReturnType = evtType,
1144
+ });
1145
+ }
1146
+
1147
+ return members;
1148
+ }
1149
+
1150
+ private static List<WinMdParameterInfo> GetMethodParameters(
1151
+ MetadataReader reader, MethodDefinition method, MethodSignature<string> sig)
1152
+ {
1153
+ var parameters = new List<WinMdParameterInfo>();
1154
+ var paramHandles = method.GetParameters().ToList();
1155
+ var paramNames = new List<string>();
1156
+
1157
+ foreach (var ph in paramHandles)
1158
+ {
1159
+ var param = reader.GetParameter(ph);
1160
+ if (param.SequenceNumber > 0)
1161
+ {
1162
+ paramNames.Add(reader.GetString(param.Name));
1163
+ }
1164
+ }
1165
+
1166
+ for (var i = 0; i < sig.ParameterTypes.Length; i++)
1167
+ {
1168
+ parameters.Add(new WinMdParameterInfo
1169
+ {
1170
+ Name = i < paramNames.Count ? paramNames[i] : $"arg{i}",
1171
+ Type = sig.ParameterTypes[i],
1172
+ });
1173
+ }
1174
+
1175
+ return parameters;
1176
+ }
1177
+
1178
+ internal static List<string> ParseEnumValues(MetadataReader reader, TypeDefinition typeDef)
1179
+ {
1180
+ var values = new List<string>();
1181
+
1182
+ foreach (var fieldHandle in typeDef.GetFields())
1183
+ {
1184
+ var field = reader.GetFieldDefinition(fieldHandle);
1185
+ var fieldName = reader.GetString(field.Name);
1186
+
1187
+ if (fieldName == "value__")
1188
+ {
1189
+ continue;
1190
+ }
1191
+
1192
+ if ((field.Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Public &&
1193
+ (field.Attributes & FieldAttributes.Static) != 0)
1194
+ {
1195
+ values.Add(fieldName);
1196
+ }
1197
+ }
1198
+
1199
+ return values;
1200
+ }
1201
+
1202
+ private static string GetHandleTypeName(MetadataReader reader, EntityHandle handle) => handle.Kind switch
1203
+ {
1204
+ HandleKind.TypeDefinition => GetTypeDefName(reader, (TypeDefinitionHandle)handle),
1205
+ HandleKind.TypeReference => GetTypeRefName(reader, (TypeReferenceHandle)handle),
1206
+ HandleKind.TypeSpecification => DecodeTypeSpecification(reader, (TypeSpecificationHandle)handle),
1207
+ _ => "unknown",
1208
+ };
1209
+
1210
+ private static string DecodeTypeSpecification(MetadataReader reader, TypeSpecificationHandle handle)
1211
+ {
1212
+ try
1213
+ {
1214
+ var typeSpec = reader.GetTypeSpecification(handle);
1215
+ return typeSpec.DecodeSignature(new SimpleTypeProvider(), null);
1216
+ }
1217
+ catch
1218
+ {
1219
+ return "unknown";
1220
+ }
1221
+ }
1222
+ }