Initial commit

This commit is contained in:
2026-06-20 04:28:24 +03:00
committed by GitHub
commit 07f02e0958
29 changed files with 1700 additions and 0 deletions
@@ -0,0 +1,25 @@
---
applyTo: "octofit-tracker/backend/**"
---
# Octofit Tracker Logic + Data Tier Guidelines
## Logic tier (Node.js + Express + TypeScript)
- Build API routes under `/api/`.
- Keep API service on port `8000`.
- Use environment-aware Codespaces URLs via `CODESPACE_NAME`.
Example base URL logic:
```ts
const codespaceName = process.env.CODESPACE_NAME;
const baseUrl = codespaceName
? `https://${codespaceName}-8000.app.github.dev`
: 'http://localhost:8000';
```
## Data tier (MongoDB + Mongoose)
- Use Mongoose models for users, teams, activities, leaderboard, and workouts.
- Connect to `octofit_db`.
- Validate endpoints with `curl` after wiring routes.
@@ -0,0 +1,18 @@
---
applyTo: "octofit-tracker/frontend/**"
---
# Octofit Tracker React Presentation Tier Guidelines
Use commands that target `octofit-tracker/frontend` without changing directories.
```bash
npm create vite@latest octofit-tracker/frontend -- --template react
npm install --prefix octofit-tracker/frontend
npm install bootstrap react-router-dom --prefix octofit-tracker/frontend
```
Add Bootstrap CSS import at the top of `octofit-tracker/frontend/src/main.jsx`.
## Images
Use `docs/octofitapp-small.png` for the app logo.
@@ -0,0 +1,66 @@
---
applyTo: "**"
---
# Octofit Tracker Multi-tier Application Setup Guidelines
## Application goals
Build an Octofit Tracker **multi-tier application** with:
- User authentication and profiles
- Activity logging and tracking
- Team creation and management
- Competitive leaderboard
- Personalized workout suggestions
## Command execution rules
- Never change directories in commands.
- Always reference target paths directly.
## Forwarded ports
- 8000: public (logic/API tier)
- 5173: public (presentation tier)
- 27017: private (data tier)
Do not propose any other ports to forward or make public.
## Project structure
```text
octofit-tracker/
├── backend/
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
└── frontend/
├── src/
└── package.json
```
## Stack requirements
### Presentation tier
- React 19 with Vite
- react-router-dom for navigation
- bootstrap for styling
### Logic tier
- Node.js (LTS)
- Express
- TypeScript
### Data tier
- MongoDB (`mongodb-org`)
- Mongoose for data access
## MongoDB service expectations
- Always use `ps aux | grep mongod` to check whether mongod is running.
- `mongodb-org` is the official MongoDB package.
- `mongosh` is the official client tool.
- Use Mongoose models from the logic tier for schema/data work instead of ad-hoc raw scripts.
@@ -0,0 +1,21 @@
---
mode: 'agent'
model: GPT-5.5
description: 'Create the Node.js logic tier for the Octofit multi-tier application'
---
Create the logic tier in `octofit-tracker/backend` for the Octofit Tracker multi-tier application.
Requirements:
1. Do not change directories; use path-qualified commands.
2. Initialize a TypeScript Node.js API with Express.
3. Configure scripts for build/dev/start.
4. Add route handlers for:
- `/api/users/`
- `/api/teams/`
- `/api/activities/`
- `/api/leaderboard/`
- `/api/workouts/`
5. Keep server port on `8000`.
6. Add Codespaces-aware API URL support using `CODESPACE_NAME`.
@@ -0,0 +1,18 @@
---
mode: 'agent'
model: GPT-5.5
description: 'Configure MongoDB and seed octofit_db for the Octofit multi-tier application'
---
Set up and populate the data tier for `octofit-tracker/backend`.
Requirements:
1. Use MongoDB with Mongoose.
2. Use connection string for local MongoDB on port `27017` and database `octofit_db`.
3. Create Mongoose models for users, teams, activities, leaderboard, and workouts.
4. Add a seed script at `src/scripts/seed.ts`.
5. Include this help/description text in the seed script comments or logs:
`Seed the octofit_db database with test data`.
6. Insert realistic sample data for all collections.
7. Verify data creation with API route responses.
+35
View File
@@ -0,0 +1,35 @@
## Step 1: Prepare your modern multi-tier application exercise
Welcome to your **"Build applications with GitHub Copilot agent mode"** exercise! :robot:
In this exercise, you will build a **modern multi-tier application** for OctoFit Tracker:
- **Presentation tier:** React 19
- **Logic tier:** Node.js + Express + TypeScript
- **Data tier:** MongoDB
### :keyboard: Activity: Create and publish your working branch
1. Open your Codespace for your repository copy.
1. Open Copilot Chat and switch to **Agent** mode.
1. Run this prompt:
> ![Static Badge](https://img.shields.io/badge/-Prompt-text?style=flat-square&logo=github%20copilot&labelColor=512a97&color=ecd8ff)
>
> ```prompt
> Please create and publish a new Git branch called build-octofit-app
> ```
1. Confirm the active branch is `build-octofit-app`.
1. Wait for Mona to post the next step.
<details>
<summary>Having trouble? 🤷</summary><br/>
- Make sure the branch name is exactly `build-octofit-app`.
- Make sure the branch is pushed to your repository.
</details>
@@ -0,0 +1,40 @@
## Step 2: Initialize the modern multi-tier application stack
> [!NOTE]
> **Behind the scenes:** This exercise uses custom instruction files to guide Copilot for this multi-tier application setup.
In this step, you will initialize a modern **multi-tier application** foundation:
- Create `octofit-tracker/frontend` and `octofit-tracker/backend`.
- Initialize React 19 (presentation tier) with Vite.
- Initialize a Node.js + Express + TypeScript backend (logic tier).
- Add MongoDB support with Mongoose (data tier).
### :keyboard: Activity: Initialize frontend and backend package manifests
> ![Static Badge](https://img.shields.io/badge/-Prompt-text?style=flat-square&logo=github%20copilot&labelColor=512a97&color=ecd8ff)
>
> ```prompt
> Let's initialize the OctoFit Tracker modern multi-tier application.
>
> Follow the instructions exactly and execute step-by-step:
> - Create octofit-tracker/frontend and octofit-tracker/backend
> - Initialize React 19 in the frontend with Vite
> - Initialize backend package.json for Node.js + Express + TypeScript
> - Add mongoose for MongoDB data access
> - Keep ports at 5173 (frontend), 8000 (backend), and 27017 (MongoDB)
> ```
1. Commit and push to `build-octofit-app`.
1. Wait for Mona to check your work and post the next lesson.
<details>
<summary>Having trouble? 🤷</summary><br/>
Check these files exist and include expected dependencies:
- `octofit-tracker/frontend/package.json` with React 19.
- `octofit-tracker/backend/package.json` with `express` and `mongoose`.
</details>
+44
View File
@@ -0,0 +1,44 @@
## Step 3: Build the logic and data tiers for the multi-tier application
> [!NOTE]
> **Behind the scenes:** Custom instructions and prompt files guide Copilot while building the logic and data tiers.
In this step, you will implement the backend of the **multi-tier application**:
- Configure MongoDB connection for `octofit_db`.
- Create Express routes for users, teams, activities, leaderboard, and workouts.
- Add a seed script to populate test data.
### :keyboard: Activity: Scaffold the logic tier
Use this prompt file:
> ![Static Badge](https://img.shields.io/badge/-Prompt-text?style=flat-square&logo=github%20copilot&labelColor=512a97&color=ecd8ff)
>
> ```prompt
> /create-express-logic-tier
> ```
### :keyboard: Activity: Configure and seed the data tier
Use this prompt file:
> ![Static Badge](https://img.shields.io/badge/-Prompt-text?style=flat-square&logo=github%20copilot&labelColor=512a97&color=ecd8ff)
>
> ```prompt
> /init-populate-octofit_db
> ```
1. Commit and push your backend changes.
1. Wait for Mona to validate and unlock the next step.
<details>
<summary>Having trouble? 🤷</summary><br/>
Confirm these files include expected content:
- `octofit-tracker/backend/src/config/database.ts` includes `octofit_db` and `mongoose`.
- `octofit-tracker/backend/src/scripts/seed.ts` includes a seed command description.
</details>
@@ -0,0 +1,35 @@
## Step 4: Wire API hosting for the multi-tier application
In this step, you will finalize API hosting for your **multi-tier application**:
- Keep backend API on port `8000`.
- Build Codespaces-aware API URL behavior using `$CODESPACE_NAME`.
- Validate endpoints with `curl`.
### :keyboard: Activity: Configure API base URL and host support
> ![Static Badge](https://img.shields.io/badge/-Prompt-text?style=flat-square&logo=github%20copilot&labelColor=512a97&color=ecd8ff)
>
> ```prompt
> Let's configure the Node.js API for Codespaces and localhost.
>
> - Backend runs on port 8000
> - Build API base URL with $CODESPACE_NAME when available:
> https://$CODESPACE_NAME-8000.app.github.dev
> - Keep localhost support when $CODESPACE_NAME is not set
> - Verify /api/users and /api/activities with curl
> ```
1. Commit and push your changes to `build-octofit-app`.
1. Wait for Mona to validate and share the next step.
<details>
<summary>Having trouble? 🤷</summary><br/>
Verify `octofit-tracker/backend/src/server.ts` includes:
- `CODESPACE_NAME`
- `-8000.app.github.dev`
</details>
@@ -0,0 +1,53 @@
## Step 5: Build the React presentation tier of the multi-tier application
> [!NOTE]
> This step implements the **presentation tier** for your modern multi-tier application.
In this step, you will:
- Complete React 19 frontend components.
- Connect each view to the backend API routes.
- Use React Router for navigation.
### :keyboard: Activity: Implement frontend components and routing
> ![Static Badge](https://img.shields.io/badge/-Prompt-text?style=flat-square&logo=github%20copilot&labelColor=512a97&color=ecd8ff)
>
> ```prompt
> Let's update the React 19 presentation tier for this multi-tier application.
>
> - Update src/App.jsx and src/main.jsx
> - Update src/components/Activities.jsx
> - Update src/components/Leaderboard.jsx
> - Update src/components/Teams.jsx
> - Update src/components/Users.jsx
> - Update src/components/Workouts.jsx
> - Use react-router-dom for navigation
> - Use Vite environment variables via `import.meta.env`, for example `import.meta.env.VITE_CODESPACE_NAME`
> - Document that `VITE_CODESPACE_NAME` must be defined (for example in `.env.local`)
> - Use API endpoints under:
> https://${import.meta.env.VITE_CODESPACE_NAME}-8000.app.github.dev/api/[component]/
> - Add a safe fallback if `VITE_CODESPACE_NAME` is unset to avoid `https://undefined-8000...` URLs
> - Keep compatibility with paginated and array responses
> ```
### :keyboard: Activity: Run and verify the presentation tier
Run the React app with the Vite dev server (for example, `npm run dev`) and open port `5173`.
1. Commit and push your changes.
1. Wait for Mona to verify and post the final lesson.
<details>
<summary>Having trouble? 🤷</summary><br/>
Confirm these files include the expected endpoint paths:
- `Activities.jsx` -> `/api/activities/`
- `Leaderboard.jsx` -> `/api/leaderboard/`
- `Teams.jsx` -> `/api/teams/`
- `Users.jsx` -> `/api/users/`
- `Workouts.jsx` -> `/api/workouts/`
</details>
+22
View File
@@ -0,0 +1,22 @@
## Step 6: Use Copilot on your multi-tier application pull request
Great job! You have implemented a modern **multi-tier application** with Copilot agent mode.
Now create and complete your pull request workflow.
### :keyboard: Activity: Open, summarize, and review your PR
1. Open your repository in a browser.
1. Create a pull request with:
- **base:** `main`
- **compare:** `build-octofit-app`
- **title:** `Modernize OctoFit multi-tier application stack`
1. Optionally use **Copilot Summary** for the PR description.
1. Optionally request a **Copilot code review**.
1. Merge the pull request.
1. Wait for Mona to post the final review.
+20
View File
@@ -0,0 +1,20 @@
## Review
_Congratulations, you've completed this exercise!_
You built and modernized a **multi-tier application** using GitHub Copilot agent mode.
### What you accomplished
- Prepared a Codespaces environment for a multi-tier application.
- Implemented a React 19 presentation tier.
- Built a Node.js + Express + TypeScript logic tier.
- Connected a MongoDB data tier with Mongoose.
- Practiced pull request summarization and review with Copilot.
### What's next?
- Add authentication and role-based authorization.
- Add tests for API routes and React components.
- Add CI checks for linting and automated tests.
- Explore other GitHub Skills exercises.
+70
View File
@@ -0,0 +1,70 @@
name: Step 0 # Start Exercise build-applications-w-GHCP-agent-mode
on:
push:
branches:
- main
permissions:
contents: write
actions: write
issues: write
env:
STEP_1_FILE: ".github/steps/1-preparing.md"
jobs:
start_exercise:
if: |
!github.event.repository.is_template
name: Start Exercise
uses: skills/exercise-toolkit/.github/workflows/start-exercise.yml@v0.9.0
with:
exercise-title: "Build Applications with GitHub Copilot Agent Mode"
intro-message: |
"Welcome to the exciting world of GitHub Copilot agent mode! 🚀
In this exercise, you'll unlock the potential of this AI-powered
coding assistant to accelerate your development process. Let's dive in
and have some fun exploring the future of coding together! 💻✨"
post_next_step_content:
name: Post next step content
runs-on: ubuntu-latest
needs: [start_exercise]
env:
ISSUE_NUMBER: ${{ needs.start_exercise.outputs.issue-number }}
ISSUE_REPOSITORY: ${{ github.repository }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Create comment - add step content
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: ${{ env.STEP_1_FILE }}
vars: |
login: ${{ github.actor }}
full_repo_name: ${{ github.repository }}
- name: Create comment - watching for progress
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/watching-for-progress.md
- name: Enable next step workflow
run: |
gh workflow enable "Step 1"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+68
View File
@@ -0,0 +1,68 @@
name: Step 1 # Preparing to use GHCP agent mode
on:
push:
branches:
- "build-octofit-app"
permissions:
contents: read
actions: write
issues: write
env:
STEP_2_FILE: ".github/steps/2-application-initial-setup.md"
jobs:
find_exercise:
name: Find Exercise Issue
uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.0
post_next_step_content:
name: Post next step content
needs: [find_exercise]
runs-on: ubuntu-latest
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Create comment - step finished
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/step-finished-prepare-next-step.md
vars: |
next_step_number: 2
- name: Create comment - add step content
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: ${{ env.STEP_2_FILE }}
- name: Create comment - watching for progress
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/watching-for-progress.md
- name: Disable current workflow and enable next one
run: |
gh workflow disable "${{github.workflow}}"
gh workflow enable "Step 2"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,163 @@
name: Step 2 # octofit-tracker application initial setup
on:
push:
branches:
- "build-octofit-app"
paths:
- "octofit-tracker/frontend/package.json"
- "octofit-tracker/backend/package.json"
permissions:
contents: read
actions: write
issues: write
env:
STEP_3_FILE: ".github/steps/3-django-project-setup.md"
jobs:
find_exercise:
name: Find Exercise Issue
uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.0
check_step_work:
name: Check step work
runs-on: ubuntu-latest
needs: [find_exercise]
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Find last comment
id: find-last-comment
uses: peter-evans/find-comment@v3
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
direction: last
- name: Update comment - checking work
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
comment-id: ${{ steps.find-last-comment.outputs.comment-id }}
file: exercise-toolkit/markdown-templates/step-feedback/checking-work.md
edit-mode: replace
# START: Check practical exercise
- name: Check React 19 dependency
id: check-react-19
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/frontend/package.json
keyphrase: '"react": "\^19'
minimum-occurrences: 1
case-sensitive: false
- name: Check Express dependency
id: check-express
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/backend/package.json
keyphrase: '"express"'
minimum-occurrences: 1
case-sensitive: false
- name: Check Mongoose dependency
id: check-mongoose
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/backend/package.json
keyphrase: '"mongoose"'
minimum-occurrences: 1
case-sensitive: false
- name: Update comment - step results
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
comment-id: ${{ steps.find-last-comment.outputs.comment-id }}
edit-mode: replace
file: exercise-toolkit/markdown-templates/step-feedback/step-results-table.md
vars: |
step_number: 2
results_table:
- description: "Check frontend package.json for React 19"
passed: ${{ steps.check-react-19.outcome == 'success' }}
- description: "Check backend package.json for Express"
passed: ${{ steps.check-express.outcome == 'success' }}
- description: "Check backend package.json for Mongoose"
passed: ${{ steps.check-mongoose.outcome == 'success' }}
# END: Check practical exercise
- name: Fail job if not all checks passed
if: contains(steps.*.outcome, 'failure')
run: exit 1
post_next_step_content:
name: Post next step content
needs: [find_exercise, check_step_work]
runs-on: ubuntu-latest
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Create comment - step finished
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/step-finished-prepare-next-step.md
vars: |
next_step_number: 3
- name: Create comment - add step content
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: ${{ env.STEP_3_FILE }}
- name: Create comment - watching for progress
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/watching-for-progress.md
- name: Disable current workflow and enable next one
run: |
gh workflow disable "${{github.workflow}}"
gh workflow enable "Step 3"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,162 @@
name: Step 3 # Logic tier setup and MongoDB test data population
on:
push:
branches:
- "build-octofit-app"
paths:
- "octofit-tracker/backend/src/**"
- "octofit-tracker/backend/package.json"
permissions:
contents: read
actions: write
issues: write
env:
STEP_4_FILE: ".github/steps/4-setup-django-rest-framework.md"
jobs:
find_exercise:
name: Find Exercise Issue
uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.0
check_step_work:
name: Check step work
runs-on: ubuntu-latest
needs: [find_exercise]
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Find last comment
id: find-last-comment
uses: peter-evans/find-comment@v3
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
direction: last
- name: Update comment - checking work
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
comment-id: ${{ steps.find-last-comment.outputs.comment-id }}
file: exercise-toolkit/markdown-templates/step-feedback/checking-work.md
edit-mode: replace
# START: Check practical exercise
- name: Check database config file for octofit_db
id: check-octofit-db
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/backend/src/config/database.ts
keyphrase: 'octofit_db'
minimum-occurrences: 1
case-sensitive: false
- name: Check database config file for mongoose
id: check-mongoose-config
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/backend/src/config/database.ts
keyphrase: 'mongoose'
minimum-occurrences: 1
case-sensitive: false
- name: Check seed script description
id: check-seed-script
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/backend/src/scripts/seed.ts
keyphrase: 'Seed the octofit_db database with test data'
minimum-occurrences: 1
case-sensitive: false
- name: Update comment - step results
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
comment-id: ${{ steps.find-last-comment.outputs.comment-id }}
edit-mode: replace
file: exercise-toolkit/markdown-templates/step-feedback/step-results-table.md
vars: |
step_number: 3
results_table:
- description: "Check database.ts for octofit_db"
passed: ${{ steps.check-octofit-db.outcome == 'success' }}
- description: "Check database.ts for mongoose"
passed: ${{ steps.check-mongoose-config.outcome == 'success' }}
- description: "Check seed.ts for test data seed description"
passed: ${{ steps.check-seed-script.outcome == 'success' }}
# END: Check practical exercise
- name: Fail job if not all checks passed
if: contains(steps.*.outcome, 'failure')
run: exit 1
post_next_step_content:
name: Post next step content
needs: [find_exercise, check_step_work]
runs-on: ubuntu-latest
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Create comment - step finished
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/step-finished-prepare-next-step.md
vars: |
next_step_number: 4
- name: Create comment - add step content
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: ${{ env.STEP_4_FILE }}
- name: Create comment - watching for progress
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/watching-for-progress.md
- name: Disable current workflow and enable next one
run: |
gh workflow disable "${{github.workflow}}"
gh workflow enable "Step 4"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,150 @@
name: Step 4 # Setup API hosting for the logic tier
on:
push:
branches:
- "build-octofit-app"
paths:
- "octofit-tracker/backend/src/**"
permissions:
contents: read
actions: write
issues: write
env:
STEP_5_FILE: ".github/steps/5-setup-frontend-react-framework.md"
jobs:
find_exercise:
name: Find Exercise Issue
uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.0
check_step_work:
name: Check step work
runs-on: ubuntu-latest
needs: [find_exercise]
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Find last comment
id: find-last-comment
uses: peter-evans/find-comment@v3
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
direction: last
- name: Update comment - checking work
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
comment-id: ${{ steps.find-last-comment.outputs.comment-id }}
file: exercise-toolkit/markdown-templates/step-feedback/checking-work.md
edit-mode: replace
# START: Check practical exercise
- name: Check server.ts uses codespace env variable
id: check-codespace-name
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/backend/src/server.ts
keyphrase: 'CODESPACE_NAME'
minimum-occurrences: 1
case-sensitive: false
- name: Check server.ts includes codespace URL pattern
id: check-codespace-url
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/backend/src/server.ts
keyphrase: '-8000.app.github.dev'
minimum-occurrences: 1
case-sensitive: false
- name: Update comment - step results
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
comment-id: ${{ steps.find-last-comment.outputs.comment-id }}
edit-mode: replace
file: exercise-toolkit/markdown-templates/step-feedback/step-results-table.md
vars: |
step_number: 4
results_table:
- description: "Check server.ts for CODESPACE_NAME"
passed: ${{ steps.check-codespace-name.outcome == 'success' }}
- description: "Check server.ts for codespace URL"
passed: ${{ steps.check-codespace-url.outcome == 'success' }}
# END: Check practical exercise
- name: Fail job if not all checks passed
if: contains(steps.*.outcome, 'failure')
run: exit 1
post_next_step_content:
name: Post next step content
needs: [find_exercise, check_step_work]
runs-on: ubuntu-latest
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Create comment - step finished
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/step-finished-prepare-next-step.md
vars: |
next_step_number: 5
- name: Create comment - add step content
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: ${{ env.STEP_5_FILE }}
- name: Create comment - watching for progress
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/watching-for-progress.md
- name: Disable current workflow and enable next one
run: |
gh workflow disable "${{github.workflow}}"
gh workflow enable "Step 5"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,186 @@
name: Step 5 # Setup the React presentation tier
on:
push:
branches:
- "build-octofit-app"
paths:
- "octofit-tracker/frontend/**"
permissions:
contents: read
actions: write
issues: write
env:
STEP_6_FILE: ".github/steps/6-copilot-on-github.md"
jobs:
find_exercise:
name: Find Exercise Issue
uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.0
check_step_work:
name: Check step work
runs-on: ubuntu-latest
needs: [find_exercise]
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Find last comment
id: find-last-comment
uses: peter-evans/find-comment@v3
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
direction: last
- name: Update comment - checking work
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
comment-id: ${{ steps.find-last-comment.outputs.comment-id }}
file: exercise-toolkit/markdown-templates/step-feedback/checking-work.md
edit-mode: replace
# START: Check practical exercise
- name: Check for codespace API endpoint in Activities.jsx
id: check-activities
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/frontend/src/components/Activities.jsx
keyphrase: '-8000.app.github.dev/api/activities'
minimum-occurrences: 1
case-sensitive: false
- name: Check for codespace API endpoint in Leaderboard.jsx
id: check-leaderboard
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/frontend/src/components/Leaderboard.jsx
keyphrase: '-8000.app.github.dev/api/leaderboard'
minimum-occurrences: 1
case-sensitive: false
- name: Check for codespace API endpoint in Teams.jsx
id: check-teams
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/frontend/src/components/Teams.jsx
keyphrase: '-8000.app.github.dev/api/teams'
minimum-occurrences: 1
case-sensitive: false
- name: Check for codespace API endpoint in Users.jsx
id: check-users
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/frontend/src/components/Users.jsx
keyphrase: '-8000.app.github.dev/api/users'
minimum-occurrences: 1
case-sensitive: false
- name: Check for codespace API endpoint in Workouts.jsx
id: check-workouts
continue-on-error: true
uses: skills/action-keyphrase-checker@v2.0.0
with:
text-file: octofit-tracker/frontend/src/components/Workouts.jsx
keyphrase: '-8000.app.github.dev/api/workouts'
minimum-occurrences: 1
case-sensitive: false
- name: Update comment - step results
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
comment-id: ${{ steps.find-last-comment.outputs.comment-id }}
edit-mode: replace
file: exercise-toolkit/markdown-templates/step-feedback/step-results-table.md
vars: |
step_number: 5
results_table:
- description: "Check activities for the API endpoint"
passed: ${{ steps.check-activities.outcome == 'success' }}
- description: "Check leaderboard for the API endpoint"
passed: ${{ steps.check-leaderboard.outcome == 'success' }}
- description: "Check teams for the API endpoint"
passed: ${{ steps.check-teams.outcome == 'success' }}
- description: "Check users for the API endpoint"
passed: ${{ steps.check-users.outcome == 'success' }}
- description: "Check workouts for the API endpoint"
passed: ${{ steps.check-workouts.outcome == 'success' }}
# END: Check practical exercise
- name: Fail job if not all checks passed
if: contains(steps.*.outcome, 'failure')
run: exit 1
post_next_step_content:
name: Post next step content
needs: [find_exercise, check_step_work]
runs-on: ubuntu-latest
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Create comment - step finished
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/step-finished-prepare-next-step.md
vars: |
next_step_number: 6
- name: Create comment - add step content
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: ${{ env.STEP_6_FILE }}
- name: Create comment - watching for progress
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/watching-for-progress.md
- name: Disable current workflow and enable next one
run: |
gh workflow disable "${{github.workflow}}"
gh workflow enable "Step 6"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+69
View File
@@ -0,0 +1,69 @@
name: Step 6 # Copilot on GitHub
on:
pull_request:
branches:
- main
paths:
- "octofit-tracker/**"
types:
- closed
permissions:
contents: write
actions: write
issues: write
env:
REVIEW_FILE: ".github/steps/x-review.md"
jobs:
find_exercise:
name: Find Exercise Issue
uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.0
post_review_content:
name: Post review content
needs: [find_exercise]
runs-on: ubuntu-latest
env:
ISSUE_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ needs.find_exercise.outputs.issue-number }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Get response templates
uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
ref: v0.9.0
- name: Create comment - step finished - final review next
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: exercise-toolkit/markdown-templates/step-feedback/lesson-review.md
- name: Create comment - add review content
uses: GrantBirki/comment@v2.1.1
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
file: ${{ env.REVIEW_FILE }}
- name: Disable current workflow
run: gh workflow disable "${{github.workflow}}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
finish_exercise:
name: Finish Exercise
needs: [find_exercise, post_review_content]
uses: skills/exercise-toolkit/.github/workflows/finish-exercise.yml@v0.9.0
with:
issue-url: ${{ needs.find_exercise.outputs.issue-url }}
exercise-title: "Build Applications with GitHub Copilot Agent Mode"