tech-hub-skills 1.2.0 → 1.5.2

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 (198) hide show
  1. package/{LICENSE → .claude/LICENSE} +21 -21
  2. package/.claude/README.md +291 -0
  3. package/.claude/bin/cli.js +266 -0
  4. package/{bin → .claude/bin}/copilot.js +182 -182
  5. package/{bin → .claude/bin}/postinstall.js +42 -42
  6. package/{tech_hub_skills/skills → .claude/commands}/README.md +336 -336
  7. package/{tech_hub_skills/skills → .claude/commands}/ai-engineer.md +104 -104
  8. package/{tech_hub_skills/skills → .claude/commands}/aws.md +143 -143
  9. package/{tech_hub_skills/skills → .claude/commands}/azure.md +149 -149
  10. package/{tech_hub_skills/skills → .claude/commands}/backend-developer.md +108 -108
  11. package/{tech_hub_skills/skills → .claude/commands}/code-review.md +399 -399
  12. package/{tech_hub_skills/skills → .claude/commands}/compliance-automation.md +747 -747
  13. package/{tech_hub_skills/skills → .claude/commands}/compliance-officer.md +108 -108
  14. package/{tech_hub_skills/skills → .claude/commands}/data-engineer.md +113 -113
  15. package/{tech_hub_skills/skills → .claude/commands}/data-governance.md +102 -102
  16. package/{tech_hub_skills/skills → .claude/commands}/data-scientist.md +123 -123
  17. package/{tech_hub_skills/skills → .claude/commands}/database-admin.md +109 -109
  18. package/{tech_hub_skills/skills → .claude/commands}/devops.md +160 -160
  19. package/{tech_hub_skills/skills → .claude/commands}/docker.md +160 -160
  20. package/{tech_hub_skills/skills → .claude/commands}/enterprise-dashboard.md +613 -613
  21. package/{tech_hub_skills/skills → .claude/commands}/finops.md +184 -184
  22. package/{tech_hub_skills/skills → .claude/commands}/frontend-developer.md +108 -108
  23. package/{tech_hub_skills/skills → .claude/commands}/gcp.md +143 -143
  24. package/{tech_hub_skills/skills → .claude/commands}/ml-engineer.md +115 -115
  25. package/{tech_hub_skills/skills → .claude/commands}/mlops.md +187 -187
  26. package/{tech_hub_skills/skills → .claude/commands}/network-engineer.md +109 -109
  27. package/{tech_hub_skills/skills → .claude/commands}/optimization-advisor.md +329 -329
  28. package/{tech_hub_skills/skills → .claude/commands}/orchestrator.md +623 -623
  29. package/{tech_hub_skills/skills → .claude/commands}/platform-engineer.md +102 -102
  30. package/{tech_hub_skills/skills → .claude/commands}/process-automation.md +226 -226
  31. package/{tech_hub_skills/skills → .claude/commands}/process-changelog.md +184 -184
  32. package/{tech_hub_skills/skills → .claude/commands}/process-documentation.md +484 -484
  33. package/{tech_hub_skills/skills → .claude/commands}/process-kanban.md +324 -324
  34. package/{tech_hub_skills/skills → .claude/commands}/process-versioning.md +214 -214
  35. package/{tech_hub_skills/skills → .claude/commands}/product-designer.md +104 -104
  36. package/{tech_hub_skills/skills → .claude/commands}/project-starter.md +443 -443
  37. package/{tech_hub_skills/skills → .claude/commands}/qa-engineer.md +109 -109
  38. package/{tech_hub_skills/skills → .claude/commands}/security-architect.md +135 -135
  39. package/{tech_hub_skills/skills → .claude/commands}/sre.md +109 -109
  40. package/{tech_hub_skills/skills → .claude/commands}/system-design.md +126 -126
  41. package/{tech_hub_skills/skills → .claude/commands}/technical-writer.md +101 -101
  42. package/.claude/package.json +46 -0
  43. package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/01-prompt-engineering/README.md +252 -252
  44. package/.claude/roles/ai-engineer/skills/01-prompt-engineering/prompt_ab_tester.py +356 -0
  45. package/.claude/roles/ai-engineer/skills/01-prompt-engineering/prompt_template_manager.py +274 -0
  46. package/.claude/roles/ai-engineer/skills/01-prompt-engineering/token_cost_estimator.py +324 -0
  47. package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/02-rag-pipeline/README.md +448 -448
  48. package/.claude/roles/ai-engineer/skills/02-rag-pipeline/document_chunker.py +336 -0
  49. package/.claude/roles/ai-engineer/skills/02-rag-pipeline/rag_pipeline.sql +213 -0
  50. package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/03-agent-orchestration/README.md +599 -599
  51. package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/04-llm-guardrails/README.md +735 -735
  52. package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/05-vector-embeddings/README.md +711 -711
  53. package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/06-llm-evaluation/README.md +777 -777
  54. package/{tech_hub_skills → .claude}/roles/azure/skills/01-infrastructure-fundamentals/README.md +264 -264
  55. package/{tech_hub_skills → .claude}/roles/azure/skills/02-data-factory/README.md +264 -264
  56. package/{tech_hub_skills → .claude}/roles/azure/skills/03-synapse-analytics/README.md +264 -264
  57. package/{tech_hub_skills → .claude}/roles/azure/skills/04-databricks/README.md +264 -264
  58. package/{tech_hub_skills → .claude}/roles/azure/skills/05-functions/README.md +264 -264
  59. package/{tech_hub_skills → .claude}/roles/azure/skills/06-kubernetes-service/README.md +264 -264
  60. package/{tech_hub_skills → .claude}/roles/azure/skills/07-openai-service/README.md +264 -264
  61. package/{tech_hub_skills → .claude}/roles/azure/skills/08-machine-learning/README.md +264 -264
  62. package/{tech_hub_skills → .claude}/roles/azure/skills/09-storage-adls/README.md +264 -264
  63. package/{tech_hub_skills → .claude}/roles/azure/skills/10-networking/README.md +264 -264
  64. package/{tech_hub_skills → .claude}/roles/azure/skills/11-sql-cosmos/README.md +264 -264
  65. package/{tech_hub_skills → .claude}/roles/azure/skills/12-event-hubs/README.md +264 -264
  66. package/{tech_hub_skills → .claude}/roles/code-review/skills/01-automated-code-review/README.md +394 -394
  67. package/{tech_hub_skills → .claude}/roles/code-review/skills/02-pr-review-workflow/README.md +427 -427
  68. package/{tech_hub_skills → .claude}/roles/code-review/skills/03-code-quality-gates/README.md +518 -518
  69. package/{tech_hub_skills → .claude}/roles/code-review/skills/04-reviewer-assignment/README.md +504 -504
  70. package/{tech_hub_skills → .claude}/roles/code-review/skills/05-review-analytics/README.md +540 -540
  71. package/{tech_hub_skills → .claude}/roles/data-engineer/skills/01-lakehouse-architecture/README.md +550 -550
  72. package/.claude/roles/data-engineer/skills/01-lakehouse-architecture/bronze_ingestion.py +337 -0
  73. package/.claude/roles/data-engineer/skills/01-lakehouse-architecture/medallion_queries.sql +300 -0
  74. package/{tech_hub_skills → .claude}/roles/data-engineer/skills/02-etl-pipeline/README.md +580 -580
  75. package/{tech_hub_skills → .claude}/roles/data-engineer/skills/03-data-quality/README.md +579 -579
  76. package/{tech_hub_skills → .claude}/roles/data-engineer/skills/04-streaming-pipelines/README.md +608 -608
  77. package/{tech_hub_skills → .claude}/roles/data-engineer/skills/05-performance-optimization/README.md +547 -547
  78. package/{tech_hub_skills → .claude}/roles/data-governance/skills/01-data-catalog/README.md +112 -112
  79. package/{tech_hub_skills → .claude}/roles/data-governance/skills/02-data-lineage/README.md +129 -129
  80. package/{tech_hub_skills → .claude}/roles/data-governance/skills/03-data-quality-framework/README.md +182 -182
  81. package/{tech_hub_skills → .claude}/roles/data-governance/skills/04-access-control/README.md +39 -39
  82. package/{tech_hub_skills → .claude}/roles/data-governance/skills/05-master-data-management/README.md +40 -40
  83. package/{tech_hub_skills → .claude}/roles/data-governance/skills/06-compliance-privacy/README.md +46 -46
  84. package/{tech_hub_skills → .claude}/roles/data-scientist/skills/01-eda-automation/README.md +230 -230
  85. package/.claude/roles/data-scientist/skills/01-eda-automation/eda_generator.py +446 -0
  86. package/{tech_hub_skills → .claude}/roles/data-scientist/skills/02-statistical-modeling/README.md +264 -264
  87. package/{tech_hub_skills → .claude}/roles/data-scientist/skills/03-feature-engineering/README.md +264 -264
  88. package/{tech_hub_skills → .claude}/roles/data-scientist/skills/04-predictive-modeling/README.md +264 -264
  89. package/{tech_hub_skills → .claude}/roles/data-scientist/skills/05-customer-analytics/README.md +264 -264
  90. package/{tech_hub_skills → .claude}/roles/data-scientist/skills/06-campaign-analysis/README.md +264 -264
  91. package/{tech_hub_skills → .claude}/roles/data-scientist/skills/07-experimentation/README.md +264 -264
  92. package/{tech_hub_skills → .claude}/roles/data-scientist/skills/08-data-visualization/README.md +264 -264
  93. package/{tech_hub_skills → .claude}/roles/devops/skills/01-cicd-pipeline/README.md +264 -264
  94. package/{tech_hub_skills → .claude}/roles/devops/skills/02-container-orchestration/README.md +264 -264
  95. package/{tech_hub_skills → .claude}/roles/devops/skills/03-infrastructure-as-code/README.md +264 -264
  96. package/{tech_hub_skills → .claude}/roles/devops/skills/04-gitops/README.md +264 -264
  97. package/{tech_hub_skills → .claude}/roles/devops/skills/05-environment-management/README.md +264 -264
  98. package/{tech_hub_skills → .claude}/roles/devops/skills/06-automated-testing/README.md +264 -264
  99. package/{tech_hub_skills → .claude}/roles/devops/skills/07-release-management/README.md +264 -264
  100. package/{tech_hub_skills → .claude}/roles/devops/skills/08-monitoring-alerting/README.md +264 -264
  101. package/{tech_hub_skills → .claude}/roles/devops/skills/09-devsecops/README.md +265 -265
  102. package/{tech_hub_skills → .claude}/roles/finops/skills/01-cost-visibility/README.md +264 -264
  103. package/{tech_hub_skills → .claude}/roles/finops/skills/02-resource-tagging/README.md +264 -264
  104. package/{tech_hub_skills → .claude}/roles/finops/skills/03-budget-management/README.md +264 -264
  105. package/{tech_hub_skills → .claude}/roles/finops/skills/04-reserved-instances/README.md +264 -264
  106. package/{tech_hub_skills → .claude}/roles/finops/skills/05-spot-optimization/README.md +264 -264
  107. package/{tech_hub_skills → .claude}/roles/finops/skills/06-storage-tiering/README.md +264 -264
  108. package/{tech_hub_skills → .claude}/roles/finops/skills/07-compute-rightsizing/README.md +264 -264
  109. package/{tech_hub_skills → .claude}/roles/finops/skills/08-chargeback/README.md +264 -264
  110. package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/01-mlops-pipeline/README.md +566 -566
  111. package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/02-feature-engineering/README.md +655 -655
  112. package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/03-model-training/README.md +704 -704
  113. package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/04-model-serving/README.md +845 -845
  114. package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/05-model-monitoring/README.md +874 -874
  115. package/{tech_hub_skills → .claude}/roles/mlops/skills/01-ml-pipeline-orchestration/README.md +264 -264
  116. package/{tech_hub_skills → .claude}/roles/mlops/skills/02-experiment-tracking/README.md +264 -264
  117. package/{tech_hub_skills → .claude}/roles/mlops/skills/03-model-registry/README.md +264 -264
  118. package/{tech_hub_skills → .claude}/roles/mlops/skills/04-feature-store/README.md +264 -264
  119. package/{tech_hub_skills → .claude}/roles/mlops/skills/05-model-deployment/README.md +264 -264
  120. package/{tech_hub_skills → .claude}/roles/mlops/skills/06-model-observability/README.md +264 -264
  121. package/{tech_hub_skills → .claude}/roles/mlops/skills/07-data-versioning/README.md +264 -264
  122. package/{tech_hub_skills → .claude}/roles/mlops/skills/08-ab-testing/README.md +264 -264
  123. package/{tech_hub_skills → .claude}/roles/mlops/skills/09-automated-retraining/README.md +264 -264
  124. package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/01-internal-developer-platform/README.md +153 -153
  125. package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/02-self-service-infrastructure/README.md +57 -57
  126. package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/03-slo-sli-management/README.md +59 -59
  127. package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/04-developer-experience/README.md +57 -57
  128. package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/05-incident-management/README.md +73 -73
  129. package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/06-capacity-management/README.md +59 -59
  130. package/{tech_hub_skills → .claude}/roles/product-designer/skills/01-requirements-discovery/README.md +407 -407
  131. package/{tech_hub_skills → .claude}/roles/product-designer/skills/02-user-research/README.md +382 -382
  132. package/{tech_hub_skills → .claude}/roles/product-designer/skills/03-brainstorming-ideation/README.md +437 -437
  133. package/{tech_hub_skills → .claude}/roles/product-designer/skills/04-ux-design/README.md +496 -496
  134. package/{tech_hub_skills → .claude}/roles/product-designer/skills/05-product-market-fit/README.md +376 -376
  135. package/{tech_hub_skills → .claude}/roles/product-designer/skills/06-stakeholder-management/README.md +412 -412
  136. package/{tech_hub_skills → .claude}/roles/security-architect/skills/01-pii-detection/README.md +319 -319
  137. package/{tech_hub_skills → .claude}/roles/security-architect/skills/02-threat-modeling/README.md +264 -264
  138. package/{tech_hub_skills → .claude}/roles/security-architect/skills/03-infrastructure-security/README.md +264 -264
  139. package/{tech_hub_skills → .claude}/roles/security-architect/skills/04-iam/README.md +264 -264
  140. package/{tech_hub_skills → .claude}/roles/security-architect/skills/05-application-security/README.md +264 -264
  141. package/{tech_hub_skills → .claude}/roles/security-architect/skills/06-secrets-management/README.md +264 -264
  142. package/{tech_hub_skills → .claude}/roles/security-architect/skills/07-security-monitoring/README.md +264 -264
  143. package/{tech_hub_skills → .claude}/roles/system-design/skills/01-architecture-patterns/README.md +337 -337
  144. package/{tech_hub_skills → .claude}/roles/system-design/skills/02-requirements-engineering/README.md +264 -264
  145. package/{tech_hub_skills → .claude}/roles/system-design/skills/03-scalability/README.md +264 -264
  146. package/{tech_hub_skills → .claude}/roles/system-design/skills/04-high-availability/README.md +264 -264
  147. package/{tech_hub_skills → .claude}/roles/system-design/skills/05-cost-optimization-design/README.md +264 -264
  148. package/{tech_hub_skills → .claude}/roles/system-design/skills/06-api-design/README.md +264 -264
  149. package/{tech_hub_skills → .claude}/roles/system-design/skills/07-observability-architecture/README.md +264 -264
  150. package/{tech_hub_skills → .claude}/roles/system-design/skills/08-process-automation/PROCESS_TEMPLATE.md +336 -336
  151. package/{tech_hub_skills → .claude}/roles/system-design/skills/08-process-automation/README.md +521 -521
  152. package/.claude/roles/system-design/skills/08-process-automation/ai_prompt_generator.py +744 -0
  153. package/.claude/roles/system-design/skills/08-process-automation/automation_recommender.py +688 -0
  154. package/.claude/roles/system-design/skills/08-process-automation/plan_generator.py +679 -0
  155. package/.claude/roles/system-design/skills/08-process-automation/process_analyzer.py +528 -0
  156. package/.claude/roles/system-design/skills/08-process-automation/process_parser.py +684 -0
  157. package/.claude/roles/system-design/skills/08-process-automation/role_matcher.py +615 -0
  158. package/.claude/skills/README.md +336 -0
  159. package/.claude/skills/ai-engineer.md +104 -0
  160. package/.claude/skills/aws.md +143 -0
  161. package/.claude/skills/azure.md +149 -0
  162. package/.claude/skills/backend-developer.md +108 -0
  163. package/.claude/skills/code-review.md +399 -0
  164. package/.claude/skills/compliance-automation.md +747 -0
  165. package/.claude/skills/compliance-officer.md +108 -0
  166. package/.claude/skills/data-engineer.md +113 -0
  167. package/.claude/skills/data-governance.md +102 -0
  168. package/.claude/skills/data-scientist.md +123 -0
  169. package/.claude/skills/database-admin.md +109 -0
  170. package/.claude/skills/devops.md +160 -0
  171. package/.claude/skills/docker.md +160 -0
  172. package/.claude/skills/enterprise-dashboard.md +613 -0
  173. package/.claude/skills/finops.md +184 -0
  174. package/.claude/skills/frontend-developer.md +108 -0
  175. package/.claude/skills/gcp.md +143 -0
  176. package/.claude/skills/ml-engineer.md +115 -0
  177. package/.claude/skills/mlops.md +187 -0
  178. package/.claude/skills/network-engineer.md +109 -0
  179. package/.claude/skills/optimization-advisor.md +329 -0
  180. package/.claude/skills/orchestrator.md +623 -0
  181. package/.claude/skills/platform-engineer.md +102 -0
  182. package/.claude/skills/process-automation.md +226 -0
  183. package/.claude/skills/process-changelog.md +184 -0
  184. package/.claude/skills/process-documentation.md +484 -0
  185. package/.claude/skills/process-kanban.md +324 -0
  186. package/.claude/skills/process-versioning.md +214 -0
  187. package/.claude/skills/product-designer.md +104 -0
  188. package/.claude/skills/project-starter.md +443 -0
  189. package/.claude/skills/qa-engineer.md +109 -0
  190. package/.claude/skills/security-architect.md +135 -0
  191. package/.claude/skills/sre.md +109 -0
  192. package/.claude/skills/system-design.md +126 -0
  193. package/.claude/skills/technical-writer.md +101 -0
  194. package/.gitattributes +2 -0
  195. package/GITHUB_COPILOT.md +106 -0
  196. package/README.md +192 -291
  197. package/package.json +16 -46
  198. package/bin/cli.js +0 -241
