원클릭으로
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%