custom-agents-boilerplate 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. custom_agents_boilerplate-0.1.0/LICENSE +21 -0
  2. custom_agents_boilerplate-0.1.0/MANIFEST.in +4 -0
  3. custom_agents_boilerplate-0.1.0/PKG-INFO +207 -0
  4. custom_agents_boilerplate-0.1.0/README.md +190 -0
  5. custom_agents_boilerplate-0.1.0/pyproject.toml +35 -0
  6. custom_agents_boilerplate-0.1.0/setup.cfg +4 -0
  7. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/__init__.py +3 -0
  8. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/cli.py +212 -0
  9. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/generator.py +127 -0
  10. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/_base/base-prompt.md +30 -0
  11. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/_base/rules.md +39 -0
  12. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/dev/prompt.md +38 -0
  13. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/dev/tasks.md +7 -0
  14. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/estudante/prompt.md +39 -0
  15. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/estudante/tasks.md +7 -0
  16. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/po/prompt.md +50 -0
  17. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/po/tasks.md +7 -0
  18. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/qa/prompt.md +45 -0
  19. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/agents/qa/tasks.md +7 -0
  20. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/config/levels.json +70 -0
  21. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/config/roles.json +60 -0
  22. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/levels/avancado.md +29 -0
  23. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/levels/iniciante.md +30 -0
  24. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates/levels/intermediario.md +25 -0
  25. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate/templates_loader.py +18 -0
  26. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate.egg-info/PKG-INFO +207 -0
  27. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate.egg-info/SOURCES.txt +28 -0
  28. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate.egg-info/dependency_links.txt +1 -0
  29. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate.egg-info/entry_points.txt +2 -0
  30. custom_agents_boilerplate-0.1.0/src/custom_agents_boilerplate.egg-info/top_level.txt +1 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Custom Agents Boilerplate Authors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,4 @@
