Communitygithub.com

tinystruct-patterns

Expertenberatung für die Entwicklung mit dem tinystruct Java-Framework. Nutzen Sie dieses Skill bei der Arbeit an der tinystruct-Codebasis oder an jedem Projekt, das auf tinystruct basiert – inklusive der Erstellung von Application-Klassen, @Action-gerouteten Endpunkten, Unit-Tests, ActionRegistry, HTTP/CLI-Dual-Mode-Handling, dem integrierten HTTP-Server, dem Event-System, JSON mit Builder/Builders, Datenbankpersistenz mit AbstractData, POJO-Generierung, Server-Sent Events (SSE), Datei-Uploads und ausgehenden HTTP-Netzwerkoperationen.

Was ist tinystruct-patterns?

Dieses Skill bietet eine umfassende Referenz für die Entwicklung mit dem **tinystruct** Java-Framework, einem leichten und leistungsstarken Framework, das CLI und HTTP als gleichberechtigte Bürger behandelt. Es beschreibt das Kernprinzip des Dual-Mode-Designs, bei dem jede mit `@Action` annotierte Methode sowohl über ein Terminal als auch über einen Webbrowser ausgeführt werden kann, ohne Modifikationen. Das Skill behandelt alle wichtigen Aspekte der Framework-Nutzung, einschließlich der Erstellung von Application-Klassen durch Erweiterung von `AbstractApplication`, der Verwendung des nativen JSON-Systems (`Builder`/`Builders`) für eine Null-Abhängigkeits-Serialisierung, der Datenbankpersistenz mit `AbstractData` POJOs und der Implementierung erweiterter Funktionen wie Server-Sent Events (SSE), Datei-Uploads und MCP (Model Context Protocol) Tool-Integration. Es ist für Entwickler auf GitHub Copilot, Cursor, Codex und ähnlichen KI-gestützten Entwicklungswerkzeugen konzipiert. Es enthält praktische Codebeispiele, Best Practices und eine Übersicht über Anti-Patterns, um Entwicklern zu helfen, effiziente, wartbare und skalierbare Anwendungen mit tinystruct zu erstellen.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

tinystruct-Entwicklungsmuster

Architektur- und Implementierungsmuster für die Entwicklung von Modulen mit dem tinystruct Java-Framework – einem leichten, leistungsstarken Framework, das CLI und HTTP als gleichberechtigte Bürger behandelt und weder eine main()-Methode noch minimale Konfiguration erfordert.

Kernprinzip

CLI und HTTP sind gleichberechtigte Bürger. Jede mit @Action annotierte Methode sollte idealerweise sowohl über ein Terminal als auch über einen Webbrowser ohne Änderung ausgeführt werden können. Diese "Dual-Mode"-Fähigkeit ist die Kern-Designphilosophie von tinystruct.

Wann zu aktivieren

Wann verwenden

  • Erstellen neuer Application-Module durch Erweiterung von AbstractApplication.
  • Definieren von Routen und Befehlszeilenaktionen mit @Action.
  • Verarbeiten von anforderungsbezogenem Status über Context.
  • Durchführen von JSON-Serialisierung mit den nativen Builder- und Builders-Komponenten.
  • Arbeiten mit Datenbankpersistenz über AbstractData POJOs.
  • Generieren von POJOs aus Datenbanktabellen mit dem generate-Befehl.
  • Implementieren von Server-Sent Events (SSE) für Echtzeit-Push.
  • Verarbeiten von Datei-Uploads über Multipart-Daten.
  • Durchführen ausgehender HTTP-Anfragen mit URLRequest und HTTPHandler.
  • Konfigurieren von Datenbankverbindungen oder Systemeinstellungen in application.properties.
  • Debuggen von Routing-Konflikten (Actions) oder CLI-Argument-Parsing.

Wie es funktioniert

Das tinystruct-Framework behandelt jede mit @Action annotierte Methode als routbaren Endpunkt sowohl für Terminal- als auch für Webumgebungen. Anwendungen werden durch Erweiterung von AbstractApplication erstellt, das Kern-Lebenszyklus-Hooks wie init() und Zugriff auf den Anfrage-Context bereitstellt.

