tech-hub-skills 1.0.0
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.
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/bin/cli.js +241 -0
- package/bin/copilot.js +182 -0
- package/bin/postinstall.js +42 -0
- package/package.json +46 -0
- package/tech_hub_skills/roles/ai-engineer/skills/01-prompt-engineering/README.md +252 -0
- package/tech_hub_skills/roles/ai-engineer/skills/02-rag-pipeline/README.md +448 -0
- package/tech_hub_skills/roles/ai-engineer/skills/03-agent-orchestration/README.md +599 -0
- package/tech_hub_skills/roles/ai-engineer/skills/04-llm-guardrails/README.md +735 -0
- package/tech_hub_skills/roles/ai-engineer/skills/05-vector-embeddings/README.md +711 -0
- package/tech_hub_skills/roles/ai-engineer/skills/06-llm-evaluation/README.md +777 -0
- package/tech_hub_skills/roles/azure/skills/01-infrastructure-fundamentals/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/02-data-factory/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/03-synapse-analytics/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/04-databricks/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/05-functions/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/06-kubernetes-service/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/07-openai-service/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/08-machine-learning/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/09-storage-adls/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/10-networking/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/11-sql-cosmos/README.md +264 -0
- package/tech_hub_skills/roles/azure/skills/12-event-hubs/README.md +264 -0
- package/tech_hub_skills/roles/code-review/skills/01-automated-code-review/README.md +394 -0
- package/tech_hub_skills/roles/code-review/skills/02-pr-review-workflow/README.md +427 -0
- package/tech_hub_skills/roles/code-review/skills/03-code-quality-gates/README.md +518 -0
- package/tech_hub_skills/roles/code-review/skills/04-reviewer-assignment/README.md +504 -0
- package/tech_hub_skills/roles/code-review/skills/05-review-analytics/README.md +540 -0
- package/tech_hub_skills/roles/data-engineer/skills/01-lakehouse-architecture/README.md +550 -0
- package/tech_hub_skills/roles/data-engineer/skills/02-etl-pipeline/README.md +580 -0
- package/tech_hub_skills/roles/data-engineer/skills/03-data-quality/README.md +579 -0
- package/tech_hub_skills/roles/data-engineer/skills/04-streaming-pipelines/README.md +608 -0
- package/tech_hub_skills/roles/data-engineer/skills/05-performance-optimization/README.md +547 -0
- package/tech_hub_skills/roles/data-governance/skills/01-data-catalog/README.md +112 -0
- package/tech_hub_skills/roles/data-governance/skills/02-data-lineage/README.md +129 -0
- package/tech_hub_skills/roles/data-governance/skills/03-data-quality-framework/README.md +182 -0
- package/tech_hub_skills/roles/data-governance/skills/04-access-control/README.md +39 -0
- package/tech_hub_skills/roles/data-governance/skills/05-master-data-management/README.md +40 -0
- package/tech_hub_skills/roles/data-governance/skills/06-compliance-privacy/README.md +46 -0
- package/tech_hub_skills/roles/data-scientist/skills/01-eda-automation/README.md +230 -0
- package/tech_hub_skills/roles/data-scientist/skills/02-statistical-modeling/README.md +264 -0
- package/tech_hub_skills/roles/data-scientist/skills/03-feature-engineering/README.md +264 -0
- package/tech_hub_skills/roles/data-scientist/skills/04-predictive-modeling/README.md +264 -0
- package/tech_hub_skills/roles/data-scientist/skills/05-customer-analytics/README.md +264 -0
- package/tech_hub_skills/roles/data-scientist/skills/06-campaign-analysis/README.md +264 -0
- package/tech_hub_skills/roles/data-scientist/skills/07-experimentation/README.md +264 -0
- package/tech_hub_skills/roles/data-scientist/skills/08-data-visualization/README.md +264 -0
- package/tech_hub_skills/roles/devops/skills/01-cicd-pipeline/README.md +264 -0
- package/tech_hub_skills/roles/devops/skills/02-container-orchestration/README.md +264 -0
- package/tech_hub_skills/roles/devops/skills/03-infrastructure-as-code/README.md +264 -0
- package/tech_hub_skills/roles/devops/skills/04-gitops/README.md +264 -0
- package/tech_hub_skills/roles/devops/skills/05-environment-management/README.md +264 -0
- package/tech_hub_skills/roles/devops/skills/06-automated-testing/README.md +264 -0
- package/tech_hub_skills/roles/devops/skills/07-release-management/README.md +264 -0
- package/tech_hub_skills/roles/devops/skills/08-monitoring-alerting/README.md +264 -0
- package/tech_hub_skills/roles/devops/skills/09-devsecops/README.md +265 -0
- package/tech_hub_skills/roles/finops/skills/01-cost-visibility/README.md +264 -0
- package/tech_hub_skills/roles/finops/skills/02-resource-tagging/README.md +264 -0
- package/tech_hub_skills/roles/finops/skills/03-budget-management/README.md +264 -0
- package/tech_hub_skills/roles/finops/skills/04-reserved-instances/README.md +264 -0
- package/tech_hub_skills/roles/finops/skills/05-spot-optimization/README.md +264 -0
- package/tech_hub_skills/roles/finops/skills/06-storage-tiering/README.md +264 -0
- package/tech_hub_skills/roles/finops/skills/07-compute-rightsizing/README.md +264 -0
- package/tech_hub_skills/roles/finops/skills/08-chargeback/README.md +264 -0
- package/tech_hub_skills/roles/ml-engineer/skills/01-mlops-pipeline/README.md +566 -0
- package/tech_hub_skills/roles/ml-engineer/skills/02-feature-engineering/README.md +655 -0
- package/tech_hub_skills/roles/ml-engineer/skills/03-model-training/README.md +704 -0
- package/tech_hub_skills/roles/ml-engineer/skills/04-model-serving/README.md +845 -0
- package/tech_hub_skills/roles/ml-engineer/skills/05-model-monitoring/README.md +874 -0
- package/tech_hub_skills/roles/mlops/skills/01-ml-pipeline-orchestration/README.md +264 -0
- package/tech_hub_skills/roles/mlops/skills/02-experiment-tracking/README.md +264 -0
- package/tech_hub_skills/roles/mlops/skills/03-model-registry/README.md +264 -0
- package/tech_hub_skills/roles/mlops/skills/04-feature-store/README.md +264 -0
- package/tech_hub_skills/roles/mlops/skills/05-model-deployment/README.md +264 -0
- package/tech_hub_skills/roles/mlops/skills/06-model-observability/README.md +264 -0
- package/tech_hub_skills/roles/mlops/skills/07-data-versioning/README.md +264 -0
- package/tech_hub_skills/roles/mlops/skills/08-ab-testing/README.md +264 -0
- package/tech_hub_skills/roles/mlops/skills/09-automated-retraining/README.md +264 -0
- package/tech_hub_skills/roles/platform-engineer/skills/01-internal-developer-platform/README.md +153 -0
- package/tech_hub_skills/roles/platform-engineer/skills/02-self-service-infrastructure/README.md +57 -0
- package/tech_hub_skills/roles/platform-engineer/skills/03-slo-sli-management/README.md +59 -0
- package/tech_hub_skills/roles/platform-engineer/skills/04-developer-experience/README.md +57 -0
- package/tech_hub_skills/roles/platform-engineer/skills/05-incident-management/README.md +73 -0
- package/tech_hub_skills/roles/platform-engineer/skills/06-capacity-management/README.md +59 -0
- package/tech_hub_skills/roles/product-designer/skills/01-requirements-discovery/README.md +407 -0
- package/tech_hub_skills/roles/product-designer/skills/02-user-research/README.md +382 -0
- package/tech_hub_skills/roles/product-designer/skills/03-brainstorming-ideation/README.md +437 -0
- package/tech_hub_skills/roles/product-designer/skills/04-ux-design/README.md +496 -0
- package/tech_hub_skills/roles/product-designer/skills/05-product-market-fit/README.md +376 -0
- package/tech_hub_skills/roles/product-designer/skills/06-stakeholder-management/README.md +412 -0
- package/tech_hub_skills/roles/security-architect/skills/01-pii-detection/README.md +319 -0
- package/tech_hub_skills/roles/security-architect/skills/02-threat-modeling/README.md +264 -0
- package/tech_hub_skills/roles/security-architect/skills/03-infrastructure-security/README.md +264 -0
- package/tech_hub_skills/roles/security-architect/skills/04-iam/README.md +264 -0
- package/tech_hub_skills/roles/security-architect/skills/05-application-security/README.md +264 -0
- package/tech_hub_skills/roles/security-architect/skills/06-secrets-management/README.md +264 -0
- package/tech_hub_skills/roles/security-architect/skills/07-security-monitoring/README.md +264 -0
- package/tech_hub_skills/roles/system-design/skills/01-architecture-patterns/README.md +337 -0
- package/tech_hub_skills/roles/system-design/skills/02-requirements-engineering/README.md +264 -0
- package/tech_hub_skills/roles/system-design/skills/03-scalability/README.md +264 -0
- package/tech_hub_skills/roles/system-design/skills/04-high-availability/README.md +264 -0
- package/tech_hub_skills/roles/system-design/skills/05-cost-optimization-design/README.md +264 -0
- package/tech_hub_skills/roles/system-design/skills/06-api-design/README.md +264 -0
- package/tech_hub_skills/roles/system-design/skills/07-observability-architecture/README.md +264 -0
- package/tech_hub_skills/roles/system-design/skills/08-process-automation/PROCESS_TEMPLATE.md +336 -0
- package/tech_hub_skills/roles/system-design/skills/08-process-automation/README.md +521 -0
- package/tech_hub_skills/skills/README.md +336 -0
- package/tech_hub_skills/skills/ai-engineer.md +104 -0
- package/tech_hub_skills/skills/azure.md +149 -0
- package/tech_hub_skills/skills/code-review.md +399 -0
- package/tech_hub_skills/skills/compliance-automation.md +747 -0
- package/tech_hub_skills/skills/data-engineer.md +113 -0
- package/tech_hub_skills/skills/data-governance.md +102 -0
- package/tech_hub_skills/skills/data-scientist.md +123 -0
- package/tech_hub_skills/skills/devops.md +160 -0
- package/tech_hub_skills/skills/docker.md +160 -0
- package/tech_hub_skills/skills/enterprise-dashboard.md +613 -0
- package/tech_hub_skills/skills/finops.md +184 -0
- package/tech_hub_skills/skills/ml-engineer.md +115 -0
- package/tech_hub_skills/skills/mlops.md +187 -0
- package/tech_hub_skills/skills/optimization-advisor.md +329 -0
- package/tech_hub_skills/skills/orchestrator.md +497 -0
- package/tech_hub_skills/skills/platform-engineer.md +102 -0
- package/tech_hub_skills/skills/process-automation.md +226 -0
- package/tech_hub_skills/skills/process-changelog.md +184 -0
- package/tech_hub_skills/skills/process-documentation.md +484 -0
- package/tech_hub_skills/skills/process-kanban.md +324 -0
- package/tech_hub_skills/skills/process-versioning.md +214 -0
- package/tech_hub_skills/skills/product-designer.md +104 -0
- package/tech_hub_skills/skills/project-starter.md +443 -0
- package/tech_hub_skills/skills/security-architect.md +135 -0
- package/tech_hub_skills/skills/system-design.md +126 -0
|
@@ -0,0 +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
|