diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 2a1f9a7..39c70c2 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,10 +1,19 @@
{
"name": "Python 3",
- "image": "mcr.microsoft.com/devcontainers/python:3.13",
+ "image": "mcr.microsoft.com/devcontainers/base:jammy",
+ "features": {
+ "ghcr.io/devcontainers/features/node:1": {
+ "version": "lts"
+ },
+ "ghcr.io/devcontainers/features/python:1": {
+ "version": "3.13"
+ }
+ },
"customizations": {
"vscode": {
"extensions": [
"GitHub.copilot",
+ "GitHub.copilot-chat",
"ms-python.python",
"ms-python.debugpy",
"ms-vscode.live-server",
@@ -12,19 +21,13 @@
],
"settings": {
"livePreview.openPreviewTarget": "External Browser",
-
+
// This experimental (as of 2 Sept) feature disables the automatic context attachment of current active file in Agent Mode
"chat.implicitContext.suggestedContext": false,
// These are defaults but keeping them here for clarity and explicitness
- "github.copilot.chat.codeGeneration.useInstructionFiles": true,
- "chat.promptFilesLocations": {
- ".github/prompts": true
- },
- "chat.instructionsFilesLocations": {
- ".github/instructions": true
- }
+ "github.copilot.chat.codeGeneration.useInstructionFiles": true
}
}
}
-}
\ No newline at end of file
+}
diff --git a/.github/images/copilot-chat-reviews-instructions.png b/.github/images/copilot-chat-reviews-instructions.png
new file mode 100644
index 0000000..32f9a63
Binary files /dev/null and b/.github/images/copilot-chat-reviews-instructions.png differ
diff --git a/.github/images/copilot-custom-instructions-reference.png b/.github/images/copilot-custom-instructions-reference.png
new file mode 100644
index 0000000..b995828
Binary files /dev/null and b/.github/images/copilot-custom-instructions-reference.png differ
diff --git a/.github/images/custom-agent-dropdown-selection.png b/.github/images/custom-agent-dropdown-selection.png
new file mode 100644
index 0000000..f70035c
Binary files /dev/null and b/.github/images/custom-agent-dropdown-selection.png differ
diff --git a/.github/images/handoff-button.png b/.github/images/handoff-button.png
new file mode 100644
index 0000000..3ebb0cd
Binary files /dev/null and b/.github/images/handoff-button.png differ
diff --git a/.github/images/homework-website-screenshot.png b/.github/images/homework-website-screenshot.png
new file mode 100644
index 0000000..e52d3f1
Binary files /dev/null and b/.github/images/homework-website-screenshot.png differ
diff --git a/.github/images/node-confirmation.png b/.github/images/node-confirmation.png
new file mode 100644
index 0000000..0ed4e0a
Binary files /dev/null and b/.github/images/node-confirmation.png differ
diff --git a/.github/images/skill-being-used.png b/.github/images/skill-being-used.png
new file mode 100644
index 0000000..486f611
Binary files /dev/null and b/.github/images/skill-being-used.png differ
diff --git a/.github/steps/1-step.md b/.github/steps/1-step.md
index 383b27b..0942b0f 100644
--- a/.github/steps/1-step.md
+++ b/.github/steps/1-step.md
@@ -9,7 +9,7 @@ Você ouviu dizer que as Copilot Instructions podem ajudar com isso!
Você vai executar este site na primeira atividade!
-
+
@@ -61,7 +61,7 @@ Agora que você explorou o projeto, vamos criar instruções personalizadas para
```text
.github/copilot-instructions.md
- ```
+ ```
> ❕ **Importante:** Certifique-se de que o nome do arquivo está correto. Este nome de arquivo específico é necessário para que o Copilot o reconheça.
@@ -102,7 +102,7 @@ Agora que você explorou o projeto, vamos criar instruções personalizadas para
1. Observe que o Copilot usa suas instruções personalizadas como referência na resposta.
-
+
1. Faça o commit do arquivo `.github/copilot-instructions.md` na branch `main` e envie (push) para o GitHub.
diff --git a/.github/steps/2-step.md b/.github/steps/2-step.md
index 717aa3f..acc9f4b 100644
--- a/.github/steps/2-step.md
+++ b/.github/steps/2-step.md
@@ -34,6 +34,7 @@ Agora vamos criar instruções direcionadas especificamente para arquivos de tar
```markdown
---
+ description: "Instructions to use whenever creating or editing assignment markdown files to ensure consistency and clarity for students."
applyTo: "assignments/**/*.md"
---
@@ -78,7 +79,7 @@ Agora vamos criar instruções direcionadas especificamente para arquivos de tar
1. Observe como o Copilot referencia as instruções gerais do projeto e os arquivos de instrução específicos para tarefas.
-
+
1. Compare as alterações sugeridas com a estrutura original do arquivo para ver como o Copilot aplicou suas instruções. Aplique as alterações sugeridas e verifique como a tarefa atualizada aparece no **Site Preview**.
diff --git a/.github/steps/3-step.md b/.github/steps/3-step.md
index 5f96281..cca98c5 100644
--- a/.github/steps/3-step.md
+++ b/.github/steps/3-step.md
@@ -2,125 +2,344 @@
Agora que você estabeleceu instruções para as tarefas, você quer agilizar a criação de novas tarefas.
-Criar tarefas é um processo repetitivo que envolve múltiplos passos — um cenário perfeito para um prompt reutilizável!
+Creating assignments is a repetitive task and involves multiple steps, a perfect scenario for a reusable skill!
-- Criar a tarefa
-- Atualizar a configuração do site para carregar a nova tarefa
+- Creating the assignment content
+- Registering it in the website configuration
+- Attaching starter code or data files
-### 📖 Teoria: Arquivos de Prompt
+### 📖 Theory: Agent Skills
-Arquivos de prompt (`*.prompt.md`) são prompts reutilizáveis para simplificar tarefas comuns e úteis no seu projeto. Eles são selecionados no Copilot Chat usando comandos slash (`/`).
+Agent Skills are an [open standard](https://agentskills.io/) for giving AI agents specialized capabilities and workflows. A skill is a folder containing a `SKILL.md` file with metadata and instructions, plus optional scripts, references, and other resources.
-Eles podem referenciar outros arquivos do workspace, arquivos de prompt ou arquivos de instrução usando links no estilo Markdown relativos à localização do arquivo de prompt.
+```text
+skill-name/
+├── SKILL.md # Required: metadata + instructions
+├── scripts/ # Optional: executable code
+├── references/ # Optional: documentation
+```
-O Visual Studio Code procura arquivos `*.prompt.md` no diretório `.github/prompts/` por [padrão](vscode://settings/chat.promptFilesLocations).
+Agents discover skills automatically through **progressive disclosure**:
+
+1. **Discovery**: At startup, agents load only the skill's `name` and `description`.
+1. **Activation**: When a task matches a skill's description, the agent reads the full `SKILL.md` instructions.
+1. **Resources**: Additional files (references, scripts) are loaded only when needed.
+
+This means you can have many skills installed without slowing things down — only what's relevant gets loaded into context.
+
+Skills get activated in two ways: **automatically** when Copilot matches your request to a skill's description, or **explicitly** via a slash command (`/skill-name`). Because agents rely on the `name` and `description` to decide which skills to activate, writing a clear, specific description is important.
+
+Visual Studio Code discovers skills from the `.github/skills/` directory by default.
> [!TIP]
-> Use arquivos de prompt para definir tarefas e fluxos de trabalho repetíveis.
->
-> Ao escrever prompts, foque no **QUE** precisa ser feito. Você pode referenciar instruções para o **COMO**.
+> Write a clear `description` in the frontmatter so the agent knows **when** to use the skill. Reference additional files for templates, examples, and detailed documentation.
-Consulte a página [VS Code Docs: Prompt Files](https://code.visualstudio.com/docs/copilot/copilot-customization#_prompt-files-experimental) para mais informações.
+See the [VS Code Docs: Agent Skills](https://code.visualstudio.com/docs/copilot/customization/agent-skills) for more information.
-### ⌨️ Atividade: Criar um Prompt para Tarefas
+### ⌨️ Activity: Create the Skill Skeleton
-Agora vamos criar um prompt reutilizável que automatiza todo o processo de criação de tarefas. Este é um caso perfeito para um arquivo de prompt, pois criar tarefas envolve múltiplos passos repetitivos que seguem o mesmo padrão toda vez — exatamente o tipo de fluxo de trabalho que se beneficia da automação.
+Let's start by creating the full skill directory structure and its main `SKILL.md` file. We'll create all the directories upfront — including `references/` and `scripts/` — so everything is in place as we add files in the following activities.
-1. Crie um novo arquivo chamado:
+1. Create the skill directory structure with all subdirectories:
```text
- .github/prompts/new-assignment.prompt.md
+ .github/skills/new-assignment/
+ .github/skills/new-assignment/references/
+ .github/skills/new-assignment/scripts/
```
-1. Adicione o seguinte conteúdo para criar um prompt abrangente de geração de tarefas:
+1. Create the main skill file:
+
+ ```text
+ .github/skills/new-assignment/SKILL.md
+ ```
+
+1. Add the following content. The frontmatter `name` and `description` are what the agent sees at discovery time to decide whether to activate the skill. The body provides the workflow the agent follows once activated.
```markdown
---
- agent: agent
- description: Criar uma nova tarefa de programação
- argument-hint: Forneça os detalhes da tarefa
+ name: new-assignment
+ description: Create a new programming homework assignment for Mergington High School students. Use this skill whenever the user wants to create, add, scaffold, or generate a new assignment, exercise, or homework — even if they don't use the word "assignment" explicitly.
---
# Criar Nova Tarefa de Programação
- Seu objetivo é gerar uma nova tarefa para os alunos da Mergington High School.
+ Assignments live in `assignments//`, and the website reads `config.json` to display them. Follow these steps to create both.
+
+ ## Step 1: Gather Requirements
+
+ If the user hasn't specified, ask what programming concept the assignment should cover.
+
+ > 📖 Read [references/assignment-guide.md](references/assignment-guide.md) for guidance on difficulty, scope, and when to include starter code.
- ## Passo 1: Coletar Informações da Tarefa
+ ## Step 2: Create the Assignment
- Se ainda não fornecido pelo usuário, pergunte sobre o que será a tarefa.
+ 1. Create `assignments//README.md` following the [assignment template](../../../templates/assignment-template.md)
+ 2. (Optional) Add starter code or data files to the same directory
- ## Passo 2: Criar a Estrutura da Tarefa
+ ## Step 3: Register with the Website
- 1. Crie um novo diretório na pasta `assignments` com um nome único baseado no tema da tarefa
- 1. Crie um novo arquivo no diretório chamado `README.md` com a estrutura do arquivo [assignment-template.md](../../templates/assignment-template.md)
- 1. Preencha os detalhes da tarefa no arquivo README
- 1. (Opcional) Adicione código inicial ou anexos se a tarefa precisar — adicione esses arquivos na mesma pasta da tarefa
+ Use the bundled scripts — do NOT edit `config.json` manually.
- ## Passo 3: Atualizar a Configuração do Site
+ **Register the assignment:**
- Atualize a lista de tarefas no arquivo de configuração do site [config.json](../../config.json) para incluir a nova tarefa. Para o campo dueDate, use a data atual mais 7 dias, a menos que especificado de outra forma.
+ node .github/skills/new-assignment/scripts/update-config.js "" ""
+
+ **Register each file as an attachment** (starter code, data files, etc.):
+
+ node .github/skills/new-assignment/scripts/add-attachment.js ""
+
+ Common types: `python`, `csv`, `json`, `txt`, `html`
+
+ ## Step 4: Verify
+
+ Confirm the assignment was registered correctly: check that `config.json` contains the new entry and that all created files exist on disk.
```
-### ⌨️ Atividade: Testar o Prompt de Tarefas
+ Notice how the `SKILL.md` references two other directories — `references/` and `scripts/` — that we haven't created yet. This is the progressive disclosure pattern in action: the agent only loads these files when it reaches a step that needs them.
+
+### ⌨️ Activity: Add a Reference Guide
+
+Let's populate the `references/` directory with domain knowledge the agent can consult as needed. The `SKILL.md` points to `references/assignment-guide.md` so the agent can read it when deciding difficulty and scope — but only when it actually needs that context.
+
+1. Create the reference file:
+
+ ```text
+ .github/skills/new-assignment/references/assignment-guide.md
+ ```
+
+1. Add the following content to give the agent pedagogical guidance:
+
+ ```markdown
+ # Assignment Design Guide
+
+ Guidance for designing assignment content — what to teach and how to scope it. For formatting and markdown structure, the project's instruction files handle that automatically.
+
+ ## Difficulty & Scope
+
+ - Target 2–4 tasks per assignment that build on each other
+ - Start with something a student can finish in under 10 minutes, then add complexity
+ - The last task can be a stretch goal, but earlier tasks should build confidence
+ - Stick to one core concept per assignment (e.g., "loops", not "loops + file I/O + error handling")
+
+ ## Starter Code
+
+ Include starter code when:
+
+ - The assignment needs boilerplate the student shouldn't write from scratch
+ - You want students to follow a specific function signature or structure
+
+ Skip it when the point is writing something from scratch (e.g., "write a script that…").
+
+ ## Example Topics by Difficulty
+
+ - **Beginner**: variables, conditionals, loops, string formatting
+ - **Intermediate**: functions, lists/dicts, file I/O, basic classes
+ - **Advanced**: APIs, data analysis, testing, web frameworks
+ ```
+
+ By separating this from `SKILL.md`, we keep the main instructions focused on _workflow_ while this file provides _domain knowledge_. The agent only reads it when it reaches the gather-requirements step.
+
+### ⌨️ Activity: Add Bundled Scripts
+
+Skills can bundle scripts for deterministic tasks that are better handled by code than by the AI. Our skill needs two scripts: one to register the assignment in `config.json` and one to attach files (starter code, datasets, etc.) to it. Having the agent run these scripts ensures consistent, error-free config updates every time.
+
+1. Create the first script that registers a new assignment:
+
+ ```text
+ .github/skills/new-assignment/scripts/update-config.js
+ ```
+
+ Add the following content:
+
+ ```javascript
+ const fs = require("fs");
+ const path = require("path");
+
+ const [id, title, description] = process.argv.slice(2);
+ const configPath = path.resolve(__dirname, "../../../../config.json");
+ const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
+
+ if (!id || !title || !description) {
+ console.error(
+ 'Usage: node .github/skills/new-assignment/scripts/update-config.js "" ""',
+ );
+ process.exit(1);
+ }
+
+ const dueDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString().split("T")[0];
+
+ config.assignments.push({
+ id,
+ title,
+ description,
+ path: `assignments/${id}`,
+ dueDate,
+ });
+
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
+ console.log(`Added "${title}" (due ${dueDate})`);
+ ```
+
+ This script handles the math for the due date and the exact JSON structure — things that are tedious and error-prone for an AI to get right every time.
+
+1. Create a second script that attaches files to an existing assignment:
+
+ ```text
+ .github/skills/new-assignment/scripts/add-attachment.js
+ ```
+
+ Add the following content:
+
+ ```javascript
+ const fs = require("fs");
+ const path = require("path");
+
+ const [assignmentId, displayName, filename, type] = process.argv.slice(2);
+
+ if (!assignmentId || !displayName || !filename || !type) {
+ console.error(
+ 'Usage: node add-attachment.js "" ',
+ );
+ console.error(
+ 'Example: node add-attachment.js python-basics "Starter Code" starter-code.py python',
+ );
+ process.exit(1);
+ }
+
+ const repoRoot = path.resolve(__dirname, "../../../../");
+ const configPath = path.join(repoRoot, "config.json");
+ const filePath = path.join(repoRoot, "assignments", assignmentId, filename);
+
+ // Verify the file exists on disk
+ if (!fs.existsSync(filePath)) {
+ console.error(`Error: File not found: assignments/${assignmentId}/${filename}`);
+ process.exit(1);
+ }
+
+ const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
+ const assignment = config.assignments.find((a) => a.id === assignmentId);
+
+ if (!assignment) {
+ console.error(`Error: Assignment "${assignmentId}" not found in config.json`);
+ console.error("Available IDs:", config.assignments.map((a) => a.id).join(", "));
+ process.exit(1);
+ }
+
+ // Create attachments array if it doesn't exist
+ if (!assignment.attachments) {
+ assignment.attachments = [];
+ }
+
+ // Skip if an attachment with the same filename already exists
+ const existing = assignment.attachments.find((a) => a.file === filename);
+ if (existing) {
+ console.log(`Skipped: "${filename}" is already attached to "${assignmentId}"`);
+ process.exit(0);
+ }
+
+ assignment.attachments.push({
+ name: displayName,
+ file: filename,
+ type: type,
+ });
+
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
+ console.log(`Added "${displayName}" (${filename}) to assignment "${assignmentId}"`);
+ ```
+
+ This second script validates that the file actually exists, prevents duplicate attachments, and produces clear error messages — all things that make the skill more robust when the agent executes it.
+
+1. Review the final skill structure. It should look like this:
+
+ ```text
+ .github/skills/new-assignment/
+ ├── SKILL.md # Workflow the agent follows
+ ├── references/
+ │ └── assignment-guide.md # Domain knowledge (loaded on demand)
+ └── scripts/
+ ├── update-config.js # Registers new assignments
+ └── add-attachment.js # Attaches files to assignments
+ ```
+
+ Each part of the skill has a clear role:
+ - **`SKILL.md`** — the agent's playbook: what steps to follow and when to load other resources
+ - **`references/`** — background knowledge that helps the agent make better decisions
+ - **`scripts/`** — deterministic operations handled by code instead of AI generation
+
+### ⌨️ Activity: Test the Assignment Skill
1. Abra o Copilot Chat no VS Code e certifique-se de estar no modo `Agent`.
-1. Execute seu prompt digitando `/new-assignment` no campo de entrada do chat. Há 2 opções:
+1. Ask Copilot to create a new assignment using a natural language prompt. Because the skill has a clear `description`, Copilot will automatically match your request and activate it.
- - Digite apenas `/new-assignment` sem descrição. O Copilot perguntará sobre o que a tarefa deve ser.
- - Inclua o tema diretamente: `/new-assignment Construindo APIs REST com o framework FastAPI`
+ > 
+ >
+ > ```prompt
+ > Create a new assignment about Building REST APIs with FastAPI framework
+ > ```
+
+ > 💡 **Tip:** You can also invoke the skill explicitly with the `/new-assignment` slash command in the chat input.
💡 Ideias de Temas para Tarefas
- ```text
- Processamento de Texto com Python - trabalhando com strings, I/O de arquivos e manipulação de texto
- ```
+ ```text
+ Python Text Processing - working with strings, file I/O, and text manipulation
+ ```
- ```text
- Estruturas de Dados em Python - listas, dicionários, sets e tuplas
- ```
+ ```text
+ Data Structures in Python - lists, dictionaries, sets, and tuples
+ ```
- ```text
- Visualização de Dados com Python - usando matplotlib ou plotly para gráficos
- ```
+ ```text
+ Python Data Visualization - using matplotlib or plotly for charts and graphs
+ ```
- ```text
- Construindo APIs REST com o framework FastAPI
- ```
+ ```text
+ Building REST APIs with FastAPI framework
+ ```
- ```text
- Estatística com Python - análise de dados e cálculos estatísticos usando pandas e numpy
- ```
+ ```text
+ Statistics with Python - data analysis and statistical calculations using pandas and numpy
+ ```
-1. Verifique se a nova tarefa aparece na lista de tarefas no preview do site.
+1. Copilot will read the skill, create the assignment, and run the bundled scripts.
+
+
+
+ Accept any confirmation prompts to let it continue.
+
+
+
+1. Verify the new assignment appears in the assignments list on the website preview.
A tarefa não apareceu? 🔍
- Verifique os seguintes itens:
-
- - Atualize a página.
- - Um novo diretório foi criado em `assignments/`.
- - O arquivo `config.json` foi atualizado com a nova tarefa.
+ Check these items:
+ - Refresh the page.
+ - A new directory was created in `assignments/`.
+ - The `config.json` file was updated with the new assignment.
1. Revise o conteúdo da tarefa gerada para garantir que corresponde às convenções estabelecidas.
-1. Faça o commit e envie (push) suas alterações:
-
- - O novo arquivo de prompt: `.github/prompts/new-assignment.prompt.md`
- - O diretório e arquivos da tarefa gerada.
- - O `config.json` atualizado.
+1. Commit and push your changes:
+ - The new skill directory: `.github/skills/new-assignment/` (including `SKILL.md`, `references/`, and `scripts/`)
+ - The generated assignment directory and files.
+ - Updated `config.json` configuration.
1. Aguarde a Mona preparar o próximo passo!
Está com problemas? 🤷
-- Certifique-se de que o arquivo de prompt está no diretório `.github/prompts/` com a extensão `.prompt.md`.
+- Make sure the skill is in the `.github/skills/new-assignment/` directory with a `SKILL.md` file.
+- The `name` field in `SKILL.md` frontmatter must match the parent directory name (`new-assignment`).
+- If the skill doesn't appear in the `/` menu, reload the VS Code window.
diff --git a/.github/steps/4-step.md b/.github/steps/4-step.md
index f4a1997..6ec24fb 100644
--- a/.github/steps/4-step.md
+++ b/.github/steps/4-step.md
@@ -1,6 +1,6 @@
## Passo 4: Criando Agentes Personalizados
-Agora que você tem instruções, prompts e templates trabalhando juntos, você quer levar a personalização um passo além. Ao fazer brainstorming de novas tarefas, você gostaria de ter uma experiência de chat especializada que foque puramente na ideação, em vez da implementação.
+Now that you have instructions, skills, and templates working together, you want to take customization one step further. When brainstorming new assignments, you'd like a specialized chat experience that focuses purely on ideation — and then hands off to Agent Mode to actually implement the assignment creation using the skill you built in Step 3.
### 📖 Teoria: Agentes Personalizados
@@ -14,10 +14,9 @@ O Visual Studio Code procura arquivos `*.agent.md` no diretório `.github/agents
> - [VS Code Docs: Custom Agents](https://code.visualstudio.com/docs/copilot/customization/custom-agents)
> - [GitHub Docs: Custom Agents Configuration](https://docs.github.com/en/copilot/reference/custom-agents-configuration)
+### ⌨️ Activity: Create an Assignment Brainstorming Custom Agent
-### ⌨️ Atividade: Criar um Agente Personalizado para Brainstorming de Tarefas
-
-Agora vamos criar um agente personalizado especializado em brainstorming de ideias para tarefas.
+Now let's create a specialized custom agent that helps brainstorm assignment ideas, then hands off to Agent Mode to actually implement the assignment creation using the skill you built in Step 3.
1. Crie um novo arquivo chamado:
@@ -29,65 +28,63 @@ Agora vamos criar um agente personalizado especializado em brainstorming de idei
```markdown
---
- name: assignment-brainstorming
- description: Assistente de brainstorming de tarefas
- tools: ["search", "web"]
+ name: Assignment Brainstorming
+ description: Brainstorm the next programming assignment for Mergington High School students
+ tools: ["search", "vscode/askQuestions"]
+ handoffs:
+ - label: "Create this assignment"
+ agent: agent
+ prompt: "Create a new assignment based on the recommendation from the brainstorming session above."
+ send: true
---
- # 💡 Assistente de Brainstorming de Tarefas
-
- **MODO BRAINSTORM ATIVADO** 🚀
-
- Sou seu parceiro de brainstorming de tarefas para a Mergington High School! Analiso seu currículo existente e sugiro tarefas criativas que se baseiam no que seus alunos já aprenderam.
+ # Assignment Brainstorming Assistant
- ## Meu Estilo de Resposta
+ Help the teacher decide on the next assignment by analyzing existing curriculum and suggesting one focused idea.
- Toda resposta segue este formato:
+ ## Workflow
- 🔍 ANÁLISE RÁPIDA: [Breve análise das tarefas existentes]
- 💡 EXPLOSÃO DE IDEIAS: [3-5 sugestões rápidas]
- 🎯 PRÓXIMA PERGUNTA: [O que preciso saber para ajudar mais]
+ 1. Scan the `assignments/` directory and `config.json` to understand what topics are already covered.
+ 2. Use the `askQuestions` tool to gather the teacher's preferences — difficulty level, topic area, and any constraints.
+ 3. Recommend **one** assignment: a title, the core concept, and a sentence on why it fills a curriculum gap.
+ 4. Suggest using the **Create this assignment** button to build it.
## Regras
- - ⚡ Manter respostas curtas
- - 🎯 Sempre terminar com uma pergunta específica
- - 💡 Focar em conceitos, não em detalhes
- - 🚫 Nunca escrever especificações de tarefas
- - 📊 Basear ideias em lacunas do currículo existente
+ - Keep responses short — no more than a few sentences per section.
+ - Never write full assignment specs. That's the skill's job.
+ - Base recommendations on gaps in the existing curriculum.
+ - Always end with a clear next step.
```
-### ⌨️ Atividade: Testar o Agente Personalizado de Brainstorming
+ Let's break down the key parts:
+ - **`tools: ["search", "vscode/askQuestions"]`** — gives the agent the ability to search the codebase and present structured questions with selectable options, rather than relying on free-text back-and-forth.
+ - **`handoffs`** — defines a "Create this assignment" button. When clicked, it switches to the regular Copilot Agent mode and automatically sends a prompt referencing the brainstormed recommendation. This should trigger the `new-assignment` skill from Step 3 so that the assignment is actually created based on the brainstormed idea.
+ - **The body instructions** — define the agent's personality and workflow. Notice it's focused on _ideation only_ and explicitly defers implementation to the skill.
+
+### ⌨️ Activity: Test the Brainstorming Custom Agent
1. Abra o Copilot Chat no VS Code.
1. Selecione seu agente personalizado na lista suspensa de agentes.
-
+
-1. Teste o agente personalizado com perguntas que um professor faria. Observe o formato de resposta diferente!
+1. Start a brainstorming session:
> 
>
> ```prompt
- > Quais tópicos de tarefas estão faltando no meu currículo atual?
+ > What should I teach next?
> ```
- > 
- >
- > ```prompt
- > Sugira 3 tarefas avançadas de Python para meus alunos.
- > ```
+1. The agent will scan your existing assignments, then ask you structured questions about difficulty and topic preferences. Answer the questions to narrow down the recommendation.
- > 
- >
- > ```prompt
- > Qual seria uma boa tarefa de acompanhamento após a tarefa de análise de dados?
- > ```
+1. Once the agent recommends an assignment, click the **Create this assignment** button to hand off to Agent Mode for implementation.
-1. Tente fazer perguntas de acompanhamento para ver como o agente personalizado mantém sua personalidade ao longo da conversa.
+
-1. Faça o commit e envie (push) suas alterações para o arquivo do novo agente personalizado: `.github/agents/assignment-brainstorming.agent.md`
+1. Commit and push your changes to the `main` branch.
1. Aguarde a Mona dar a revisão final!
diff --git a/.github/workflows/0-start-exercise.yml b/.github/workflows/0-start-exercise.yml
index b7e952e..edcb37a 100644
--- a/.github/workflows/0-start-exercise.yml
+++ b/.github/workflows/0-start-exercise.yml
@@ -18,7 +18,7 @@ jobs:
if: |
!github.event.repository.is_template
name: Start Exercise
- uses: skills/exercise-toolkit/.github/workflows/start-exercise.yml@v0.7.3
+ uses: skills/exercise-toolkit/.github/workflows/start-exercise.yml@v0.9.3
with:
exercise-title: "Personalize Sua Experiência com o GitHub Copilot"
intro-message: "Aprenda a personalizar o GitHub Copilot para funcionar melhor para sua equipe e projetos."
@@ -29,12 +29,12 @@ jobs:
needs: [start_exercise]
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
ref: main
- - name: Atualizar datas das tarefas
- uses: actions/github-script@v7
+ - name: Update assignment dates
+ uses: actions/github-script@v9
with:
script: |
const fs = require('fs');
@@ -59,7 +59,7 @@ jobs:
fs.writeFileSync('config.json', JSON.stringify(config, null, 2) + '\n');
- name: Commit updated config.json
- uses: EndBug/add-and-commit@v9
+ uses: EndBug/add-and-commit@v10.0.0
with:
add: "config.json"
message: "Atualizar datas de entrega das tarefas para início do exercício"
@@ -75,14 +75,16 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
+ with:
+ ref: main
- name: Get response templates
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
- ref: v0.7.0
+ ref: v0.9.3
- name: Create comment - add step content
uses: GrantBirki/comment@v2.1.1
diff --git a/.github/workflows/1-step.yml b/.github/workflows/1-step.yml
index 6638f08..62b732d 100644
--- a/.github/workflows/1-step.yml
+++ b/.github/workflows/1-step.yml
@@ -1,4 +1,4 @@
-name: Passo 1
+name: Step 1
on:
push:
@@ -18,8 +18,8 @@ env:
jobs:
find_exercise:
- name: Encontrar Issue do Exercício
- uses: dev-pods/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.1.1
+ name: Find Exercise Issue
+ uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.3
check_step_work:
name: Verificar trabalho do passo
@@ -31,18 +31,18 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Get response templates
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
- ref: v0.7.0
+ ref: v0.9.3
- name: Find last comment
id: find-last-comment
- uses: peter-evans/find-comment@v3
+ uses: peter-evans/find-comment@v4
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
@@ -62,7 +62,7 @@ jobs:
- name: Check if copilot-instructions.md exists
id: check-file-exists
continue-on-error: true
- uses: skills/exercise-toolkit/actions/file-exists@v0.7.0
+ uses: skills/exercise-toolkit/actions/file-exists@v0.9.3
with:
file: '.github/copilot-instructions.md'
@@ -96,14 +96,14 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Get response templates
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
- ref: v0.7.0
+ ref: v0.9.3
- name: Create comment - step finished
uses: GrantBirki/comment@v2.1.1
@@ -113,7 +113,7 @@ jobs:
file: .github/translations/step-finished-prepare-next-step.md
vars: |
next_step_number: 2
-
+
- name: Create comment - add step content
uses: GrantBirki/comment@v2.1.1
with:
diff --git a/.github/workflows/2-step.yml b/.github/workflows/2-step.yml
index 327d67d..77c7433 100644
--- a/.github/workflows/2-step.yml
+++ b/.github/workflows/2-step.yml
@@ -21,7 +21,7 @@ jobs:
find_exercise:
name: Encontrar Issue do Exercício
if: github.run_number != 1
- uses: dev-pods/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.1.1
+ uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.3
check_step_work:
name: Verificar trabalho do passo
@@ -33,18 +33,18 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Get response templates
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
- ref: v0.7.0
+ ref: v0.9.3
- name: Find last comment
id: find-last-comment
- uses: peter-evans/find-comment@v3
+ uses: peter-evans/find-comment@v4
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
@@ -64,14 +64,14 @@ jobs:
- name: Check if assignments.instructions.md exists
id: check-file-exists
continue-on-error: true
- uses: skills/exercise-toolkit/actions/file-exists@v0.7.0
+ uses: skills/exercise-toolkit/actions/file-exists@v0.9.3
with:
file: ".github/instructions/assignments.instructions.md"
- name: Check for applyTo pattern in assignments.instructions.md
id: check-for-applyto
continue-on-error: true
- uses: skills/action-keyphrase-checker@v1
+ uses: skills/action-keyphrase-checker@v2
with:
text-file: ".github/instructions/assignments.instructions.md"
keyphrase: "applyTo"
@@ -79,7 +79,7 @@ jobs:
- name: Check for Objective section in games-in-python README
id: check-for-objective
continue-on-error: true
- uses: skills/action-keyphrase-checker@v1
+ uses: skills/action-keyphrase-checker@v2
with:
text-file: "assignments/games-in-python/README.md"
keyphrase: "Objective"
@@ -87,7 +87,7 @@ jobs:
- name: Check for Tasks section in games-in-python README
id: check-for-tasks
continue-on-error: true
- uses: skills/action-keyphrase-checker@v1
+ uses: skills/action-keyphrase-checker@v2
with:
text-file: "assignments/games-in-python/README.md"
keyphrase: "Tasks"
@@ -128,14 +128,14 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Get response templates
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
- ref: v0.7.0
+ ref: v0.9.3
- name: Create comment - step finished
uses: GrantBirki/comment@v2.1.1
diff --git a/.github/workflows/3-step.yml b/.github/workflows/3-step.yml
index 00584a9..b1faaf5 100644
--- a/.github/workflows/3-step.yml
+++ b/.github/workflows/3-step.yml
@@ -5,8 +5,8 @@ on:
branches:
- main
paths:
- - ".github/prompts/**"
- - "**/*.prompt.md"
+ - ".github/skills/**"
+ - "**/SKILL.md"
- "config.json"
- "assignments/**"
@@ -22,11 +22,11 @@ jobs:
find_exercise:
name: Encontrar Issue do Exercício
if: github.run_number != 1
- uses: dev-pods/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.1.1
+ uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.3
check_step_work:
- name: Verificar trabalho do passo
- needs: [find_exercise]
+ name: Check step work
+ needs: [ find_exercise ]
runs-on: ubuntu-latest
env:
ISSUE_REPOSITORY: ${{ github.repository }}
@@ -34,18 +34,18 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Get response templates
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
- ref: v0.7.0
+ ref: v0.9.3
- name: Find last comment
id: find-last-comment
- uses: peter-evans/find-comment@v3
+ uses: peter-evans/find-comment@v4
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
@@ -62,17 +62,17 @@ jobs:
# START: Check practical exercise
- - name: Check if new-assignment.prompt.md exists
+ - name: Check if new-assignment SKILL.md exists
id: check-file-exists
continue-on-error: true
- uses: skills/exercise-toolkit/actions/file-exists@v0.7.0
+ uses: skills/exercise-toolkit/actions/file-exists@v0.9.3
with:
- file: ".github/prompts/new-assignment.prompt.md"
+ file: ".github/skills/new-assignment/SKILL.md"
- name: Check for new assignment directory created
id: check-new-assignment-dir
continue-on-error: true
- uses: actions/github-script@v7
+ uses: actions/github-script@v9
with:
script: |
const fs = require('fs');
@@ -96,7 +96,7 @@ jobs:
- name: Check that new assignment was added to config.json
id: check-config-updated
continue-on-error: true
- uses: actions/github-script@v7
+ uses: actions/github-script@v9
with:
script: |
const fs = require('fs');
@@ -124,7 +124,7 @@ jobs:
vars: |
step_number: 3
results_table:
- - description: "Arquivo new-assignment.prompt.md criado"
+ - description: "Created new-assignment skill (SKILL.md)"
passed: ${{ steps.check-file-exists.outcome == 'success' }}
- description: ${{ steps.check-new-assignment-dir.outputs.STEP_MESSAGE }}
passed: ${{ steps.check-new-assignment-dir.outcome == 'success' }}
@@ -138,8 +138,8 @@ jobs:
run: exit 1
post_next_step_content:
- name: Postar conteúdo do próximo passo
- needs: [find_exercise, check_step_work]
+ name: Post next step content
+ needs: [ find_exercise, check_step_work ]
runs-on: ubuntu-latest
env:
ISSUE_REPOSITORY: ${{ github.repository }}
@@ -147,14 +147,14 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Get response templates
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
- ref: v0.7.0
+ ref: v0.9.3
- name: Create comment - step finished
uses: GrantBirki/comment@v2.1.1
diff --git a/.github/workflows/4-step.yml b/.github/workflows/4-step.yml
index 8d5c6d5..3cc3c10 100644
--- a/.github/workflows/4-step.yml
+++ b/.github/workflows/4-step.yml
@@ -19,7 +19,7 @@ env:
jobs:
find_exercise:
name: Find Exercise Issue
- uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.7.0
+ uses: skills/exercise-toolkit/.github/workflows/find-exercise-issue.yml@v0.9.3
check_step_work:
name: Check step work
@@ -31,18 +31,18 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Get response templates
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
- ref: v0.7.0
+ ref: v0.9.3
- name: Find last comment
id: find-last-comment
- uses: peter-evans/find-comment@v3
+ uses: peter-evans/find-comment@v4
with:
repository: ${{ env.ISSUE_REPOSITORY }}
issue-number: ${{ env.ISSUE_NUMBER }}
@@ -62,7 +62,7 @@ jobs:
- name: Check if assignment-brainstorming.agent.md exists
id: check-file-exists
continue-on-error: true
- uses: skills/exercise-toolkit/actions/file-exists@v0.7.0
+ uses: skills/exercise-toolkit/actions/file-exists@v0.9.3
with:
file: '.github/agents/assignment-brainstorming.agent.md'
@@ -96,14 +96,14 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Get response templates
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
repository: skills/exercise-toolkit
path: exercise-toolkit
- ref: v0.7.0
+ ref: v0.9.3
- name: Create comment - step finished - final review next
uses: GrantBirki/comment@v2.1.1
@@ -127,7 +127,7 @@ jobs:
finish_exercise:
name: Finish Exercise
needs: [find_exercise, post_review_content]
- uses: skills/exercise-toolkit/.github/workflows/finish-exercise.yml@v0.7.1
+ uses: skills/exercise-toolkit/.github/workflows/finish-exercise.yml@v0.9.3
with:
issue-url: ${{ needs.find_exercise.outputs.issue-url }}
exercise-title: "Personalize Sua Experiência com o GitHub Copilot"
diff --git a/config.json b/config.json
index 4010153..bf2253d 100644
--- a/config.json
+++ b/config.json
@@ -39,8 +39,8 @@
"type": "python"
}
]
- }
- ,{
+ },
+ {
"id": "data-analysis",
"title": "Data Analysis",
"description": "Basics of data analysis: loading, exploring, and visualizing data in Python.",