Das Routing wird von der ActionRegistry übernommen, die automatisch Pfadsegmente auf Methodenargumente abbildet und Abhängigkeiten injiziert. Für datenorientierte Dienste sollten die nativen Builder- und Builders-Komponenten für die JSON-Serialisierung verwendet werden, um einen Null-Abhängigkeits-Footprint zu erhalten. Die Datenbankschicht verwendet AbstractData POJOs in Verbindung mit XML-Mapping-Dateien für CRUD-Operationen ohne externe ORM-Bibliotheken.

Beispiele

Grundlegende Anwendung (MyService)

public class MyService extends AbstractApplication {
    @Override
    public void init() {
        this.setTemplateRequired(false); // .view-Suche für Daten-/API-Apps deaktivieren
    }

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

    @Action("greet")
    public String greet() {
        return "Hallo von tinystruct!";
    }

    // Pfadparameter: GET /?q=greet/James  ODER  bin/dispatcher greet/James
    @Action("greet")
    public String greet(String name) {
        return "Hallo, " + name + "!";
    }
}

HTTP-Modus-Disambiguierung (login)

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

Native JSON-Datenverarbeitung (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\":\"Connected to SSE\"}";
}

// An einen bestimmten Client pushen
String sessionId = getContext().getId();
Builder msg = new Builder();
msg.put("text", "Hallo, Benutzer!");
SSEPushManager.getInstance().push(sessionId, msg);

// An alle broadcasten
SSEPushManager.getInstance().broadcast(msg);

Datei-Upload

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("Hochgeladen: " + file.getFilename());
        }
    }
    return "Upload OK";
}

MCP-Server- und Tool-Integration

tinystruct bietet native Unterstützung für das Model Context Protocol (MCP) ab SDK-Version 1.7.26. Die MCP-APIs (z. B. org.tinystruct.mcp.MCPTool, org.tinystruct.mcp.MCPServer, org.tinystruct.mcp.MCPException) sind direkt in der Kernabhängigkeit enthalten:

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

SICHERHEITSWARNUNG (Prompt Injection): Tool-Rückgabewerte werden direkt in den Kontext des KI-Modells eingespeist. Sie MÜSSEN alle vom Aufrufer bereitgestellten Argumente validieren und bereinigen, bevor Sie sie in die Rückgabezeichenfolge des Tools aufnehmen. Die Nichtbereinigung von Eingaben kann es einem Angreifer ermöglichen, gegnerische Anweisungen (Prompt Injection) einzuschleusen, die das Verhalten des Modells überschreiben. Validieren Sie immer Länge, Zeichensätze und Nullwerte.

So erstellen Sie ein MCP-Tool:

  1. Erweitern Sie org.tinystruct.mcp.MCPTool.
  2. Annotation von Operationen mit @Action und Deklaration von Parametern mit @Argument innerhalb des arguments-Arrays.
  3. Akzeptieren Sie Parameter als explizite Methodenargumente, die mit den Schlüsseln in @Argument übereinstimmen. (Verwenden Sie kein getContext().getAttribute(...) für Tool-Argumente).
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", "Ein benutzerdefiniertes Tool zur Demonstration von MCP");
    }

    @Action(
        value = "custom/hello",
        description = "Jemanden begrüßen",
        arguments = {
            @Argument(key = "name", description = "Der zu begrüßende Name", type = "string", optional = false)
        }
    )
    public String hello(String name) throws MCPException {
        // SICHERHEIT: Validieren/Bereinigen Sie Tool-Eingaben, bevor Sie sie an das Modell zurückgeben,
        // um Prompt-Injection-Schwachstellen zu verhindern.
        if (name == null || name.length() > 50 || !name.matches("^[a-zA-Z0-9 ]+$")) {
            throw new MCPException("Ungültiger Name bereitgestellt");
        }
        return "Hallo, " + name + "!";
    }
}

So stellen Sie einen MCP-Server bereit:

  1. Erweitern Sie org.tinystruct.mcp.MCPServer.
  2. Überschreiben Sie init() und registrieren Sie Ihre Tools mit this.registerTool(). Das Framework scannt und mapped automatisch die @Action-Methoden.
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";
    }
}

Starten Sie den Server über den Dispatcher:

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

Konfiguration

