{"id":46639310,"url":"https://github.com/ericchansen/teamskills","last_synced_at":"2026-03-08T02:19:02.400Z","repository":{"id":336075833,"uuid":"1146083088","full_name":"ericchansen/teamskills","owner":"ericchansen","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-27T00:24:07.000Z","size":532,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-27T01:34:20.233Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ericchansen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-30T15:48:43.000Z","updated_at":"2026-02-27T00:24:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ericchansen/teamskills","commit_stats":null,"previous_names":["ericchansen/teamskills"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ericchansen/teamskills","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fteamskills","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fteamskills/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fteamskills/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fteamskills/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ericchansen","download_url":"https://codeload.github.com/ericchansen/teamskills/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericchansen%2Fteamskills/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30242406,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T00:58:18.660Z","status":"online","status_checked_at":"2026-03-08T02:00:06.215Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-03-08T02:19:01.679Z","updated_at":"2026-03-08T02:19:02.368Z","avatar_url":"https://github.com/ericchansen.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Team Skills Tracker\n\nA web application for tracking team member skills and proficiency levels across Azure products, use cases, and soft skills.\n\n## Features\n\n- **Skills Matrix View**: Visual table showing all team members and their skills\n- **User Profiles**: Detailed view of individual skills with easy editing\n- **Proficiency Levels**: Microsoft's L100-L400 scale with color coding\n  - L100 (Red): Foundational - understands core concepts; applies learning with guidance\n  - L200 (Orange): Intermediate - applies skills in standard scenarios with growing independence\n  - L300 (Blue): Advanced - solves complex, ambiguous problems; coaches peers\n  - L400 (Green): Expert - recognized authority; shapes best practices and mentors others\n  - L400 (Green): Expert - deep expertise, can lead workshops\n- **Skill Categories**: Organized by Azure Compute, Data, AI, Security, Networking, DevOps, Soft Skills, and Use Cases\n- **Easy Skill Management**: Quick add/edit/delete with autocomplete\n- **AI Chat Assistant**: Natural language queries for finding experts and analyzing team skills\n\n## Tech Stack\n\n- **Frontend**: React + Vite\n- **Backend**: Node.js + Express\n- **Agent**: Python + Microsoft Agent Framework\n- **Database**: PostgreSQL\n- **AI Model**: Azure AI Services (GPT-4o)\n\n## 🚀 Quick Start with Docker (Recommended)\n\n**Prerequisites**: Docker Desktop ([Get Docker](https://www.docker.com/products/docker-desktop/))\n\n```bash\n# Clone the repository\ngit clone \u003cyour-repo-url\u003e\ncd teamskills\n\n# Start everything\ndocker-compose up --build\n```\n\n**Done!** Open http://localhost:3000 in your browser.\n\nDocker automatically:\n- ✅ Starts PostgreSQL with test data\n- ✅ Runs backend API (http://localhost:3001)\n- ✅ Runs agent service (http://localhost:8000)\n- ✅ Runs frontend dev server (http://localhost:3000)\n\n### Chat Assistant Setup\n\nThe AI chat assistant requires Azure AI Services credentials. Create a `.env` file:\n\n```bash\ncp .env.example .env\n```\n\nEdit `.env` with your Azure AI Services settings:\n```\nAZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com\nAZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o\n```\n\nWithout these credentials, the chat will show \"Agent not available\" but all other features work normally.\n\nSee [DOCKER.md](DOCKER.md) for detailed Docker commands and troubleshooting.\n\n---\n\n## Alternative: Local Setup (Without Docker)\n\n**Prerequisites**: \n- Node.js 18+ \n- PostgreSQL 14+\n- npm or yarn\n\n## Setup Instructions\n\n### 1. Database Setup\n\nCreate a PostgreSQL database:\n```bash\npsql -U postgres\nCREATE DATABASE teamskills;\n\\q\n```\n\nInitialize the schema and seed data:\n```bash\npsql -U postgres -d teamskills -f database/schema.sql\npsql -U postgres -d teamskills -f database/seed.sql\n```\n\n### 2. Backend Setup\n\nCreate a `.env` file in the root directory:\n```bash\ncp .env.example .env\n```\n\nEdit `.env` with your database credentials:\n```\nDB_USER=postgres\nDB_HOST=localhost\nDB_NAME=teamskills\nDB_PASSWORD=your_password\nDB_PORT=5432\nPORT=3001\n```\n\nInstall dependencies and start the backend:\n```bash\nnpm install\nnpm start\n```\n\nThe API will run on http://localhost:3001\n\n### 3. Frontend Setup\n\nInstall frontend dependencies:\n```bash\ncd frontend\nnpm install\n```\n\nStart the development server:\n```bash\nnpm run dev\n```\n\nThe frontend will run on http://localhost:3000\n\n## Loading Your Team Data\n\nThe repository includes demo data with fictional team members. To load your real team:\n\n1. **Create your team seed file** by copying and modifying the demo:\n   ```bash\n   cp database/seed.sql database/seed-team.sql\n   ```\n\n2. **Edit `database/seed-team.sql`** with your real team members' names, emails, and skills\n\n3. **Load your team data** (replaces demo data):\n   ```bash\n   # With Docker:\n   docker-compose exec db psql -U postgres -d teamskills -c \"TRUNCATE users, user_skills, skill_relationships RESTART IDENTITY CASCADE;\"\n   docker-compose exec -T db psql -U postgres -d teamskills \u003c database/seed-team.sql\n   \n   # Without Docker:\n   psql -U postgres -d teamskills -c \"TRUNCATE users, user_skills, skill_relationships RESTART IDENTITY CASCADE;\"\n   psql -U postgres -d teamskills -f database/seed-team.sql\n   ```\n\n\u003e **Note**: `seed-team.sql` is gitignored to protect your team's personal information.\n\n## Usage\n\n1. Open http://localhost:3000 in your browser\n2. **Matrix View**: See all team members and their skills at a glance\n3. **Click a user name** to view their detailed profile\n4. **Add Skills**: Click \"+ Add Skill\" button, search for skills, and select proficiency level\n5. **Update Proficiency**: Use dropdown in profile view to change skill levels\n6. **Filter Skills**: Use category filter in matrix view to focus on specific skill areas\n7. **Chat Assistant**: Click the 💬 button to ask questions like:\n   - \"Who knows Kubernetes?\"\n   - \"What skill gaps do we have?\"\n   - \"Give me a team skills summary\"\n\n## API Endpoints\n\n### Users\n- `GET /api/users` - Get all users\n- `GET /api/users/:id` - Get single user\n- `POST /api/users` - Create user\n- `PUT /api/users/:id` - Update user\n- `DELETE /api/users/:id` - Delete user\n\n### Skills\n- `GET /api/skills` - Get all skills\n- `GET /api/skills/:id` - Get single skill\n- `GET /api/skills/:id/related` - Get related skills\n- `POST /api/skills` - Create skill\n- `PUT /api/skills/:id` - Update skill\n- `DELETE /api/skills/:id` - Delete skill\n\n### Skill Categories\n- `GET /api/categories` - Get all categories\n- `POST /api/categories` - Create category\n\n### User Skills\n- `GET /api/user-skills/:userId` - Get all skills for a user\n- `PUT /api/user-skills` - Update or create user skill\n- `DELETE /api/user-skills` - Remove user skill\n\n### Matrix\n- `GET /api/matrix` - Get complete matrix data (users × skills)\n\n### Agent (Chat Assistant)\n- `GET /agent/status` - Check agent availability and capabilities\n- `POST /chat` - Send message and get complete response\n- `POST /chat/stream` - Send message and get streaming SSE response\n\n## Development\n\nThe application includes 8 test users with diverse skill profiles across different Azure specializations. Use these to explore the functionality or add your own team members.\n\n## Future Enhancements\n\n- Export/reporting features (Excel, PDF)\n- Skill endorsements/verification\n- Learning resource links\n- MCP PostgreSQL integration for advanced queries\n- Team filtering/labels for users\n\n## Authentication\n\nThe app supports Microsoft Entra ID (Azure AD) authentication. When configured, users can sign in with their Microsoft accounts and edit their own skill profiles.\n\nSee [docs/authentication.md](docs/authentication.md) for setup instructions.\n\n**Quick summary:**\n- Register an app in Microsoft Entra ID\n- Set `AZURE_AD_CLIENT_ID` and `AZURE_AD_TENANT_ID` environment variables\n- Users are matched by email or auto-created on first login\n\nWithout authentication configured, the app runs in demo mode with a simple user picker.\n\n## PR Preview Environments\n\nEvery pull request automatically gets an isolated staging environment for review.\n\n### How It Works\n\n1. **Open a PR** → GitHub Actions deploys a staging environment\n2. **Bot comments** on the PR with frontend and backend URLs\n3. **Push updates** → Environment is redeployed with latest changes\n4. **Close/merge PR** → Environment is automatically deleted\n\n### Staging Environment Details\n\nEach PR gets:\n- Isolated Container Apps (backend + frontend)\n- Dedicated PostgreSQL database with demo data\n- Unique URLs: `https://ca-frontend-pr{number}.*.azurecontainerapps.io`\n\n### GitHub Environment Setup\n\nPR staging uses a separate `staging` GitHub Environment (not `production`):\n\n| GitHub Environment | Purpose | Used by |\n|---|---|---|\n| `staging` | PR preview deployments | `pr-staging.yml`, `pr-cleanup.yml` |\n| `production` | Production deployments | `ci-cd.yml` (deploy job, master only) |\n\n**Required setup:**\n1. Create a `staging` GitHub Environment in repo Settings → Environments\n2. Add the same Azure credentials (vars: `AZURE_CLIENT_ID`, `AZURE_SUBSCRIPTION_ID`, `AZURE_TENANT_ID`; secret: `AZURE_CLIENT_SECRET`)\n3. For Dependabot PR staging: also add `AZURE_CLIENT_SECRET` as a [Dependabot secret](https://docs.github.com/en/code-security/dependabot/working-with-dependabot/configuring-access-to-private-registries-for-dependabot)\n\n### Cost Optimization\n\n- Uses cheapest PostgreSQL SKU (B1ms Burstable)\n- Container Apps scale to zero when idle\n- Resources deleted automatically on PR close\n- Shares production ACR to avoid duplicate registry costs\n\n---\n\n## Azure Deployment\n\nThis project can be deployed to Azure using the Azure Developer CLI (azd).\n\n### Prerequisites\n\n- [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) installed and logged in\n- [Azure Developer CLI (azd)](https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd) installed\n\n### Deploy to Azure\n\n```bash\n# Login to Azure\naz login\nazd auth login\n\n# Deploy everything (infrastructure + code)\nazd up\n```\n\nThis will:\n- Create a resource group with PostgreSQL, Container Registry, Container Apps, and Azure AI Services\n- Build and push Docker images to the registry\n- Deploy all three services (backend, frontend, agent)\n- Configure RBAC for the agent to call Azure AI Services\n\n### Tear Down Azure Resources\n\nTo delete all Azure resources created by this project:\n\n```bash\n# Delete all resources (with purge for soft-deleted resources)\nazd down --force --purge -e \u003cenvironment-name\u003e\n```\n\nThe `--force` flag skips confirmation prompts, and `--purge` permanently deletes soft-deletable resources like Key Vaults and Cognitive Services accounts.\n\n**Note**: If azd down fails, you can manually delete the resource group:\n```bash\naz group delete --name rg-\u003cenvironment-name\u003e --yes --no-wait\n```\n\n### Useful Commands\n\n```bash\n# List deployed environments\nazd env list\n\n# Show environment details (URLs, settings)\nazd env get-values -e \u003cenvironment-name\u003e\n\n# Deploy only code changes (no infrastructure changes)\nazd deploy\n\n# Deploy only infrastructure changes\nazd provision\n\n# View deployment logs\naz containerapp logs show --name \u003capp-name\u003e --resource-group \u003crg-name\u003e --tail 50\n```\n\n## License\n\nISC\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericchansen%2Fteamskills","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericchansen%2Fteamskills","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericchansen%2Fteamskills/lists"}