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.
- package/{LICENSE → .claude/LICENSE} +21 -21
- package/.claude/README.md +291 -0
- package/.claude/bin/cli.js +266 -0
- package/{bin → .claude/bin}/copilot.js +182 -182
- package/{bin → .claude/bin}/postinstall.js +42 -42
- package/{tech_hub_skills/skills → .claude/commands}/README.md +336 -336
- package/{tech_hub_skills/skills → .claude/commands}/ai-engineer.md +104 -104
- package/{tech_hub_skills/skills → .claude/commands}/aws.md +143 -143
- package/{tech_hub_skills/skills → .claude/commands}/azure.md +149 -149
- package/{tech_hub_skills/skills → .claude/commands}/backend-developer.md +108 -108
- package/{tech_hub_skills/skills → .claude/commands}/code-review.md +399 -399
- package/{tech_hub_skills/skills → .claude/commands}/compliance-automation.md +747 -747
- package/{tech_hub_skills/skills → .claude/commands}/compliance-officer.md +108 -108
- package/{tech_hub_skills/skills → .claude/commands}/data-engineer.md +113 -113
- package/{tech_hub_skills/skills → .claude/commands}/data-governance.md +102 -102
- package/{tech_hub_skills/skills → .claude/commands}/data-scientist.md +123 -123
- package/{tech_hub_skills/skills → .claude/commands}/database-admin.md +109 -109
- package/{tech_hub_skills/skills → .claude/commands}/devops.md +160 -160
- package/{tech_hub_skills/skills → .claude/commands}/docker.md +160 -160
- package/{tech_hub_skills/skills → .claude/commands}/enterprise-dashboard.md +613 -613
- package/{tech_hub_skills/skills → .claude/commands}/finops.md +184 -184
- package/{tech_hub_skills/skills → .claude/commands}/frontend-developer.md +108 -108
- package/{tech_hub_skills/skills → .claude/commands}/gcp.md +143 -143
- package/{tech_hub_skills/skills → .claude/commands}/ml-engineer.md +115 -115
- package/{tech_hub_skills/skills → .claude/commands}/mlops.md +187 -187
- package/{tech_hub_skills/skills → .claude/commands}/network-engineer.md +109 -109
- package/{tech_hub_skills/skills → .claude/commands}/optimization-advisor.md +329 -329
- package/{tech_hub_skills/skills → .claude/commands}/orchestrator.md +623 -623
- package/{tech_hub_skills/skills → .claude/commands}/platform-engineer.md +102 -102
- package/{tech_hub_skills/skills → .claude/commands}/process-automation.md +226 -226
- package/{tech_hub_skills/skills → .claude/commands}/process-changelog.md +184 -184
- package/{tech_hub_skills/skills → .claude/commands}/process-documentation.md +484 -484
- package/{tech_hub_skills/skills → .claude/commands}/process-kanban.md +324 -324
- package/{tech_hub_skills/skills → .claude/commands}/process-versioning.md +214 -214
- package/{tech_hub_skills/skills → .claude/commands}/product-designer.md +104 -104
- package/{tech_hub_skills/skills → .claude/commands}/project-starter.md +443 -443
- package/{tech_hub_skills/skills → .claude/commands}/qa-engineer.md +109 -109
- package/{tech_hub_skills/skills → .claude/commands}/security-architect.md +135 -135
- package/{tech_hub_skills/skills → .claude/commands}/sre.md +109 -109
- package/{tech_hub_skills/skills → .claude/commands}/system-design.md +126 -126
- package/{tech_hub_skills/skills → .claude/commands}/technical-writer.md +101 -101
- package/.claude/package.json +46 -0
- package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/01-prompt-engineering/README.md +252 -252
- package/.claude/roles/ai-engineer/skills/01-prompt-engineering/prompt_ab_tester.py +356 -0
- package/.claude/roles/ai-engineer/skills/01-prompt-engineering/prompt_template_manager.py +274 -0
- package/.claude/roles/ai-engineer/skills/01-prompt-engineering/token_cost_estimator.py +324 -0
- package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/02-rag-pipeline/README.md +448 -448
- package/.claude/roles/ai-engineer/skills/02-rag-pipeline/document_chunker.py +336 -0
- package/.claude/roles/ai-engineer/skills/02-rag-pipeline/rag_pipeline.sql +213 -0
- package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/03-agent-orchestration/README.md +599 -599
- package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/04-llm-guardrails/README.md +735 -735
- package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/05-vector-embeddings/README.md +711 -711
- package/{tech_hub_skills → .claude}/roles/ai-engineer/skills/06-llm-evaluation/README.md +777 -777
- package/{tech_hub_skills → .claude}/roles/azure/skills/01-infrastructure-fundamentals/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/02-data-factory/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/03-synapse-analytics/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/04-databricks/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/05-functions/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/06-kubernetes-service/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/07-openai-service/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/08-machine-learning/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/09-storage-adls/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/10-networking/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/11-sql-cosmos/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/azure/skills/12-event-hubs/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/code-review/skills/01-automated-code-review/README.md +394 -394
- package/{tech_hub_skills → .claude}/roles/code-review/skills/02-pr-review-workflow/README.md +427 -427
- package/{tech_hub_skills → .claude}/roles/code-review/skills/03-code-quality-gates/README.md +518 -518
- package/{tech_hub_skills → .claude}/roles/code-review/skills/04-reviewer-assignment/README.md +504 -504
- package/{tech_hub_skills → .claude}/roles/code-review/skills/05-review-analytics/README.md +540 -540
- package/{tech_hub_skills → .claude}/roles/data-engineer/skills/01-lakehouse-architecture/README.md +550 -550
- package/.claude/roles/data-engineer/skills/01-lakehouse-architecture/bronze_ingestion.py +337 -0
- package/.claude/roles/data-engineer/skills/01-lakehouse-architecture/medallion_queries.sql +300 -0
- package/{tech_hub_skills → .claude}/roles/data-engineer/skills/02-etl-pipeline/README.md +580 -580
- package/{tech_hub_skills → .claude}/roles/data-engineer/skills/03-data-quality/README.md +579 -579
- package/{tech_hub_skills → .claude}/roles/data-engineer/skills/04-streaming-pipelines/README.md +608 -608
- package/{tech_hub_skills → .claude}/roles/data-engineer/skills/05-performance-optimization/README.md +547 -547
- package/{tech_hub_skills → .claude}/roles/data-governance/skills/01-data-catalog/README.md +112 -112
- package/{tech_hub_skills → .claude}/roles/data-governance/skills/02-data-lineage/README.md +129 -129
- package/{tech_hub_skills → .claude}/roles/data-governance/skills/03-data-quality-framework/README.md +182 -182
- package/{tech_hub_skills → .claude}/roles/data-governance/skills/04-access-control/README.md +39 -39
- package/{tech_hub_skills → .claude}/roles/data-governance/skills/05-master-data-management/README.md +40 -40
- package/{tech_hub_skills → .claude}/roles/data-governance/skills/06-compliance-privacy/README.md +46 -46
- package/{tech_hub_skills → .claude}/roles/data-scientist/skills/01-eda-automation/README.md +230 -230
- package/.claude/roles/data-scientist/skills/01-eda-automation/eda_generator.py +446 -0
- package/{tech_hub_skills → .claude}/roles/data-scientist/skills/02-statistical-modeling/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/data-scientist/skills/03-feature-engineering/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/data-scientist/skills/04-predictive-modeling/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/data-scientist/skills/05-customer-analytics/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/data-scientist/skills/06-campaign-analysis/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/data-scientist/skills/07-experimentation/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/data-scientist/skills/08-data-visualization/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/devops/skills/01-cicd-pipeline/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/devops/skills/02-container-orchestration/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/devops/skills/03-infrastructure-as-code/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/devops/skills/04-gitops/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/devops/skills/05-environment-management/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/devops/skills/06-automated-testing/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/devops/skills/07-release-management/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/devops/skills/08-monitoring-alerting/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/devops/skills/09-devsecops/README.md +265 -265
- package/{tech_hub_skills → .claude}/roles/finops/skills/01-cost-visibility/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/finops/skills/02-resource-tagging/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/finops/skills/03-budget-management/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/finops/skills/04-reserved-instances/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/finops/skills/05-spot-optimization/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/finops/skills/06-storage-tiering/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/finops/skills/07-compute-rightsizing/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/finops/skills/08-chargeback/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/01-mlops-pipeline/README.md +566 -566
- package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/02-feature-engineering/README.md +655 -655
- package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/03-model-training/README.md +704 -704
- package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/04-model-serving/README.md +845 -845
- package/{tech_hub_skills → .claude}/roles/ml-engineer/skills/05-model-monitoring/README.md +874 -874
- package/{tech_hub_skills → .claude}/roles/mlops/skills/01-ml-pipeline-orchestration/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/mlops/skills/02-experiment-tracking/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/mlops/skills/03-model-registry/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/mlops/skills/04-feature-store/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/mlops/skills/05-model-deployment/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/mlops/skills/06-model-observability/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/mlops/skills/07-data-versioning/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/mlops/skills/08-ab-testing/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/mlops/skills/09-automated-retraining/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/01-internal-developer-platform/README.md +153 -153
- package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/02-self-service-infrastructure/README.md +57 -57
- package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/03-slo-sli-management/README.md +59 -59
- package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/04-developer-experience/README.md +57 -57
- package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/05-incident-management/README.md +73 -73
- package/{tech_hub_skills → .claude}/roles/platform-engineer/skills/06-capacity-management/README.md +59 -59
- package/{tech_hub_skills → .claude}/roles/product-designer/skills/01-requirements-discovery/README.md +407 -407
- package/{tech_hub_skills → .claude}/roles/product-designer/skills/02-user-research/README.md +382 -382
- package/{tech_hub_skills → .claude}/roles/product-designer/skills/03-brainstorming-ideation/README.md +437 -437
- package/{tech_hub_skills → .claude}/roles/product-designer/skills/04-ux-design/README.md +496 -496
- package/{tech_hub_skills → .claude}/roles/product-designer/skills/05-product-market-fit/README.md +376 -376
- package/{tech_hub_skills → .claude}/roles/product-designer/skills/06-stakeholder-management/README.md +412 -412
- package/{tech_hub_skills → .claude}/roles/security-architect/skills/01-pii-detection/README.md +319 -319
- package/{tech_hub_skills → .claude}/roles/security-architect/skills/02-threat-modeling/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/security-architect/skills/03-infrastructure-security/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/security-architect/skills/04-iam/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/security-architect/skills/05-application-security/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/security-architect/skills/06-secrets-management/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/security-architect/skills/07-security-monitoring/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/system-design/skills/01-architecture-patterns/README.md +337 -337
- package/{tech_hub_skills → .claude}/roles/system-design/skills/02-requirements-engineering/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/system-design/skills/03-scalability/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/system-design/skills/04-high-availability/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/system-design/skills/05-cost-optimization-design/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/system-design/skills/06-api-design/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/system-design/skills/07-observability-architecture/README.md +264 -264
- package/{tech_hub_skills → .claude}/roles/system-design/skills/08-process-automation/PROCESS_TEMPLATE.md +336 -336
- package/{tech_hub_skills → .claude}/roles/system-design/skills/08-process-automation/README.md +521 -521
- package/.claude/roles/system-design/skills/08-process-automation/ai_prompt_generator.py +744 -0
- package/.claude/roles/system-design/skills/08-process-automation/automation_recommender.py +688 -0
- package/.claude/roles/system-design/skills/08-process-automation/plan_generator.py +679 -0
- package/.claude/roles/system-design/skills/08-process-automation/process_analyzer.py +528 -0
- package/.claude/roles/system-design/skills/08-process-automation/process_parser.py +684 -0
- package/.claude/roles/system-design/skills/08-process-automation/role_matcher.py +615 -0
- package/.claude/skills/README.md +336 -0
- package/.claude/skills/ai-engineer.md +104 -0
- package/.claude/skills/aws.md +143 -0
- package/.claude/skills/azure.md +149 -0
- package/.claude/skills/backend-developer.md +108 -0
- package/.claude/skills/code-review.md +399 -0
- package/.claude/skills/compliance-automation.md +747 -0
- package/.claude/skills/compliance-officer.md +108 -0
- package/.claude/skills/data-engineer.md +113 -0
- package/.claude/skills/data-governance.md +102 -0
- package/.claude/skills/data-scientist.md +123 -0
- package/.claude/skills/database-admin.md +109 -0
- package/.claude/skills/devops.md +160 -0
- package/.claude/skills/docker.md +160 -0
- package/.claude/skills/enterprise-dashboard.md +613 -0
- package/.claude/skills/finops.md +184 -0
- package/.claude/skills/frontend-developer.md +108 -0
- package/.claude/skills/gcp.md +143 -0
- package/.claude/skills/ml-engineer.md +115 -0
- package/.claude/skills/mlops.md +187 -0
- package/.claude/skills/network-engineer.md +109 -0
- package/.claude/skills/optimization-advisor.md +329 -0
- package/.claude/skills/orchestrator.md +623 -0
- package/.claude/skills/platform-engineer.md +102 -0
- package/.claude/skills/process-automation.md +226 -0
- package/.claude/skills/process-changelog.md +184 -0
- package/.claude/skills/process-documentation.md +484 -0
- package/.claude/skills/process-kanban.md +324 -0
- package/.claude/skills/process-versioning.md +214 -0
- package/.claude/skills/product-designer.md +104 -0
- package/.claude/skills/project-starter.md +443 -0
- package/.claude/skills/qa-engineer.md +109 -0
- package/.claude/skills/security-architect.md +135 -0
- package/.claude/skills/sre.md +109 -0
- package/.claude/skills/system-design.md +126 -0
- package/.claude/skills/technical-writer.md +101 -0
- package/.gitattributes +2 -0
- package/GITHUB_COPILOT.md +106 -0
- package/README.md +192 -291
- package/package.json +16 -46
- package/bin/cli.js +0 -241
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Role Matcher - Maps processes to the most suitable roles and skills.
|
|
3
|
+
|
|
4
|
+
Part of the Tech Hub Skills Library (sd-08: Process Automation).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from typing import List, Dict, Optional, Set, Tuple
|
|
9
|
+
from enum import Enum
|
|
10
|
+
|
|
11
|
+
from process_analyzer import ProcessAnalysis, AutomationType
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class Skill:
|
|
16
|
+
"""Represents a Tech Hub skill."""
|
|
17
|
+
id: str
|
|
18
|
+
name: str
|
|
19
|
+
role: str
|
|
20
|
+
complexity: str
|
|
21
|
+
description: str
|
|
22
|
+
keywords: List[str] = field(default_factory=list)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class RoleAssignment:
|
|
27
|
+
"""Assignment of a role to a process automation task."""
|
|
28
|
+
role: str
|
|
29
|
+
role_name: str
|
|
30
|
+
affinity_score: float # 0-100
|
|
31
|
+
skills_required: List[str]
|
|
32
|
+
responsibilities: List[str]
|
|
33
|
+
effort_percentage: float
|
|
34
|
+
is_primary: bool = False
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass
|
|
38
|
+
class TeamComposition:
|
|
39
|
+
"""Complete team composition for automation implementation."""
|
|
40
|
+
assignments: List[RoleAssignment]
|
|
41
|
+
skill_gaps: List[Dict]
|
|
42
|
+
cross_functional_dependencies: List[Dict]
|
|
43
|
+
recommended_team_size: int
|
|
44
|
+
|
|
45
|
+
def to_dict(self) -> Dict:
|
|
46
|
+
"""Convert to dictionary."""
|
|
47
|
+
return {
|
|
48
|
+
"assignments": [
|
|
49
|
+
{
|
|
50
|
+
"role": a.role,
|
|
51
|
+
"role_name": a.role_name,
|
|
52
|
+
"affinity_score": a.affinity_score,
|
|
53
|
+
"skills": a.skills_required,
|
|
54
|
+
"effort_pct": a.effort_percentage,
|
|
55
|
+
"is_primary": a.is_primary
|
|
56
|
+
}
|
|
57
|
+
for a in self.assignments
|
|
58
|
+
],
|
|
59
|
+
"skill_gaps": self.skill_gaps,
|
|
60
|
+
"dependencies": self.cross_functional_dependencies,
|
|
61
|
+
"team_size": self.recommended_team_size
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
def get_primary_role(self) -> Optional[RoleAssignment]:
|
|
65
|
+
"""Get the primary role assignment."""
|
|
66
|
+
for assignment in self.assignments:
|
|
67
|
+
if assignment.is_primary:
|
|
68
|
+
return assignment
|
|
69
|
+
return self.assignments[0] if self.assignments else None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class RoleMatcher:
|
|
73
|
+
"""
|
|
74
|
+
Maps processes to suitable roles and skills for implementation.
|
|
75
|
+
|
|
76
|
+
Uses the Tech Hub skills library to identify the best team composition
|
|
77
|
+
for implementing automation initiatives.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
# Complete Tech Hub role definitions
|
|
81
|
+
ROLES = {
|
|
82
|
+
"ai-engineer": {
|
|
83
|
+
"name": "AI Engineer",
|
|
84
|
+
"focus": ["LLMs", "RAG", "Agents", "Prompt Engineering", "NLP"],
|
|
85
|
+
"automation_types": [AutomationType.AI_POWERED],
|
|
86
|
+
"skills": [
|
|
87
|
+
Skill("ai-01", "Prompt Engineering & Optimization", "ai-engineer", "basic",
|
|
88
|
+
"Design and optimize prompts", ["prompt", "llm", "gpt", "template"]),
|
|
89
|
+
Skill("ai-02", "RAG Pipeline Builder", "ai-engineer", "medium",
|
|
90
|
+
"Build retrieval augmented generation", ["rag", "vector", "embedding", "search"]),
|
|
91
|
+
Skill("ai-03", "LLM Agent Orchestration", "ai-engineer", "advanced",
|
|
92
|
+
"Multi-agent systems", ["agent", "tool", "function", "reasoning"]),
|
|
93
|
+
Skill("ai-04", "LLM Guardrails & Safety", "ai-engineer", "medium",
|
|
94
|
+
"Safety and content moderation", ["safety", "guardrail", "moderation"]),
|
|
95
|
+
Skill("ai-05", "Vector Embeddings & Search", "ai-engineer", "medium",
|
|
96
|
+
"Semantic search systems", ["embedding", "vector", "similarity"]),
|
|
97
|
+
Skill("ai-06", "LLM Evaluation & Benchmarking", "ai-engineer", "advanced",
|
|
98
|
+
"Evaluate LLM performance", ["evaluation", "benchmark", "metrics"]),
|
|
99
|
+
Skill("ai-07", "Production LLM API Integration", "ai-engineer", "medium",
|
|
100
|
+
"LLM API integration", ["api", "openai", "azure", "integration"]),
|
|
101
|
+
Skill("ai-08", "Marketing AI Automation", "ai-engineer", "expert",
|
|
102
|
+
"Marketing automation with AI", ["marketing", "content", "email", "seo"]),
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"data-engineer": {
|
|
106
|
+
"name": "Data Engineer",
|
|
107
|
+
"focus": ["Pipelines", "ETL", "Lakehouse", "Streaming", "Data Quality"],
|
|
108
|
+
"automation_types": [AutomationType.DATA_PIPELINE, AutomationType.WORKFLOW],
|
|
109
|
+
"skills": [
|
|
110
|
+
Skill("de-01", "Lakehouse Architecture", "data-engineer", "medium",
|
|
111
|
+
"Bronze-Silver-Gold architecture", ["lakehouse", "medallion", "delta"]),
|
|
112
|
+
Skill("de-02", "ETL/ELT Pipeline Orchestration", "data-engineer", "medium",
|
|
113
|
+
"Data pipeline orchestration", ["etl", "elt", "pipeline", "airflow"]),
|
|
114
|
+
Skill("de-03", "Data Quality & Validation", "data-engineer", "medium",
|
|
115
|
+
"Data quality checks", ["quality", "validation", "testing"]),
|
|
116
|
+
Skill("de-04", "Real-Time Streaming Pipelines", "data-engineer", "advanced",
|
|
117
|
+
"Streaming data processing", ["streaming", "kafka", "real-time"]),
|
|
118
|
+
Skill("de-05", "Performance Optimization", "data-engineer", "advanced",
|
|
119
|
+
"Query and pipeline optimization", ["performance", "optimization", "tuning"]),
|
|
120
|
+
Skill("de-06", "Cloud Data Infrastructure", "data-engineer", "medium",
|
|
121
|
+
"Azure data infrastructure", ["azure", "cloud", "infrastructure"]),
|
|
122
|
+
Skill("de-07", "Database Management & Migration", "data-engineer", "medium",
|
|
123
|
+
"Database operations", ["database", "sql", "migration"]),
|
|
124
|
+
Skill("de-08", "Marketing Data Ingestion", "data-engineer", "medium",
|
|
125
|
+
"Marketing data sources", ["marketing", "salesforce", "crm"]),
|
|
126
|
+
Skill("de-09", "Monitoring & Observability", "data-engineer", "medium",
|
|
127
|
+
"Pipeline monitoring", ["monitoring", "observability", "alerts"]),
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
"ml-engineer": {
|
|
131
|
+
"name": "ML Engineer",
|
|
132
|
+
"focus": ["MLOps", "Model Training", "Model Serving", "Feature Stores"],
|
|
133
|
+
"automation_types": [AutomationType.ML_BASED],
|
|
134
|
+
"skills": [
|
|
135
|
+
Skill("ml-01", "MLOps Pipeline Automation", "ml-engineer", "medium",
|
|
136
|
+
"ML pipeline automation", ["mlops", "pipeline", "automation"]),
|
|
137
|
+
Skill("ml-02", "Feature Engineering & Store", "ml-engineer", "medium",
|
|
138
|
+
"Feature store management", ["feature", "feast", "store"]),
|
|
139
|
+
Skill("ml-03", "Model Training & Tuning", "ml-engineer", "medium",
|
|
140
|
+
"Model training", ["training", "hyperparameter", "tuning"]),
|
|
141
|
+
Skill("ml-04", "Model Serving & APIs", "ml-engineer", "medium",
|
|
142
|
+
"Model deployment", ["serving", "inference", "api", "endpoint"]),
|
|
143
|
+
Skill("ml-05", "Model Monitoring & Drift", "ml-engineer", "advanced",
|
|
144
|
+
"Model monitoring", ["monitoring", "drift", "performance"]),
|
|
145
|
+
Skill("ml-06", "Distributed Training", "ml-engineer", "expert",
|
|
146
|
+
"Distributed ML", ["distributed", "gpu", "scaling"]),
|
|
147
|
+
Skill("ml-07", "Model Versioning & Registry", "ml-engineer", "medium",
|
|
148
|
+
"Model registry", ["versioning", "registry", "mlflow"]),
|
|
149
|
+
Skill("ml-08", "Model Compression", "ml-engineer", "advanced",
|
|
150
|
+
"Model optimization", ["compression", "quantization", "pruning"]),
|
|
151
|
+
Skill("ml-09", "Continuous Retraining", "ml-engineer", "expert",
|
|
152
|
+
"Automated retraining", ["retraining", "continuous", "automation"]),
|
|
153
|
+
]
|
|
154
|
+
},
|
|
155
|
+
"data-scientist": {
|
|
156
|
+
"name": "Data Scientist",
|
|
157
|
+
"focus": ["Analytics", "Statistics", "Modeling", "Experimentation"],
|
|
158
|
+
"automation_types": [AutomationType.ML_BASED],
|
|
159
|
+
"skills": [
|
|
160
|
+
Skill("ds-01", "Automated EDA", "data-scientist", "basic",
|
|
161
|
+
"Exploratory data analysis", ["eda", "analysis", "profiling"]),
|
|
162
|
+
Skill("ds-02", "Statistical Modeling", "data-scientist", "medium",
|
|
163
|
+
"Statistical analysis", ["statistics", "hypothesis", "testing"]),
|
|
164
|
+
Skill("ds-03", "Feature Engineering", "data-scientist", "medium",
|
|
165
|
+
"Feature creation", ["feature", "engineering", "transformation"]),
|
|
166
|
+
Skill("ds-04", "Predictive Modeling", "data-scientist", "medium",
|
|
167
|
+
"Prediction models", ["prediction", "forecasting", "classification"]),
|
|
168
|
+
Skill("ds-05", "Customer Analytics", "data-scientist", "advanced",
|
|
169
|
+
"Customer analysis", ["customer", "segmentation", "churn"]),
|
|
170
|
+
Skill("ds-06", "Campaign Analysis", "data-scientist", "medium",
|
|
171
|
+
"Marketing analysis", ["campaign", "attribution", "roi"]),
|
|
172
|
+
Skill("ds-07", "Experimentation & Causal", "data-scientist", "expert",
|
|
173
|
+
"A/B testing and causal", ["experiment", "ab-test", "causal"]),
|
|
174
|
+
Skill("ds-08", "Data Visualization", "data-scientist", "medium",
|
|
175
|
+
"Visualization", ["visualization", "dashboard", "reporting"]),
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
"security-architect": {
|
|
179
|
+
"name": "Security Architect",
|
|
180
|
+
"focus": ["Security", "Compliance", "IAM", "Threat Modeling"],
|
|
181
|
+
"automation_types": [AutomationType.SECURITY],
|
|
182
|
+
"skills": [
|
|
183
|
+
Skill("sa-01", "PII Detection & Privacy", "security-architect", "medium",
|
|
184
|
+
"PII and privacy", ["pii", "privacy", "gdpr", "anonymization"]),
|
|
185
|
+
Skill("sa-02", "Threat Modeling", "security-architect", "medium",
|
|
186
|
+
"Threat analysis", ["threat", "risk", "stride"]),
|
|
187
|
+
Skill("sa-03", "Infrastructure Security", "security-architect", "medium",
|
|
188
|
+
"IaC security", ["infrastructure", "iac", "hardening"]),
|
|
189
|
+
Skill("sa-04", "Identity & Access Management", "security-architect", "medium",
|
|
190
|
+
"IAM", ["iam", "identity", "access", "rbac"]),
|
|
191
|
+
Skill("sa-05", "Application Security", "security-architect", "medium",
|
|
192
|
+
"AppSec", ["sast", "dast", "appsec", "vulnerability"]),
|
|
193
|
+
Skill("sa-06", "Secrets & Key Management", "security-architect", "basic",
|
|
194
|
+
"Secrets management", ["secrets", "keys", "vault"]),
|
|
195
|
+
Skill("sa-07", "Security Monitoring", "security-architect", "advanced",
|
|
196
|
+
"Security monitoring", ["siem", "sentinel", "incident"]),
|
|
197
|
+
]
|
|
198
|
+
},
|
|
199
|
+
"system-design": {
|
|
200
|
+
"name": "System Designer",
|
|
201
|
+
"focus": ["Architecture", "Patterns", "Scalability", "Design"],
|
|
202
|
+
"automation_types": [],
|
|
203
|
+
"skills": [
|
|
204
|
+
Skill("sd-01", "Architecture Pattern Selection", "system-design", "medium",
|
|
205
|
+
"Architecture patterns", ["architecture", "pattern", "microservices"]),
|
|
206
|
+
Skill("sd-02", "Requirements Engineering", "system-design", "basic",
|
|
207
|
+
"Requirements", ["requirements", "user-story", "specification"]),
|
|
208
|
+
Skill("sd-03", "Scalability & Performance", "system-design", "advanced",
|
|
209
|
+
"Scalability design", ["scalability", "performance", "capacity"]),
|
|
210
|
+
Skill("sd-04", "High Availability & DR", "system-design", "advanced",
|
|
211
|
+
"HA/DR", ["availability", "disaster-recovery", "failover"]),
|
|
212
|
+
Skill("sd-05", "Cost Optimization Design", "system-design", "medium",
|
|
213
|
+
"Cost optimization", ["cost", "optimization", "finops"]),
|
|
214
|
+
Skill("sd-06", "API Design & Integration", "system-design", "medium",
|
|
215
|
+
"API design", ["api", "rest", "graphql", "integration"]),
|
|
216
|
+
Skill("sd-07", "Observability Architecture", "system-design", "medium",
|
|
217
|
+
"Observability", ["observability", "monitoring", "tracing"]),
|
|
218
|
+
Skill("sd-08", "Process Automation Analysis", "system-design", "medium",
|
|
219
|
+
"Process automation", ["automation", "process", "workflow", "optimization"]),
|
|
220
|
+
]
|
|
221
|
+
},
|
|
222
|
+
"devops": {
|
|
223
|
+
"name": "DevOps Engineer",
|
|
224
|
+
"focus": ["CI/CD", "Infrastructure", "Kubernetes", "Automation"],
|
|
225
|
+
"automation_types": [AutomationType.INFRASTRUCTURE, AutomationType.RPA],
|
|
226
|
+
"skills": [
|
|
227
|
+
Skill("do-01", "CI/CD Pipeline Design", "devops", "medium",
|
|
228
|
+
"CI/CD pipelines", ["cicd", "pipeline", "github-actions"]),
|
|
229
|
+
Skill("do-02", "Container Orchestration", "devops", "medium",
|
|
230
|
+
"Kubernetes", ["kubernetes", "k8s", "container", "helm"]),
|
|
231
|
+
Skill("do-03", "Infrastructure as Code", "devops", "medium",
|
|
232
|
+
"IaC", ["terraform", "bicep", "iac", "infrastructure"]),
|
|
233
|
+
Skill("do-04", "GitOps & Version Control", "devops", "basic",
|
|
234
|
+
"GitOps", ["git", "gitops", "flux", "argocd"]),
|
|
235
|
+
Skill("do-05", "Environment Management", "devops", "medium",
|
|
236
|
+
"Environments", ["environment", "staging", "production"]),
|
|
237
|
+
Skill("do-06", "Automated Testing", "devops", "medium",
|
|
238
|
+
"Testing automation", ["testing", "pytest", "integration"]),
|
|
239
|
+
Skill("do-07", "Release Management", "devops", "medium",
|
|
240
|
+
"Release management", ["release", "deployment", "rollback"]),
|
|
241
|
+
Skill("do-08", "Monitoring & Alerting", "devops", "medium",
|
|
242
|
+
"Monitoring", ["monitoring", "prometheus", "grafana", "alerting"]),
|
|
243
|
+
Skill("do-09", "DevSecOps", "devops", "advanced",
|
|
244
|
+
"Security in DevOps", ["devsecops", "security", "scanning"]),
|
|
245
|
+
]
|
|
246
|
+
},
|
|
247
|
+
"finops": {
|
|
248
|
+
"name": "FinOps Practitioner",
|
|
249
|
+
"focus": ["Cost Management", "Optimization", "Budgets"],
|
|
250
|
+
"automation_types": [],
|
|
251
|
+
"skills": [
|
|
252
|
+
Skill("fo-01", "Cost Visibility & Reporting", "finops", "basic",
|
|
253
|
+
"Cost visibility", ["cost", "reporting", "dashboard"]),
|
|
254
|
+
Skill("fo-02", "Resource Tagging Strategy", "finops", "basic",
|
|
255
|
+
"Tagging", ["tagging", "governance", "policy"]),
|
|
256
|
+
Skill("fo-03", "Budget Management & Alerts", "finops", "basic",
|
|
257
|
+
"Budgets", ["budget", "alert", "threshold"]),
|
|
258
|
+
Skill("fo-04", "Reserved Instance Planning", "finops", "medium",
|
|
259
|
+
"RIs", ["reserved", "commitment", "savings"]),
|
|
260
|
+
Skill("fo-05", "Spot Instance Optimization", "finops", "medium",
|
|
261
|
+
"Spot", ["spot", "preemptible", "interruptible"]),
|
|
262
|
+
Skill("fo-06", "Storage Tiering", "finops", "medium",
|
|
263
|
+
"Storage optimization", ["storage", "tiering", "lifecycle"]),
|
|
264
|
+
Skill("fo-07", "Compute Right-sizing", "finops", "medium",
|
|
265
|
+
"Right-sizing", ["rightsizing", "optimization", "advisor"]),
|
|
266
|
+
Skill("fo-08", "Chargeback & Showback", "finops", "advanced",
|
|
267
|
+
"Cost allocation", ["chargeback", "showback", "allocation"]),
|
|
268
|
+
]
|
|
269
|
+
},
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
def __init__(self):
|
|
273
|
+
"""Initialize role matcher."""
|
|
274
|
+
self._build_keyword_index()
|
|
275
|
+
|
|
276
|
+
def _build_keyword_index(self):
|
|
277
|
+
"""Build keyword to skill index for fast matching."""
|
|
278
|
+
self.keyword_index: Dict[str, List[Tuple[str, Skill]]] = {}
|
|
279
|
+
|
|
280
|
+
for role_id, role_data in self.ROLES.items():
|
|
281
|
+
for skill in role_data.get("skills", []):
|
|
282
|
+
for keyword in skill.keywords:
|
|
283
|
+
if keyword not in self.keyword_index:
|
|
284
|
+
self.keyword_index[keyword] = []
|
|
285
|
+
self.keyword_index[keyword].append((role_id, skill))
|
|
286
|
+
|
|
287
|
+
def match_roles(
|
|
288
|
+
self,
|
|
289
|
+
analysis: ProcessAnalysis,
|
|
290
|
+
strategy: Optional[object] = None
|
|
291
|
+
) -> TeamComposition:
|
|
292
|
+
"""
|
|
293
|
+
Match process to optimal team composition.
|
|
294
|
+
|
|
295
|
+
Args:
|
|
296
|
+
analysis: Process analysis
|
|
297
|
+
strategy: Optional automation strategy
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
TeamComposition with role assignments
|
|
301
|
+
"""
|
|
302
|
+
# Calculate affinity scores for each role
|
|
303
|
+
role_scores = self._calculate_role_affinities(analysis)
|
|
304
|
+
|
|
305
|
+
# Create role assignments
|
|
306
|
+
assignments = []
|
|
307
|
+
total_effort = 0
|
|
308
|
+
|
|
309
|
+
# Sort roles by affinity
|
|
310
|
+
sorted_roles = sorted(
|
|
311
|
+
role_scores.items(),
|
|
312
|
+
key=lambda x: x[1]["score"],
|
|
313
|
+
reverse=True
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
# Assign primary role (highest affinity)
|
|
317
|
+
primary_assigned = False
|
|
318
|
+
|
|
319
|
+
for role_id, score_data in sorted_roles:
|
|
320
|
+
if score_data["score"] < 20:
|
|
321
|
+
continue
|
|
322
|
+
|
|
323
|
+
# Determine effort based on affinity
|
|
324
|
+
if not primary_assigned:
|
|
325
|
+
effort = 40 # Primary role gets 40%
|
|
326
|
+
is_primary = True
|
|
327
|
+
primary_assigned = True
|
|
328
|
+
else:
|
|
329
|
+
effort = max(10, min(30, score_data["score"] / 3))
|
|
330
|
+
is_primary = False
|
|
331
|
+
|
|
332
|
+
total_effort += effort
|
|
333
|
+
|
|
334
|
+
assignments.append(RoleAssignment(
|
|
335
|
+
role=role_id,
|
|
336
|
+
role_name=self.ROLES[role_id]["name"],
|
|
337
|
+
affinity_score=score_data["score"],
|
|
338
|
+
skills_required=score_data["skills"],
|
|
339
|
+
responsibilities=score_data["responsibilities"],
|
|
340
|
+
effort_percentage=effort,
|
|
341
|
+
is_primary=is_primary
|
|
342
|
+
))
|
|
343
|
+
|
|
344
|
+
# Normalize effort to 100%
|
|
345
|
+
if total_effort > 0:
|
|
346
|
+
for assignment in assignments:
|
|
347
|
+
assignment.effort_percentage = round(
|
|
348
|
+
(assignment.effort_percentage / total_effort) * 100, 1
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
# Identify skill gaps
|
|
352
|
+
skill_gaps = self._identify_skill_gaps(analysis, assignments)
|
|
353
|
+
|
|
354
|
+
# Map cross-functional dependencies
|
|
355
|
+
dependencies = self._map_dependencies(assignments)
|
|
356
|
+
|
|
357
|
+
# Calculate team size
|
|
358
|
+
team_size = self._calculate_team_size(analysis, assignments)
|
|
359
|
+
|
|
360
|
+
return TeamComposition(
|
|
361
|
+
assignments=assignments,
|
|
362
|
+
skill_gaps=skill_gaps,
|
|
363
|
+
cross_functional_dependencies=dependencies,
|
|
364
|
+
recommended_team_size=team_size
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
def _calculate_role_affinities(
|
|
368
|
+
self,
|
|
369
|
+
analysis: ProcessAnalysis
|
|
370
|
+
) -> Dict[str, Dict]:
|
|
371
|
+
"""Calculate affinity scores for each role."""
|
|
372
|
+
scores = {}
|
|
373
|
+
|
|
374
|
+
for role_id, role_data in self.ROLES.items():
|
|
375
|
+
score = 0
|
|
376
|
+
matched_skills = []
|
|
377
|
+
responsibilities = []
|
|
378
|
+
|
|
379
|
+
# Check automation type match
|
|
380
|
+
role_auto_types = role_data.get("automation_types", [])
|
|
381
|
+
for auto_type in analysis.automation_types:
|
|
382
|
+
if auto_type in role_auto_types:
|
|
383
|
+
score += 25
|
|
384
|
+
responsibilities.append(f"Implement {auto_type.value} automation")
|
|
385
|
+
|
|
386
|
+
# Check keyword matches in process
|
|
387
|
+
process_text = f"{analysis.name} {analysis.description}".lower()
|
|
388
|
+
for step in analysis.steps:
|
|
389
|
+
process_text += f" {step.name} {step.description}".lower()
|
|
390
|
+
|
|
391
|
+
for skill in role_data.get("skills", []):
|
|
392
|
+
for keyword in skill.keywords:
|
|
393
|
+
if keyword in process_text:
|
|
394
|
+
score += 10
|
|
395
|
+
if skill.id not in matched_skills:
|
|
396
|
+
matched_skills.append(skill.id)
|
|
397
|
+
break
|
|
398
|
+
|
|
399
|
+
# Check data source relevance
|
|
400
|
+
if role_id == "data-engineer" and analysis.data_sources_involved:
|
|
401
|
+
score += 20
|
|
402
|
+
responsibilities.append("Build data integration pipelines")
|
|
403
|
+
|
|
404
|
+
# Check compliance relevance
|
|
405
|
+
if role_id == "security-architect" and analysis.compliance_requirements:
|
|
406
|
+
score += 30
|
|
407
|
+
responsibilities.append("Ensure compliance requirements are met")
|
|
408
|
+
|
|
409
|
+
# System design always involved for complex processes
|
|
410
|
+
if role_id == "system-design":
|
|
411
|
+
if analysis.complexity.value in ["complex", "enterprise"]:
|
|
412
|
+
score += 25
|
|
413
|
+
responsibilities.append("Design overall architecture")
|
|
414
|
+
else:
|
|
415
|
+
score += 10
|
|
416
|
+
responsibilities.append("Review architecture decisions")
|
|
417
|
+
|
|
418
|
+
# DevOps always needed for deployment
|
|
419
|
+
if role_id == "devops":
|
|
420
|
+
score += 15
|
|
421
|
+
responsibilities.append("Set up CI/CD and deployment")
|
|
422
|
+
|
|
423
|
+
# FinOps for cost tracking
|
|
424
|
+
if role_id == "finops":
|
|
425
|
+
score += 10
|
|
426
|
+
responsibilities.append("Track and optimize costs")
|
|
427
|
+
|
|
428
|
+
scores[role_id] = {
|
|
429
|
+
"score": min(100, score),
|
|
430
|
+
"skills": matched_skills[:5], # Top 5 skills
|
|
431
|
+
"responsibilities": responsibilities
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
return scores
|
|
435
|
+
|
|
436
|
+
def _identify_skill_gaps(
|
|
437
|
+
self,
|
|
438
|
+
analysis: ProcessAnalysis,
|
|
439
|
+
assignments: List[RoleAssignment]
|
|
440
|
+
) -> List[Dict]:
|
|
441
|
+
"""Identify potential skill gaps."""
|
|
442
|
+
gaps = []
|
|
443
|
+
|
|
444
|
+
# Get all matched skills
|
|
445
|
+
matched_skills = set()
|
|
446
|
+
for assignment in assignments:
|
|
447
|
+
matched_skills.update(assignment.skills_required)
|
|
448
|
+
|
|
449
|
+
# Check for common gaps based on automation types
|
|
450
|
+
if AutomationType.AI_POWERED in analysis.automation_types:
|
|
451
|
+
ai_skills = {"ai-01", "ai-04", "ai-07"}
|
|
452
|
+
missing = ai_skills - matched_skills
|
|
453
|
+
if missing:
|
|
454
|
+
gaps.append({
|
|
455
|
+
"area": "AI/LLM",
|
|
456
|
+
"missing_skills": list(missing),
|
|
457
|
+
"recommendation": "Ensure AI Engineer covers prompt engineering and safety"
|
|
458
|
+
})
|
|
459
|
+
|
|
460
|
+
if AutomationType.ML_BASED in analysis.automation_types:
|
|
461
|
+
ml_skills = {"ml-01", "ml-04", "ml-05"}
|
|
462
|
+
missing = ml_skills - matched_skills
|
|
463
|
+
if missing:
|
|
464
|
+
gaps.append({
|
|
465
|
+
"area": "MLOps",
|
|
466
|
+
"missing_skills": list(missing),
|
|
467
|
+
"recommendation": "Include ML Engineer for model lifecycle management"
|
|
468
|
+
})
|
|
469
|
+
|
|
470
|
+
if analysis.compliance_requirements:
|
|
471
|
+
sec_skills = {"sa-01", "sa-02"}
|
|
472
|
+
missing = sec_skills - matched_skills
|
|
473
|
+
if missing:
|
|
474
|
+
gaps.append({
|
|
475
|
+
"area": "Security/Compliance",
|
|
476
|
+
"missing_skills": list(missing),
|
|
477
|
+
"recommendation": "Engage Security Architect for compliance validation"
|
|
478
|
+
})
|
|
479
|
+
|
|
480
|
+
return gaps
|
|
481
|
+
|
|
482
|
+
def _map_dependencies(
|
|
483
|
+
self,
|
|
484
|
+
assignments: List[RoleAssignment]
|
|
485
|
+
) -> List[Dict]:
|
|
486
|
+
"""Map cross-functional dependencies."""
|
|
487
|
+
dependencies = []
|
|
488
|
+
|
|
489
|
+
role_ids = [a.role for a in assignments]
|
|
490
|
+
|
|
491
|
+
# Common dependency patterns
|
|
492
|
+
if "data-engineer" in role_ids and "ml-engineer" in role_ids:
|
|
493
|
+
dependencies.append({
|
|
494
|
+
"from": "data-engineer",
|
|
495
|
+
"to": "ml-engineer",
|
|
496
|
+
"type": "data",
|
|
497
|
+
"description": "Feature pipelines and training data"
|
|
498
|
+
})
|
|
499
|
+
|
|
500
|
+
if "data-engineer" in role_ids and "ai-engineer" in role_ids:
|
|
501
|
+
dependencies.append({
|
|
502
|
+
"from": "data-engineer",
|
|
503
|
+
"to": "ai-engineer",
|
|
504
|
+
"type": "data",
|
|
505
|
+
"description": "Document processing and embeddings"
|
|
506
|
+
})
|
|
507
|
+
|
|
508
|
+
if "ml-engineer" in role_ids and "devops" in role_ids:
|
|
509
|
+
dependencies.append({
|
|
510
|
+
"from": "ml-engineer",
|
|
511
|
+
"to": "devops",
|
|
512
|
+
"type": "deployment",
|
|
513
|
+
"description": "Model serving infrastructure"
|
|
514
|
+
})
|
|
515
|
+
|
|
516
|
+
if "security-architect" in role_ids:
|
|
517
|
+
dependencies.append({
|
|
518
|
+
"from": "security-architect",
|
|
519
|
+
"to": "all",
|
|
520
|
+
"type": "review",
|
|
521
|
+
"description": "Security review gates"
|
|
522
|
+
})
|
|
523
|
+
|
|
524
|
+
if "system-design" in role_ids:
|
|
525
|
+
dependencies.append({
|
|
526
|
+
"from": "system-design",
|
|
527
|
+
"to": "all",
|
|
528
|
+
"type": "architecture",
|
|
529
|
+
"description": "Architecture guidance and ADRs"
|
|
530
|
+
})
|
|
531
|
+
|
|
532
|
+
return dependencies
|
|
533
|
+
|
|
534
|
+
def _calculate_team_size(
|
|
535
|
+
self,
|
|
536
|
+
analysis: ProcessAnalysis,
|
|
537
|
+
assignments: List[RoleAssignment]
|
|
538
|
+
) -> int:
|
|
539
|
+
"""Calculate recommended team size."""
|
|
540
|
+
base_size = len([a for a in assignments if a.affinity_score >= 30])
|
|
541
|
+
|
|
542
|
+
# Adjust for complexity
|
|
543
|
+
complexity_adjustment = {
|
|
544
|
+
"simple": 0,
|
|
545
|
+
"moderate": 1,
|
|
546
|
+
"complex": 2,
|
|
547
|
+
"enterprise": 3
|
|
548
|
+
}
|
|
549
|
+
base_size += complexity_adjustment.get(analysis.complexity.value, 0)
|
|
550
|
+
|
|
551
|
+
return max(2, min(8, base_size))
|
|
552
|
+
|
|
553
|
+
def get_skill_details(self, skill_id: str) -> Optional[Skill]:
|
|
554
|
+
"""Get details for a specific skill."""
|
|
555
|
+
for role_data in self.ROLES.values():
|
|
556
|
+
for skill in role_data.get("skills", []):
|
|
557
|
+
if skill.id == skill_id:
|
|
558
|
+
return skill
|
|
559
|
+
return None
|
|
560
|
+
|
|
561
|
+
def get_role_skills(self, role_id: str) -> List[Skill]:
|
|
562
|
+
"""Get all skills for a role."""
|
|
563
|
+
if role_id in self.ROLES:
|
|
564
|
+
return self.ROLES[role_id].get("skills", [])
|
|
565
|
+
return []
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
# Example usage
|
|
569
|
+
if __name__ == "__main__":
|
|
570
|
+
from process_analyzer import ProcessAnalyzer
|
|
571
|
+
|
|
572
|
+
analyzer = ProcessAnalyzer()
|
|
573
|
+
analysis = analyzer.analyze_process(
|
|
574
|
+
name="Automated Customer Insights Report",
|
|
575
|
+
description="Generate weekly insights from customer data using ML",
|
|
576
|
+
steps=[
|
|
577
|
+
{"name": "Extract CRM data", "time_minutes": 20, "data_sources": ["Salesforce"]},
|
|
578
|
+
{"name": "Extract usage data", "time_minutes": 15, "data_sources": ["Product DB"]},
|
|
579
|
+
{"name": "Run segmentation model", "time_minutes": 30, "requires_expertise": True},
|
|
580
|
+
{"name": "Generate insights with LLM", "time_minutes": 20, "requires_expertise": True},
|
|
581
|
+
{"name": "Create visualizations", "time_minutes": 25},
|
|
582
|
+
{"name": "Distribute report", "time_minutes": 10}
|
|
583
|
+
],
|
|
584
|
+
frequency="weekly",
|
|
585
|
+
stakeholders=["Product", "Marketing", "Sales"],
|
|
586
|
+
compliance_requirements=["GDPR"]
|
|
587
|
+
)
|
|
588
|
+
|
|
589
|
+
matcher = RoleMatcher()
|
|
590
|
+
team = matcher.match_roles(analysis)
|
|
591
|
+
|
|
592
|
+
print("=" * 60)
|
|
593
|
+
print("TEAM COMPOSITION RECOMMENDATION")
|
|
594
|
+
print("=" * 60)
|
|
595
|
+
print(f"\nRecommended Team Size: {team.recommended_team_size}")
|
|
596
|
+
|
|
597
|
+
print("\nRole Assignments:")
|
|
598
|
+
for assignment in team.assignments:
|
|
599
|
+
primary = " (PRIMARY)" if assignment.is_primary else ""
|
|
600
|
+
print(f"\n {assignment.role_name}{primary}")
|
|
601
|
+
print(f" Affinity Score: {assignment.affinity_score}%")
|
|
602
|
+
print(f" Effort: {assignment.effort_percentage}%")
|
|
603
|
+
print(f" Skills: {', '.join(assignment.skills_required)}")
|
|
604
|
+
print(f" Responsibilities:")
|
|
605
|
+
for resp in assignment.responsibilities:
|
|
606
|
+
print(f" - {resp}")
|
|
607
|
+
|
|
608
|
+
if team.skill_gaps:
|
|
609
|
+
print("\nSkill Gaps Identified:")
|
|
610
|
+
for gap in team.skill_gaps:
|
|
611
|
+
print(f" - {gap['area']}: {gap['recommendation']}")
|
|
612
|
+
|
|
613
|
+
print("\nCross-Functional Dependencies:")
|
|
614
|
+
for dep in team.cross_functional_dependencies:
|
|
615
|
+
print(f" - {dep['from']} → {dep['to']}: {dep['description']}")
|