@@ -1,427 +1,427 @@
1
- # cr-02: PR Review Workflow
2
-
3
- Structured pull request review process with templates, checklists, and approval workflows.
4
-
5
- ## Overview
6
-
7
- A well-defined PR review workflow ensures consistent quality, faster reviews, and clear expectations for both authors and reviewers. This skill provides templates, checklists, and automation for enterprise PR management.
8
-
9
- ## Capabilities
10
-
11
- ### PR Templates
12
- - Standard change template
13
- - Feature template with design docs
14
- - Bug fix template with root cause
15
- - Security-sensitive change template
16
- - Database migration template
17
-
18
- ### Review Checklists
19
- - Functionality verification
20
- - Security considerations
21
- - Performance impact
22
- - Test coverage
23
- - Documentation updates
24
-
25
- ### Workflow Automation
26
- - Auto-labeling based on changes
27
- - Draft to ready transitions
28
- - Review reminders
29
- - Stale PR management
30
- - Merge queue handling
31
-
32
- ## Implementation
33
-
34
- ### PR Template (.github/pull_request_template.md)
35
-
36
- ```markdown
37
- ## Summary
38
- <!-- Describe your changes in 2-3 sentences -->
39
-
40
- ## Type of Change
41
- <!-- Check all that apply -->
42
- - [ ] Bug fix (non-breaking change fixing an issue)
43
- - [ ] New feature (non-breaking change adding functionality)
44
- - [ ] Breaking change (fix or feature causing existing functionality to change)
45
- - [ ] Refactoring (no functional changes)
46
- - [ ] Documentation update
47
- - [ ] Configuration change
48
- - [ ] Security fix
49
-
50
- ## Related Issues
51
- <!-- Link any related issues: Fixes #123, Relates to #456 -->
52
-
53
- ## Changes Made
54
- <!-- List the main changes -->
55
- -
56
- -
57
- -
58
-
59
- ## Testing Done
60
- <!-- Describe testing performed -->
61
- - [ ] Unit tests added/updated
62
- - [ ] Integration tests added/updated
63
- - [ ] Manual testing completed
64
- - [ ] Test coverage maintained/increased
65
-
66
- ## Security Checklist
67
- <!-- For all changes, verify -->
68
- - [ ] No secrets or credentials committed
69
- - [ ] No new dependencies with known vulnerabilities
70
- - [ ] Input validation added where needed
71
- - [ ] Authentication/authorization unchanged or reviewed
72
- - [ ] Logging does not expose sensitive data
73
-
74
- ## Performance Impact
75
- <!-- Describe any performance implications -->
76
- - [ ] No performance impact expected
77
- - [ ] Performance tested (describe results)
78
- - [ ] New database queries are optimized
79
- - [ ] No N+1 queries introduced
80
-
81
- ## Documentation
82
- - [ ] README updated if needed
83
- - [ ] API documentation updated
84
- - [ ] Changelog entry added
85
- - [ ] Architecture docs updated if needed
86
-
87
- ## Rollback Plan
88
- <!-- How to rollback if issues are found -->
89
-
90
- ## Screenshots (if applicable)
91
- <!-- Add screenshots for UI changes -->
92
-
93
- ## Reviewer Notes
94
- <!-- Any specific areas you'd like reviewers to focus on -->
95
- ```
96
-
97
- ### Security-Sensitive PR Template
98
-
99
- ```markdown
100
- ## Security Change Request
101
-
102
- ### Summary
103
- <!-- Describe the security-related change -->
104
-
105
- ### Security Impact Assessment
106
-
107
- **Risk Level**: [ ] Critical [ ] High [ ] Medium [ ] Low
108
-
109
- **Affected Areas**:
110
- - [ ] Authentication
111
- - [ ] Authorization
112
- - [ ] Data encryption
113
- - [ ] Input validation
114
- - [ ] Session management
115
- - [ ] Logging/Audit
116
- - [ ] API security
117
- - [ ] Infrastructure
118
-
119
- ### Threat Model Update
120
- <!-- Link to updated threat model or describe changes -->
121
-
122
- ### Security Review Checklist
123
- - [ ] OWASP Top 10 considered
124
- - [ ] STRIDE analysis performed
125
- - [ ] Security architect reviewed (required for High/Critical)
126
- - [ ] Pen testing scheduled if needed
127
- - [ ] Security scanning passed
128
-
129
- ### Compliance Impact
130
- - [ ] No compliance impact
131
- - [ ] GDPR implications reviewed
132
- - [ ] SOC 2 controls affected
133
- - [ ] PCI-DSS requirements considered
134
-
135
- ### Required Approvers
136
- - [ ] Security team member
137
- - [ ] Code owner
138
- - [ ] Platform team (if infrastructure)
139
- ```
140
-
141
- ### Review Checklist Automation
142
-
143
- ```yaml
144
- # .github/workflows/pr-checklist.yml
145
- name: PR Review Checklist
146
- on:
147
- pull_request:
148
- types: [opened, edited, synchronize]
149
-
150
- jobs:
151
- validate-checklist:
152
- runs-on: ubuntu-latest
153
- steps:
154
- - uses: actions/checkout@v4
155
-
156
- - name: Check PR template completion
157
- uses: actions/github-script@v7
158
- with:
159
- script: |
160
- const body = context.payload.pull_request.body || '';
161
-
162
- const requiredSections = [
163
- 'Summary',
164
- 'Type of Change',
165
- 'Testing Done',
166
- 'Security Checklist'
167
- ];
168
-
169
- const missingSections = requiredSections.filter(
170
- section => !body.includes(`## ${section}`)
171
- );
172
-
173
- if (missingSections.length > 0) {
174
- core.setFailed(
175
- `Missing required sections: ${missingSections.join(', ')}`
176
- );
177
- }
178
-
179
- // Check for unchecked security items
180
- const securitySection = body.match(/## Security Checklist[\s\S]*?(?=##|$)/);
181
- if (securitySection) {
182
- const unchecked = (securitySection[0].match(/- \[ \]/g) || []).length;
183
- const checked = (securitySection[0].match(/- \[x\]/gi) || []).length;
184
-
185
- if (unchecked > 0 && checked === 0) {
186
- core.warning('Security checklist not completed');
187
- }
188
- }
189
-
190
- - name: Label PR based on changes
191
- uses: actions/labeler@v5
192
- with:
193
- repo-token: ${{ secrets.GITHUB_TOKEN }}
194
- ```
195
-
196
- ### Auto-Labeling Configuration
197
-
198
- ```yaml
199
- # .github/labeler.yml
200
- frontend:
201
- - changed-files:
202
- - any-glob-to-any-file:
203
- - 'src/components/**'
204
- - 'src/pages/**'
205
- - '**/*.tsx'
206
- - '**/*.css'
207
-
208
- backend:
209
- - changed-files:
210
- - any-glob-to-any-file:
211
- - 'src/api/**'
212
- - 'src/services/**'
213
- - '**/*.py'
214
-
215
- database:
216
- - changed-files:
217
- - any-glob-to-any-file:
218
- - '**/migrations/**'
219
- - '**/*.sql'
220
-
221
- infrastructure:
222
- - changed-files:
223
- - any-glob-to-any-file:
224
- - 'terraform/**'
225
- - 'kubernetes/**'
226
- - '.github/workflows/**'
227
- - 'Dockerfile*'
228
-
229
- security:
230
- - changed-files:
231
- - any-glob-to-any-file:
232
- - '**/auth/**'
233
- - '**/security/**'
234
- - '**/*secret*'
235
- - '**/*password*'
236
-
237
- documentation:
238
- - changed-files:
239
- - any-glob-to-any-file:
240
- - '**/*.md'
241
- - 'docs/**'
242
-
243
- tests:
244
- - changed-files:
245
- - any-glob-to-any-file:
246
- - '**/*.test.*'
247
- - '**/*.spec.*'
248
- - '**/tests/**'
249
- ```
250
-
251
- ### Review Reminder Workflow
252
-
253
- ```yaml
254
- # .github/workflows/pr-reminders.yml
255
- name: PR Review Reminders
256
- on:
257
- schedule:
258
- - cron: '0 9 * * 1-5' # 9 AM weekdays
259
- workflow_dispatch:
260
-
261
- jobs:
262
- remind-reviewers:
263
- runs-on: ubuntu-latest
264
- steps:
265
- - uses: actions/github-script@v7
266
- with:
267
- script: |
268
- const { data: prs } = await github.rest.pulls.list({
269
- owner: context.repo.owner,
270
- repo: context.repo.repo,
271
- state: 'open'
272
- });
273
-
274
- const now = new Date();
275
- const ONE_DAY = 24 * 60 * 60 * 1000;
276
-
277
- for (const pr of prs) {
278
- if (pr.draft) continue;
279
-
280
- const created = new Date(pr.created_at);
281
- const age = (now - created) / ONE_DAY;
282
-
283
- // Remind after 24 hours
284
- if (age > 1 && age < 2) {
285
- await github.rest.issues.createComment({
286
- owner: context.repo.owner,
287
- repo: context.repo.repo,
288
- issue_number: pr.number,
289
- body: ' **Reminder**: This PR has been awaiting review for over 24 hours.'
290
- });
291
- }
292
-
293
- // Escalate after 48 hours
294
- if (age > 2) {
295
- await github.rest.issues.addLabels({
296
- owner: context.repo.owner,
297
- repo: context.repo.repo,
298
- issue_number: pr.number,
299
- labels: ['needs-attention']
300
- });
301
- }
302
- }
303
- ```
304
-
305
- ### Review States Machine
306
-
307
- ```python
308
- """PR Review workflow state machine."""
309
-
310
- from enum import Enum
311
- from dataclasses import dataclass
312
- from typing import List, Optional
313
- from datetime import datetime
314
-
315
- class ReviewState(Enum):
316
- DRAFT = "draft"
317
- READY_FOR_REVIEW = "ready_for_review"
318
- IN_REVIEW = "in_review"
319
- CHANGES_REQUESTED = "changes_requested"
320
- APPROVED = "approved"
321
- NEEDS_SECURITY_REVIEW = "needs_security_review"
322
- SECURITY_APPROVED = "security_approved"
323
- READY_TO_MERGE = "ready_to_merge"
324
- MERGED = "merged"
325
-
326
- @dataclass
327
- class PRWorkflow:
328
- """Manages PR review workflow state."""
329
-
330
- pr_number: int
331
- state: ReviewState = ReviewState.DRAFT
332
- reviewers: List[str] = None
333
- approvals: List[str] = None
334
- security_review_required: bool = False
335
- created_at: datetime = None
336
- last_activity: datetime = None
337
-
338
- def __post_init__(self):
339
- self.reviewers = self.reviewers or []
340
- self.approvals = self.approvals or []
341
- self.created_at = self.created_at or datetime.now()
342
- self.last_activity = self.last_activity or datetime.now()
343
-
344
- def transition(self, new_state: ReviewState) -> bool:
345
- """Transition to new state if valid."""
346
- valid_transitions = {
347
- ReviewState.DRAFT: [ReviewState.READY_FOR_REVIEW],
348
- ReviewState.READY_FOR_REVIEW: [ReviewState.IN_REVIEW, ReviewState.DRAFT],
349
- ReviewState.IN_REVIEW: [
350
- ReviewState.CHANGES_REQUESTED,
351
- ReviewState.APPROVED,
352
- ReviewState.NEEDS_SECURITY_REVIEW
353
- ],
354
- ReviewState.CHANGES_REQUESTED: [ReviewState.IN_REVIEW],
355
- ReviewState.APPROVED: [
356
- ReviewState.READY_TO_MERGE,
357
- ReviewState.NEEDS_SECURITY_REVIEW
358
- ],
359
- ReviewState.NEEDS_SECURITY_REVIEW: [
360
- ReviewState.SECURITY_APPROVED,
361
- ReviewState.CHANGES_REQUESTED
362
- ],
363
- ReviewState.SECURITY_APPROVED: [ReviewState.READY_TO_MERGE],
364
- ReviewState.READY_TO_MERGE: [ReviewState.MERGED],
365
- }
366
-
367
- if new_state in valid_transitions.get(self.state, []):
368
- self.state = new_state
369
- self.last_activity = datetime.now()
370
- return True
371
- return False
372
-
373
- def add_approval(self, reviewer: str) -> None:
374
- """Add reviewer approval."""
375
- if reviewer not in self.approvals:
376
- self.approvals.append(reviewer)
377
- self.last_activity = datetime.now()
378
-
379
- def is_ready_to_merge(self) -> bool:
380
- """Check if PR meets merge criteria."""
381
- min_approvals = 2
382
- has_approvals = len(self.approvals) >= min_approvals
383
-
384
- if self.security_review_required:
385
- return (has_approvals and
386
- self.state == ReviewState.SECURITY_APPROVED)
387
-
388
- return has_approvals and self.state == ReviewState.APPROVED
389
-
390
- def get_blockers(self) -> List[str]:
391
- """Get list of merge blockers."""
392
- blockers = []
393
-
394
- if len(self.approvals) < 2:
395
- blockers.append(f"Need {2 - len(self.approvals)} more approval(s)")
396
-
397
- if self.security_review_required and self.state != ReviewState.SECURITY_APPROVED:
398
- blockers.append("Security review required")
399
-
400
- if self.state == ReviewState.CHANGES_REQUESTED:
401
- blockers.append("Changes requested by reviewer")
402
-
403
- return blockers
404
- ```
405
-
406
- ## Metrics
407
-
408
- | Metric | Target | Description |
409
- |--------|--------|-------------|
410
- | Template compliance | 100% | All PRs use templates |
411
- | Checklist completion | > 90% | Security checklist done |
412
- | Review SLA | < 24 hours | First review time |
413
- | Stale PR count | 0 | No PRs > 7 days |
414
-
415
- ## Connections
416
-
417
- - **Inputs from**: Developer creates PR
418
- - **Outputs to**: Reviewers, quality gates (cr-03)
419
- - **Triggers**: Auto-labeling, reviewer assignment (cr-04)
420
-
421
- ## Best Practices
422
-
423
- 1. Keep PR templates concise but comprehensive
424
- 2. Make security checklist mandatory, not optional
425
- 3. Use auto-labeling to route reviews efficiently
426
- 4. Set up reminders to prevent stale PRs
427
- 5. Track template usage and iterate based on feedback
1
+ # cr-02: PR Review Workflow
2
+
3
+ Structured pull request review process with templates, checklists, and approval workflows.
4
+
5
+ ## Overview
6
+
7
+ A well-defined PR review workflow ensures consistent quality, faster reviews, and clear expectations for both authors and reviewers. This skill provides templates, checklists, and automation for enterprise PR management.
8
+
9
+ ## Capabilities
10
+
11
+ ### PR Templates
12
+ - Standard change template
13
+ - Feature template with design docs
14
+ - Bug fix template with root cause
15
+ - Security-sensitive change template
16
+ - Database migration template
17
+
18
+ ### Review Checklists
19
+ - Functionality verification
20
+ - Security considerations
21
+ - Performance impact
22
+ - Test coverage
23
+ - Documentation updates
24
+
25
+ ### Workflow Automation
26
+ - Auto-labeling based on changes
27
+ - Draft to ready transitions
28
+ - Review reminders
29
+ - Stale PR management
30
+ - Merge queue handling
31
+
32
+ ## Implementation
33
+
34
+ ### PR Template (.github/pull_request_template.md)
35
+
36
+ ```markdown
37
+ ## Summary
38
+ <!-- Describe your changes in 2-3 sentences -->
39
+
40
+ ## Type of Change
41
+ <!-- Check all that apply -->
42
+ - [ ] Bug fix (non-breaking change fixing an issue)
43
+ - [ ] New feature (non-breaking change adding functionality)
44
+ - [ ] Breaking change (fix or feature causing existing functionality to change)
45
+ - [ ] Refactoring (no functional changes)
46
+ - [ ] Documentation update
47
+ - [ ] Configuration change
48
+ - [ ] Security fix
49
+
50
+ ## Related Issues
51
+ <!-- Link any related issues: Fixes #123, Relates to #456 -->
52
+
53
+ ## Changes Made
54
+ <!-- List the main changes -->
55
+ -
56
+ -
57
+ -
58
+
59
+ ## Testing Done
60
+ <!-- Describe testing performed -->
61
+ - [ ] Unit tests added/updated
62
+ - [ ] Integration tests added/updated
63
+ - [ ] Manual testing completed
64
+ - [ ] Test coverage maintained/increased
65
+
66
+ ## Security Checklist
67
+ <!-- For all changes, verify -->
68
+ - [ ] No secrets or credentials committed
69
+ - [ ] No new dependencies with known vulnerabilities
70
+ - [ ] Input validation added where needed
71
+ - [ ] Authentication/authorization unchanged or reviewed
72
+ - [ ] Logging does not expose sensitive data
73
+
74
+ ## Performance Impact
75
+ <!-- Describe any performance implications -->
76
+ - [ ] No performance impact expected
77
+ - [ ] Performance tested (describe results)
78
+ - [ ] New database queries are optimized
79
+ - [ ] No N+1 queries introduced
80
+
81
+ ## Documentation
82
+ - [ ] README updated if needed
83
+ - [ ] API documentation updated
84
+ - [ ] Changelog entry added
85
+ - [ ] Architecture docs updated if needed
86
+
87
+ ## Rollback Plan
88
+ <!-- How to rollback if issues are found -->
89
+
90
+ ## Screenshots (if applicable)
91
+ <!-- Add screenshots for UI changes -->
92
+
93
+ ## Reviewer Notes
94
+ <!-- Any specific areas you'd like reviewers to focus on -->
95
+ ```
96
+
97
+ ### Security-Sensitive PR Template
98
+
99
+ ```markdown
100
+ ## Security Change Request
101
+
102
+ ### Summary
103
+ <!-- Describe the security-related change -->
104
+
105
+ ### Security Impact Assessment
106
+
107
+ **Risk Level**: [ ] Critical [ ] High [ ] Medium [ ] Low
108
+
109
+ **Affected Areas**:
110
+ - [ ] Authentication
111
+ - [ ] Authorization
112
+ - [ ] Data encryption
113
+ - [ ] Input validation
114
+ - [ ] Session management
115
+ - [ ] Logging/Audit
116
+ - [ ] API security
117
+ - [ ] Infrastructure
118
+
119
+ ### Threat Model Update
120
+ <!-- Link to updated threat model or describe changes -->
121
+
122
+ ### Security Review Checklist
123
+ - [ ] OWASP Top 10 considered
124
+ - [ ] STRIDE analysis performed
125
+ - [ ] Security architect reviewed (required for High/Critical)
126
+ - [ ] Pen testing scheduled if needed
127
+ - [ ] Security scanning passed
128
+
129
+ ### Compliance Impact
130
+ - [ ] No compliance impact
131
+ - [ ] GDPR implications reviewed
132
+ - [ ] SOC 2 controls affected
133
+ - [ ] PCI-DSS requirements considered
134
+
135
+ ### Required Approvers
136
+ - [ ] Security team member
137
+ - [ ] Code owner
138
+ - [ ] Platform team (if infrastructure)
139
+ ```
140
+
141
+ ### Review Checklist Automation
142
+
143
+ ```yaml
144
+ # .github/workflows/pr-checklist.yml
145
+ name: PR Review Checklist
146
+ on:
147
+ pull_request:
148
+ types: [opened, edited, synchronize]
149
+
150
+ jobs:
151
+ validate-checklist:
152
+ runs-on: ubuntu-latest
153
+ steps:
154
+ - uses: actions/checkout@v4
155
+
156
+ - name: Check PR template completion
157
+ uses: actions/github-script@v7
158
+ with:
159
+ script: |
160
+ const body = context.payload.pull_request.body || '';
161
+
162
+ const requiredSections = [
163
+ 'Summary',
164
+ 'Type of Change',
165
+ 'Testing Done',
166
+ 'Security Checklist'
167
+ ];
168
+
169
+ const missingSections = requiredSections.filter(
170
+ section => !body.includes(`## ${section}`)
171
+ );
172
+
173
+ if (missingSections.length > 0) {
174
+ core.setFailed(
175
+ `Missing required sections: ${missingSections.join(', ')}`
176
+ );
177
+ }
178
+
179
+ // Check for unchecked security items
180
+ const securitySection = body.match(/## Security Checklist[\s\S]*?(?=##|$)/);
181
+ if (securitySection) {
182
+ const unchecked = (securitySection[0].match(/- \[ \]/g) || []).length;
183
+ const checked = (securitySection[0].match(/- \[x\]/gi) || []).length;
184
+
185
+ if (unchecked > 0 && checked === 0) {
186
+ core.warning('Security checklist not completed');
187
+ }
188
+ }
189
+
190
+ - name: Label PR based on changes
191
+ uses: actions/labeler@v5
192
+ with:
193
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
194
+ ```
195
+
196
+ ### Auto-Labeling Configuration
197
+
198
+ ```yaml
199
+ # .github/labeler.yml
200
+ frontend:
201
+ - changed-files:
202
+ - any-glob-to-any-file:
203
+ - 'src/components/**'
204
+ - 'src/pages/**'
205
+ - '**/*.tsx'
206
+ - '**/*.css'
207
+
208
+ backend:
209
+ - changed-files:
210
+ - any-glob-to-any-file:
211
+ - 'src/api/**'
212
+ - 'src/services/**'
213
+ - '**/*.py'
214
+
215
+ database:
216
+ - changed-files:
217
+ - any-glob-to-any-file:
218
+ - '**/migrations/**'
219
+ - '**/*.sql'
220
+
221
+ infrastructure:
222
+ - changed-files:
223
+ - any-glob-to-any-file:
224
+ - 'terraform/**'
225
+ - 'kubernetes/**'
226
+ - '.github/workflows/**'
227
+ - 'Dockerfile*'
228
+
229
+ security:
230
+ - changed-files:
231
+ - any-glob-to-any-file:
232
+ - '**/auth/**'
233
+ - '**/security/**'
234
+ - '**/*secret*'
235
+ - '**/*password*'
236
+
237
+ documentation:
238
+ - changed-files:
239
+ - any-glob-to-any-file:
240
+ - '**/*.md'
241
+ - 'docs/**'
242
+
243
+ tests:
244
+ - changed-files:
245
+ - any-glob-to-any-file:
246
+ - '**/*.test.*'
247
+ - '**/*.spec.*'
248
+ - '**/tests/**'
249
+ ```
250
+
251
+ ### Review Reminder Workflow
252
+
253
+ ```yaml
254
+ # .github/workflows/pr-reminders.yml
255
+ name: PR Review Reminders
256
+ on:
257
+ schedule:
258
+ - cron: '0 9 * * 1-5' # 9 AM weekdays
259
+ workflow_dispatch:
260
+
261
+ jobs:
262
+ remind-reviewers:
263
+ runs-on: ubuntu-latest
264
+ steps:
265
+ - uses: actions/github-script@v7
266
+ with:
267
+ script: |
268
+ const { data: prs } = await github.rest.pulls.list({
269
+ owner: context.repo.owner,
270
+ repo: context.repo.repo,
271
+ state: 'open'
272
+ });
273
+
274
+ const now = new Date();
275
+ const ONE_DAY = 24 * 60 * 60 * 1000;
276
+
277
+ for (const pr of prs) {
278
+ if (pr.draft) continue;
279
+
280
+ const created = new Date(pr.created_at);
281
+ const age = (now - created) / ONE_DAY;
282
+
283
+ // Remind after 24 hours
284
+ if (age > 1 && age < 2) {
285
+ await github.rest.issues.createComment({
286
+ owner: context.repo.owner,
287
+ repo: context.repo.repo,
288
+ issue_number: pr.number,
289
+ body: ' **Reminder**: This PR has been awaiting review for over 24 hours.'
290
+ });
291
+ }
292
+
293
+ // Escalate after 48 hours
294
+ if (age > 2) {
295
+ await github.rest.issues.addLabels({
296
+ owner: context.repo.owner,
297
+ repo: context.repo.repo,
298
+ issue_number: pr.number,
299
+ labels: ['needs-attention']
300
+ });
301
+ }
302
+ }
303
+ ```
304
+
305
+ ### Review States Machine
306
+
307
+ ```python
308
+ """PR Review workflow state machine."""
309
+
310
+ from enum import Enum
311
+ from dataclasses import dataclass
312
+ from typing import List, Optional
313
+ from datetime import datetime
314
+
315
+ class ReviewState(Enum):
316
+ DRAFT = "draft"
317
+ READY_FOR_REVIEW = "ready_for_review"
318
+ IN_REVIEW = "in_review"
319
+ CHANGES_REQUESTED = "changes_requested"
320
+ APPROVED = "approved"
321
+ NEEDS_SECURITY_REVIEW = "needs_security_review"
322
+ SECURITY_APPROVED = "security_approved"
323
+ READY_TO_MERGE = "ready_to_merge"
324
+ MERGED = "merged"
325
+
326
+ @dataclass
327
+ class PRWorkflow:
328
+ """Manages PR review workflow state."""
329
+
330
+ pr_number: int
331
+ state: ReviewState = ReviewState.DRAFT
332
+ reviewers: List[str] = None
333
+ approvals: List[str] = None
334
+ security_review_required: bool = False
335
+ created_at: datetime = None
336
+ last_activity: datetime = None
337
+
338
+ def __post_init__(self):
339
+ self.reviewers = self.reviewers or []
340
+ self.approvals = self.approvals or []
341
+ self.created_at = self.created_at or datetime.now()
342
+ self.last_activity = self.last_activity or datetime.now()
343
+
344
+ def transition(self, new_state: ReviewState) -> bool:
345
+ """Transition to new state if valid."""
346
+ valid_transitions = {
347
+ ReviewState.DRAFT: [ReviewState.READY_FOR_REVIEW],
348
+ ReviewState.READY_FOR_REVIEW: [ReviewState.IN_REVIEW, ReviewState.DRAFT],
349
+ ReviewState.IN_REVIEW: [
350
+ ReviewState.CHANGES_REQUESTED,
351
+ ReviewState.APPROVED,
352
+ ReviewState.NEEDS_SECURITY_REVIEW
353
+ ],
354
+ ReviewState.CHANGES_REQUESTED: [ReviewState.IN_REVIEW],
355
+ ReviewState.APPROVED: [
356
+ ReviewState.READY_TO_MERGE,
357
+ ReviewState.NEEDS_SECURITY_REVIEW
358
+ ],
359
+ ReviewState.NEEDS_SECURITY_REVIEW: [
360
+ ReviewState.SECURITY_APPROVED,
361
+ ReviewState.CHANGES_REQUESTED
362
+ ],
363
+ ReviewState.SECURITY_APPROVED: [ReviewState.READY_TO_MERGE],
364
+ ReviewState.READY_TO_MERGE: [ReviewState.MERGED],
365
+ }
366
+
367
+ if new_state in valid_transitions.get(self.state, []):
368
+ self.state = new_state
369
+ self.last_activity = datetime.now()
370
+ return True
371
+ return False
372
+
373
+ def add_approval(self, reviewer: str) -> None:
374
+ """Add reviewer approval."""
375
+ if reviewer not in self.approvals:
376
+ self.approvals.append(reviewer)
377
+ self.last_activity = datetime.now()
378
+
379
+ def is_ready_to_merge(self) -> bool:
380
+ """Check if PR meets merge criteria."""
381
+ min_approvals = 2
382
+ has_approvals = len(self.approvals) >= min_approvals
383
+
384
+ if self.security_review_required:
385
+ return (has_approvals and
386
+ self.state == ReviewState.SECURITY_APPROVED)
387
+
388
+ return has_approvals and self.state == ReviewState.APPROVED
389
+
390
+ def get_blockers(self) -> List[str]:
391
+ """Get list of merge blockers."""
392
+ blockers = []
393
+
394
+ if len(self.approvals) < 2:
395
+ blockers.append(f"Need {2 - len(self.approvals)} more approval(s)")
396
+
397
+ if self.security_review_required and self.state != ReviewState.SECURITY_APPROVED:
398
+ blockers.append("Security review required")
399
+
400
+ if self.state == ReviewState.CHANGES_REQUESTED:
401
+ blockers.append("Changes requested by reviewer")
402
+
403
+ return blockers
404
+ ```
405
+
406
+ ## Metrics
407
+
408
+ | Metric | Target | Description |
409
+ |--------|--------|-------------|
410
+ | Template compliance | 100% | All PRs use templates |
411
+ | Checklist completion | > 90% | Security checklist done |
412
+ | Review SLA | < 24 hours | First review time |
413
+ | Stale PR count | 0 | No PRs > 7 days |
414
+
415
+ ## Connections
416
+
417
+ - **Inputs from**: Developer creates PR
418
+ - **Outputs to**: Reviewers, quality gates (cr-03)
419
+ - **Triggers**: Auto-labeling, reviewer assignment (cr-04)
420
+
421
+ ## Best Practices
422
+
423
+ 1. Keep PR templates concise but comprehensive
424
+ 2. Make security checklist mandatory, not optional
425
+ 3. Use auto-labeling to route reviews efficiently
426
+ 4. Set up reminders to prevent stale PRs
427
+ 5. Track template usage and iterate based on feedback