Communitygithub.com

tinystruct-patterns

Orientação especializada para desenvolvimento com o framework Java tinystruct. Use ao trabalhar no código-fonte do tinystruct ou em qualquer projeto construído sobre ele — incluindo criação de classes Application, rotas com @Action, testes unitários, ActionRegistry, modo duplo HTTP/CLI, servidor HTTP embutido, sistema de eventos, JSON com Builder/Builders, persistência de banco de dados com AbstractData, geração de POJOs, Server-Sent Events (SSE), upload de arquivos e requisições HTTP de saída.

O que é tinystruct-patterns?

A skill tinystruct-patterns fornece orientação especializada para desenvolvedores que utilizam o framework Java tinystruct, um framework leve e de alta performance que trata CLI e HTTP como cidadãos de primeira classe, sem necessidade de um método main() e com configuração mínima. Ela cobre desde a criação de módulos de aplicação estendendo AbstractApplication, definição de rotas e ações de linha de comando com @Action, manipulação de estado por requisição via Context, até serialização JSON nativa com Builder e Builders. A skill também aborda persistência de banco de dados com AbstractData, geração de POJOs a partir de tabelas, implementação de Server-Sent Events (SSE) para push em tempo real, upload de arquivos, requisições HTTP de saída e integração com o Model Context Protocol (MCP) para construção de ferramentas e servidores MCP. O conteúdo é baseado na documentação oficial SKILL.md e inclui práticas recomendadas, anti-padrões e exemplos de código que garantem que o assistente possa orientar corretamente o desenvolvedor em qualquer um desses tópicos.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/tinystruct-patterns

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Padrões de Desenvolvimento tinystruct

Padrões de arquitetura e implementação para construir módulos com o framework tinystruct Java – um framework leve e de alta performance que trata CLI e HTTP como cidadãos equivalentes, não exigindo um método main() e com configuração mínima.

Princípio Central

CLI e HTTP são cidadãos equivalentes. Todo método anotado com @Action deve, idealmente, poder ser executado tanto de um terminal quanto de um navegador da web sem modificação. Essa capacidade de "modo duplo" é a filosofia de design central do tinystruct.

Quando Ativar

Quando Usar

  • Criando novos módulos Applicação estendendo AbstractApplication.
  • Definindo rotas e ações de linha de comando usando @Action.
  • Manipulando estado por requisição via Context.
  • Realizando serialização JSON usando os componentes nativos Builder e Builders.
  • Trabalhando com persistência de banco de dados via POJOs AbstractData.
  • Gerando POJOs a partir de tabelas de banco de dados usando o comando generate.
  • Implementando Server-Sent Events (SSE) para push em tempo real.
  • Manipulando upload de arquivos via dados multipart.
  • Fazendo requisições HTTP de saída com URLRequest e HTTPHandler.
  • Configurando conexões de banco de dados ou configurações do sistema em application.properties.
  • Depurando conflitos de rota (Actions) ou análise de argumentos CLI.

Como Funciona

O framework tinystruct trata qualquer método anotado com @Action como um endpoint roteável tanto para terminal quanto para ambiente web. As aplicações são criadas estendendo AbstractApplication, que fornece hooks de ciclo de vida principais como init() e acesso ao Context da requisição.

O roteamento é gerenciado pelo ActionRegistry, que mapeia automaticamente segmentos de caminho para argumentos de método e injeta dependências. Para serviços somente de dados, os componentes nativos Builder e Builders devem ser usados para serialização JSON, mantendo uma pegada de zero dependências. A camada de banco de dados usa POJOs AbstractData pareados com arquivos de mapeamento XML para operações CRUD sem bibliotecas ORM externas.

Exemplos

Aplicação Básica (MyService)

public class MyService extends AbstractApplication {
    @Override
    public void init() {
        this.setTemplateRequired(false); // Desabilita a busca por .view para apps de dados/API
    }

    @Override public String version() { return "1.0.0"; }

    @Action("greet")
    public String greet() {
        return "Olá do tinystruct!";
    }

    // Parâmetro de caminho: GET /?q=greet/James  OU  bin/dispatcher greet/James
    @Action("greet")
    public String greet(String name) {
        return "Olá, " + name + "!";
    }
}

Desambiguação de Modo HTTP (login)