1
+ include README.md
2
+ include LICENSE
3
+ include pyproject.toml
4
+ recursive-include src/custom_agents_boilerplate/templates *
@@ -0,0 +1,207 @@
1
+ Metadata-Version: 2.4
2
+ Name: custom-agents-boilerplate
3
+ Version: 0.1.0
4
+ Summary: CLI para gerar Custom Agents (VS Code + GitHub Copilot Chat) em qualquer projeto.
5
+ Author: Agent Boilerplate
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/EngelRyan/agent-boilerplate
8
+ Project-URL: Repository, https://github.com/EngelRyan/agent-boilerplate
9
+ Project-URL: Issues, https://github.com/EngelRyan/agent-boilerplate/issues
10
+ Keywords: vscode,copilot,agents,prompt,cli
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Operating System :: OS Independent
13
+ Requires-Python: >=3.9
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Dynamic: license-file
17
+
18
+ # Agent Boilerplate 🤖
19
+
20
+ Ambiente de **Custom Agents** para o **VS Code + GitHub Copilot Chat**, com variações por:
21
+
22
+ - **Role (papel)**: Dev 🧑‍💻 | QA 🧪 | PO 📋 | Estudante 🎓
23
+ - **Nível (mentoria)**: Iniciante 🌱 | Intermediário 🚀 | Avançado ⚡
24
+
25
+ Objetivo: para a mesma tarefa, obter respostas **coerentes e visivelmente diferentes** dependendo do papel e do nível.
26
+
27
+ ## Uso profissional (sem clonar repo)
28
+
29
+ Você pode instalar um CLI e gerar os agentes **dentro de qualquer projeto**.
30
+
31
+ ### Instalar
32
+
33
+ Recomendado (instala o comando globalmente, sem sujar o Python do sistema):
34
+
35
+ ```bash
36
+ pipx install custom-agents-boilerplate
37
+ ```
38
+
39
+ Alternativa (instala no ambiente atual):
40
+
41
+ ```bash
42
+ pip install custom-agents-boilerplate
43
+ ```
44
+
45
+ ### Gerar no seu projeto
46
+
47
+ Dentro da pasta do seu projeto, rode o wizard:
48
+
49
+ ```bash
50
+ custom-agents
51
+ ```
52
+
53
+ Ele cria `.github/agents/` (e opcionalmente `chatmodes/`). Depois abra o projeto no VS Code → Copilot Chat → dropdown de Agents.
54
+
55
+ ### Usar sem menu (CI / comando direto)
56
+
57
+ ```bash
58
+ custom-agents generate --roles dev,qa --levels iniciante,avancado --output .
59
+ ```
60
+
61
+ Listar opções:
62
+
63
+ ```bash
64
+ custom-agents list
65
+ ```
66
+
67
+ ### Publicar no PyPI
68
+
69
+ Guia completo (manual + GitHub Actions com Trusted Publishing): veja `PUBLISHING.md`.
70
+
71
+ ## O que você ganha com cada role
72
+
73
+ - **Dev**: implementação, arquitetura, debugging, qualidade de código.
74
+ - **QA**: plano de testes, casos de teste, estratégia de automação, risco e severidade.
75
+ - **PO**: user stories, critérios de aceite, métricas de sucesso, priorização.
76
+ - **Estudante**: explicação didática, exemplos progressivos, exercícios.
77
+
78
+ ## O que muda em cada nível
79
+
80
+ - **Iniciante**: define termos, passo a passo curto, exemplo completo.
81
+ - **Intermediário**: trade-offs, perguntas de contexto, snippets relevantes.
82
+ - **Avançado**: direto, crítico, edge cases, implicações de longo prazo.
83
+
84
+ ## Onde ficam os agentes (importante)
85
+
86
+ O formato atual do VS Code chama isso de **Custom Agents** e o VS Code detecta automaticamente os arquivos em:
87
+
88
+ - `.github/agents/*.agent.md`
89
+
90
+ Este repo também mantém uma pasta `chatmodes/` com arquivos `*.chatmode.md` por compatibilidade/legado.
91
+
92
+ > Nota: neste projeto, os arquivos em `.github/agents/` e `chatmodes/` são **gerados**.
93
+ > Quem clonar o repo deve gerar pela primeira vez (passo abaixo).
94
+
95
+ ## Como usar no VS Code (passo a passo)
96
+
97
+ 1. Abra a pasta `agent-boilerplate/` no VS Code.
98
+ 2. Abra o Copilot Chat.
99
+ 3. No dropdown de **Agents**, selecione um agente (por exemplo `dev-iniciante`).
100
+ 4. Faça sua solicitação normalmente.
101
+
102
+ Se você não enxergar os agentes:
103
+
104
+ - Garanta que o workspace está **Trusted**.
105
+ - Abra a tela de customizações do chat (ícone de engrenagem) e confira a lista de agentes carregados.
106
+
107
+ ## Agentes disponíveis (12 combinações)
108
+
109
+ - `dev-iniciante`, `dev-intermediario`, `dev-avancado`
110
+ - `qa-iniciante`, `qa-intermediario`, `qa-avancado`
111
+ - `po-iniciante`, `po-intermediario`, `po-avancado`
112
+ - `estudante-iniciante`, `estudante-intermediario`, `estudante-avancado`
113
+
114
+ ## Estrutura do projeto
115
+
116
+ ```
117
+ agent-boilerplate/
118
+ ├── .github/
119
+ │ └── agents/ # 12 custom agents (formato atual)
120
+ ├── src/custom_agents_boilerplate/templates/
121
+ │ ├── config/ # Fonte da verdade de roles e níveis
122
+ │ ├── agents/ # Prompts por role (+ base)
123
+ │ └── levels/ # Ajuste de comportamento por nível
124
+ ├── chatmodes/ # Arquivos legacy (*.chatmode.md)
125
+ ├── examples/ # Exemplos para demo (entrada/saída)
126
+ └── scripts/ # validate + list + regenerate
127
+ ```
128
+
129
+ ## Validar a instalação
130
+
131
+ Primeiro clone/primeira vez:
132
+
133
+ ```bash
134
+ bash scripts/generate-agents.sh
135
+ ```
136
+
137
+ Depois valide:
138
+
139
+ ```bash
140
+ bash scripts/validate.sh
141
+ ```
142
+
143
+ Se você quiser validar apenas as “fontes” (sem exigir arquivos gerados), use:
144
+
145
+ ```bash
146
+ bash scripts/validate.sh --source-only
147
+ ```
148
+
149
+ ## Regenerar os agentes após mudanças
150
+
151
+ Quando você editar qualquer arquivo em `src/custom_agents_boilerplate/templates/agents/` ou `src/custom_agents_boilerplate/templates/levels/`, regenere:
152
+
153
+ ```bash
154
+ bash scripts/generate-agents.sh
155
+ bash scripts/validate.sh
156
+ ```
157
+
158
+ ## Gerar um pacote custom (baixar só o que escolher)
159
+
160
+ Se você quer distribuir/usar **apenas algumas combinações** (por exemplo, só `dev-iniciante` e `qa-avancado`), use o empacotador:
161
+
162
+ ### Opção 1 (recomendado): menu guiado
163
+
164
+ Rode e siga o passo a passo:
165
+
166
+ ```bash
167
+ python scripts/package_agents.py
168
+ ```
169
+
170
+ Ele vai perguntar quais **roles**, quais **níveis**, a **pasta de saída**, se é para **recriar** ou **adicionar mais**, e se gera `.zip`.
171
+
172
+ ### Opção 2: comando direto (sem menu)
173
+
174
+ 1) (Opcional) veja as opções disponíveis:
175
+
176
+ ```bash
177
+ python scripts/package_agents.py --list
178
+ ```
179
+
180
+ 2) Gere uma pasta (e opcionalmente um `.zip`) com **apenas os agentes escolhidos**:
181
+
182
+ ```bash
183
+ python scripts/package_agents.py --roles dev,qa --levels iniciante,avancado --zip
184
+ ```
185
+
186
+ Isso cria `dist/agent-boilerplate-package/` contendo somente:
187
+
188
+ - `.github/agents/*.agent.md` (os selecionados)
189
+ - `README.md` (instruções rápidas)
190
+
191
+ 3) Para “baixar mais” depois (adicionar mais agentes no mesmo pacote), rode novamente com `--add` apontando para a mesma saída:
192
+
193
+ ```bash
194
+ python scripts/package_agents.py --output dist/agent-boilerplate-package --add --roles po --levels intermediario --zip
195
+ ```
196
+
197
+ Observação: para o VS Code detectar, basta abrir a pasta do pacote no VS Code; ele carrega o que estiver em `.github/agents/`.
198
+
199
+ ## Como customizar / evoluir
200
+
201
+ - Regras universais: `src/custom_agents_boilerplate/templates/agents/_base/base-prompt.md` e `src/custom_agents_boilerplate/templates/agents/_base/rules.md`
202
+ - Especialização por role: `src/custom_agents_boilerplate/templates/agents/<role>/prompt.md` e `src/custom_agents_boilerplate/templates/agents/<role>/tasks.md`
203
+ - Ajuste por nível: `src/custom_agents_boilerplate/templates/levels/<nivel>.md`
204
+
205
+ ## Créditos
206
+
207
+ Projeto acadêmico para a disciplina de Inteligência Artificial.
@@ -0,0 +1,190 @@
1
+ # Agent Boilerplate 🤖
2
+
3
+ Ambiente de **Custom Agents** para o **VS Code + GitHub Copilot Chat**, com variações por:
4
+
5
+ - **Role (papel)**: Dev 🧑‍💻 | QA 🧪 | PO 📋 | Estudante 🎓
6
+ - **Nível (mentoria)**: Iniciante 🌱 | Intermediário 🚀 | Avançado ⚡
7
+
8
+ Objetivo: para a mesma tarefa, obter respostas **coerentes e visivelmente diferentes** dependendo do papel e do nível.
9
+
10
+ ## Uso profissional (sem clonar repo)
11
+
12
+ Você pode instalar um CLI e gerar os agentes **dentro de qualquer projeto**.
13
+
14
+ ### Instalar
15
+
16
+ Recomendado (instala o comando globalmente, sem sujar o Python do sistema):
17
+
18
+ ```bash
19
+ pipx install custom-agents-boilerplate
20
+ ```
21
+
22
+ Alternativa (instala no ambiente atual):
23
+
24
+ ```bash
25
+ pip install custom-agents-boilerplate
26
+ ```
27
+
28
+ ### Gerar no seu projeto
29
+
30
+ Dentro da pasta do seu projeto, rode o wizard:
31
+
32
+ ```bash
33
+ custom-agents
34
+ ```
35
+
36
+ Ele cria `.github/agents/` (e opcionalmente `chatmodes/`). Depois abra o projeto no VS Code → Copilot Chat → dropdown de Agents.
37
+
38
+ ### Usar sem menu (CI / comando direto)
39
+
40
+ ```bash
41
+ custom-agents generate --roles dev,qa --levels iniciante,avancado --output .
42
+ ```
43
+
44
+ Listar opções:
45
+
46
+ ```bash
47
+ custom-agents list
48
+ ```
49
+
50
+ ### Publicar no PyPI
51
+
52
+ Guia completo (manual + GitHub Actions com Trusted Publishing): veja `PUBLISHING.md`.
53
+
54
+ ## O que você ganha com cada role
55
+
56
+ - **Dev**: implementação, arquitetura, debugging, qualidade de código.
57
+ - **QA**: plano de testes, casos de teste, estratégia de automação, risco e severidade.
58
+ - **PO**: user stories, critérios de aceite, métricas de sucesso, priorização.
59
+ - **Estudante**: explicação didática, exemplos progressivos, exercícios.
60
+
61
+ ## O que muda em cada nível
62
+
63
+ - **Iniciante**: define termos, passo a passo curto, exemplo completo.
64
+ - **Intermediário**: trade-offs, perguntas de contexto, snippets relevantes.
65
+ - **Avançado**: direto, crítico, edge cases, implicações de longo prazo.
66
+
67
+ ## Onde ficam os agentes (importante)
68
+
69
+ O formato atual do VS Code chama isso de **Custom Agents** e o VS Code detecta automaticamente os arquivos em:
70
+
71
+ - `.github/agents/*.agent.md`
72
+
73
+ Este repo também mantém uma pasta `chatmodes/` com arquivos `*.chatmode.md` por compatibilidade/legado.
74
+
75
+ > Nota: neste projeto, os arquivos em `.github/agents/` e `chatmodes/` são **gerados**.
76
+ > Quem clonar o repo deve gerar pela primeira vez (passo abaixo).
77
+
78
+ ## Como usar no VS Code (passo a passo)
79
+
80
+ 1. Abra a pasta `agent-boilerplate/` no VS Code.
81
+ 2. Abra o Copilot Chat.
82
+ 3. No dropdown de **Agents**, selecione um agente (por exemplo `dev-iniciante`).
83
+ 4. Faça sua solicitação normalmente.
84
+
85
+ Se você não enxergar os agentes:
86
+
87
+ - Garanta que o workspace está **Trusted**.
88
+ - Abra a tela de customizações do chat (ícone de engrenagem) e confira a lista de agentes carregados.
89
+
90
+ ## Agentes disponíveis (12 combinações)
91
+
92
+ - `dev-iniciante`, `dev-intermediario`, `dev-avancado`
93
+ - `qa-iniciante`, `qa-intermediario`, `qa-avancado`
94
+ - `po-iniciante`, `po-intermediario`, `po-avancado`
95
+ - `estudante-iniciante`, `estudante-intermediario`, `estudante-avancado`
96
+
97
+ ## Estrutura do projeto
98
+
99
+ ```
100
+ agent-boilerplate/
101
+ ├── .github/
102
+ │ └── agents/ # 12 custom agents (formato atual)
103
+ ├── src/custom_agents_boilerplate/templates/
104
+ │ ├── config/ # Fonte da verdade de roles e níveis
105
+ │ ├── agents/ # Prompts por role (+ base)
106
+ │ └── levels/ # Ajuste de comportamento por nível
107
+ ├── chatmodes/ # Arquivos legacy (*.chatmode.md)
108
+ ├── examples/ # Exemplos para demo (entrada/saída)
109
+ └── scripts/ # validate + list + regenerate
110
+ ```
111
+
112
+ ## Validar a instalação
113
+
114
+ Primeiro clone/primeira vez:
115
+
116
+ ```bash
117
+ bash scripts/generate-agents.sh
118
+ ```
119
+
120
+ Depois valide:
121
+
122
+ ```bash
123
+ bash scripts/validate.sh
124
+ ```
125
+
126
+ Se você quiser validar apenas as “fontes” (sem exigir arquivos gerados), use:
127
+
128
+ ```bash
129
+ bash scripts/validate.sh --source-only
130
+ ```
131
+
132
+ ## Regenerar os agentes após mudanças
133
+
134
+ Quando você editar qualquer arquivo em `src/custom_agents_boilerplate/templates/agents/` ou `src/custom_agents_boilerplate/templates/levels/`, regenere:
135
+
136
+ ```bash
137
+ bash scripts/generate-agents.sh
138
+ bash scripts/validate.sh
139
+ ```
140
+
141
+ ## Gerar um pacote custom (baixar só o que escolher)
142
+
143
+ Se você quer distribuir/usar **apenas algumas combinações** (por exemplo, só `dev-iniciante` e `qa-avancado`), use o empacotador:
144
+
145
+ ### Opção 1 (recomendado): menu guiado
146
+
147
+ Rode e siga o passo a passo:
148
+
149
+ ```bash
150
+ python scripts/package_agents.py
151
+ ```
152
+
153
+ Ele vai perguntar quais **roles**, quais **níveis**, a **pasta de saída**, se é para **recriar** ou **adicionar mais**, e se gera `.zip`.
154
+
155
+ ### Opção 2: comando direto (sem menu)
156
+
157
+ 1) (Opcional) veja as opções disponíveis:
158
+
159
+ ```bash
160
+ python scripts/package_agents.py --list
161
+ ```
162
+
163
+ 2) Gere uma pasta (e opcionalmente um `.zip`) com **apenas os agentes escolhidos**:
164
+
165
+ ```bash
166
+ python scripts/package_agents.py --roles dev,qa --levels iniciante,avancado --zip
167
+ ```
168
+
169
+ Isso cria `dist/agent-boilerplate-package/` contendo somente:
170
+
171
+ - `.github/agents/*.agent.md` (os selecionados)
172
+ - `README.md` (instruções rápidas)
173
+
174
+ 3) Para “baixar mais” depois (adicionar mais agentes no mesmo pacote), rode novamente com `--add` apontando para a mesma saída:
175
+
176
+ ```bash
177
+ python scripts/package_agents.py --output dist/agent-boilerplate-package --add --roles po --levels intermediario --zip
178
+ ```
179
+
180
+ Observação: para o VS Code detectar, basta abrir a pasta do pacote no VS Code; ele carrega o que estiver em `.github/agents/`.
181
+
182
+ ## Como customizar / evoluir
183
+
184
+ - Regras universais: `src/custom_agents_boilerplate/templates/agents/_base/base-prompt.md` e `src/custom_agents_boilerplate/templates/agents/_base/rules.md`
185
+ - Especialização por role: `src/custom_agents_boilerplate/templates/agents/<role>/prompt.md` e `src/custom_agents_boilerplate/templates/agents/<role>/tasks.md`
186
+ - Ajuste por nível: `src/custom_agents_boilerplate/templates/levels/<nivel>.md`
187
+
188
+ ## Créditos
189
+
190
+ Projeto acadêmico para a disciplina de Inteligência Artificial.
@@ -0,0 +1,35 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "custom-agents-boilerplate"
7
+ version = "0.1.0"
8
+ description = "CLI para gerar Custom Agents (VS Code + GitHub Copilot Chat) em qualquer projeto."
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = "MIT"
12
+ license-files = ["LICENSE"]
13
+ authors = [{name = "Agent Boilerplate"}]
14
+ keywords = ["vscode", "copilot", "agents", "prompt", "cli"]
15
+ classifiers = [
16
+ "Programming Language :: Python :: 3",
17
+ "Operating System :: OS Independent",
18
+ ]
19
+
20
+ [project.urls]
21
+ Homepage = "https://github.com/EngelRyan/agent-boilerplate"
22
+ Repository = "https://github.com/EngelRyan/agent-boilerplate"
23
+ Issues = "https://github.com/EngelRyan/agent-boilerplate/issues"
24
+
25
+ [project.scripts]
26
+ custom-agents = "custom_agents_boilerplate.cli:main"
27
+
28
+ [tool.setuptools]
29
+ package-dir = {"" = "src"}
30
+
31
+ [tool.setuptools.packages.find]
32
+ where = ["src"]
33
+
34
+ [tool.setuptools.package-data]
35
+ custom_agents_boilerplate = ["templates/**/*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,3 @@
1
+ __all__ = ["__version__"]
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,212 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ from .generator import generate_agents, load_catalog_from_templates
8
+ from .templates_loader import templates_root
9
+
10
+
11
+ def _prompt_yes_no(question: str, *, default: bool) -> bool:
12
+ hint = "Y/n" if default else "y/N"
13
+ while True:
14
+ raw = input(f"{question} [{hint}]: ").strip().lower()
15
+ if not raw:
16
+ return default
17
+ if raw in {"y", "yes", "s", "sim"}:
18
+ return True
19
+ if raw in {"n", "no", "nao", "não"}:
20
+ return False
21
+ print("Entrada inválida. Responda com 'y' ou 'n'.")
22
+
23
+
24
+ def _choose_multi(kind: str, options: list[str]) -> list[str]:
25
+ print(f"\nSelecione {kind}:")
26
+ for idx, opt in enumerate(options, start=1):
27
+ print(f" {idx}) {opt}")
28
+ print(" all) todos")
29
+ print(" (Enter) todos")
30
+
31
+ while True:
32
+ raw = input("Digite números separados por vírgula (ex: 1,3) ou 'all':\n> ").strip().lower()
33
+ if not raw or raw in {"all", "*"}:
34
+ return list(options)
35
+
36
+ parts = [p.strip() for p in raw.split(",") if p.strip()]
37
+ try:
38
+ indexes = [int(p) for p in parts]
39
+ except ValueError:
40
+ print("Entrada inválida. Use números separados por vírgula, ou 'all'.")
41
+ continue
42
+
43
+ if any(i < 1 or i > len(options) for i in indexes):
44
+ print("Algum número está fora da lista. Tente novamente.")
45
+ continue
46
+
47
+ chosen = [options[i - 1] for i in indexes]
48
+ # keep deterministic order
49
+ return [o for o in options if o in set(chosen)]
50
+
51
+
52
+ def _wizard_generate(template_root: Path) -> dict:
53
+ catalog = load_catalog_from_templates(template_root)
54
+ role_keys = sorted(catalog.roles.keys())
55
+ level_keys = sorted(catalog.levels.keys())
56
+
57
+ print("\n=== custom-agents — Gerar agentes do Copilot Chat ===")
58
+ print("Saída: vai criar .github/agents/ dentro do seu projeto.")
59
+
60
+ roles = _choose_multi("roles", role_keys)
61
+ levels = _choose_multi("níveis", level_keys)
62
+
63
+ default_output = str(Path.cwd())
64
+ output_raw = input(f"\nPasta do projeto (output) [{default_output}]: ").strip()
65
+ output = Path(output_raw or default_output).expanduser().resolve()
66
+
67
+ include_chatmodes = _prompt_yes_no("Gerar também chatmodes/ (legado)?", default=False)
68
+
69
+ agents_dir = output / ".github" / "agents"
70
+ chatmodes_dir = output / "chatmodes"
71
+
72
+ force = False
73
+ if agents_dir.exists() or (include_chatmodes and chatmodes_dir.exists()):
74
+ print("\nDetectei saída existente:")
75
+ if agents_dir.exists():
76
+ print(f"- {agents_dir}")
77
+ if include_chatmodes and chatmodes_dir.exists():
78
+ print(f"- {chatmodes_dir}")
79
+ force = _prompt_yes_no("Apagar e recriar esses diretórios?", default=False)
80
+ if not force:
81
+ print("Cancelado.")
82
+ raise SystemExit(1)
83
+
84
+ return {
85
+ "roles": roles,
86
+ "levels": levels,
87
+ "output": output,
88
+ "include_chatmodes": include_chatmodes,
89
+ "force": force,
90
+ }
91
+
92
+
93
+ def _cmd_list(template_root: Path) -> int:
94
+ catalog = load_catalog_from_templates(template_root)
95
+
96
+ print("Roles disponíveis:")
97
+ for key in sorted(catalog.roles.keys()):
98
+ role = catalog.roles[key]
99
+ label = f"{role.emoji} {role.label}".strip()
100
+ print(f"- {key} ({label})")
101
+
102
+ print("\nNíveis disponíveis:")
103
+ for key in sorted(catalog.levels.keys()):
104
+ level = catalog.levels[key]
105
+ label = f"{level.emoji} {level.label}".strip()
106
+ print(f"- {key} ({label})")
107
+
108
+ return 0
109
+
110
+
111
+ def _csv(value: str | None) -> list[str] | None:
112
+ if value is None:
113
+ return None
114
+ value = value.strip()
115
+ if not value:
116
+ return None
117
+ if value.lower() in {"all", "*"}:
118
+ return ["*"]
119
+ return [p.strip() for p in value.split(",") if p.strip()]
120
+
121
+
122
+ def _normalize(selected: list[str] | None, options: list[str]) -> list[str]:
123
+ if not selected or selected == ["*"]:
124
+ return options
125
+ invalid = [x for x in selected if x not in options]
126
+ if invalid:
127
+ raise SystemExit(f"ERRO: inválido(s): {', '.join(invalid)}")
128
+ return selected
129
+
130
+
131
+ def _cmd_generate(template_root: Path, args: argparse.Namespace) -> int:
132
+ catalog = load_catalog_from_templates(template_root)
133
+ role_keys = sorted(catalog.roles.keys())
134
+ level_keys = sorted(catalog.levels.keys())
135
+
136
+ roles = _normalize(_csv(args.roles), role_keys)
137
+ levels = _normalize(_csv(args.levels), level_keys)
138
+
139
+ output = Path(args.output).expanduser().resolve()
140
+
141
+ generate_agents(
142
+ template_root=template_root,
143
+ output_root=output,
144
+ roles=roles,
145
+ levels=levels,
146
+ include_chatmodes=bool(args.chatmodes),
147
+ force=bool(args.force),
148
+ )
149
+
150
+ print(f"OK: gerado em {output / '.github' / 'agents'}")
151
+ if args.chatmodes:
152
+ print(f"OK: gerado em {output / 'chatmodes'}")
153
+
154
+ return 0
155
+
156
+
157
+ def main(argv: list[str] | None = None) -> int:
158
+ argv = list(sys.argv[1:] if argv is None else argv)
159
+
160
+ parser = argparse.ArgumentParser(prog="custom-agents")
161
+ sub = parser.add_subparsers(dest="cmd")
162
+
163
+ sub.add_parser("list", help="Lista roles e níveis disponíveis")
164
+
165
+ p_gen = sub.add_parser("generate", help="Gera .github/agents (e opcionalmente chatmodes)")
166
+ p_gen.add_argument("--roles", help="CSV (ex: dev,qa) ou all", default=None)
167
+ p_gen.add_argument("--levels", help="CSV (ex: iniciante,avancado) ou all", default=None)
168
+ p_gen.add_argument("--output", help="Pasta do projeto (default: .)", default=str(Path.cwd()))
169
+ p_gen.add_argument("--chatmodes", action="store_true", help="Também gera chatmodes/ (legado)")
170
+ p_gen.add_argument("--force", action="store_true", help="Apaga e recria diretórios de saída")
171
+
172
+ # default: wizard generate
173
+ args = parser.parse_args(argv)
174
+
175
+ with templates_root() as template_root:
176
+ if args.cmd == "list":
177
+ return _cmd_list(template_root)
178
+
179
+ if args.cmd == "generate":
180
+ return _cmd_generate(template_root, args)
181
+
182
+ # no subcommand -> wizard
183
+ if not sys.stdin.isatty():
184
+ # non-interactive default
185
+ return _cmd_generate(
186
+ template_root,
187
+ argparse.Namespace(
188
+ roles="all",
189
+ levels="all",
190
+ output=str(Path.cwd()),
191
+ chatmodes=False,
192
+ force=False,
193
+ ),
194
+ )
195
+
196
+ wiz = _wizard_generate(template_root)
197
+ generate_agents(
198
+ template_root=template_root,
199
+ output_root=wiz["output"],
200
+ roles=wiz["roles"],
201
+ levels=wiz["levels"],
202
+ include_chatmodes=wiz["include_chatmodes"],
203
+ force=wiz["force"],
204
+ )
205
+
206
+ print("\nOK: agentes gerados com sucesso.")
207
+ print("Abra o projeto no VS Code → Copilot Chat → Agents.")
208
+ return 0
209
+
210
+
211
+ if __name__ == "__main__":
212
+ raise SystemExit(main())