Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "engineer-expertise-extractor",
|
||||||
|
"description": "Research and extract an engineer's coding style, patterns, and best practices from their GitHub contributions. Creates structured knowledge base for replicating their expertise.",
|
||||||
|
"version": "0.0.0-2025.11.28",
|
||||||
|
"author": {
|
||||||
|
"name": "James Rochabrun",
|
||||||
|
"email": "jamesrochabrun@gmail.com"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./skills/engineer-expertise-extractor"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# engineer-expertise-extractor
|
||||||
|
|
||||||
|
Research and extract an engineer's coding style, patterns, and best practices from their GitHub contributions. Creates structured knowledge base for replicating their expertise.
|
||||||
48
plugin.lock.json
Normal file
48
plugin.lock.json
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:jamesrochabrun/skills:engineer-expertise-extractor",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "e1dc9f46a4e54755eb600ba5700333189314c16e",
|
||||||
|
"treeHash": "139f221c3d9b2cff87f4e1e23a2cfb0ae12c0fe294380a4962cf33ae213b605b",
|
||||||
|
"generatedAt": "2025-11-28T10:17:47.269090Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "engineer-expertise-extractor",
|
||||||
|
"description": "Research and extract an engineer's coding style, patterns, and best practices from their GitHub contributions. Creates structured knowledge base for replicating their expertise."
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "de3fadb15ae28e93c2efecce5a06f656992b3a90f01b1124972737c2cc93443e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "04e70b25fc0c5f7fc0c295534f24f47b36672e2e150995772eb361697a1969a2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/engineer-expertise-extractor/SKILL.md",
|
||||||
|
"sha256": "1fa0e2fcc60ac60e7b4db7b1e93aba93624ad8fd34ba25601b29f149d384d2ff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/engineer-expertise-extractor/scripts/extract_engineer.sh",
|
||||||
|
"sha256": "3fd76ef39495e703e11478102693accc0d8180db767482215dd48f8639b88d52"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "139f221c3d9b2cff87f4e1e23a2cfb0ae12c0fe294380a4962cf33ae213b605b"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
638
skills/engineer-expertise-extractor/SKILL.md
Normal file
638
skills/engineer-expertise-extractor/SKILL.md
Normal file
@@ -0,0 +1,638 @@
|
|||||||
|
---
|
||||||
|
name: engineer-expertise-extractor
|
||||||
|
description: Research and extract an engineer's coding style, patterns, and best practices from their GitHub contributions. Creates structured knowledge base for replicating their expertise.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Engineer Expertise Extractor
|
||||||
|
|
||||||
|
Extract and document an engineer's coding expertise by analyzing their GitHub contributions, creating a structured knowledge base that captures their coding style, patterns, best practices, and architectural decisions.
|
||||||
|
|
||||||
|
## What This Skill Does
|
||||||
|
|
||||||
|
Researches an engineer's work to create a "digital mentor" by:
|
||||||
|
- **Analyzing Pull Requests** - Extract code patterns, review style, decisions
|
||||||
|
- **Extracting Coding Style** - Document their preferences and conventions
|
||||||
|
- **Identifying Patterns** - Common solutions and approaches they use
|
||||||
|
- **Capturing Best Practices** - Their quality standards and guidelines
|
||||||
|
- **Organizing Examples** - Real code samples from their work
|
||||||
|
- **Documenting Decisions** - Architectural choices and reasoning
|
||||||
|
|
||||||
|
## Why This Matters
|
||||||
|
|
||||||
|
**Knowledge Preservation:**
|
||||||
|
- Capture expert knowledge before they leave
|
||||||
|
- Document tribal knowledge
|
||||||
|
- Create mentorship materials
|
||||||
|
- Onboard new engineers faster
|
||||||
|
|
||||||
|
**Consistency:**
|
||||||
|
- Align team coding standards
|
||||||
|
- Replicate expert approaches
|
||||||
|
- Maintain code quality
|
||||||
|
- Scale expertise across team
|
||||||
|
|
||||||
|
**Learning:**
|
||||||
|
- Learn from senior engineers
|
||||||
|
- Understand decision-making
|
||||||
|
- See real-world patterns
|
||||||
|
- Improve code quality
|
||||||
|
|
||||||
|
## How It Works
|
||||||
|
|
||||||
|
### 1. Research Phase
|
||||||
|
Using GitHub CLI (`gh`), the skill:
|
||||||
|
- Fetches engineer's pull requests
|
||||||
|
- Analyzes code changes
|
||||||
|
- Reviews their comments and feedback
|
||||||
|
- Extracts patterns and conventions
|
||||||
|
- Identifies their expertise areas
|
||||||
|
|
||||||
|
### 2. Analysis Phase
|
||||||
|
Categorizes findings into:
|
||||||
|
- **Coding Style** - Formatting, naming, structure
|
||||||
|
- **Patterns** - Common solutions and approaches
|
||||||
|
- **Best Practices** - Quality guidelines
|
||||||
|
- **Architecture** - Design decisions
|
||||||
|
- **Testing** - Testing approaches
|
||||||
|
- **Code Review** - Feedback patterns
|
||||||
|
- **Documentation** - Doc style and practices
|
||||||
|
|
||||||
|
### 3. Organization Phase
|
||||||
|
Creates structured folders:
|
||||||
|
```
|
||||||
|
engineer_profiles/
|
||||||
|
└── [engineer_name]/
|
||||||
|
├── README.md (overview)
|
||||||
|
├── coding_style/
|
||||||
|
│ ├── languages/
|
||||||
|
│ ├── naming_conventions.md
|
||||||
|
│ ├── code_structure.md
|
||||||
|
│ └── formatting_preferences.md
|
||||||
|
├── patterns/
|
||||||
|
│ ├── common_solutions.md
|
||||||
|
│ ├── design_patterns.md
|
||||||
|
│ └── code_examples/
|
||||||
|
├── best_practices/
|
||||||
|
│ ├── code_quality.md
|
||||||
|
│ ├── testing_approach.md
|
||||||
|
│ ├── performance.md
|
||||||
|
│ └── security.md
|
||||||
|
├── architecture/
|
||||||
|
│ ├── design_decisions.md
|
||||||
|
│ ├── tech_choices.md
|
||||||
|
│ └── trade_offs.md
|
||||||
|
├── code_review/
|
||||||
|
│ ├── feedback_style.md
|
||||||
|
│ ├── common_suggestions.md
|
||||||
|
│ └── review_examples.md
|
||||||
|
└── examples/
|
||||||
|
├── by_language/
|
||||||
|
├── by_pattern/
|
||||||
|
└── notable_prs/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output Structure
|
||||||
|
|
||||||
|
### Engineer Profile README
|
||||||
|
|
||||||
|
**Contains:**
|
||||||
|
- Engineer overview
|
||||||
|
- Areas of expertise
|
||||||
|
- Languages and technologies
|
||||||
|
- Key contributions
|
||||||
|
- Coding philosophy
|
||||||
|
- How to use this profile
|
||||||
|
|
||||||
|
### Coding Style Documentation
|
||||||
|
|
||||||
|
**Captures:**
|
||||||
|
- Naming conventions (variables, functions, classes)
|
||||||
|
- Code structure preferences
|
||||||
|
- File organization
|
||||||
|
- Comment style
|
||||||
|
- Formatting preferences
|
||||||
|
- Language-specific idioms
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
# Coding Style: [Engineer Name]
|
||||||
|
|
||||||
|
## Naming Conventions
|
||||||
|
|
||||||
|
### Variables
|
||||||
|
- Use descriptive names: `userAuthentication` not `ua`
|
||||||
|
- Boolean variables: `isActive`, `hasPermission`, `canEdit`
|
||||||
|
- Collections: plural names `users`, `items`, `transactions`
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
- Verb-first: `getUserById`, `validateInput`, `calculateTotal`
|
||||||
|
- Pure functions preferred
|
||||||
|
- Single responsibility
|
||||||
|
|
||||||
|
### Classes
|
||||||
|
- PascalCase: `UserService`, `PaymentProcessor`
|
||||||
|
- Interface prefix: `IUserRepository`
|
||||||
|
- Concrete implementations: `MongoUserRepository`
|
||||||
|
|
||||||
|
## Code Structure
|
||||||
|
|
||||||
|
### File Organization
|
||||||
|
- One class per file
|
||||||
|
- Related functions grouped together
|
||||||
|
- Tests alongside implementation
|
||||||
|
- Clear separation of concerns
|
||||||
|
|
||||||
|
### Function Length
|
||||||
|
- Max 20-30 lines preferred
|
||||||
|
- Extract helper functions
|
||||||
|
- Single level of abstraction
|
||||||
|
```
|
||||||
|
|
||||||
|
### Patterns Documentation
|
||||||
|
|
||||||
|
**Captures:**
|
||||||
|
- Recurring solutions
|
||||||
|
- Design patterns used
|
||||||
|
- Architectural patterns
|
||||||
|
- Problem-solving approaches
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
# Common Patterns: [Engineer Name]
|
||||||
|
|
||||||
|
## Dependency Injection
|
||||||
|
|
||||||
|
Used consistently across services:
|
||||||
|
|
||||||
|
\`\`\`typescript
|
||||||
|
// Pattern: Constructor injection
|
||||||
|
class UserService {
|
||||||
|
constructor(
|
||||||
|
private readonly userRepo: IUserRepository,
|
||||||
|
private readonly logger: ILogger
|
||||||
|
) {}
|
||||||
|
}
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
**Why:** Testability, loose coupling, clear dependencies
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
Consistent error handling approach:
|
||||||
|
|
||||||
|
\`\`\`typescript
|
||||||
|
// Pattern: Custom error types + global handler
|
||||||
|
class ValidationError extends Error {
|
||||||
|
constructor(message: string) {
|
||||||
|
super(message);
|
||||||
|
this.name = 'ValidationError';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Usage
|
||||||
|
if (!isValid(input)) {
|
||||||
|
throw new ValidationError('Invalid input format');
|
||||||
|
}
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
**Why:** Type-safe errors, centralized handling, clear debugging
|
||||||
|
```
|
||||||
|
|
||||||
|
### Best Practices Documentation
|
||||||
|
|
||||||
|
**Captures:**
|
||||||
|
- Quality standards
|
||||||
|
- Testing approaches
|
||||||
|
- Performance guidelines
|
||||||
|
- Security practices
|
||||||
|
- Documentation standards
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
# Best Practices: [Engineer Name]
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
### Unit Test Structure
|
||||||
|
- AAA pattern (Arrange, Act, Assert)
|
||||||
|
- One assertion per test preferred
|
||||||
|
- Test names describe behavior
|
||||||
|
- Mock external dependencies
|
||||||
|
|
||||||
|
\`\`\`typescript
|
||||||
|
describe('UserService', () => {
|
||||||
|
describe('createUser', () => {
|
||||||
|
it('should create user with valid data', async () => {
|
||||||
|
// Arrange
|
||||||
|
const userData = { email: 'test@example.com', name: 'Test' };
|
||||||
|
const mockRepo = createMockRepository();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const result = await userService.createUser(userData);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(result.id).toBeDefined();
|
||||||
|
expect(result.email).toBe(userData.email);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
### Test Coverage
|
||||||
|
- Aim for 80%+ coverage
|
||||||
|
- 100% coverage for critical paths
|
||||||
|
- Integration tests for APIs
|
||||||
|
- E2E tests for user flows
|
||||||
|
|
||||||
|
## Code Review Standards
|
||||||
|
|
||||||
|
### What to Check
|
||||||
|
- [ ] Tests included and passing
|
||||||
|
- [ ] No console.logs remaining
|
||||||
|
- [ ] Error handling present
|
||||||
|
- [ ] Comments explain "why" not "what"
|
||||||
|
- [ ] No hardcoded values
|
||||||
|
- [ ] Security considerations addressed
|
||||||
|
```
|
||||||
|
|
||||||
|
### Architecture Documentation
|
||||||
|
|
||||||
|
**Captures:**
|
||||||
|
- Design decisions
|
||||||
|
- Technology choices
|
||||||
|
- Trade-offs made
|
||||||
|
- System design approaches
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
# Architectural Decisions: [Engineer Name]
|
||||||
|
|
||||||
|
## Decision: Microservices vs Monolith
|
||||||
|
|
||||||
|
**Context:** Scaling user service
|
||||||
|
**Decision:** Start monolith, extract services when needed
|
||||||
|
**Reasoning:**
|
||||||
|
- Team size: 5 engineers
|
||||||
|
- Product stage: MVP
|
||||||
|
- Premature optimization risk
|
||||||
|
- Easier debugging and deployment
|
||||||
|
|
||||||
|
**Trade-offs:**
|
||||||
|
- Monolith pros: Simpler, faster development
|
||||||
|
- Monolith cons: Harder to scale later
|
||||||
|
- Decision: Optimize for current needs, refactor when hitting limits
|
||||||
|
|
||||||
|
## Decision: REST vs GraphQL
|
||||||
|
|
||||||
|
**Context:** API design for mobile app
|
||||||
|
**Decision:** REST with versioning
|
||||||
|
**Reasoning:**
|
||||||
|
- Team familiar with REST
|
||||||
|
- Simple use cases
|
||||||
|
- Caching easier
|
||||||
|
- Over-fetching not a problem yet
|
||||||
|
|
||||||
|
**When to reconsider:** If frontend needs complex queries
|
||||||
|
```
|
||||||
|
|
||||||
|
### Code Review Documentation
|
||||||
|
|
||||||
|
**Captures:**
|
||||||
|
- Feedback patterns
|
||||||
|
- Review approach
|
||||||
|
- Common suggestions
|
||||||
|
- Communication style
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
```markdown
|
||||||
|
# Code Review Style: [Engineer Name]
|
||||||
|
|
||||||
|
## Review Approach
|
||||||
|
|
||||||
|
### Priority Order
|
||||||
|
1. Security vulnerabilities
|
||||||
|
2. Logic errors
|
||||||
|
3. Test coverage
|
||||||
|
4. Code structure
|
||||||
|
5. Naming and style
|
||||||
|
|
||||||
|
### Feedback Style
|
||||||
|
- Specific and constructive
|
||||||
|
- Explains "why" behind suggestions
|
||||||
|
- Provides examples
|
||||||
|
- Asks questions to understand reasoning
|
||||||
|
|
||||||
|
### Common Suggestions
|
||||||
|
|
||||||
|
**Security:**
|
||||||
|
- "Consider input validation here"
|
||||||
|
- "This query is vulnerable to SQL injection"
|
||||||
|
- "Should we rate-limit this endpoint?"
|
||||||
|
|
||||||
|
**Performance:**
|
||||||
|
- "This N+1 query could be optimized with a join"
|
||||||
|
- "Consider caching this expensive operation"
|
||||||
|
- "Memoize this pure function"
|
||||||
|
|
||||||
|
**Testing:**
|
||||||
|
- "Can we add a test for the error case?"
|
||||||
|
- "What happens if the API returns null?"
|
||||||
|
- "Let's test the boundary conditions"
|
||||||
|
|
||||||
|
**Code Quality:**
|
||||||
|
- "Can we extract this into a helper function?"
|
||||||
|
- "This function is doing too many things"
|
||||||
|
- "Consider a more descriptive variable name"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using This Skill
|
||||||
|
|
||||||
|
### Extract Engineer Profile
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/extract_engineer.sh [github-username]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Interactive workflow:**
|
||||||
|
1. Enter GitHub username
|
||||||
|
2. Select repository scope (all/specific org)
|
||||||
|
3. Choose analysis depth (last N PRs)
|
||||||
|
4. Specify focus areas (languages, topics)
|
||||||
|
5. Extract and organize findings
|
||||||
|
|
||||||
|
**Output:** Structured profile in `engineer_profiles/[username]/`
|
||||||
|
|
||||||
|
### Analyze Specific Repository
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/analyze_repo.sh [repo-url] [engineer-username]
|
||||||
|
```
|
||||||
|
|
||||||
|
Focuses analysis on specific repository contributions.
|
||||||
|
|
||||||
|
### Update Existing Profile
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/update_profile.sh [engineer-username]
|
||||||
|
```
|
||||||
|
|
||||||
|
Adds new PRs and updates existing profile.
|
||||||
|
|
||||||
|
## Research Sources
|
||||||
|
|
||||||
|
### GitHub CLI Queries
|
||||||
|
|
||||||
|
**Pull Requests:**
|
||||||
|
```bash
|
||||||
|
gh pr list --author [username] --limit 100 --state all
|
||||||
|
gh pr view [pr-number] --json title,body,files,reviews,comments
|
||||||
|
```
|
||||||
|
|
||||||
|
**Code Changes:**
|
||||||
|
```bash
|
||||||
|
gh pr diff [pr-number]
|
||||||
|
gh api repos/{owner}/{repo}/pulls/{pr}/files
|
||||||
|
```
|
||||||
|
|
||||||
|
**Reviews:**
|
||||||
|
```bash
|
||||||
|
gh pr view [pr-number] --comments
|
||||||
|
gh api repos/{owner}/{repo}/pulls/{pr}/reviews
|
||||||
|
```
|
||||||
|
|
||||||
|
**Commits:**
|
||||||
|
```bash
|
||||||
|
gh api search/commits --author [username]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Analysis Techniques
|
||||||
|
|
||||||
|
**Pattern Recognition:**
|
||||||
|
- Identify recurring code structures
|
||||||
|
- Extract common solutions
|
||||||
|
- Detect naming patterns
|
||||||
|
- Find architectural choices
|
||||||
|
|
||||||
|
**Style Extraction:**
|
||||||
|
- Analyze formatting consistency
|
||||||
|
- Extract naming conventions
|
||||||
|
- Identify comment patterns
|
||||||
|
- Detect structural preferences
|
||||||
|
|
||||||
|
**Best Practice Identification:**
|
||||||
|
- Look for testing patterns
|
||||||
|
- Find error handling approaches
|
||||||
|
- Identify security practices
|
||||||
|
- Extract performance optimizations
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
### 1. Onboarding New Engineers
|
||||||
|
|
||||||
|
**Problem:** New engineer needs to learn team standards
|
||||||
|
**Solution:** Provide senior engineer's profile as reference
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- Real examples from codebase
|
||||||
|
- Understand team conventions
|
||||||
|
- See decision-making process
|
||||||
|
- Learn best practices
|
||||||
|
|
||||||
|
### 2. Code Review Training
|
||||||
|
|
||||||
|
**Problem:** Teaching good code review skills
|
||||||
|
**Solution:** Study experienced reviewer's feedback patterns
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- Learn what to look for
|
||||||
|
- Understand feedback style
|
||||||
|
- See common issues
|
||||||
|
- Improve review quality
|
||||||
|
|
||||||
|
### 3. Knowledge Transfer
|
||||||
|
|
||||||
|
**Problem:** Senior engineer leaving, knowledge lost
|
||||||
|
**Solution:** Extract their expertise before departure
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- Preserve tribal knowledge
|
||||||
|
- Document decisions
|
||||||
|
- Maintain code quality
|
||||||
|
- Reduce bus factor
|
||||||
|
|
||||||
|
### 4. Establishing Team Standards
|
||||||
|
|
||||||
|
**Problem:** Inconsistent coding styles across team
|
||||||
|
**Solution:** Extract patterns from best engineers, create standards
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- Evidence-based standards
|
||||||
|
- Real-world examples
|
||||||
|
- Buy-in from team
|
||||||
|
- Consistent codebase
|
||||||
|
|
||||||
|
### 5. AI Agent Training
|
||||||
|
|
||||||
|
**Problem:** Agent needs to code like specific engineer
|
||||||
|
**Solution:** Provide extracted profile to agent
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- Match expert's style
|
||||||
|
- Follow their patterns
|
||||||
|
- Apply their best practices
|
||||||
|
- Maintain consistency
|
||||||
|
|
||||||
|
## Profile Usage by Agents
|
||||||
|
|
||||||
|
When an agent has access to an engineer profile, it can:
|
||||||
|
|
||||||
|
**Code Generation:**
|
||||||
|
- Follow extracted naming conventions
|
||||||
|
- Use identified patterns
|
||||||
|
- Apply documented best practices
|
||||||
|
- Match architectural style
|
||||||
|
|
||||||
|
**Code Review:**
|
||||||
|
- Provide feedback in engineer's style
|
||||||
|
- Check for common issues they'd catch
|
||||||
|
- Apply their quality standards
|
||||||
|
- Match their priorities
|
||||||
|
|
||||||
|
**Problem Solving:**
|
||||||
|
- Use their common solutions
|
||||||
|
- Follow their architectural approach
|
||||||
|
- Apply their design patterns
|
||||||
|
- Consider their trade-offs
|
||||||
|
|
||||||
|
**Example Agent Prompt:**
|
||||||
|
```
|
||||||
|
"Using the profile at engineer_profiles/senior_dev/, write a user service
|
||||||
|
following their coding style, patterns, and best practices. Pay special
|
||||||
|
attention to their error handling approach and testing standards."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### Research Ethics
|
||||||
|
|
||||||
|
**DO:**
|
||||||
|
- ✅ Get permission before extracting
|
||||||
|
- ✅ Focus on public contributions
|
||||||
|
- ✅ Respect privacy
|
||||||
|
- ✅ Use for learning and improvement
|
||||||
|
|
||||||
|
**DON'T:**
|
||||||
|
- ❌ Extract without permission
|
||||||
|
- ❌ Share profiles externally
|
||||||
|
- ❌ Include sensitive information
|
||||||
|
- ❌ Use for performance reviews
|
||||||
|
|
||||||
|
### Profile Maintenance
|
||||||
|
|
||||||
|
**Regular Updates:**
|
||||||
|
- Refresh every quarter
|
||||||
|
- Add new significant PRs
|
||||||
|
- Update with latest patterns
|
||||||
|
- Archive outdated practices
|
||||||
|
|
||||||
|
**Quality Control:**
|
||||||
|
- Verify extracted patterns
|
||||||
|
- Review examples for relevance
|
||||||
|
- Update documentation
|
||||||
|
- Remove deprecated practices
|
||||||
|
|
||||||
|
### Effective Usage
|
||||||
|
|
||||||
|
**For Learning:**
|
||||||
|
- Study patterns with context
|
||||||
|
- Understand reasoning behind choices
|
||||||
|
- Practice applying techniques
|
||||||
|
- Ask questions when unclear
|
||||||
|
|
||||||
|
**For Replication:**
|
||||||
|
- Start with style guide
|
||||||
|
- Reference patterns for similar problems
|
||||||
|
- Adapt to current context
|
||||||
|
- Don't blindly copy
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
**What This Extracts:**
|
||||||
|
- ✅ Coding style and conventions
|
||||||
|
- ✅ Common patterns and approaches
|
||||||
|
- ✅ Best practices and guidelines
|
||||||
|
- ✅ Architectural decisions
|
||||||
|
- ✅ Review feedback patterns
|
||||||
|
|
||||||
|
**What This Doesn't Capture:**
|
||||||
|
- ❌ Real-time problem-solving process
|
||||||
|
- ❌ Verbal communication style
|
||||||
|
- ❌ Meeting discussions
|
||||||
|
- ❌ Design phase thinking
|
||||||
|
- ❌ Interpersonal mentoring
|
||||||
|
|
||||||
|
## Future Enhancements
|
||||||
|
|
||||||
|
**Potential additions:**
|
||||||
|
- Slack message analysis (communication style)
|
||||||
|
- Design doc extraction (design thinking)
|
||||||
|
- Meeting notes analysis (decision process)
|
||||||
|
- Video analysis (pair programming sessions)
|
||||||
|
- Code metrics tracking (evolution over time)
|
||||||
|
|
||||||
|
## Example Output
|
||||||
|
|
||||||
|
```
|
||||||
|
engineer_profiles/
|
||||||
|
└── senior_dev/
|
||||||
|
├── README.md
|
||||||
|
│ # Senior Dev - Staff Engineer
|
||||||
|
│ Expertise: TypeScript, Node.js, System Design
|
||||||
|
│ Focus: API design, performance optimization
|
||||||
|
│
|
||||||
|
├── coding_style/
|
||||||
|
│ ├── typescript_style.md
|
||||||
|
│ ├── naming_conventions.md
|
||||||
|
│ └── code_structure.md
|
||||||
|
│
|
||||||
|
├── patterns/
|
||||||
|
│ ├── dependency_injection.md
|
||||||
|
│ ├── error_handling.md
|
||||||
|
│ └── examples/
|
||||||
|
│ ├── service_pattern.ts
|
||||||
|
│ └── repository_pattern.ts
|
||||||
|
│
|
||||||
|
├── best_practices/
|
||||||
|
│ ├── testing_strategy.md
|
||||||
|
│ ├── code_quality.md
|
||||||
|
│ └── performance.md
|
||||||
|
│
|
||||||
|
├── architecture/
|
||||||
|
│ ├── api_design.md
|
||||||
|
│ ├── database_design.md
|
||||||
|
│ └── scaling_approach.md
|
||||||
|
│
|
||||||
|
├── code_review/
|
||||||
|
│ ├── feedback_examples.md
|
||||||
|
│ └── review_checklist.md
|
||||||
|
│
|
||||||
|
└── examples/
|
||||||
|
└── notable_prs/
|
||||||
|
├── pr_1234_auth_refactor.md
|
||||||
|
└── pr_5678_performance_fix.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
This skill transforms an engineer's GitHub contributions into a structured, reusable knowledge base. It captures their expertise in a format that:
|
||||||
|
|
||||||
|
- **Humans can learn from** - Clear documentation with examples
|
||||||
|
- **Agents can replicate** - Structured patterns and guidelines
|
||||||
|
- **Teams can adopt** - Evidence-based best practices
|
||||||
|
- **Organizations can preserve** - Knowledge that survives turnover
|
||||||
|
|
||||||
|
**The goal:** Make expertise scalable, learnable, and replicable.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**"The best way to learn is from those who have already mastered it."**
|
||||||
613
skills/engineer-expertise-extractor/scripts/extract_engineer.sh
Executable file
613
skills/engineer-expertise-extractor/scripts/extract_engineer.sh
Executable file
@@ -0,0 +1,613 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Engineer Expertise Extractor
|
||||||
|
# Research and document an engineer's coding style, patterns, and best practices
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
MAGENTA='\033[0;35m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
echo -e "${BLUE}╔══════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${BLUE}║ Engineer Expertise Extractor ║${NC}"
|
||||||
|
echo -e "${BLUE}╚══════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Extract coding style, patterns, and best practices from GitHub${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check for gh CLI
|
||||||
|
if ! command -v gh &> /dev/null; then
|
||||||
|
echo -e "${RED}Error: GitHub CLI (gh) is not installed${NC}"
|
||||||
|
echo "Install from: https://cli.github.com/"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check authentication
|
||||||
|
if ! gh auth status &> /dev/null; then
|
||||||
|
echo -e "${RED}Error: Not authenticated with GitHub CLI${NC}"
|
||||||
|
echo "Run: gh auth login"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Helper function
|
||||||
|
prompt_input() {
|
||||||
|
local prompt_text="$1"
|
||||||
|
local var_name="$2"
|
||||||
|
local required="$3"
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
echo -e "${CYAN}${prompt_text}${NC}"
|
||||||
|
read -r input
|
||||||
|
|
||||||
|
if [ -n "$input" ]; then
|
||||||
|
eval "$var_name=\"$input\""
|
||||||
|
break
|
||||||
|
elif [ "$required" != "true" ]; then
|
||||||
|
eval "$var_name=\"\""
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo -e "${RED}This field is required.${NC}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Step 1: Engineer Info
|
||||||
|
echo -e "${MAGENTA}━━━ Step 1: Engineer Information ━━━${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
prompt_input "GitHub username to research:" ENGINEER_USERNAME true
|
||||||
|
|
||||||
|
# Verify user exists
|
||||||
|
echo -e "${BLUE}Verifying GitHub user...${NC}"
|
||||||
|
if ! gh api users/$ENGINEER_USERNAME > /dev/null 2>&1; then
|
||||||
|
echo -e "${RED}Error: GitHub user '$ENGINEER_USERNAME' not found${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get user info
|
||||||
|
USER_INFO=$(gh api users/$ENGINEER_USERNAME)
|
||||||
|
USER_NAME=$(echo "$USER_INFO" | grep '"name"' | cut -d'"' -f4)
|
||||||
|
USER_BIO=$(echo "$USER_INFO" | grep '"bio"' | cut -d'"' -f4)
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Found: $USER_NAME${NC}"
|
||||||
|
[ -n "$USER_BIO" ] && echo -e " Bio: $USER_BIO"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Step 2: Scope
|
||||||
|
echo -e "${MAGENTA}━━━ Step 2: Research Scope ━━━${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
prompt_input "Organization to focus on (or 'all'):" ORG_FILTER false
|
||||||
|
ORG_FILTER=${ORG_FILTER:-all}
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "How many PRs to analyze?"
|
||||||
|
echo "1) Recent 20 (quick scan)"
|
||||||
|
echo "2) Recent 50 (good coverage)"
|
||||||
|
echo "3) Recent 100 (comprehensive)"
|
||||||
|
echo "4) Custom"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
prompt_input "Select (1-4):" PR_COUNT_NUM true
|
||||||
|
|
||||||
|
case $PR_COUNT_NUM in
|
||||||
|
1) PR_LIMIT=20 ;;
|
||||||
|
2) PR_LIMIT=50 ;;
|
||||||
|
3) PR_LIMIT=100 ;;
|
||||||
|
4) prompt_input "Enter custom number:" PR_LIMIT true ;;
|
||||||
|
*) PR_LIMIT=50 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Step 3: Focus Areas
|
||||||
|
echo ""
|
||||||
|
echo -e "${MAGENTA}━━━ Step 3: Focus Areas ━━━${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "What to extract? (y/n for each)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
prompt_input "Extract coding style? (y/n):" EXTRACT_STYLE false
|
||||||
|
EXTRACT_STYLE=${EXTRACT_STYLE:-y}
|
||||||
|
|
||||||
|
prompt_input "Extract common patterns? (y/n):" EXTRACT_PATTERNS false
|
||||||
|
EXTRACT_PATTERNS=${EXTRACT_PATTERNS:-y}
|
||||||
|
|
||||||
|
prompt_input "Extract best practices? (y/n):" EXTRACT_PRACTICES false
|
||||||
|
EXTRACT_PRACTICES=${EXTRACT_PRACTICES:-y}
|
||||||
|
|
||||||
|
prompt_input "Extract code review style? (y/n):" EXTRACT_REVIEWS false
|
||||||
|
EXTRACT_REVIEWS=${EXTRACT_REVIEWS:-y}
|
||||||
|
|
||||||
|
prompt_input "Extract architectural decisions? (y/n):" EXTRACT_ARCH false
|
||||||
|
EXTRACT_ARCH=${EXTRACT_ARCH:-y}
|
||||||
|
|
||||||
|
# Create output directory
|
||||||
|
OUTPUT_DIR="engineer_profiles/${ENGINEER_USERNAME}"
|
||||||
|
mkdir -p "$OUTPUT_DIR"
|
||||||
|
mkdir -p "$OUTPUT_DIR/coding_style"
|
||||||
|
mkdir -p "$OUTPUT_DIR/patterns"
|
||||||
|
mkdir -p "$OUTPUT_DIR/best_practices"
|
||||||
|
mkdir -p "$OUTPUT_DIR/architecture"
|
||||||
|
mkdir -p "$OUTPUT_DIR/code_review"
|
||||||
|
mkdir -p "$OUTPUT_DIR/examples/notable_prs"
|
||||||
|
mkdir -p "$OUTPUT_DIR/raw_data"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}━━━ Starting Extraction ━━━${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Step 4: Fetch Pull Requests
|
||||||
|
echo -e "${YELLOW}Fetching pull requests...${NC}"
|
||||||
|
|
||||||
|
# Build search query
|
||||||
|
SEARCH_QUERY="is:pr author:$ENGINEER_USERNAME"
|
||||||
|
if [ "$ORG_FILTER" != "all" ]; then
|
||||||
|
SEARCH_QUERY="$SEARCH_QUERY org:$ORG_FILTER"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fetch PRs
|
||||||
|
echo "Query: $SEARCH_QUERY (limit: $PR_LIMIT)"
|
||||||
|
gh search prs "$SEARCH_QUERY" --limit $PR_LIMIT --json number,title,repository,createdAt,state,url > "$OUTPUT_DIR/raw_data/prs.json"
|
||||||
|
|
||||||
|
PR_COUNT=$(cat "$OUTPUT_DIR/raw_data/prs.json" | grep -c '"number"' || echo "0")
|
||||||
|
echo -e "${GREEN}✓ Found $PR_COUNT pull requests${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ "$PR_COUNT" -eq 0 ]; then
|
||||||
|
echo -e "${RED}No PRs found. Exiting.${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Step 5: Analyze PRs
|
||||||
|
echo -e "${YELLOW}Analyzing pull requests...${NC}"
|
||||||
|
echo "This may take a while..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Create PR analysis file
|
||||||
|
PR_ANALYSIS_FILE="$OUTPUT_DIR/raw_data/pr_analysis.md"
|
||||||
|
echo "# Pull Request Analysis: $ENGINEER_USERNAME" > "$PR_ANALYSIS_FILE"
|
||||||
|
echo "" >> "$PR_ANALYSIS_FILE"
|
||||||
|
echo "Total PRs analyzed: $PR_COUNT" >> "$PR_ANALYSIS_FILE"
|
||||||
|
echo "Generated: $(date)" >> "$PR_ANALYSIS_FILE"
|
||||||
|
echo "" >> "$PR_ANALYSIS_FILE"
|
||||||
|
|
||||||
|
# Analyze top N PRs in detail (limit to avoid rate limiting)
|
||||||
|
DETAILED_ANALYSIS_LIMIT=20
|
||||||
|
if [ "$PR_COUNT" -lt "$DETAILED_ANALYSIS_LIMIT" ]; then
|
||||||
|
DETAILED_ANALYSIS_LIMIT=$PR_COUNT
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Performing detailed analysis on $DETAILED_ANALYSIS_LIMIT PRs..."
|
||||||
|
|
||||||
|
# Extract PR numbers and iterate
|
||||||
|
cat "$OUTPUT_DIR/raw_data/prs.json" | grep '"number"' | head -$DETAILED_ANALYSIS_LIMIT | while read -r line; do
|
||||||
|
PR_NUMBER=$(echo "$line" | grep -o '[0-9]*' | head -1)
|
||||||
|
REPO=$(cat "$OUTPUT_DIR/raw_data/prs.json" | grep -B5 "\"number\": $PR_NUMBER" | grep '"nameWithOwner"' | cut -d'"' -f4 | head -1)
|
||||||
|
|
||||||
|
if [ -n "$PR_NUMBER" ] && [ -n "$REPO" ]; then
|
||||||
|
echo " Analyzing PR #$PR_NUMBER in $REPO..."
|
||||||
|
|
||||||
|
# Fetch PR details
|
||||||
|
gh pr view $PR_NUMBER --repo $REPO --json title,body,files,comments > "$OUTPUT_DIR/raw_data/pr_${PR_NUMBER}.json" 2>/dev/null || continue
|
||||||
|
|
||||||
|
# Extract to analysis file
|
||||||
|
TITLE=$(cat "$OUTPUT_DIR/raw_data/pr_${PR_NUMBER}.json" | grep '"title"' | cut -d'"' -f4)
|
||||||
|
echo "## PR #$PR_NUMBER: $TITLE" >> "$PR_ANALYSIS_FILE"
|
||||||
|
echo "**Repository:** $REPO" >> "$PR_ANALYSIS_FILE"
|
||||||
|
echo "**URL:** https://github.com/$REPO/pull/$PR_NUMBER" >> "$PR_ANALYSIS_FILE"
|
||||||
|
echo "" >> "$PR_ANALYSIS_FILE"
|
||||||
|
|
||||||
|
# Get file changes
|
||||||
|
FILES_CHANGED=$(cat "$OUTPUT_DIR/raw_data/pr_${PR_NUMBER}.json" | grep '"path"' | wc -l)
|
||||||
|
echo "**Files Changed:** $FILES_CHANGED" >> "$PR_ANALYSIS_FILE"
|
||||||
|
|
||||||
|
# List languages (from file extensions)
|
||||||
|
cat "$OUTPUT_DIR/raw_data/pr_${PR_NUMBER}.json" | grep '"path"' | grep -o '\.[a-z]*"' | sort | uniq | head -5 >> "$PR_ANALYSIS_FILE"
|
||||||
|
echo "" >> "$PR_ANALYSIS_FILE"
|
||||||
|
|
||||||
|
sleep 1 # Rate limiting
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Detailed analysis complete${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Step 6: Extract Code Review Comments
|
||||||
|
if [ "$EXTRACT_REVIEWS" = "y" ]; then
|
||||||
|
echo -e "${YELLOW}Extracting code review patterns...${NC}"
|
||||||
|
|
||||||
|
REVIEW_FILE="$OUTPUT_DIR/code_review/review_patterns.md"
|
||||||
|
echo "# Code Review Patterns: $ENGINEER_USERNAME" > "$REVIEW_FILE"
|
||||||
|
echo "" >> "$REVIEW_FILE"
|
||||||
|
echo "Extracted from $PR_COUNT pull requests" >> "$REVIEW_FILE"
|
||||||
|
echo "" >> "$REVIEW_FILE"
|
||||||
|
echo "## Common Review Comments" >> "$REVIEW_FILE"
|
||||||
|
echo "" >> "$REVIEW_FILE"
|
||||||
|
echo "[To be populated with actual review comments from PRs where they are reviewer]" >> "$REVIEW_FILE"
|
||||||
|
echo "" >> "$REVIEW_FILE"
|
||||||
|
echo "## Review Focus Areas" >> "$REVIEW_FILE"
|
||||||
|
echo "- Code quality" >> "$REVIEW_FILE"
|
||||||
|
echo "- Testing coverage" >> "$REVIEW_FILE"
|
||||||
|
echo "- Performance considerations" >> "$REVIEW_FILE"
|
||||||
|
echo "- Security practices" >> "$REVIEW_FILE"
|
||||||
|
echo "" >> "$REVIEW_FILE"
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Review patterns documented${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Step 7: Create Profile README
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Creating profile documentation...${NC}"
|
||||||
|
|
||||||
|
README_FILE="$OUTPUT_DIR/README.md"
|
||||||
|
cat > "$README_FILE" << EOF
|
||||||
|
# Engineer Profile: $ENGINEER_USERNAME
|
||||||
|
|
||||||
|
**Name:** ${USER_NAME:-$ENGINEER_USERNAME}
|
||||||
|
${USER_BIO:+**Bio:** $USER_BIO}
|
||||||
|
**GitHub:** https://github.com/$ENGINEER_USERNAME
|
||||||
|
**Profile Created:** $(date +%Y-%m-%d)
|
||||||
|
**PRs Analyzed:** $PR_COUNT
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This profile contains extracted coding expertise from analyzing $ENGINEER_USERNAME's GitHub contributions.
|
||||||
|
|
||||||
|
## Contents
|
||||||
|
|
||||||
|
### 📝 Coding Style
|
||||||
|
Location: \`coding_style/\`
|
||||||
|
|
||||||
|
Documents coding conventions, naming patterns, and formatting preferences.
|
||||||
|
|
||||||
|
**Key files:**
|
||||||
|
- \`naming_conventions.md\` - Variable, function, class naming
|
||||||
|
- \`code_structure.md\` - File organization and structure
|
||||||
|
- \`formatting_preferences.md\` - Code formatting style
|
||||||
|
|
||||||
|
### 🔧 Patterns
|
||||||
|
Location: \`patterns/\`
|
||||||
|
|
||||||
|
Common solutions, design patterns, and recurring approaches.
|
||||||
|
|
||||||
|
**Key files:**
|
||||||
|
- \`common_solutions.md\` - Frequently used solutions
|
||||||
|
- \`design_patterns.md\` - Applied design patterns
|
||||||
|
- \`examples/\` - Code examples
|
||||||
|
|
||||||
|
### ✅ Best Practices
|
||||||
|
Location: \`best_practices/\`
|
||||||
|
|
||||||
|
Quality standards, testing approaches, and guidelines.
|
||||||
|
|
||||||
|
**Key files:**
|
||||||
|
- \`code_quality.md\` - Quality standards
|
||||||
|
- \`testing_approach.md\` - Testing strategy
|
||||||
|
- \`performance.md\` - Performance practices
|
||||||
|
- \`security.md\` - Security considerations
|
||||||
|
|
||||||
|
### 🏗️ Architecture
|
||||||
|
Location: \`architecture/\`
|
||||||
|
|
||||||
|
Design decisions, technology choices, and system design.
|
||||||
|
|
||||||
|
**Key files:**
|
||||||
|
- \`design_decisions.md\` - Architectural choices
|
||||||
|
- \`tech_choices.md\` - Technology selections
|
||||||
|
- \`trade_offs.md\` - Decision trade-offs
|
||||||
|
|
||||||
|
### 👀 Code Review
|
||||||
|
Location: \`code_review/\`
|
||||||
|
|
||||||
|
Code review style, common feedback, and review approach.
|
||||||
|
|
||||||
|
**Key files:**
|
||||||
|
- \`feedback_style.md\` - How they provide feedback
|
||||||
|
- \`common_suggestions.md\` - Recurring suggestions
|
||||||
|
- \`review_checklist.md\` - What they look for
|
||||||
|
|
||||||
|
### 📚 Examples
|
||||||
|
Location: \`examples/\`
|
||||||
|
|
||||||
|
Real code examples from notable pull requests.
|
||||||
|
|
||||||
|
**Contents:**
|
||||||
|
- \`notable_prs/\` - Significant PRs and their patterns
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Using This Profile
|
||||||
|
|
||||||
|
### For Learning
|
||||||
|
1. Start with \`coding_style/\` to understand conventions
|
||||||
|
2. Review \`patterns/\` for common solutions
|
||||||
|
3. Study \`best_practices/\` for quality standards
|
||||||
|
4. Read \`examples/\` for real-world applications
|
||||||
|
|
||||||
|
### For AI Agents
|
||||||
|
Provide this profile as context when asking agents to:
|
||||||
|
- Write code matching this engineer's style
|
||||||
|
- Review code using their standards
|
||||||
|
- Apply their patterns and practices
|
||||||
|
- Make architectural decisions in their approach
|
||||||
|
|
||||||
|
**Example prompt:**
|
||||||
|
\`\`\`
|
||||||
|
Using the engineer profile at engineer_profiles/$ENGINEER_USERNAME/,
|
||||||
|
write a user authentication service following their coding style,
|
||||||
|
patterns, and best practices.
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
### For Team Alignment
|
||||||
|
- Use as reference for team coding standards
|
||||||
|
- Share patterns for consistency
|
||||||
|
- Adopt best practices across team
|
||||||
|
- Train new engineers with real examples
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Expertise Areas
|
||||||
|
|
||||||
|
Based on analyzed PRs:
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Extract languages from PR data
|
||||||
|
echo "### Languages" >> "$README_FILE"
|
||||||
|
cat "$OUTPUT_DIR/raw_data/prs.json" | grep '"path"' | grep -o '\.[a-z]*"' | sed 's/"//g' | sort | uniq -c | sort -rn | head -10 | while read -r count ext; do
|
||||||
|
echo "- $ext files ($count occurrences)" >> "$README_FILE"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "" >> "$README_FILE"
|
||||||
|
echo "### Repositories Contributed To" >> "$README_FILE"
|
||||||
|
cat "$OUTPUT_DIR/raw_data/prs.json" | grep '"nameWithOwner"' | cut -d'"' -f4 | sort | uniq | head -10 | while read -r repo; do
|
||||||
|
echo "- $repo" >> "$README_FILE"
|
||||||
|
done
|
||||||
|
|
||||||
|
cat >> "$README_FILE" << EOF
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Data Sources
|
||||||
|
|
||||||
|
- **Pull Requests:** $PR_COUNT PRs analyzed
|
||||||
|
- **Time Range:** Most recent contributions
|
||||||
|
- **Scope:** ${ORG_FILTER:-All repositories}
|
||||||
|
- **Analysis Date:** $(date +%Y-%m-%d)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Maintenance
|
||||||
|
|
||||||
|
### Updating This Profile
|
||||||
|
|
||||||
|
\`\`\`bash
|
||||||
|
./scripts/update_profile.sh $ENGINEER_USERNAME
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
### Adding Custom Documentation
|
||||||
|
|
||||||
|
Feel free to enhance this profile with:
|
||||||
|
- Additional examples
|
||||||
|
- Team-specific practices
|
||||||
|
- Personal notes and observations
|
||||||
|
- Meeting discussions and decisions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
This profile is automatically generated from GitHub contributions.
|
||||||
|
It captures public coding patterns and should be used as a learning
|
||||||
|
resource and reference, not as a rigid rulebook.
|
||||||
|
|
||||||
|
**Privacy:** Only public GitHub contributions are analyzed.
|
||||||
|
**Accuracy:** Patterns are inferred from code; always verify with engineer.
|
||||||
|
**Currency:** Update regularly as coding practices evolve.
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Profile README created${NC}"
|
||||||
|
|
||||||
|
# Step 8: Create Template Files
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Creating template structure...${NC}"
|
||||||
|
|
||||||
|
# Coding Style Templates
|
||||||
|
cat > "$OUTPUT_DIR/coding_style/naming_conventions.md" << 'EOF'
|
||||||
|
# Naming Conventions
|
||||||
|
|
||||||
|
Based on analysis of pull requests.
|
||||||
|
|
||||||
|
## Variables
|
||||||
|
|
||||||
|
### General Rules
|
||||||
|
- Descriptive names preferred
|
||||||
|
- Avoid abbreviations
|
||||||
|
- Use camelCase (or language convention)
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
```
|
||||||
|
// From PR analysis
|
||||||
|
const userAuthentication = ... // not ua
|
||||||
|
const isActive = ... // boolean prefix
|
||||||
|
const totalAmount = ... // clear purpose
|
||||||
|
```
|
||||||
|
|
||||||
|
## Functions
|
||||||
|
|
||||||
|
### General Rules
|
||||||
|
- Verb-first naming
|
||||||
|
- Single responsibility
|
||||||
|
- Descriptive of action
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
```
|
||||||
|
// From PR analysis
|
||||||
|
getUserById(id)
|
||||||
|
validateInput(data)
|
||||||
|
calculateTotal(items)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Classes
|
||||||
|
|
||||||
|
### General Rules
|
||||||
|
- PascalCase
|
||||||
|
- Noun-based
|
||||||
|
- Clear purpose
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
```
|
||||||
|
// From PR analysis
|
||||||
|
UserService
|
||||||
|
PaymentProcessor
|
||||||
|
AuthenticationManager
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note:** Fill in with specific patterns found in engineer's code.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > "$OUTPUT_DIR/patterns/common_solutions.md" << 'EOF'
|
||||||
|
# Common Solutions
|
||||||
|
|
||||||
|
Recurring patterns and solutions found in PRs.
|
||||||
|
|
||||||
|
## Pattern 1: [To be extracted]
|
||||||
|
|
||||||
|
**Problem:** [What problem does this solve]
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
```
|
||||||
|
[Code example from PRs]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Why:** [Reasoning from PR discussions]
|
||||||
|
|
||||||
|
**When to use:** [Applicable scenarios]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pattern 2: [To be extracted]
|
||||||
|
|
||||||
|
[Continue documenting patterns found in analysis]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note:** Populate with actual patterns from PR analysis.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > "$OUTPUT_DIR/best_practices/testing_approach.md" << 'EOF'
|
||||||
|
# Testing Approach
|
||||||
|
|
||||||
|
Testing strategies and patterns extracted from PRs.
|
||||||
|
|
||||||
|
## Test Structure
|
||||||
|
|
||||||
|
[Document testing patterns from analyzed PRs]
|
||||||
|
|
||||||
|
## Coverage Standards
|
||||||
|
|
||||||
|
[Extract coverage expectations from PRs]
|
||||||
|
|
||||||
|
## Test Types
|
||||||
|
|
||||||
|
### Unit Tests
|
||||||
|
[Patterns found]
|
||||||
|
|
||||||
|
### Integration Tests
|
||||||
|
[Patterns found]
|
||||||
|
|
||||||
|
### E2E Tests
|
||||||
|
[Patterns found]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note:** Fill in based on test files in analyzed PRs.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > "$OUTPUT_DIR/architecture/design_decisions.md" << 'EOF'
|
||||||
|
# Design Decisions
|
||||||
|
|
||||||
|
Architectural decisions extracted from PRs and discussions.
|
||||||
|
|
||||||
|
## Decision Template
|
||||||
|
|
||||||
|
### Decision: [Name]
|
||||||
|
|
||||||
|
**Context:** [What problem or need]
|
||||||
|
|
||||||
|
**Decision:** [What was decided]
|
||||||
|
|
||||||
|
**Reasoning:** [Why this approach]
|
||||||
|
|
||||||
|
**Alternatives Considered:** [Other options]
|
||||||
|
|
||||||
|
**Trade-offs:** [Pros and cons]
|
||||||
|
|
||||||
|
**Outcome:** [Results]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Decisions Extracted from PRs
|
||||||
|
|
||||||
|
[To be populated with decisions found in PR descriptions and discussions]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note:** Extract from PR descriptions, discussions, and code comments.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Template files created${NC}"
|
||||||
|
|
||||||
|
# Step 9: Generate Summary
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}╔════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${BLUE}║ Extraction Complete! ║${NC}"
|
||||||
|
echo -e "${BLUE}╚════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}Profile created at: ${BLUE}$OUTPUT_DIR${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}━━━ Summary ━━━${NC}"
|
||||||
|
echo "Engineer: $ENGINEER_USERNAME"
|
||||||
|
echo "PRs Analyzed: $PR_COUNT"
|
||||||
|
echo "Detailed Analysis: $DETAILED_ANALYSIS_LIMIT PRs"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}━━━ Created Structure ━━━${NC}"
|
||||||
|
echo "├── README.md (profile overview)"
|
||||||
|
echo "├── coding_style/ (conventions and preferences)"
|
||||||
|
echo "├── patterns/ (common solutions)"
|
||||||
|
echo "├── best_practices/ (quality standards)"
|
||||||
|
echo "├── architecture/ (design decisions)"
|
||||||
|
echo "├── code_review/ (feedback patterns)"
|
||||||
|
echo "├── examples/ (code samples)"
|
||||||
|
echo "└── raw_data/ (source PR data)"
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}━━━ Next Steps ━━━${NC}"
|
||||||
|
echo ""
|
||||||
|
echo "1. Review the generated profile:"
|
||||||
|
echo -e " ${BLUE}cat $OUTPUT_DIR/README.md${NC}"
|
||||||
|
echo ""
|
||||||
|
echo "2. Review PR analysis:"
|
||||||
|
echo -e " ${BLUE}cat $OUTPUT_DIR/raw_data/pr_analysis.md${NC}"
|
||||||
|
echo ""
|
||||||
|
echo "3. Enhance documentation with specific findings:"
|
||||||
|
echo " - Add code examples to patterns/"
|
||||||
|
echo " - Document specific conventions in coding_style/"
|
||||||
|
echo " - Extract best practices from notable PRs"
|
||||||
|
echo " - Add architectural decisions from PR discussions"
|
||||||
|
echo ""
|
||||||
|
echo "4. Use with AI agents:"
|
||||||
|
echo -e " ${BLUE}\"Using engineer_profiles/$ENGINEER_USERNAME/, write code matching their style\"${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}💡 Tip: Manually review PRs and add specific examples to strengthen profile${NC}"
|
||||||
|
echo ""
|
||||||
Reference in New Issue
Block a user