一键导入
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%