diff --git a/.github/chatmodes/beast-mode.md b/.github/chatmodes/beast-mode.md
new file mode 100644
index 0000000..c981381
--- /dev/null
+++ b/.github/chatmodes/beast-mode.md
@@ -0,0 +1,3 @@
+- Always provide high-performance code solutions.
+- Focus on logic and security, no conversational fillers.
+- Deeply analyze project structure before suggesting edits.
diff --git a/.gitignore b/.gitignore
index 1720c36..e643075 100644
--- a/.gitignore
+++ b/.gitignore
@@ -440,4 +440,10 @@ mtj.tmp/
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
-replay_pid*
\ No newline at end of file
+replay_pid*
+
+# Workshop Specific
+python/sns_api.db
+python/.venv/
+javascript/node_modules/
+javascript/dist/
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..6f5444d
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,9 @@
+{
+ "chat.tools.autoApprove": true,
+ "chat.agent.maxRequests": 100,
+ "chat.mcp.serverSampling": {
+ "github-copilot-vibe-coding-workshop/.vscode/mcp.json: Framelink Figma MCP": {
+ "allowedModels": ["copilot/auto"]
+ }
+ }
+}
diff --git a/complete/README.md b/complete/README.md
index 1be3ce8..500dc1e 100644
--- a/complete/README.md
+++ b/complete/README.md
@@ -3,7 +3,7 @@
Here are the list of complete app samples. Because they are also vibe-coded, you can check out how they're built.
| Application | Location |
-|-------------|-----------------------------|
+| ----------- | --------------------------- |
| FastAPI | [python](./python/) |
| React | [javascript](./javascript/) |
| Spring Boot | [java](./java/) |
@@ -19,38 +19,38 @@ Refer to the [README](../README.md) doc for preparation.
1. Make sure that Docker is running.
- ```bash
- docker info
- ```
+ ```bash
+ docker info
+ ```
1. Get the repository root.
- ```bash
- # bash/zsh
- REPOSITORY_ROOT=$(git rev-parse --show-toplevel)
- ```
+ ```bash
+ # bash/zsh
+ REPOSITORY_ROOT=$(git rev-parse --show-toplevel)
+ ```
- ```powershell
- # PowerShell
- $REPOSITORY_ROOT = git rev-parse --show-toplevel
- ```
+ ```powershell
+ # PowerShell
+ $REPOSITORY_ROOT = git rev-parse --show-toplevel
+ ```
1. Navigate to the `complete` directory.
- ```bash
- cd $REPOSITORY_ROOT/complete
- ```
+ ```bash
+ cd $REPOSITORY_ROOT/complete
+ ```
1. Run the containerized apps.
- ```bash
- docker compose up --build -d
- ```
+ ```bash
+ docker compose up --build -d
+ ```
1. Open a web browser and navigate to `http://localhost:3030`.
1. Verify if the web application is running properly.
1. Clean up by running the following command to remove the containerized apps.
- ```bash
- docker compose down --rmi all
- ```
+ ```bash
+ docker compose down --rmi all
+ ```
diff --git a/complete/openapi.yaml b/complete/openapi.yaml
index d058b78..fc16691 100644
--- a/complete/openapi.yaml
+++ b/complete/openapi.yaml
@@ -23,17 +23,17 @@ paths:
tags:
- Posts
responses:
- '200':
+ "200":
description: Successfully retrieved posts
content:
application/json:
schema:
type: array
items:
- $ref: '#/components/schemas/Post'
- '500':
- $ref: '#/components/responses/InternalServerError'
-
+ $ref: "#/components/schemas/Post"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
+
post:
summary: Create a new post
description: Create a new post to share something with others
@@ -45,18 +45,18 @@ paths:
content:
application/json:
schema:
- $ref: '#/components/schemas/NewPostRequest'
+ $ref: "#/components/schemas/NewPostRequest"
responses:
- '201':
+ "201":
description: Post created successfully
content:
application/json:
schema:
- $ref: '#/components/schemas/Post'
- '400':
- $ref: '#/components/responses/BadRequest'
- '500':
- $ref: '#/components/responses/InternalServerError'
+ $ref: "#/components/schemas/Post"
+ "400":
+ $ref: "#/components/responses/BadRequest"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
/posts/{postId}:
get:
@@ -66,19 +66,19 @@ paths:
tags:
- Posts
parameters:
- - $ref: '#/components/parameters/PostIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
responses:
- '200':
+ "200":
description: Successfully retrieved the post
content:
application/json:
schema:
- $ref: '#/components/schemas/Post'
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
-
+ $ref: "#/components/schemas/Post"
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
+
patch:
summary: Update a post
description: Update an existing post if you made a mistake or have something to add
@@ -86,27 +86,27 @@ paths:
tags:
- Posts
parameters:
- - $ref: '#/components/parameters/PostIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
requestBody:
required: true
content:
application/json:
schema:
- $ref: '#/components/schemas/UpdatePostRequest'
+ $ref: "#/components/schemas/UpdatePostRequest"
responses:
- '200':
+ "200":
description: Post updated successfully
content:
application/json:
schema:
- $ref: '#/components/schemas/Post'
- '400':
- $ref: '#/components/responses/BadRequest'
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
-
+ $ref: "#/components/schemas/Post"
+ "400":
+ $ref: "#/components/responses/BadRequest"
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
+
delete:
summary: Delete a post
description: Delete a post if you no longer want it shared
@@ -114,14 +114,14 @@ paths:
tags:
- Posts
parameters:
- - $ref: '#/components/parameters/PostIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
responses:
- '204':
+ "204":
description: Post deleted successfully
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
/posts/{postId}/comments:
get:
@@ -131,21 +131,21 @@ paths:
tags:
- Comments
parameters:
- - $ref: '#/components/parameters/PostIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
responses:
- '200':
+ "200":
description: Successfully retrieved comments
content:
application/json:
schema:
type: array
items:
- $ref: '#/components/schemas/Comment'
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
-
+ $ref: "#/components/schemas/Comment"
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
+
post:
summary: Create a comment
description: Add a comment to a post to share your thoughts
@@ -153,26 +153,26 @@ paths:
tags:
- Comments
parameters:
- - $ref: '#/components/parameters/PostIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
requestBody:
required: true
content:
application/json:
schema:
- $ref: '#/components/schemas/NewCommentRequest'
+ $ref: "#/components/schemas/NewCommentRequest"
responses:
- '201':
+ "201":
description: Comment created successfully
content:
application/json:
schema:
- $ref: '#/components/schemas/Comment'
- '400':
- $ref: '#/components/responses/BadRequest'
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
+ $ref: "#/components/schemas/Comment"
+ "400":
+ $ref: "#/components/responses/BadRequest"
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
/posts/{postId}/comments/{commentId}:
get:
@@ -182,20 +182,20 @@ paths:
tags:
- Comments
parameters:
- - $ref: '#/components/parameters/PostIdPath'
- - $ref: '#/components/parameters/CommentIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
+ - $ref: "#/components/parameters/CommentIdPath"
responses:
- '200':
+ "200":
description: Successfully retrieved the comment
content:
application/json:
schema:
- $ref: '#/components/schemas/Comment'
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
-
+ $ref: "#/components/schemas/Comment"
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
+
patch:
summary: Update a comment
description: Update an existing comment to correct or revise it
@@ -203,28 +203,28 @@ paths:
tags:
- Comments
parameters:
- - $ref: '#/components/parameters/PostIdPath'
- - $ref: '#/components/parameters/CommentIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
+ - $ref: "#/components/parameters/CommentIdPath"
requestBody:
required: true
content:
application/json:
schema:
- $ref: '#/components/schemas/UpdateCommentRequest'
+ $ref: "#/components/schemas/UpdateCommentRequest"
responses:
- '200':
+ "200":
description: Comment updated successfully
content:
application/json:
schema:
- $ref: '#/components/schemas/Comment'
- '400':
- $ref: '#/components/responses/BadRequest'
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
-
+ $ref: "#/components/schemas/Comment"
+ "400":
+ $ref: "#/components/responses/BadRequest"
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
+
delete:
summary: Delete a comment
description: Delete a comment if necessary
@@ -232,15 +232,15 @@ paths:
tags:
- Comments
parameters:
- - $ref: '#/components/parameters/PostIdPath'
- - $ref: '#/components/parameters/CommentIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
+ - $ref: "#/components/parameters/CommentIdPath"
responses:
- '204':
+ "204":
description: Comment deleted successfully
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
/posts/{postId}/likes:
post:
@@ -250,27 +250,27 @@ paths:
tags:
- Likes
parameters:
- - $ref: '#/components/parameters/PostIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
requestBody:
required: true
content:
application/json:
schema:
- $ref: '#/components/schemas/LikeRequest'
+ $ref: "#/components/schemas/LikeRequest"
responses:
- '201':
+ "201":
description: Post liked successfully
content:
application/json:
schema:
- $ref: '#/components/schemas/LikeResponse'
- '400':
- $ref: '#/components/responses/BadRequest'
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
-
+ $ref: "#/components/schemas/LikeResponse"
+ "400":
+ $ref: "#/components/responses/BadRequest"
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
+
delete:
summary: Unlike a post
description: Remove your like from a post if you change your mind
@@ -278,14 +278,14 @@ paths:
tags:
- Likes
parameters:
- - $ref: '#/components/parameters/PostIdPath'
+ - $ref: "#/components/parameters/PostIdPath"
responses:
- '204':
+ "204":
description: Like removed successfully
- '404':
- $ref: '#/components/responses/NotFound'
- '500':
- $ref: '#/components/responses/InternalServerError'
+ "404":
+ $ref: "#/components/responses/NotFound"
+ "500":
+ $ref: "#/components/responses/InternalServerError"
components:
parameters:
@@ -298,7 +298,7 @@ components:
type: string
format: uuid
example: "123e4567-e89b-12d3-a456-426614174000"
-
+
CommentIdPath:
name: commentId
in: path
@@ -539,7 +539,7 @@ components:
content:
application/json:
schema:
- $ref: '#/components/schemas/Error'
+ $ref: "#/components/schemas/Error"
example:
error: "VALIDATION_ERROR"
message: "The request body is invalid"
@@ -550,7 +550,7 @@ components:
content:
application/json:
schema:
- $ref: '#/components/schemas/Error'
+ $ref: "#/components/schemas/Error"
example:
error: "NOT_FOUND"
message: "The requested resource was not found"
@@ -560,7 +560,7 @@ components:
content:
application/json:
schema:
- $ref: '#/components/schemas/Error'
+ $ref: "#/components/schemas/Error"
example:
error: "INTERNAL_ERROR"
message: "An unexpected error occurred"
diff --git a/docs/02-javascript.md b/docs/02-javascript.md
index 97e5b6a..e0d9234 100644
--- a/docs/02-javascript.md
+++ b/docs/02-javascript.md
@@ -51,17 +51,17 @@ Refer to the [README](../README.md) doc for preparation.
1. Copy custom instructions.
- ```bash
- # bash/zsh
- cp -r $REPOSITORY_ROOT/docs/custom-instructions/javascript/. \
- $REPOSITORY_ROOT/.github/
- ```
-
- ```powershell
- # PowerShell
- Copy-Item -Path $REPOSITORY_ROOT/docs/custom-instructions/javascript/* `
- -Destination $REPOSITORY_ROOT/.github/ -Recurse -Force
- ```
+ ```bash
+ # bash/zsh
+ cp -r $REPOSITORY_ROOT/docs/custom-instructions/javascript/. \
+ $REPOSITORY_ROOT/.github/
+ ```
+
+ ```powershell
+ # PowerShell
+ Copy-Item -Path $REPOSITORY_ROOT/docs/custom-instructions/javascript/* `
+ -Destination $REPOSITORY_ROOT/.github/ -Recurse -Force
+ ```
### Prepare Application Project
@@ -69,18 +69,18 @@ Refer to the [README](../README.md) doc for preparation.
1. Make sure that the `context7` MCP server is up and running.
1. Use prompt like below to scaffold a React web app project.
- ```text
- I'd like to scaffold a React web app. Follow the instructions below.
-
- - Make sure it's the web app, not the mobile app.
- - Your working directory is `javascript`.
- - Identify all the steps first, which you're going to do.
- - Use ViteJS as the frontend app framework.
- - Use default settings when initializing the project.
- - Use `SimpleSocialMediaApplication` as the name of the project while initializing.
- - Use the port number of `3000`.
- - Only initialize the project. DO NOT go further.
- ```
+ ```text
+ I'd like to scaffold a React web app. Follow the instructions below.
+
+ - Make sure it's the web app, not the mobile app.
+ - Your working directory is `javascript`.
+ - Identify all the steps first, which you're going to do.
+ - Use ViteJS as the frontend app framework.
+ - Use default settings when initializing the project.
+ - Use `SimpleSocialMediaApplication` as the name of the project while initializing.
+ - Use the port number of `3000`.
+ - Only initialize the project. DO NOT go further.
+ ```
1. Click the  button of GitHub Copilot to take the changes.
@@ -106,9 +106,10 @@ Refer to the [README](../README.md) doc for preparation.
1. Make sure that the FastAPI backend app is up and running.
- ```text
- Run the FastAPI backend API, which is located at the `python` directory.
- ```
+ ```text
+
+ Run the FastAPI backend API, which is located at the `python` directory.
+ ```
> **NOTE**: You may use the [`complete/python`](../complete/python/) sample app instead.
@@ -122,20 +123,20 @@ Refer to the [README](../README.md) doc for preparation.
1. Add [`product-requirements.md`](../product-requirements.md) and [`openapi.yaml`](../openapi.yaml) to GitHub Copilot.
1. Use prompt like below to build the application based on the requirements and OpenAPI document.
- ```text
- I'd like to build a React web app. Follow the instructions below.
-
- - Your working directory is `javascript`.
- - Identify all the steps first, which you're going to do.
- - There's a backend API app running on `http://localhost:8000`.
- - Use `openapi.yaml` that describes all the endpoints and data schema.
- - Use the port number of `3000`.
- - Create all the UI components defined in this link: {{FIGMA_SECTION_LINK}}.
- - DO NOT add anything not related to the UI components.
- - DO NOT add anything not defined in `openapi.yaml`.
- - DO NOT modify anything defined in `openapi.yaml`.
- - Give visual indication when the backend API is unavailable or unreachable for any reason.
- ```
+ ```text
+ I'd like to build a React web app. Follow the instructions below.
+
+ - Your working directory is `javascript`.
+ - Identify all the steps first, which you're going to do.
+ - There's a backend API app running on `http://localhost:8000`.
+ - Use `openapi.yaml` that describes all the endpoints and data schema.
+ - Use the port number of `3000`.
+ - Create all the UI components defined in this link: {{FIGMA_SECTION_LINK}}.
+ - DO NOT add anything not related to the UI components.
+ - DO NOT add anything not defined in `openapi.yaml`.
+ - DO NOT modify anything defined in `openapi.yaml`.
+ - Give visual indication when the backend API is unavailable or unreachable for any reason.
+ ```
1. Repeat four more times for the rest four Figma design links.
1. Click the  button of GitHub Copilot to take the changes.
@@ -144,17 +145,17 @@ Refer to the [README](../README.md) doc for preparation.
1. Make sure that the FastAPI backend app is up and running.
- ```text
- Run the FastAPI backend API, which is located at the `python` directory.
- ```
+ ```text
+ Run the FastAPI backend API, which is located at the `python` directory.
+ ```
1. Verify if it's built properly or not.
- ```text
- Run the React app and verify if the app is properly running.
+ ```text
+ Run the React app and verify if the app is properly running.
- If app running fails, analyze the issues and fix them.
- ```
+ If app running fails, analyze the issues and fix them.
+ ```
1. Open a web browser and navigate to `http://localhost:3000`.
1. Verify if both frontend and backend apps are running properly.
diff --git a/javascript/.gitignore b/javascript/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/javascript/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/javascript/README.md b/javascript/README.md
deleted file mode 100644
index 8358ffb..0000000
--- a/javascript/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Getting Started with JavaScript
-
-Here's the starting point for your JavaScript app development.
-
-If you want to see the complete example, check out this directory, [/complete/javascript](../complete/javascript/).
diff --git a/javascript/index.html b/javascript/index.html
new file mode 100644
index 0000000..6c02a08
--- /dev/null
+++ b/javascript/index.html
@@ -0,0 +1,12 @@
+
+
+