원클릭으로
new-detector
Skill para criar novos detectores e classificadores de campo seguindo as convenções do projeto Fill All.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Skill para criar novos detectores e classificadores de campo seguindo as convenções do projeto Fill All.
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-detector |
| description | Skill para criar novos detectores e classificadores de campo seguindo as convenções do projeto Fill All. |
| 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 passo a passo para criar um novo detector ou classificador de campos no projeto Fill All, seguindo a interface FieldClassifier, pipeline imutável e convenções de confiança.
| Conceito | Descrição |
|---|---|
Detector | Interface genérica Detector<TInput, TResult> com .name + .detect() |
FieldClassifier | Subtipo que classifica FormField → ClassifierResult | null |
PageDetector | Subtipo que detecta contexto da página |
DetectionPipeline | Pipeline imutável que roda classificadores em ordem |
confidence | Valor 0–1 indicando certeza (1 = absoluta) |
Nota: Nos exemplos abaixo,
<nome>é um placeholder. Substitua pelo nome real do classificador (ex:keyword,tensorflow,chromeAi,pattern).
src/lib/form/detectors/strategies/<nome>-classifier.ts
import type { FieldClassifier, ClassifierResult } from "@/lib/form/detectors/detector.interface";
import type { FormField } from "@/types";
/**
* Classificador que detecta <descrição>.
* Analisa <sinais utilizados>.
*/
export const <nome>Classifier: FieldClassifier = {
name: "<nome>-classifier",
detect(field: FormField): ClassifierResult | null {
// 1. Extrair sinais do campo
const signals = field.signals ?? "";
// 2. Analisar sinais
// ...
// 3. Retornar null se sem confiança
if (!match) {
return null;
}
// 4. Retornar resultado com confidence
return {
type: "<field-type>",
confidence: 0.8,
method: "<nome>-classifier",
};
},
};
| Regra | Detalhe |
|---|---|
Objeto const | Nunca classe — usar objeto com .name + .detect() |
| Nome único | .name é usado pela pipeline para reordenação |
Retornar null | Quando não tiver confiança — nunca forçar resultado |
| Confidence 0–1 | 0 = nenhuma, 0.5 = moderada, 0.8 = alta, 1.0 = certeza absoluta |
| Sem side effects | .detect() é puro — sem I/O, sem mutação |
| Sem throw | Retornar null em caso de erro |
| Named export | Nunca export default |
Arquivo: src/lib/form/detectors/classifiers.ts
import { <nome>Classifier } from "./strategies/<nome>-classifier";
// Adicionar ao array ALL_CLASSIFIERS
export const ALL_CLASSIFIERS: FieldClassifier[] = [
// ... existentes
<nome>Classifier,
];
Se o classificador deve ser parte do pipeline padrão:
// Em classifiers.ts — adicionar ao DEFAULT_PIPELINE
export const DEFAULT_PIPELINE = new DetectionPipeline([
htmlTypeDetector,
// ... existentes
<nome>Classifier, // Posição importa — pipeline roda em ordem
]);
⚠️ A posição na pipeline define prioridade. Classificadores mais específicos devem vir antes dos genéricos.
Se o classificador precisa de operações assíncronas (ex: Chrome AI, API):
export const <nome>Classifier: FieldClassifier = {
name: "<nome>-classifier",
detect(field: FormField): ClassifierResult | null {
// Fallback síncrono (usado quando async não disponível)
return null;
},
async detectAsync(field: FormField): Promise<ClassifierResult | null> {
try {
// Operação assíncrona
const result = await someAsyncOperation(field);
return result ? { type: result.type, confidence: result.score, method: "<nome>-classifier" } : null;
} catch {
return null;
}
},
};
src/lib/form/detectors/__tests__/<nome>-classifier.test.ts
import { describe, it, expect } from "vitest";
import { <nome>Classifier } from "@/lib/form/detectors/strategies/<nome>-classifier";
import type { FormField } from "@/types";
const makeField = (overrides: Partial<FormField> = {}): FormField => ({
selector: "input[name='test']",
tagName: "INPUT",
type: "text",
signals: "",
label: "",
...overrides,
});
describe("<nome>Classifier", () => {
it("has a unique name", () => {
expect(<nome>Classifier.name).toBe("<nome>-classifier");
});
it("returns null for unrecognized fields", () => {
const result = <nome>Classifier.detect(makeField());
expect(result).toBeNull();
});
it("detects <tipo esperado> with correct confidence", () => {
const field = makeField({
signals: "<sinais relevantes>",
label: "<label relevante>",
});
const result = <nome>Classifier.detect(field);
expect(result).not.toBeNull();
expect(result!.type).toBe("<field-type>");
expect(result!.confidence).toBeGreaterThanOrEqual(0);
expect(result!.confidence).toBeLessThanOrEqual(1);
});
it("returns confidence in valid range", () => {
const field = makeField({ signals: "<sinais>" });
const result = <nome>Classifier.detect(field);
if (result) {
expect(result.confidence).toBeGreaterThanOrEqual(0);
expect(result.confidence).toBeLessThanOrEqual(1);
}
});
it("never throws", () => {
const fields = [
makeField(),
makeField({ signals: undefined as unknown as string }),
makeField({ type: undefined as unknown as string }),
];
for (const field of fields) {
expect(() => <nome>Classifier.detect(field)).not.toThrow();
}
});
});
# Validação rápida com script do projeto
./scripts/validate-step.sh types unit
# Ou comandos individuais:
# Verificar tipos
npm run type-check
# Rodar testes do classificador
npx vitest run src/lib/form/detectors/__tests__/<nome>-classifier.test.ts
# Rodar todos os testes de detectors
npx vitest run src/lib/form/detectors
# Verificar accuracy geral (se registrou no pipeline)
npx vitest run src/lib/dataset
Campo HTML → Pipeline.detect(field)
│
├─ Classificador 1 → resultado ou null
├─ Classificador 2 → resultado ou null
├─ Classificador 3 → resultado ou null
└─ ... (roda em ordem até encontrar confiante)
│
└─ Retorna melhor resultado (maior confidence)
.with(), .without(), .withOrder() retornam NOVA instâncianullsrc/lib/form/detectors/strategies/<nome>-classifier.tsconst com .name único + .detect() (nunca classe)null quando sem confiançaexport default)ALL_CLASSIFIERS em classifiers.tsDEFAULT_PIPELINE na posição corretanpm run type-check passanpm test passa