@Action(value = "login", mode = Mode.HTTP_POST)
public String doLogin(Request<?, ?> request) throws ApplicationException {
    request.getSession().setAttribute("userId", "42");
    return "Logado";
}

Manipulação de Dados JSON Nativa (Builder + Builders)

import org.tinystruct.data.component.Builder;
import org.tinystruct.data.component.Builders;

@Action("api/data")
public String getData() throws ApplicationException {
    Builders dataList = new Builders();
    Builder item = new Builder();
    item.put("id", 1);
    item.put("name", "James");
    dataList.add(item);

    Builder response = new Builder();
    response.put("status", "success");
    response.put("data", dataList);
    return response.toString(); // {"status":"success","data":[{"id":1,"name":"James"}]}
}

SSE (Server-Sent Events)

import org.tinystruct.http.SSEPushManager;

@Action("sse/connect")
public String connect() {
    return "{\"type\":\"connect\",\"message\":\"Conectado ao SSE\"}";
}

// Enviar para um cliente específico
String sessionId = getContext().getId();
Builder msg = new Builder();
msg.put("text", "Olá, usuário!");
SSEPushManager.getInstance().push(sessionId, msg);

// Transmissão para todos
// Transmissão para todos
SSEPushManager.getInstance().broadcast(msg);

Upload de Arquivo

import org.tinystruct.data.FileEntity;

@Action(value = "upload", mode = Mode.HTTP_POST)
public String upload(Request<?, ?> request) throws ApplicationException {
    List<FileEntity> files = request.getAttachments();
    if (files != null) {
        for (FileEntity file : files) {
            System.out.println("Enviado: " + file.getFilename());
        }
    }
    return "Upload OK";
}

Integração com Servidor MCP e Ferramentas

otinystruct fornece suporte nativo ao Model Context Protocol (MCP) a partir da versão 1.7.26 do SDK. As APIs MCP (por exemplo, org.tinystruct.mcp.MCPTool, org.tinystruct.mcp.MCPServer, org.tinystruct.mcp.MCPException) estão incluídas diretamente na dependência principal:

<dependency>
    <groupId>org.tinystruct</groupId>
    <artifactId>tinystruct</artifactId>
    <version>1.7.26</version>
</dependency>

AVISO DE SEGURANÇA (Injeção de Prompt): Os valores de retorno das ferramentas são alimentados diretamente de volta no contexto do modelo de IA. Você DEVE validar e sanitizar todos os argumentos fornecidos pelo chamador antes de incluí-los na string de retorno da ferramenta. A falha em sanitizar as entradas pode permitir que um atacante injete instruções adversariais (Injeção de Prompt) que sobrescrevam o comportamento do modelo. Sempre valide tamanho, conjuntos de caracteres e nulidade.

Para criar uma Ferramenta MCP:

  1. Estenda org.tinystruct.mcp.MCPTool.
  2. Anote operações com @Action e declare parâmetros usando @Argument dentro do array arguments.
  3. Aceite parâmetros como argumentos explícitos do método que correspondam às chaves em @Argument. (Não use getContext().getAttribute(...) para argumentos de ferramenta).
import org.tinystruct.mcp.MCPTool;
import org.tinystruct.mcp.MCPException;
import org.tinystruct.system.annotation.Action;
import org.tinystruct.system.annotation.Argument;

public class MyCustomTool extends MCPTool {
    public MyCustomTool() {
        super("custom", "Uma ferramenta personalizada para demonstrar MCP");
    }

    @Action(
        value = "custom/hello",
        description = "Dizer olá para alguém",
        arguments = {
            @Argument(key = "name", description = "O nome a ser saudado", type = "string", optional = false)
        }
    )
    public String hello(String name) throws MCPException {
        // SEGURANÇA: Validar/sanitizar entradas da ferramenta antes de retornar ao modelo
        // para prevenir vulnerabilidades de injeção de prompt.
        if (name == null || name.length() > 50 || !name.matches("^[a-zA-Z0-9 ]+$")) {
            throw new MCPException("Nome inválido fornecido");
        }
        return "Olá, " + name + "!";
    }
}

Para implantar um Servidor MCP:

  1. Estenda org.tinystruct.mcp.MCPServer.
  2. Sobrescreva init() e registre suas ferramentas usando this.registerTool(). O framework automaticamente escaneia e mapeia os métodos @Action.