Einstellungen werden in src/main/resources/application.properties verwaltet.

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

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

# Gebietsschema
default.language=en_US

# Sitzung (Redis für Cluster-Umgebungen)
# default.session.repository=org.tinystruct.http.RedisSessionRepository
# redis.host=127.0.0.1
# redis.port=6379

Greifen Sie in Ihrer Anwendung auf Konfigurationswerte zu:

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

Warnsignale & Anti-Patterns

SymptomRichtiges Muster
Importieren von com.google.gson oder com.fasterxml.jacksonVerwenden Sie org.tinystruct.data.component.Builder / Builders.
Verwenden von List<Builder> für JSON-ArraysVerwenden Sie Builders, um Probleme mit generischer Typenlöschung zu vermeiden.
ApplicationRuntimeException: template not foundRufen Sie setTemplateRequired(false) in init() für reine API-Apps auf.
Annotation von private Methoden mit @ActionAktionen müssen public sein, um vom Framework registriert zu werden.
Hartcodieren von main(String[] args) in AppsVerwenden Sie bin/dispatcher als Einstiegspunkt für alle Module.
Manuelle ActionRegistry-RegistrierungBevorzugen Sie die @Action-Annotation zur automatischen Erkennung.
Aktion zur Laufzeit nicht gefundenStellen Sie sicher, dass die Klasse über --import importiert oder in application.properties aufgeführt ist.
CLI-Argument nicht sichtbarÜbergeben Sie es mit --key value; Zugriff über getContext().getAttribute("--key").
Zwei Methoden gleicher Pfad, falsche wird ausgelöstSetzen Sie expliziten mode (z. B. HTTP_GET vs. HTTP_POST) zur Disambiguierung.

Best Practices

  1. Granulare Anwendungen: Zerlegen Sie die Logik in kleinere, fokussierte Anwendungen anstelle einer monolithischen Klasse.
  2. Einrichtung in init(): Nutzen Sie init() für die Einrichtung (Konfiguration, DB) anstelle des Konstruktors. Rufen Sie NICHT setAction() auf – verwenden Sie die @Action-Annotation.
  3. Modusbewusstsein: Verwenden Sie den Mode-Parameter in @Action, um sensible Operationen auf CLI oder bestimmte HTTP-Methoden zu beschränken.
  4. Context über Parameter: Verwenden Sie für optionale CLI-Flags getContext().getAttribute("--flag"), anstatt Parameter zur Methodensignatur hinzuzufügen.
  5. Asynchrone Ereignisse: Verwenden Sie für schwere Aufgaben, die durch Ereignisse ausgelöst werden, CompletableFuture.runAsync() innerhalb des Event-Handlers.

Technische Referenz

Ausführliche Anleitungen finden Sie im references/-Verzeichnis:

Referenzquellcodedateien (Intern)

  • src/main/java/org/tinystruct/AbstractApplication.java — Kern-Basisklasse mit Lebenszyklus-Hooks
  • src/main/java/org/tinystruct/system/annotation/Action.java — Annotation & Modi
  • src/main/java/org/tinystruct/application/ActionRegistry.java — Routing-Engine
  • src/main/java/org/tinystruct/data/component/Builder.java — JSON-Objekt-Serialisierer
  • src/main/java/org/tinystruct/data/component/Builders.java — JSON-Array-Serialisierer
  • src/main/java/org/tinystruct/data/component/AbstractData.java — Basis-POJO-Klasse mit CRUD
  • src/main/java/org/tinystruct/data/Mapping.java — Mapping-XML-Parser
  • src/main/java/org/tinystruct/data/tools/MySQLGenerator.java — POJO-Generator-Referenz
  • src/main/java/org/tinystruct/data/component/FieldType.java — SQL-zu-Java-Typzuordnungen
  • src/main/java/org/tinystruct/data/component/Condition.java — Fluent SQL-Abfrage-Builder
  • src/main/java/org/tinystruct/http/SSEPushManager.java — SSE-Verbindungsverwaltung
  • src/test/java/org/tinystruct/application/ActionRegistryTest.java — Registry-Testbeispiele
  • src/test/java/org/tinystruct/system/HttpServerHttpModeTest.java — HTTP-Integrationstestmuster

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.

Verwandte Skills