diff --git a/.cursorrules b/.cursorrules
new file mode 100644
index 0000000..f04868e
--- /dev/null
+++ b/.cursorrules
@@ -0,0 +1,76 @@
+{
+ "rules": {
+ "python": {
+ "max_line_length": 88,
+ "docstring_style": "google",
+ "require_type_hints": true,
+ "require_docstrings": true,
+ "require_async_for_io": true,
+ "require_error_handling": true
+ },
+ "general": {
+ "require_tests": true,
+ "test_coverage_threshold": 80,
+ "require_readme": true,
+ "require_requirements": true,
+ "require_logging": true,
+ "require_error_messages": true
+ },
+ "security": {
+ "prevent_hardcoded_secrets": true,
+ "require_input_validation": true,
+ "require_dependency_pinning": true
+ },
+ "style": {
+ "require_consistent_naming": true,
+ "require_comments_complex_logic": true,
+ "max_function_length": 50,
+ "max_complexity": 10
+ },
+ "teaching": {
+ "require_example_comments": true,
+ "require_step_documentation": true,
+ "require_performance_comments": true
+ },
+ "git": {
+ "require_conventional_commits": true,
+ "max_commit_size": 300,
+ "require_branch_protection": true
+ },
+ "ci_cd": {
+ "require_github_actions": true,
+ "require_security_scanning": true,
+ "require_dependency_updates": true
+ },
+ "observability": {
+ "require_structured_logging": true,
+ "require_error_tracking": true,
+ "require_performance_metrics": true
+ }
+ },
+ "documentation": {
+ "required_sections": [
+ "Overview",
+ "Installation",
+ "Usage",
+ "Configuration",
+ "Testing",
+ "Security",
+ "Performance",
+ "Contributing"
+ ]
+ },
+ "ignore_patterns": [
+ "**/__pycache__/**",
+ "**/.pytest_cache/**",
+ "**/venv/**",
+ "**/node_modules/**"
+ ],
+ "custom_checks": {
+ "teaching_readiness": {
+ "require_step_by_step_comments": true,
+ "require_learning_objectives": true,
+ "require_example_outputs": true
+ }
+ }
+}
diff --git a/.gitignore b/.gitignore
index 8e90a1b..a73b26d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -459,7 +459,7 @@ log/
*.pfx
*.env
*.env.*
-!*.env.example
+!.env.example
.secrets/
secrets/
credentials/
@@ -507,3 +507,4 @@ temp/
.idea/
*.swp
*.swo
+tims-notebook.md
diff --git a/LICENSE b/LICENSE
index 1f873a5..e1fd273 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2024 Timothy Warner
+Copyright (c) 2023
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 2d1f822..eefb7c8 100644
--- a/README.md
+++ b/README.md
@@ -1,84 +1,110 @@
-# GitHub Copilot for Developers
+# GitHub Copilot Dev Repository
-
+## Overview
+This repository is a collection of resources, examples, and exercises for mastering GitHub Copilot and related technologies.
-[](https://github.com/timothywarner/nodegoat)
-[](https://github.com/timothywarner-org/demokb)
-[](https://techtrainertim.com)
-[](https://opensource.org/licenses/MIT)
+## Repository Structure
+- **assets/**: Images and other media assets.
+- **blackbeard-extension-main/**: A sample extension project.
+- **data/**: Example datasets for exercises.
+- **docs/**: Documentation and guides.
+- **examples/**: Code examples and templates.
+- **exercises/**: Hands-on exercises for learning.
+- **modules/**: Structured learning modules.
+- **resources/**: Additional learning resources.
+- **server-2025-learning-lab/**: A server-side learning lab project.
-Gain experience with an AI-based pair programmer right now!
+## Getting Started
+1. Clone the repository: `git clone `
+2. Navigate to the desired folder and follow the instructions in the README files.
-## Course Information
+## Contributing
+See [CONTRIBUTING.md](server-2025-learning-lab/CONTRIBUTING.md) for guidelines.
-**Instructor**: Tim Warner - Microsoft MVP, MCT
+## License
+This project is licensed under the terms of the MIT license. See [LICENSE](LICENSE) for details.
-## Connect with Tim
-- π§ Email: [tim@techtrainertim.com](mailto:tim@techtrainertim.com)
-- π Website: [TechTrainerTim.com](https://techtrainertim.com)
-- π¦ Bluesky: [@techtrainertim.bsky.social](https://bsky.app/profile/techtrainertim.bsky.social)
-- πΌ LinkedIn: [Timothy Warner](https://www.linkedin.com/in/timothywarner)
-- π₯ YouTube: [@TechTrainerTim](https://youtube.com/@TechTrainerTim)
-- π O'Reilly: [Timothy Warner](https://learning.oreilly.com/search/?q=author%3A%22Timothy+Warner%22&type=*&rows=100)
+# GitHub Copilot News Fetcher
-## Repository Structure
+A modern Python example demonstrating how to fetch and display GitHub Copilot news from official sources. This educational example showcases several Python best practices and modern development patterns.
-### Course Content
-- π `/modules` - Core course materials organized by topic
- - π `/01-getting-started` - Getting started with GitHub Copilot
- - π `/02-everyday-development` - Using Copilot for everyday development
- - π `/03-advanced-features` - Advanced features and techniques
- - π `/04-ecosystem-future` - Ecosystem and future possibilities
-
-### Resources
-- π `/exercises` - Hands-on exercises (all in one place)
-- π `/examples` - Code examples organized by language/technology
-- π `/docs` - Course documentation and reference materials
-- π `/workflows` - GitHub Actions and automation examples
-- π `/presentations` - Slides and presentation materials
-- π `/cheatsheets` - Quick reference guides
+## Learning Objectives
-## Getting Started
-1. Review the [setup guide](docs/setup-guide.md)
-2. Check the [course details](docs/course-details.md)
-3. Start with the [basics](modules/01-getting-started/README.md)
-4. Try the [exercises](exercises/README.md)
-
-## Prerequisites
-- GitHub account (free or paid)
-- Visual Studio Code with GitHub Copilot extension
-- Basic understanding of Git and GitHub
-- Familiarity with at least one programming language
-
-## Core Resources
-### Official Documentation
-- [GitHub Copilot Product Page](https://github.com/features/copilot)
-- [Official Documentation](https://docs.github.com/en/copilot)
-- [GitHub Copilot for Individuals](https://docs.github.com/en/copilot/quickstart)
-- [GitHub Copilot for Business](https://docs.github.com/en/copilot/github-copilot-enterprise/overview)
-
-### IDE Extensions
-- [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot)
-- [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=GitHub.copilotvs)
-- [JetBrains Extension](https://plugins.jetbrains.com/plugin/17718-github-copilot)
-- [Neovim Extension](https://github.com/github/copilot.vim)
-
-### GitHub Copilot X Features
-- [Copilot CLI](https://githubnext.com/projects/copilot-cli/)
-- [Copilot for Pull Requests](https://github.blog/2023-11-08-github-copilot-in-the-cli-now-in-public-beta/)
-- [Copilot Chat](https://docs.github.com/en/copilot/github-copilot-chat/using-github-copilot-chat)
-
-### Learning Resources
-- [GitHub Learning Lab](https://github.com/skills/copilot-codespaces-vs)
-- [Best Practices for Prompting](https://github.blog/2023-06-20-how-to-write-better-prompts-for-github-copilot/)
-- [GitHub Copilot Trust Center](https://github.com/features/copilot/trust)
-- [Community Forum](https://github.community/c/code-to-cloud/github-copilot/41)
-
-### Pricing & Billing
-- [Pricing Information](https://docs.github.com/en/billing/managing-billing-for-github-copilot/about-billing-for-github-copilot)
-- [Enterprise Features](https://docs.github.com/en/copilot/github-copilot-enterprise/overview)
+1. **Modern Python Features**
+ - Type hints with `typing` module
+ - Dataclasses for clean data structures
+ - Async/await for concurrent operations
+ - Resource management with context managers
-## License
-MIT License - See [LICENSE](LICENSE) for details
+2. **Best Practices**
+ - Clean code organization with classes
+ - Error handling with try/except
+ - Resource cleanup in finally blocks
+ - Strong typing for better maintainability
+ - Concurrent operations for better performance
+
+3. **Real-world Integration**
+ - HTTP requests with modern `httpx` library
+ - RSS feed parsing
+ - GitHub API integration
+ - Beautiful console output with `rich`
+
+## Installation
+
+```bash
+# Create and activate a virtual environment (recommended)
+python -m venv venv
+source venv/bin/activate # On Windows: venv\Scripts\activate
+
+# Install dependencies
+pip install -r requirements.txt
+```
+
+## Usage
+
+Simply run the script:
+
+```bash
+python github-news-fetcher2.py
+```
+
+The script will:
+1. Fetch the latest Copilot-related posts from the GitHub blog
+2. Fetch the latest Copilot releases from GitHub
+3. Display the combined results in a nicely formatted table
+
+## Code Structure
+
+- `CopilotNews`: Dataclass representing a single news item
+- `GitHubNewsFetcher`: Main class handling news fetching and display
+ - `fetch_blog_posts()`: Fetches and filters GitHub blog posts
+ - `fetch_releases()`: Fetches latest GitHub Copilot releases
+ - `display_news()`: Formats and displays results
+
+## Error Handling
+
+The script includes robust error handling:
+- Timeouts for HTTP requests
+- Exception catching for API and parsing errors
+- Graceful degradation (continues even if one source fails)
+- Resource cleanup with async context management
+
+## Dependencies
+
+- `httpx`: Modern async HTTP client
+- `feedparser`: RSS/Atom feed parser
+- `rich`: Terminal formatting and tables
+
+## Extension Ideas
+
+1. Add more news sources (Twitter, YouTube, etc.)
+2. Implement caching for API responses
+3. Add filtering options for specific topics
+4. Create a web interface using FastAPI
+5. Add unit tests with pytest
+
+## Contributing
+
+Feel free to submit issues and enhancement requests!
diff --git a/course-plan.md b/course-plan.md
index b88fb81..017744b 100644
--- a/course-plan.md
+++ b/course-plan.md
@@ -1,12 +1,5 @@
# GitHub Copilot for Developers - Teaching Punchlist
-## Course Structure
-
-- **Duration**: 4 hours total
-- **Segments**: 4 x ~55 minute segments
-- **Breaks**: ~9 minute breaks between segments
-- **Platform**: ON24 live training **platform**
-
## SEGMENT 1: Getting Started with GitHub Copilot (55min)
### 1. Welcome & Introduction (10min)
@@ -126,7 +119,7 @@
### 1. AI Coding Assistant Landscape (10min)
-- [ ] Compare: Copilot, Replit, Anysphere, Magic
+- [ ] Compare: Copilot, Windsurf, v0, Replit, Anysphere, Magic
- [ ] Integration with GitHub ecosystem
- [ ] Cost/benefit analysis
- [ ] Microsoft/OpenAI/Anthropic relationships
@@ -141,7 +134,7 @@
### 3. Extensions and Integration (15min)
- [ ] GitHub marketplace extensions
-- [ ] DEMO: Install and use an extension
+- [ ] DEMO: Install and use an extensions
- [ ] API integration possibilities
- [ ] Creating custom plugins
diff --git a/data/README_ContrastStudy.md b/data/README_ContrastStudy.md
new file mode 100644
index 0000000..4ee3234
--- /dev/null
+++ b/data/README_ContrastStudy.md
@@ -0,0 +1,45 @@
+# Contrast Study: Good Data vs. Bad Data for AI-900
+
+This repository contains **two CSV datasets** plus this **Markdown** guide. The purpose is to demonstrate:
+
+1. A **good_data.csv** file that embodies **Microsoftβs Responsible AI Principles**:
+ - **Anonymized IDs** instead of personal names.
+ - **No direct PII** (no phone numbers, addresses, etc.).
+ - Balanced distribution of features (several regions, a range of ages, consistent labeling).
+ - Clearly defined **features** (all columns except the final) vs. **label** (the final column).
+
+2. A **bad_data.csv** file that violates multiple best practices:
+ - **FullName**, **StreetAddress**, **PhoneNumber** columns reveal sensitive PII.
+ - Unnecessary or questionable columns like βBlacklisted.β
+ - Inconsistent label values (Yes, No, Maybe, or empty).
+ - Missing or out-of-range numeric values (e.g., PerformanceRating can be 0 or 6, or missing).
+ - Skewed/uniform region (everything is βNorthβ), leading to potential bias.
+ - Disorganized, incomplete, or erroneous rows.
+
+## Key Teaching Points
+
+- **Responsible AI** demands that data be collected and labeled **fairly**, with **privacy** and **security** in mind, and with **transparent** usage of features vs. labels.
+- The **good_data.csv** shows a standard tabular layout ready for typical **classification** tasks (predicting βPromotionEligibleβ), with data that can be **one-hot encoded** or used as-is in many ML pipelines.
+- The **bad_data.csv** highlights the pitfalls: from personal information leaks to label ambiguity, missing values, and potential biases.
+
+## How to Use
+
+1. **Load** `good_data.csv` in tools such as:
+ - Azure Machine Learning Studio
+ - VS Code + Python (Pandas)
+ - Databricks or Spark (for bigger scale)
+ - GitHub Codespaces or local Jupyter Notebooks
+
+2. **Inspect** how easy it is to parse and model the βgoodβ dataset. Notice consistent numeric columns, no hidden PII, and a clear target label.
+
+3. **Load** `bad_data.csv`:
+ - Observe the errors, missing data, out-of-bound values, etc.
+ - Discuss how to fix or remove these columns and how that might reduce bias or risk.
+
+4. **Emphasize** Microsoft Responsible AI Principlesβask learners to spot each violation in `bad_data.csv` (privacy, fairness, reliability, etc.).
+
+5. **Extend** the data or create new synthetic variants for advanced labs. Show how βcleaningβ the bad data can be done, bridging best practices and real-world scenarios.
+
+## Enjoy Teaching!
+
+Use these files in your **AI-900** or general ML classes to illustrate the difference between βsolid, responsibly sourced dataβ vs. βchaotic, risk-laden dataβ in a memorable, hands-on way.
diff --git a/docs/repository-structure.md b/docs/repository-structure.md
index 1f18aa1..001f26f 100644
--- a/docs/repository-structure.md
+++ b/docs/repository-structure.md
@@ -79,89 +79,21 @@ This structure is optimized for the 4-hour instructional session by:
2. Providing clear progression through the outlined topics
3. Containing specific examples and exercises within each module
4. Maintaining common reference materials separately
-# Repository Structure
-```
-copilot-dev-2/
-βββ README.md # Main documentation and course overview
-βββ LICENSE # MIT License
-βββ .gitignore # Git ignore file
-βββ assets/ # Images and other media
-β βββ slides/ # Presentation slides (including warner-copilot.pptx)
-β βββ images/ # Images used in documentation
-βββ docs/ # Course documentation
-β βββ course-details.md # Detailed course outline
-β βββ setup-guide.md # Environment setup instructions
-β βββ oreilly-details.md # O'Reilly course specifics
-β βββ resources.md # Additional learning resources
-βββ modules/ # Organized by course segments
-β βββ 01-getting-started/ # Introduction and setup
-β β βββ README.md # Module overview
-β β βββ exercises/ # Hands-on activities
-β β βββ examples/ # Code demos
-β βββ 02-copilot-fundamentals/ # Core functionality
-β β βββ README.md # Module overview
-β β βββ exercises/ # Hands-on activities
-β β βββ examples/ # Code demos
-β βββ 03-tips-and-shortcuts/ # Time-saving techniques
-β β βββ README.md # Module overview
-β β βββ exercises/ # Hands-on activities
-β β βββ examples/ # Code demos
-β βββ 04-copilot-x-advanced/ # Advanced capabilities
-β β βββ README.md # Module overview
-β β βββ exercises/ # Hands-on activities
-β β βββ examples/ # Code demos
-β βββ 05-real-world-usage/ # Use cases and best practices
-β βββ README.md # Module overview
-β βββ exercises/ # Hands-on activities
-β βββ examples/ # Code demos
-βββ examples/ # Common example code for reference
-β βββ web-dev/ # Web development examples
-β βββ data-science/ # Data science examples
-β βββ devops/ # DevOps and automation examples
-β βββ prompt-engineering/ # Prompt crafting examples
-βββ resources/ # Additional resources
- βββ cheatsheets/ # Quick reference guides
- βββ templates/ # Template files and snippets
- βββ further-reading/ # Links and additional materials
-```
-
-## Directory Purposes
-
-### `/assets`
-- Stores all media content including presentation slides and images
-- Maintains version control of visual content for the course
-
-### `/docs`
-- Contains all course documentation
-- Provides setup guides and resources
-- Houses detailed course materials and O'Reilly-specific information
-
-### `/modules`
-- Structured according to the course segments
-- Each module contains:
- - README.md with module objectives and summary
- - Exercises for hands-on practice
- - Examples relevant to that module's content
-- Organized for a logical teaching flow in a 4-hour session
-
-### `/examples`
-- Common reusable code examples categorized by domain
-- Demonstrates different use cases of GitHub Copilot
-- More comprehensive than the specific module examples
-
-### `/resources`
-- Supplementary materials for students
-- Quick reference cheatsheets
-- Template files for various use cases
-- Additional reading materials and links
-
-## Instructional Flow Benefits
-
-This structure is optimized for a 4-hour instructional session by:
+# Repository Structure
-1. Organizing content into logical segments that match the course outline
-2. Providing clear progression from basics to advanced topics
-3. Containing specific examples and exercises within each module
-4. Maintaining common reference materials separately
-5. Creating a consistent structure within each module for easier navigation
\ No newline at end of file
+This document provides an overview of the repository structure and the purpose of each folder.
+
+## Top-Level Folders
+- **assets/**: Contains images and other media assets.
+- **blackbeard-extension-main/**: A sample extension project for learning.
+- **data/**: Example datasets for exercises and analysis.
+- **docs/**: Documentation and guides for the repository.
+- **examples/**: Code examples and templates for various use cases.
+- **exercises/**: Hands-on exercises to practice skills.
+- **modules/**: Structured learning modules for different topics.
+- **resources/**: Additional resources like cheatsheets and templates.
+- **server-2025-learning-lab/**: A server-side learning lab project.
+
+## Usage
+Refer to the README files in each folder for detailed instructions.
\ No newline at end of file
diff --git a/docs/setup-guide.md b/docs/setup-guide.md
index 45d47db..b0e9a59 100644
--- a/docs/setup-guide.md
+++ b/docs/setup-guide.md
@@ -1,24 +1,29 @@
# Setup Guide
## Prerequisites
-1. GitHub Account Setup
- * Create or login to your GitHub account
- * Enable GitHub Copilot subscription
-
-2. IDE Installation
- * Install Visual Studio Code
- * Install GitHub Copilot extension
- * Configure Copilot settings
-
-3. Git Configuration
- * Install Git
- * Configure basic Git settings
- * Clone this repository
-
-4. Verify Installation
- * Test Copilot suggestions
- * Test Copilot Chat
- * Verify access to all features
+- Git installed on your machine.
+- Python 3.8+ and Node.js 14+ installed.
+- A GitHub account.
+
+## Steps
+1. Clone the repository:
+ ```bash
+ git clone
+ ```
+2. Navigate to the project directory:
+ ```bash
+ cd copilot-dev-2
+ ```
+3. Install dependencies:
+ - For Python:
+ ```bash
+ pip install -r requirements.txt
+ ```
+ - For Node.js:
+ ```bash
+ npm install
+ ```
+4. Run the application or scripts as needed.
## VS Code Configuration
### Required Extensions
@@ -53,4 +58,4 @@
- Verify GitHub authentication
- Check Copilot subscription status
- Ensure VS Code is up to date
-- Clear VS Code cache if needed
\ No newline at end of file
+- Clear VS Code cache if needed
\ No newline at end of file
diff --git a/fizzbuzz.js b/fizzbuzz.js
new file mode 100644
index 0000000..1df5027
--- /dev/null
+++ b/fizzbuzz.js
@@ -0,0 +1,13 @@
+function fizzBuzz (n) {
+ for (let i = 1; i <= n; i++) {
+ if (i % 3 === 0 && i % 5 === 0) {
+ console.log("FizzBuzz");
+ } else if (i % 3 === 0) {
+ console.log("Fizz");
+ } else if (i % 5 === 0) {
+ console.log("Buzz");
+ } else {
+ console.log(i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/github-copilot-news-fetcher.js b/github-copilot-news-fetcher.js
new file mode 100644
index 0000000..c5b835b
--- /dev/null
+++ b/github-copilot-news-fetcher.js
@@ -0,0 +1,57 @@
+import axios from 'axios';
+import cheerio from 'cheerio';
+
+/**
+ * Fetches and parses GitHub Copilot news from GitHub Blog.
+ * @returns {Promise} Array of news articles about GitHub Copilot
+ */
+async function fetchCopilotNews() {
+ try {
+ console.log("Fetching GitHub Copilot news...");
+
+ // GitHub Blog URL
+ const githubBlogUrl = 'https://github.blog';
+
+ // Fetch GitHub Blog page
+ const response = await axios.get(githubBlogUrl);
+ const html = response.data;
+
+ // Parse HTML using Cheerio
+ const $ = cheerio.load(html);
+ const news = [];
+
+ // Fixed the duplicate line here
+ $('article').each((index, element) => {
+ const title = $(element).find('h2').text().trim();
+ const link = $(element).find('a').attr('href');
+ const description = $(element).find('p').text().trim();
+
+ if (title.toLowerCase().includes('copilot')) {
+ news.push({
+ title,
+ link: link.startsWith('http') ? link : `${githubBlogUrl}${link}`,
+ description,
+ });
+ }
+ });
+
+ if (news.length > 0) {
+ console.log("GitHub Copilot News found:");
+ news.forEach((item, index) => {
+ console.log(`${index + 1}. ${item.title}`);
+ console.log(` Link: ${item.link}`);
+ console.log(` Description: ${item.description}`);
+ });
+ } else {
+ console.log("No GitHub Copilot news found.");
+ }
+
+ return news;
+ } catch (error) {
+ console.error("Error fetching GitHub Copilot news:", error.message);
+ throw error;
+ }
+}
+
+// Run the function
+fetchCopilotNews();
\ No newline at end of file
diff --git a/github-news-fetcher2.py b/github-news-fetcher2.py
new file mode 100644
index 0000000..a62c42b
--- /dev/null
+++ b/github-news-fetcher2.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python3
+"""
+GitHub Copilot News Fetcher
+A simple tool to fetch the latest GitHub Copilot news from official sources.
+
+Author: Tim Warner
+Purpose: Educational demonstration of Python best practices and API usage
+"""
+
+import httpx
+import feedparser
+from datetime import datetime
+from rich.console import Console
+from rich.table import Table
+from typing import List, Dict, Any
+import asyncio
+from dataclasses import dataclass
+
+@dataclass
+class CopilotNews:
+ """Represents a single piece of Copilot news"""
+ title: str
+ date: datetime
+ url: str
+ source: str
+
+class GitHubNewsFetcher:
+ """Fetches and aggregates GitHub Copilot news from multiple sources"""
+
+ def __init__(self):
+ self.console = Console()
+ # Using httpx for modern async HTTP
+ self.client = httpx.AsyncClient(
+ timeout=30.0,
+ follow_redirects=True
+ )
+
+ async def fetch_blog_posts(self) -> List[CopilotNews]:
+ """Fetch Copilot-related posts from GitHub blog"""
+ try:
+ # GitHub blog feed URL
+ response = await self.client.get("https://github.blog/feed/")
+ feed = feedparser.parse(response.text)
+
+ copilot_news = []
+ for entry in feed.entries:
+ # Filter for Copilot-related posts
+ if "copilot" in entry.title.lower() or "copilot" in entry.description.lower():
+ news = CopilotNews(
+ title=entry.title,
+ date=datetime(*entry.published_parsed[:6]),
+ url=entry.link,
+ source="GitHub Blog"
+ )
+ copilot_news.append(news)
+
+ return copilot_news[:5] # Return latest 5 matches
+ except Exception as e:
+ self.console.print(f"[red]Error fetching blog posts: {e}[/red]")
+ return []
+
+ async def fetch_releases(self) -> List[CopilotNews]:
+ """Fetch latest GitHub Copilot releases using GitHub API"""
+ try:
+ response = await self.client.get(
+ "https://api.github.com/repos/github/copilot-docs/releases"
+ )
+ releases = response.json()
+
+ return [
+ CopilotNews(
+ title=f"Release: {release['name']}",
+ date=datetime.fromisoformat(release['published_at'].replace('Z', '+00:00')),
+ url=release['html_url'],
+ source="GitHub Releases"
+ )
+ for release in releases[:3] # Latest 3 releases
+ ]
+ except Exception as e:
+ self.console.print(f"[red]Error fetching releases: {e}[/red]")
+ return []
+
+ def display_news(self, news_items: List[CopilotNews]):
+ """Display news items in a formatted table"""
+ table = Table(title="Latest GitHub Copilot News")
+
+ table.add_column("Date", style="cyan")
+ table.add_column("Title", style="green")
+ table.add_column("Source", style="yellow")
+ table.add_column("URL", style="blue")
+
+ # Sort by date, newest first
+ sorted_news = sorted(news_items, key=lambda x: x.date, reverse=True)
+
+ for item in sorted_news:
+ table.add_row(
+ item.date.strftime("%Y-%m-%d"),
+ item.title,
+ item.source,
+ item.url
+ )
+
+ self.console.print(table)
+
+ async def close(self):
+ """Clean up resources"""
+ await self.client.aclose()
+
+async def main():
+ fetcher = GitHubNewsFetcher()
+ try:
+ # Fetch news from multiple sources concurrently
+ blog_posts, releases = await asyncio.gather(
+ fetcher.fetch_blog_posts(),
+ fetcher.fetch_releases()
+ )
+
+ # Combine and display results
+ all_news = blog_posts + releases
+ fetcher.display_news(all_news)
+
+ finally:
+ await fetcher.close()
+
+if __name__ == "__main__":
+ # Run the async main function
+ asyncio.run(main())
diff --git a/notepad b/notepad
new file mode 100644
index 0000000..22a74d1
--- /dev/null
+++ b/notepad
@@ -0,0 +1,9 @@
+# tim's dream board
+
+1. do something EPIC:
+ - Build a GitHub Copilot plugin that tells dad jokes while coding
+ - Host a "worst code ever" contest and judge entries with AI
+ - Create a VS Code extension that plays dramatic music during merge conflicts
+
+2. do something nice
+3. my imaginatino is failing
\ No newline at end of file
diff --git a/prom b/prom
new file mode 100644
index 0000000..e69de29
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..5b9ab42
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+httpx==0.26.0
+feedparser==6.0.11
+rich==13.7.0
\ No newline at end of file
diff --git a/server-2025-learning-lab/CONTRIBUTING.md b/server-2025-learning-lab/CONTRIBUTING.md
index f15613d..1177623 100644
--- a/server-2025-learning-lab/CONTRIBUTING.md
+++ b/server-2025-learning-lab/CONTRIBUTING.md
@@ -1,10 +1,15 @@
-# Contributing to Windows Server 2025 Learning Lab
+# Contributing Guidelines
-Thank you for considering contributing to the Windows Server 2025 Learning Lab project! This document provides guidelines and instructions for contributing.
+Thank you for considering contributing to this project! Please follow these guidelines to ensure a smooth contribution process.
-## Code of Conduct
+## How to Contribute
+1. Fork the repository.
+2. Create a new branch for your feature or bugfix.
+3. Commit your changes with clear and descriptive messages.
+4. Submit a pull request to the `main` branch.
-By participating in this project, you agree to abide by its [Code of Conduct](CODE_OF_CONDUCT.md).
+## Code of Conduct
+Please adhere to the [Code of Conduct](CODE_OF_CONDUCT.md) to maintain a welcoming and inclusive environment.
## How Can I Contribute?
@@ -134,4 +139,4 @@ This project uses labels to categorize issues and pull requests:
## Thank You!
-Your contributions are greatly appreciated. Every little bit helps, and credit will always be given.
\ No newline at end of file
+Your contributions are greatly appreciated. Every little bit helps, and credit will always be given.
\ No newline at end of file
diff --git a/workflow_dev/codeql-app-scan.yml b/workflow_dev/codeql-app-scan.yml
new file mode 100644
index 0000000..2cdef04
--- /dev/null
+++ b/workflow_dev/codeql-app-scan.yml
@@ -0,0 +1,29 @@
+# CodeQL workflow for security scanning
+name: "CodeQL Analysis"
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+ schedule:
+ - cron: "0 0 * * 0"
+
+jobs:
+ analyze:
+ name: Analyze CodeQL
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: "javascript,python"
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
\ No newline at end of file