import org.tinystruct.mcp.MCPServer;

public class MyMCPServer extends MCPServer {
    @Override
    public void init() {
        super.init();
        this.registerTool(new MyCustomTool());
    }

    @Override
    public String version() {
        return "1.0.0";
    }
}

Execute o servidor através do dispatcher:

bin/dispatcher start --import org.tinystruct.system.HttpServer --import com.example.MyMCPServer

Configuração

As configurações são gerenciadas em src/main/resources/application.properties.

# Banco de Dados
driver=org.h2.Driver
database.url=jdbc:h2:~/mydb
database.user=sa
database.password=

# Servidor
default.home.page=hello
server.port=8080

# Localidade
default.language=en_US

# Sessão (Redis para ambientes clusterizados)
# default.session.repository=org.tinystruct.http.RedisSessionRepository
# redis.host=127.0.0.1
# redis.port=6379

Acesse valores de configuração em sua aplicação:

String port = this.getConfiguration("server.port");

Bandeiras Vermelhas e Anti-padrões

SintomaPadrão Correto
Importando com.google.gson ou com.fasterxml.jacksonUse org.tinystruct.data.component.Builder / Builders.
Usando List<Builder> para arrays JSONUse Builders para evitar problemas de apagamento de tipo genérico.
ApplicationRuntimeException: template not foundChame setTemplateRequired(false) no init() para apps somente API.
Anotando métodos private com @ActionAções devem ser public para serem registradas pelo framework.
Codificando main(String[] args) em aplicaçõesUse bin/dispatcher como ponto de entrada para todos os módulos.
Registro manual no ActionRegistryPrefira a anotação @Action para descoberta automática.
Ação não encontrada em tempo de execuçãoCertifique-se de que a classe é importada via --import ou listada em application.properties.
Argumento CLI não visívelPasse com --key value; acesse via getContext().getAttribute("--key").
Dois métodos mesmo caminho, o errado é executadoDefina o mode explicitamente (ex.: HTTP_GET vs HTTP_POST) para desambiguar.

Melhores Práticas

  1. Aplicações Granulares: Divida a lógica em aplicações menores e focadas, em vez de uma única classe monolítica.
  2. Configuração no init(): Use init() para configuração (config, DB) em vez do construtor. NÃO chame setAction() — use a anotação @Action.
  3. Consciência de Modo: Use o parâmetro Mode em @Action para restringir operações sensíveis a CLI apenas ou a métodos HTTP específicos.
  4. Contexto sobre Parâmetros: Para flags CLI opcionais, use getContext().getAttribute("--flag") em vez de adicionar parâmetros à assinatura do método.
  5. Eventos Assíncronos: Para tarefas pesadas acionadas por eventos, use CompletableFuture.runAsync() dentro do manipulador de eventos.

Referência Técnica

Guias detalhados estão disponíveis no diretório references/:

Arquivos de Código Fonte de Referência (Internos)

  • src/main/java/org/tinystruct/AbstractApplication.java — Classe base principal com hooks de ciclo de vida
  • src/main/java/org/tinystruct/system/annotation/Action.java — Anotação e Modos
  • src/main/java/org/tinystruct/application/ActionRegistry.java — Mecanismo de Roteamento
  • src/main/java/org/tinystruct/data/component/Builder.java — Serializador JSON de objeto
  • src/main/java/org/tinystruct/data/component/Builders.java — Serializador JSON de array
  • src/main/java/org/tinystruct/data/component/AbstractData.java — Classe POJO base com CRUD
  • src/main/java/org/tinystruct/data/Mapping.java — Analisador XML de mapeamento
  • src/main/java/org/tinystruct/data/tools/MySQLGenerator.java — Referência de gerador de POJO
  • src/main/java/org/tinystruct/data/component/FieldType.java — Mapeamentos SQL-para-Java
  • src/main/java/org/tinystruct/data/component/Condition.java — Construtor de consulta SQL fluente
  • src/main/java/org/tinystruct/http/SSEPushManager.java — Gerenciamento de conexões SSE
  • src/test/java/org/tinystruct/application/ActionRegistryTest.java — Exemplos de teste do Registry
  • src/test/java/org/tinystruct/system/HttpServerHttpModeTest.java — Padrões de teste de integração HTTP

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Habilidades Relacionadas