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,940 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ Terraform Plan Analyzer for AzureRM Set-type Attributes
5
+
6
+ Analyzes terraform plan JSON output to distinguish between:
7
+ - Order-only changes (false positives) in Set-type attributes
8
+ - Actual additions/deletions/modifications
9
+
10
+ Usage:
11
+ terraform show -json plan.tfplan | python analyze_plan.py
12
+ python analyze_plan.py plan.json
13
+ python analyze_plan.py plan.json --format json --exit-code
14
+
15
+ For CI/CD pipeline usage, see README.md in this directory.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import argparse
21
+ import json
22
+ import sys
23
+ from dataclasses import dataclass, field
24
+ from pathlib import Path
25
+ from typing import Any, Dict, List, Optional, Set
26
+
27
+ # Exit codes for --exit-code option
28
+ EXIT_NO_CHANGES = 0
29
+ EXIT_ORDER_ONLY = 0 # Order-only changes are not real changes
30
+ EXIT_SET_CHANGES = 1 # Actual Set attribute changes
31
+ EXIT_RESOURCE_REPLACE = 2 # Resource replacement (most severe)
32
+ EXIT_ERROR = 3
33
+
34
+ # Default path to the external attributes JSON file (relative to this script)
35
+ DEFAULT_ATTRIBUTES_PATH = (
36
+ Path(__file__).parent.parent / "references" / "azurerm_set_attributes.json"
37
+ )
38
+
39
+
40
+ # Global configuration
41
+ class Config:
42
+ """Global configuration for the analyzer."""
43
+
44
+ ignore_case: bool = False
45
+ quiet: bool = False
46
+ verbose: bool = False
47
+ warnings: List[str] = []
48
+
49
+
50
+ CONFIG = Config()
51
+
52
+
53
+ def warn(message: str) -> None:
54
+ """Add a warning message."""
55
+ CONFIG.warnings.append(message)
56
+ if CONFIG.verbose:
57
+ print(f"Warning: {message}", file=sys.stderr)
58
+
59
+
60
+ def load_set_attributes(path: Optional[Path] = None) -> Dict[str, Dict[str, Any]]:
61
+ """Load Set-type attributes from external JSON file."""
62
+ attributes_path = path or DEFAULT_ATTRIBUTES_PATH
63
+
64
+ try:
65
+ with open(attributes_path, "r", encoding="utf-8") as f:
66
+ data = json.load(f)
67
+ return data.get("resources", {})
68
+ except FileNotFoundError:
69
+ warn(f"Attributes file not found: {attributes_path}")
70
+ return {}
71
+ except json.JSONDecodeError as e:
72
+ print(f"Error: Invalid JSON in attributes file: {e}", file=sys.stderr)
73
+ sys.exit(EXIT_ERROR)
74
+
75
+
76
+ # Global variable to hold loaded attributes (initialized in main)
77
+ AZURERM_SET_ATTRIBUTES: Dict[str, Any] = {}
78
+
79
+
80
+ def get_attr_config(attr_def: Any) -> tuple:
81
+ """
82
+ Parse attribute definition and return (key_attr, nested_attrs).
83
+
84
+ Attribute definition can be:
85
+ - str: simple key attribute (e.g., "name")
86
+ - None/null: no key attribute
87
+ - dict: nested structure with "_key" and nested attributes
88
+ """
89
+ if attr_def is None:
90
+ return (None, {})
91
+ if isinstance(attr_def, str):
92
+ return (attr_def, {})
93
+ if isinstance(attr_def, dict):
94
+ key_attr = attr_def.get("_key")
95
+ nested_attrs = {k: v for k, v in attr_def.items() if k != "_key"}
96
+ return (key_attr, nested_attrs)
97
+ return (None, {})
98
+
99
+
100
+ @dataclass
101
+ class SetAttributeChange:
102
+ """Represents a change in a Set-type attribute."""
103
+
104
+ attribute_name: str
105
+ path: str = (
106
+ "" # Full path for nested attributes (e.g., "rewrite_rule_set.rewrite_rule")
107
+ )
108
+ order_only_count: int = 0
109
+ added: List[str] = field(default_factory=list)
110
+ removed: List[str] = field(default_factory=list)
111
+ modified: List[tuple] = field(default_factory=list)
112
+ nested_changes: List["SetAttributeChange"] = field(default_factory=list)
113
+ # For primitive sets (string/number arrays)
114
+ is_primitive: bool = False
115
+ primitive_added: List[Any] = field(default_factory=list)
116
+ primitive_removed: List[Any] = field(default_factory=list)
117
+
118
+
119
+ @dataclass
120
+ class ResourceChange:
121
+ """Represents changes to a single resource."""
122
+
123
+ address: str
124
+ resource_type: str
125
+ actions: List[str] = field(default_factory=list)
126
+ set_changes: List[SetAttributeChange] = field(default_factory=list)
127
+ other_changes: List[str] = field(default_factory=list)
128
+ is_replace: bool = False
129
+ is_create: bool = False
130
+ is_delete: bool = False
131
+
132
+
133
+ @dataclass
134
+ class AnalysisResult:
135
+ """Overall analysis result."""
136
+
137
+ resources: List[ResourceChange] = field(default_factory=list)
138
+ order_only_count: int = 0
139
+ actual_set_changes_count: int = 0
140
+ replace_count: int = 0
141
+ create_count: int = 0
142
+ delete_count: int = 0
143
+ other_changes_count: int = 0
144
+ warnings: List[str] = field(default_factory=list)
145
+
146
+
147
+ def get_element_key(element: Dict[str, Any], key_attr: Optional[str]) -> str:
148
+ """Extract the key value from a Set element."""
149
+ if key_attr and key_attr in element:
150
+ val = element[key_attr]
151
+ if CONFIG.ignore_case and isinstance(val, str):
152
+ return val.lower()
153
+ return str(val)
154
+ # Fall back to hash of sorted items for elements without a key attribute
155
+ return str(hash(json.dumps(element, sort_keys=True)))
156
+
157
+
158
+ def normalize_value(val: Any) -> Any:
159
+ """Normalize values for comparison (treat empty string and None as equivalent)."""
160
+ if val == "" or val is None:
161
+ return None
162
+ if isinstance(val, list) and len(val) == 0:
163
+ return None
164
+ # Normalize numeric types (int vs float)
165
+ if isinstance(val, float) and val.is_integer():
166
+ return int(val)
167
+ return val
168
+
169
+
170
+ def normalize_for_comparison(val: Any) -> Any:
171
+ """Normalize value for comparison, including case-insensitive option."""
172
+ val = normalize_value(val)
173
+ if CONFIG.ignore_case and isinstance(val, str):
174
+ return val.lower()
175
+ return val
176
+
177
+
178
+ def values_equivalent(before_val: Any, after_val: Any) -> bool:
179
+ """Check if two values are effectively equivalent."""
180
+ return normalize_for_comparison(before_val) == normalize_for_comparison(after_val)
181
+
182
+
183
+ def compare_elements(
184
+ before: Dict[str, Any], after: Dict[str, Any], nested_attrs: Dict[str, Any] = None
185
+ ) -> tuple:
186
+ """
187
+ Compare two elements and return (simple_diffs, nested_set_attrs).
188
+
189
+ simple_diffs: differences in non-Set attributes
190
+ nested_set_attrs: list of (attr_name, before_val, after_val, attr_def) for nested Sets
191
+ """
192
+ nested_attrs = nested_attrs or {}
193
+ simple_diffs = {}
194
+ nested_set_attrs = []
195
+
196
+ all_keys = set(before.keys()) | set(after.keys())
197
+
198
+ for key in all_keys:
199
+ before_val = before.get(key)
200
+ after_val = after.get(key)
201
+
202
+ # Check if this is a nested Set attribute
203
+ if key in nested_attrs:
204
+ if before_val != after_val:
205
+ nested_set_attrs.append((key, before_val, after_val, nested_attrs[key]))
206
+ elif not values_equivalent(before_val, after_val):
207
+ simple_diffs[key] = {"before": before_val, "after": after_val}
208
+
209
+ return (simple_diffs, nested_set_attrs)
210
+
211
+
212
+ def analyze_primitive_set(
213
+ before_list: Optional[List[Any]],
214
+ after_list: Optional[List[Any]],
215
+ attr_name: str,
216
+ path: str = "",
217
+ ) -> SetAttributeChange:
218
+ """Analyze changes in a primitive Set (string/number array)."""
219
+ full_path = f"{path}.{attr_name}" if path else attr_name
220
+ change = SetAttributeChange(
221
+ attribute_name=attr_name, path=full_path, is_primitive=True
222
+ )
223
+
224
+ before_set = set(before_list) if before_list else set()
225
+ after_set = set(after_list) if after_list else set()
226
+
227
+ # Apply case-insensitive comparison if configured
228
+ if CONFIG.ignore_case:
229
+ before_normalized = {v.lower() if isinstance(v, str) else v for v in before_set}
230
+ after_normalized = {v.lower() if isinstance(v, str) else v for v in after_set}
231
+ else:
232
+ before_normalized = before_set
233
+ after_normalized = after_set
234
+
235
+ removed = before_normalized - after_normalized
236
+ added = after_normalized - before_normalized
237
+
238
+ if removed:
239
+ change.primitive_removed = list(removed)
240
+ if added:
241
+ change.primitive_added = list(added)
242
+
243
+ # Elements that exist in both (order change only)
244
+ common = before_normalized & after_normalized
245
+ if common and not removed and not added:
246
+ change.order_only_count = len(common)
247
+
248
+ return change
249
+
250
+
251
+ def analyze_set_attribute(
252
+ before_list: Optional[List[Dict[str, Any]]],
253
+ after_list: Optional[List[Dict[str, Any]]],
254
+ key_attr: Optional[str],
255
+ attr_name: str,
256
+ nested_attrs: Dict[str, Any] = None,
257
+ path: str = "",
258
+ after_unknown: Optional[Dict[str, Any]] = None,
259
+ ) -> SetAttributeChange:
260
+ """Analyze changes in a Set-type attribute, including nested Sets."""
261
+ full_path = f"{path}.{attr_name}" if path else attr_name
262
+ change = SetAttributeChange(attribute_name=attr_name, path=full_path)
263
+ nested_attrs = nested_attrs or {}
264
+
265
+ before_list = before_list or []
266
+ after_list = after_list or []
267
+
268
+ # Handle non-list values (single element)
269
+ if not isinstance(before_list, list):
270
+ before_list = [before_list] if before_list else []
271
+ if not isinstance(after_list, list):
272
+ after_list = [after_list] if after_list else []
273
+
274
+ # Check if this is a primitive set (non-dict elements)
275
+ has_primitive_before = any(
276
+ not isinstance(e, dict) for e in before_list if e is not None
277
+ )
278
+ has_primitive_after = any(
279
+ not isinstance(e, dict) for e in after_list if e is not None
280
+ )
281
+
282
+ if has_primitive_before or has_primitive_after:
283
+ # Handle primitive sets
284
+ return analyze_primitive_set(before_list, after_list, attr_name, path)
285
+
286
+ # Build maps keyed by the key attribute
287
+ before_map: Dict[str, Dict[str, Any]] = {}
288
+ after_map: Dict[str, Dict[str, Any]] = {}
289
+
290
+ # Detect duplicate keys
291
+ for e in before_list:
292
+ if isinstance(e, dict):
293
+ key = get_element_key(e, key_attr)
294
+ if key in before_map:
295
+ warn(f"Duplicate key '{key}' in before state for {full_path}")
296
+ before_map[key] = e
297
+
298
+ for e in after_list:
299
+ if isinstance(e, dict):
300
+ key = get_element_key(e, key_attr)
301
+ if key in after_map:
302
+ warn(f"Duplicate key '{key}' in after state for {full_path}")
303
+ after_map[key] = e
304
+
305
+ before_keys = set(before_map.keys())
306
+ after_keys = set(after_map.keys())
307
+
308
+ # Find removed elements
309
+ for key in before_keys - after_keys:
310
+ display_key = key if key_attr else "(element)"
311
+ change.removed.append(display_key)
312
+
313
+ # Find added elements
314
+ for key in after_keys - before_keys:
315
+ display_key = key if key_attr else "(element)"
316
+ change.added.append(display_key)
317
+
318
+ # Compare common elements
319
+ for key in before_keys & after_keys:
320
+ before_elem = before_map[key]
321
+ after_elem = after_map[key]
322
+
323
+ if before_elem == after_elem:
324
+ # Exact match - this is just an order change
325
+ change.order_only_count += 1
326
+ else:
327
+ # Content changed - check for meaningful differences
328
+ simple_diffs, nested_set_list = compare_elements(
329
+ before_elem, after_elem, nested_attrs
330
+ )
331
+
332
+ # Process nested Set attributes recursively
333
+ for nested_name, nested_before, nested_after, nested_def in nested_set_list:
334
+ nested_key, sub_nested = get_attr_config(nested_def)
335
+ nested_change = analyze_set_attribute(
336
+ nested_before,
337
+ nested_after,
338
+ nested_key,
339
+ nested_name,
340
+ sub_nested,
341
+ full_path,
342
+ )
343
+ if (
344
+ nested_change.order_only_count > 0
345
+ or nested_change.added
346
+ or nested_change.removed
347
+ or nested_change.modified
348
+ or nested_change.nested_changes
349
+ or nested_change.primitive_added
350
+ or nested_change.primitive_removed
351
+ ):
352
+ change.nested_changes.append(nested_change)
353
+
354
+ if simple_diffs:
355
+ # Has actual differences in non-nested attributes
356
+ display_key = key if key_attr else "(element)"
357
+ change.modified.append((display_key, simple_diffs))
358
+ elif not nested_set_list:
359
+ # Only null/empty differences - treat as order change
360
+ change.order_only_count += 1
361
+
362
+ return change
363
+
364
+
365
+ def analyze_resource_change(
366
+ resource_change: Dict[str, Any],
367
+ include_filter: Optional[List[str]] = None,
368
+ exclude_filter: Optional[List[str]] = None,
369
+ ) -> Optional[ResourceChange]:
370
+ """Analyze a single resource change from terraform plan."""
371
+ resource_type = resource_change.get("type", "")
372
+ address = resource_change.get("address", "")
373
+ change = resource_change.get("change", {})
374
+ actions = change.get("actions", [])
375
+
376
+ # Skip if no change or not an AzureRM resource
377
+ if actions == ["no-op"] or not resource_type.startswith("azurerm_"):
378
+ return None
379
+
380
+ # Apply filters
381
+ if include_filter:
382
+ if not any(f in resource_type for f in include_filter):
383
+ return None
384
+ if exclude_filter:
385
+ if any(f in resource_type for f in exclude_filter):
386
+ return None
387
+
388
+ before = change.get("before") or {}
389
+ after = change.get("after") or {}
390
+ after_unknown = change.get("after_unknown") or {}
391
+ before_sensitive = change.get("before_sensitive") or {}
392
+ after_sensitive = change.get("after_sensitive") or {}
393
+
394
+ # Determine action type
395
+ is_create = actions == ["create"]
396
+ is_delete = actions == ["delete"]
397
+ is_replace = "delete" in actions and "create" in actions
398
+
399
+ result = ResourceChange(
400
+ address=address,
401
+ resource_type=resource_type,
402
+ actions=actions,
403
+ is_replace=is_replace,
404
+ is_create=is_create,
405
+ is_delete=is_delete,
406
+ )
407
+
408
+ # Skip detailed Set analysis for create/delete (all elements are new/removed)
409
+ if is_create or is_delete:
410
+ return result
411
+
412
+ # Get Set attributes for this resource type
413
+ set_attrs = AZURERM_SET_ATTRIBUTES.get(resource_type, {})
414
+
415
+ # Analyze Set-type attributes
416
+ analyzed_attrs: Set[str] = set()
417
+ for attr_name, attr_def in set_attrs.items():
418
+ before_val = before.get(attr_name)
419
+ after_val = after.get(attr_name)
420
+
421
+ # Warn about sensitive attributes
422
+ if attr_name in before_sensitive or attr_name in after_sensitive:
423
+ if before_sensitive.get(attr_name) or after_sensitive.get(attr_name):
424
+ warn(
425
+ f"Attribute '{attr_name}' in {address} contains sensitive values (comparison may be incomplete)"
426
+ )
427
+
428
+ # Skip if attribute is not present or unchanged
429
+ if before_val is None and after_val is None:
430
+ continue
431
+ if before_val == after_val:
432
+ continue
433
+
434
+ # Only analyze if it's a list (Set in Terraform) or has changed
435
+ if not isinstance(before_val, list) and not isinstance(after_val, list):
436
+ continue
437
+
438
+ # Parse attribute definition for key and nested attrs
439
+ key_attr, nested_attrs = get_attr_config(attr_def)
440
+
441
+ # Get after_unknown for this attribute
442
+ attr_after_unknown = after_unknown.get(attr_name)
443
+
444
+ set_change = analyze_set_attribute(
445
+ before_val,
446
+ after_val,
447
+ key_attr,
448
+ attr_name,
449
+ nested_attrs,
450
+ after_unknown=attr_after_unknown,
451
+ )
452
+
453
+ # Only include if there are actual findings
454
+ if (
455
+ set_change.order_only_count > 0
456
+ or set_change.added
457
+ or set_change.removed
458
+ or set_change.modified
459
+ or set_change.nested_changes
460
+ or set_change.primitive_added
461
+ or set_change.primitive_removed
462
+ ):
463
+ result.set_changes.append(set_change)
464
+ analyzed_attrs.add(attr_name)
465
+
466
+ # Find other (non-Set) changes
467
+ all_keys = set(before.keys()) | set(after.keys())
468
+ for key in all_keys:
469
+ if key in analyzed_attrs:
470
+ continue
471
+ if key.startswith("_"): # Skip internal attributes
472
+ continue
473
+ before_val = before.get(key)
474
+ after_val = after.get(key)
475
+ if before_val != after_val:
476
+ result.other_changes.append(key)
477
+
478
+ return result
479
+
480
+
481
+ def collect_all_changes(set_change: SetAttributeChange, prefix: str = "") -> tuple:
482
+ """
483
+ Recursively collect order-only and actual changes from nested structure.
484
+ Returns (order_only_list, actual_change_list)
485
+ """
486
+ order_only = []
487
+ actual = []
488
+
489
+ display_name = (
490
+ f"{prefix}{set_change.attribute_name}" if prefix else set_change.attribute_name
491
+ )
492
+
493
+ has_actual_change = (
494
+ set_change.added
495
+ or set_change.removed
496
+ or set_change.modified
497
+ or set_change.primitive_added
498
+ or set_change.primitive_removed
499
+ )
500
+
501
+ if set_change.order_only_count > 0 and not has_actual_change:
502
+ order_only.append((display_name, set_change))
503
+ elif has_actual_change:
504
+ actual.append((display_name, set_change))
505
+
506
+ # Process nested changes
507
+ for nested in set_change.nested_changes:
508
+ nested_order, nested_actual = collect_all_changes(nested, f"{display_name}.")
509
+ order_only.extend(nested_order)
510
+ actual.extend(nested_actual)
511
+
512
+ return (order_only, actual)
513
+
514
+
515
+ def format_set_change(change: SetAttributeChange, indent: int = 0) -> List[str]:
516
+ """Format a single SetAttributeChange for output."""
517
+ lines = []
518
+ prefix = " " * indent
519
+
520
+ # Handle primitive sets
521
+ if change.is_primitive:
522
+ if change.primitive_added:
523
+ lines.append(f"{prefix}**Added:**")
524
+ for item in change.primitive_added:
525
+ lines.append(f"{prefix} - {item}")
526
+ if change.primitive_removed:
527
+ lines.append(f"{prefix}**Removed:**")
528
+ for item in change.primitive_removed:
529
+ lines.append(f"{prefix} - {item}")
530
+ if change.order_only_count > 0:
531
+ lines.append(f"{prefix}**Order-only:** {change.order_only_count} elements")
532
+ return lines
533
+
534
+ if change.added:
535
+ lines.append(f"{prefix}**Added:**")
536
+ for item in change.added:
537
+ lines.append(f"{prefix} - {item}")
538
+
539
+ if change.removed:
540
+ lines.append(f"{prefix}**Removed:**")
541
+ for item in change.removed:
542
+ lines.append(f"{prefix} - {item}")
543
+
544
+ if change.modified:
545
+ lines.append(f"{prefix}**Modified:**")
546
+ for item_key, diffs in change.modified:
547
+ lines.append(f"{prefix} - {item_key}:")
548
+ for diff_key, diff_val in diffs.items():
549
+ before_str = json.dumps(diff_val["before"], ensure_ascii=False)
550
+ after_str = json.dumps(diff_val["after"], ensure_ascii=False)
551
+ lines.append(f"{prefix} - {diff_key}: {before_str} → {after_str}")
552
+
553
+ if change.order_only_count > 0:
554
+ lines.append(f"{prefix}**Order-only:** {change.order_only_count} elements")
555
+
556
+ # Format nested changes
557
+ for nested in change.nested_changes:
558
+ if (
559
+ nested.added
560
+ or nested.removed
561
+ or nested.modified
562
+ or nested.nested_changes
563
+ or nested.primitive_added
564
+ or nested.primitive_removed
565
+ ):
566
+ lines.append(f"{prefix}**Nested attribute `{nested.attribute_name}`:**")
567
+ lines.extend(format_set_change(nested, indent + 1))
568
+
569
+ return lines
570
+
571
+
572
+ def format_markdown_output(result: AnalysisResult) -> str:
573
+ """Format analysis results as Markdown."""
574
+ lines = ["# Terraform Plan Analysis Results", ""]
575
+ lines.append(
576
+ 'Analyzes AzureRM Set-type attribute changes and identifies order-only "false-positive diffs".'
577
+ )
578
+ lines.append("")
579
+
580
+ # Categorize changes (including nested)
581
+ order_only_changes: List[tuple] = []
582
+ actual_set_changes: List[tuple] = []
583
+ replace_resources: List[ResourceChange] = []
584
+ create_resources: List[ResourceChange] = []
585
+ delete_resources: List[ResourceChange] = []
586
+ other_changes: List[tuple] = []
587
+
588
+ for res in result.resources:
589
+ if res.is_replace:
590
+ replace_resources.append(res)
591
+ elif res.is_create:
592
+ create_resources.append(res)
593
+ elif res.is_delete:
594
+ delete_resources.append(res)
595
+
596
+ for set_change in res.set_changes:
597
+ order_only, actual = collect_all_changes(set_change)
598
+ for name, change in order_only:
599
+ order_only_changes.append((res.address, name, change))
600
+ for name, change in actual:
601
+ actual_set_changes.append((res.address, name, change))
602
+
603
+ if res.other_changes:
604
+ other_changes.append((res.address, res.other_changes))
605
+
606
+ # Section: Order-only changes (false positives)
607
+ lines.append("## 🟢 Order-only Changes (No Impact)")
608
+ lines.append("")
609
+ if order_only_changes:
610
+ lines.append(
611
+ "The following changes are internal reordering of Set-type attributes only, with no actual resource changes."
612
+ )
613
+ lines.append("")
614
+ for address, name, change in order_only_changes:
615
+ lines.append(
616
+ f"- `{address}`: **{name}** ({change.order_only_count} elements)"
617
+ )
618
+ else:
619
+ lines.append("None")
620
+ lines.append("")
621
+
622
+ # Section: Actual Set changes
623
+ lines.append("## 🟡 Actual Set Attribute Changes")
624
+ lines.append("")
625
+ if actual_set_changes:
626
+ for address, name, change in actual_set_changes:
627
+ lines.append(f"### `{address}` - {name}")
628
+ lines.append("")
629
+ lines.extend(format_set_change(change))
630
+ lines.append("")
631
+ else:
632
+ lines.append("None")
633
+ lines.append("")
634
+
635
+ # Section: Resource replacements
636
+ lines.append("## 🔴 Resource Replacement (Caution)")
637
+ lines.append("")
638
+ if replace_resources:
639
+ lines.append(
640
+ "The following resources will be deleted and recreated. This may cause downtime."
641
+ )
642
+ lines.append("")
643
+ for res in replace_resources:
644
+ lines.append(f"- `{res.address}`")
645
+ else:
646
+ lines.append("None")
647
+ lines.append("")
648
+
649
+ # Section: Warnings
650
+ if result.warnings:
651
+ lines.append("## ⚠️ Warnings")
652
+ lines.append("")
653
+ for warning in result.warnings:
654
+ lines.append(f"- {warning}")
655
+ lines.append("")
656
+
657
+ return "\n".join(lines)
658
+
659
+
660
+ def format_json_output(result: AnalysisResult) -> str:
661
+ """Format analysis results as JSON."""
662
+
663
+ def set_change_to_dict(change: SetAttributeChange) -> dict:
664
+ d = {
665
+ "attribute_name": change.attribute_name,
666
+ "path": change.path,
667
+ "order_only_count": change.order_only_count,
668
+ "is_primitive": change.is_primitive,
669
+ }
670
+ if change.added:
671
+ d["added"] = change.added
672
+ if change.removed:
673
+ d["removed"] = change.removed
674
+ if change.modified:
675
+ d["modified"] = [{"key": k, "diffs": v} for k, v in change.modified]
676
+ if change.primitive_added:
677
+ d["primitive_added"] = change.primitive_added
678
+ if change.primitive_removed:
679
+ d["primitive_removed"] = change.primitive_removed
680
+ if change.nested_changes:
681
+ d["nested_changes"] = [set_change_to_dict(n) for n in change.nested_changes]
682
+ return d
683
+
684
+ def resource_to_dict(res: ResourceChange) -> dict:
685
+ return {
686
+ "address": res.address,
687
+ "resource_type": res.resource_type,
688
+ "actions": res.actions,
689
+ "is_replace": res.is_replace,
690
+ "is_create": res.is_create,
691
+ "is_delete": res.is_delete,
692
+ "set_changes": [set_change_to_dict(c) for c in res.set_changes],
693
+ "other_changes": res.other_changes,
694
+ }
695
+
696
+ output = {
697
+ "summary": {
698
+ "order_only_count": result.order_only_count,
699
+ "actual_set_changes_count": result.actual_set_changes_count,
700
+ "replace_count": result.replace_count,
701
+ "create_count": result.create_count,
702
+ "delete_count": result.delete_count,
703
+ "other_changes_count": result.other_changes_count,
704
+ },
705
+ "has_real_changes": (
706
+ result.actual_set_changes_count > 0
707
+ or result.replace_count > 0
708
+ or result.create_count > 0
709
+ or result.delete_count > 0
710
+ or result.other_changes_count > 0
711
+ ),
712
+ "resources": [resource_to_dict(r) for r in result.resources],
713
+ "warnings": result.warnings,
714
+ }
715
+ return json.dumps(output, indent=2, ensure_ascii=False)
716
+
717
+
718
+ def format_summary_output(result: AnalysisResult) -> str:
719
+ """Format analysis results as a single-line summary."""
720
+ parts = []
721
+
722
+ if result.order_only_count > 0:
723
+ parts.append(f"🟢 {result.order_only_count} order-only")
724
+ if result.actual_set_changes_count > 0:
725
+ parts.append(f"🟡 {result.actual_set_changes_count} set changes")
726
+ if result.replace_count > 0:
727
+ parts.append(f"🔴 {result.replace_count} replacements")
728
+
729
+ if not parts:
730
+ return "✅ No changes detected"
731
+
732
+ return " | ".join(parts)
733
+
734
+
735
+ def analyze_plan(
736
+ plan_json: Dict[str, Any],
737
+ include_filter: Optional[List[str]] = None,
738
+ exclude_filter: Optional[List[str]] = None,
739
+ ) -> AnalysisResult:
740
+ """Analyze a terraform plan JSON and return results."""
741
+ result = AnalysisResult()
742
+
743
+ resource_changes = plan_json.get("resource_changes", [])
744
+
745
+ for rc in resource_changes:
746
+ res = analyze_resource_change(rc, include_filter, exclude_filter)
747
+ if res:
748
+ result.resources.append(res)
749
+
750
+ # Count statistics
751
+ if res.is_replace:
752
+ result.replace_count += 1
753
+ elif res.is_create:
754
+ result.create_count += 1
755
+ elif res.is_delete:
756
+ result.delete_count += 1
757
+
758
+ if res.other_changes:
759
+ result.other_changes_count += len(res.other_changes)
760
+
761
+ for set_change in res.set_changes:
762
+ order_only, actual = collect_all_changes(set_change)
763
+ result.order_only_count += len(order_only)
764
+ result.actual_set_changes_count += len(actual)
765
+
766
+ # Add warnings from global config
767
+ result.warnings = CONFIG.warnings.copy()
768
+
769
+ return result
770
+
771
+
772
+ def determine_exit_code(result: AnalysisResult) -> int:
773
+ """Determine exit code based on analysis results."""
774
+ if result.replace_count > 0:
775
+ return EXIT_RESOURCE_REPLACE
776
+ if (
777
+ result.actual_set_changes_count > 0
778
+ or result.create_count > 0
779
+ or result.delete_count > 0
780
+ ):
781
+ return EXIT_SET_CHANGES
782
+ return EXIT_NO_CHANGES
783
+
784
+
785
+ def parse_args() -> argparse.Namespace:
786
+ """Parse command line arguments."""
787
+ parser = argparse.ArgumentParser(
788
+ description="Analyze Terraform plan JSON for AzureRM Set-type attribute changes.",
789
+ formatter_class=argparse.RawDescriptionHelpFormatter,
790
+ epilog="""
791
+ Examples:
792
+ # Basic usage
793
+ python analyze_plan.py plan.json
794
+
795
+ # From stdin
796
+ terraform show -json plan.tfplan | python analyze_plan.py
797
+
798
+ # CI/CD with exit code
799
+ python analyze_plan.py plan.json --exit-code
800
+
801
+ # JSON output for programmatic processing
802
+ python analyze_plan.py plan.json --format json
803
+
804
+ # Summary for CI logs
805
+ python analyze_plan.py plan.json --format summary
806
+
807
+ Exit codes (with --exit-code):
808
+ 0 - No changes or order-only changes
809
+ 1 - Actual Set attribute changes
810
+ 2 - Resource replacement detected
811
+ 3 - Error
812
+ """,
813
+ )
814
+
815
+ parser.add_argument(
816
+ "plan_file",
817
+ nargs="?",
818
+ help="Path to terraform plan JSON file (reads from stdin if not provided)",
819
+ )
820
+ parser.add_argument(
821
+ "--format",
822
+ "-f",
823
+ choices=["markdown", "json", "summary"],
824
+ default="markdown",
825
+ help="Output format (default: markdown)",
826
+ )
827
+ parser.add_argument(
828
+ "--exit-code",
829
+ "-e",
830
+ action="store_true",
831
+ help="Return exit code based on change severity",
832
+ )
833
+ parser.add_argument(
834
+ "--quiet",
835
+ "-q",
836
+ action="store_true",
837
+ help="Suppress warnings and verbose output",
838
+ )
839
+ parser.add_argument(
840
+ "--verbose",
841
+ "-v",
842
+ action="store_true",
843
+ help="Show detailed warnings and debug info",
844
+ )
845
+ parser.add_argument(
846
+ "--ignore-case",
847
+ action="store_true",
848
+ help="Ignore case when comparing string values",
849
+ )
850
+ parser.add_argument(
851
+ "--attributes", type=Path, help="Path to custom attributes JSON file"
852
+ )
853
+ parser.add_argument(
854
+ "--include",
855
+ action="append",
856
+ help="Only analyze resources matching this pattern (can be repeated)",
857
+ )
858
+ parser.add_argument(
859
+ "--exclude",
860
+ action="append",
861
+ help="Exclude resources matching this pattern (can be repeated)",
862
+ )
863
+
864
+ return parser.parse_args()
865
+
866
+
867
+ def main():
868
+ """Main entry point."""
869
+ global AZURERM_SET_ATTRIBUTES
870
+
871
+ args = parse_args()
872
+
873
+ # Configure global settings
874
+ CONFIG.ignore_case = args.ignore_case
875
+ CONFIG.quiet = args.quiet
876
+ CONFIG.verbose = args.verbose
877
+ CONFIG.warnings = []
878
+
879
+ # Load Set attributes from external JSON
880
+ AZURERM_SET_ATTRIBUTES = load_set_attributes(args.attributes)
881
+
882
+ # Read plan input
883
+ if args.plan_file:
884
+ try:
885
+ with open(args.plan_file, "r") as f:
886
+ plan_json = json.load(f)
887
+ except FileNotFoundError:
888
+ print(f"Error: File not found: {args.plan_file}", file=sys.stderr)
889
+ sys.exit(EXIT_ERROR)
890
+ except json.JSONDecodeError as e:
891
+ print(f"Error: Invalid JSON: {e}", file=sys.stderr)
892
+ sys.exit(EXIT_ERROR)
893
+ else:
894
+ try:
895
+ plan_json = json.load(sys.stdin)
896
+ except json.JSONDecodeError as e:
897
+ print(f"Error: Invalid JSON from stdin: {e}", file=sys.stderr)
898
+ sys.exit(EXIT_ERROR)
899
+
900
+ # Check for empty plan
901
+ resource_changes = plan_json.get("resource_changes", [])
902
+ if not resource_changes:
903
+ if args.format == "json":
904
+ print(
905
+ json.dumps(
906
+ {
907
+ "summary": {},
908
+ "has_real_changes": False,
909
+ "resources": [],
910
+ "warnings": [],
911
+ }
912
+ )
913
+ )
914
+ elif args.format == "summary":
915
+ print("✅ No changes detected")
916
+ else:
917
+ print("# Terraform Plan Analysis Results\n")
918
+ print("No resource changes detected.")
919
+ sys.exit(EXIT_NO_CHANGES)
920
+
921
+ # Analyze the plan
922
+ result = analyze_plan(plan_json, args.include, args.exclude)
923
+
924
+ # Format output
925
+ if args.format == "json":
926
+ output = format_json_output(result)
927
+ elif args.format == "summary":
928
+ output = format_summary_output(result)
929
+ else:
930
+ output = format_markdown_output(result)
931
+
932
+ print(output)
933
+
934
+ # Determine exit code
935
+ if args.exit_code:
936
+ sys.exit(determine_exit_code(result))
937
+
938
+
939
+ if __name__ == "__main__":
940
+ main()