ワンクリックで
new-module
Skill para criar um novo módulo em src/lib/ do zero — scaffolding, estrutura, testes, barrel exports e validação.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Skill para criar um novo módulo em src/lib/ do zero — scaffolding, estrutura, testes, barrel exports e validação.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Skill para criar novos geradores de dados seguindo as convenções do projeto Fill All.
Skill para planejamento de roadmap, gestão de features, milestones e priorização de tarefas do projeto Fill All.
Skill para validação de regressão em testes — verificar que mudanças não quebraram funcionalidades existentes.
Skill para realizar code reviews alinhados com as convenções e padrões de qualidade do projeto Fill All.
Skill para investigação e debug sistemático de bugs — reproduzir, isolar, corrigir e validar com scripts.
Skill para gerenciamento seguro de dependências npm — auditoria, atualização, lock files e breaking changes.
| name | new-module |
| description | Skill para criar um novo módulo em src/lib/ do zero — scaffolding, estrutura, testes, barrel exports e validação. |
| license | MIT |
| compatibility | Node.js 18+, TypeScript 5.x, Chrome Extension Manifest V3 |
| metadata | {"author":"marcusp","version":"1.0","project":"fill-all","category":"scaffolding"} |
Guia step-by-step para criar um novo módulo em src/lib/, seguindo a estrutura padrão do projeto com testes, exports e validação.
src/lib/<nome-modulo>/
├── <arquivo-principal>.ts # Lógica principal
├── <arquivo-secundario>.ts # (opcional) Lógica adicional
├── index.ts # Barrel exports (se múltiplos arquivos)
└── __tests__/
├── <arquivo>.test.ts # Testes unitários
└── e2e/ # (opcional) Testes E2E
└── <arquivo>.test.e2e.ts
./scripts/snapshot-health.sh --save
✅ Baseline salva
# Criar diretórios
mkdir -p src/lib/<nome-modulo>/__tests__
Arquivo: src/lib/<nome-modulo>/<arquivo>.ts
import { createLogger } from "@/lib/logger";
const log = createLogger("<NomeModulo>");
/**
* <Descrição do que o módulo faz>
*/
export function <funcaoPrincipal>(<params>): <ReturnType> {
try {
// Implementação
log.debug("<funcaoPrincipal> executado com sucesso");
return resultado;
} catch (err) {
log.warn("Falha em <funcaoPrincipal>:", err);
return fallback; // NUNCA throw
}
}
Regras:
createLoggerthrow — retornar fallbackverbNoun./scripts/validate-step.sh types
✅ Type-check passa
Arquivo: src/lib/<nome-modulo>/index.ts
export { <funcaoPrincipal> } from "./<arquivo>";
export { <outraFuncao> } from "./<outro-arquivo>";
// Exportar tipos com `export type`
export type { <MeuTipo> } from "./<tipos>";
./scripts/validate-step.sh types
✅ Type-check passa
Arquivo: src/lib/<nome-modulo>/__tests__/<arquivo>.test.ts
import { describe, it, expect, vi, beforeEach } from "vitest";
import { <funcaoPrincipal> } from "@/lib/<nome-modulo>/<arquivo>";
// Mock do logger
vi.mock("@/lib/logger", () => ({
createLogger: () => ({
debug: vi.fn(),
info: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
}),
}));
describe("<funcaoPrincipal>", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("returns expected result for valid input", () => {
// Arrange
const input = /* ... */;
// Act
const result = <funcaoPrincipal>(input);
// Assert
expect(result).toBeDefined();
});
it("returns fallback for invalid input", () => {
const result = <funcaoPrincipal>(null as unknown as any);
expect(result).toBe(/* fallback */);
});
it("never throws", () => {
expect(() => <funcaoPrincipal>(undefined as unknown as any)).not.toThrow();
expect(() => <funcaoPrincipal>(null as unknown as any)).not.toThrow();
expect(() => <funcaoPrincipal>("" as unknown as any)).not.toThrow();
});
});
./scripts/validate-step.sh types unit
✅ Type-check + testes passam
Se o módulo precisa ser chamado por outros:
// No consumer:
import { <funcaoPrincipal> } from "@/lib/<nome-modulo>";
./scripts/validate-step.sh types unit build
✅ Type-check + testes + build passam
# Validação completa
./scripts/validate-step.sh types unit build
# Comparar com baseline — verificar zero regressão
./scripts/snapshot-health.sh --compare
✅ Nenhuma regressão, módulo funcional
Se o módulo persiste dados em chrome.storage.local:
import { getFromStorage, setToStorage, updateStorageAtomically } from "@/lib/storage/core";
import { STORAGE_KEYS } from "@/lib/storage/storage-keys";
// Adicionar chave no STORAGE_KEYS:
// STORAGE_KEYS.<MODULO>_DATA = "fill_all_<modulo>_data"
export async function get<Modulo>Data(): Promise<ModuloData[]> {
return getFromStorage<ModuloData[]>(STORAGE_KEYS.<MODULO>_DATA, []);
}
export async function save<Modulo>Data(data: ModuloData[]): Promise<void> {
await setToStorage(STORAGE_KEYS.<MODULO>_DATA, data);
}
Regras de Storage:
fill_all_ via STORAGE_KEYSchrome.storage.local — nunca syncupdateStorageAtomically()Se o módulo precisa de comunicação via mensagens:
src/types/index.tssrc/lib/messaging/validators.tssrc/background/handlers/light-validators.ts### Módulo Criado
- [ ] Diretório `src/lib/<nome-modulo>/` criado
- [ ] Arquivo principal com named exports
- [ ] Logger com `createLogger("<NomeModulo>")`
- [ ] Sem `throw` — retorna fallback
- [ ] Barrel exports (`index.ts`) se múltiplos arquivos
- [ ] Testes em `__tests__/<arquivo>.test.ts`
- [ ] Logger mockado nos testes
- [ ] `vi.clearAllMocks()` no `beforeEach`
- [ ] Padrão AAA (Arrange/Act/Assert)
- [ ] `./scripts/validate-step.sh types unit build` passa
- [ ] `./scripts/snapshot-health.sh --compare` sem regressão
- [ ] Coverage ≥ 85%