Communitygithub.com

tinystruct-patterns

Expertenanleitung für die Entwicklung mit dem Java-Framework tinystruct. Verwenden Sie dieses Skill, wenn Sie an der tinystruct-Codebasis oder an Projekten arbeiten, die auf tinystruct basieren – einschließlich der Erstellung von Application-Klassen, @Action-gemappten Routen, Unit-Tests, ActionRegistry, dualem HTTP/CLI-Betrieb, dem integrierten HTTP-Server, dem Event-System, JSON mit Builder/Builders, Datenbankpersistenz mit AbstractData, POJO-Generierung, Server-Sent Events (SSE), Dateiuploads und ausgehenden HTTP-Netzwerkverbindungen.

Was ist tinystruct-patterns?

Dieser Skill bietet eine umfassende Referenz für Architektur- und Implementierungsmuster zur Entwicklung mit dem **tinystruct** Java-Framework. Im Kern behandelt tinystruct CLI und HTTP als gleichberechtigte Bürger, sodass mit `@Action` annotierte Methoden ohne Änderungen sowohl über ein Terminal als auch über einen Webbrowser ausgeführt werden können. Er ist nützlich für Entwickler, die neue `Application`-Module erstellen, Routen definieren, JSON mit den nativen `Builder`/`Builders`-Komponenten serialisieren, Datenbankpersistenz mittels `AbstractData`-POJOs verwalten, Server-Sent Events (SSE) implementieren, Dateiuploads handhaben oder ausgehende HTTP-Anfragen stellen. Der Skill enthält Codebeispiele, Konfigurationsrichtlinien und eine Übersicht über Anti-Patterns. Der Skill unterstützt die native Integration des Model Context Protocol (MCP) ab SDK-Version **1.7.26** und zeigt, wie maßgeschneiderte MCP-Tools und -Server erstellt werden. Er deckt auch Best Practices für die duale Betriebsart, das Aufsetzen in `init()` und die Verwendung von `Context` für optionale CLI-Flags ab. Verweise auf detaillierte Anleitungen (z. B. für Routing, Datenverarbeitung, Tests) sowie interne Quellcode-Referenzdateien sind für ein tiefgreifendes Verständnis der Framework-Abläufe und zur Fehlerbehebung enthalten.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/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 Erstellung 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 Änderungen ausführbar sein. Diese „Dual-Mode“-Fähigkeit ist das zentrale Designprinzip von tinystruct.

Wann aktivieren

Verwendungszwecke

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

Funktionsweise

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 reine Daten-Services sollten die nativen Komponenten Builder und Builders zur JSON-Serialisierung verwendet werden, um eine Null-Abhängigkeits-Footprint beizubehalten. Die Datenbankschicht verwendet AbstractData-POJOs in Verbindung mit XML-Mapping-Dateien für CRUD-Operationen ohne externe ORM-Bibliotheken.

Beispiele

Einfache Anwendung (MyService)

public class MyService extends AbstractApplication {
    @Override
    public void init() {
        this.setTemplateRequired(false); // .view-Lookup 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-Trennung (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\":\"Mit SSE verbunden\"}";
}

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

// Broadcast an alle
SSEPushManager.getInstance().broadcast(msg);

Dateiupload

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 Tools-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): Rückgabewerte von Tools 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. Eine fehlende Bereinigung der Eingaben kann es einem Angreifer ermöglichen, adversariale Anweisungen (Prompt Injection) einzuschleusen, die das Verhalten des Modells überschreiben. Validieren Sie immer Länge, Zeichensatz und Nullwerte.

So erstellen Sie ein MCP-Tool:

  1. Erweitern Sie org.tinystruct.mcp.MCPTool.
  2. Annotieren Sie Operationen mit @Action und deklarieren Sie Parameter mit @Argument im arguments-Array.
  3. Übernehmen Sie Parameter als explizite Methodenargumente, die mit den Schlüsseln in @Argument übereinstimmen. (Verwenden Sie nicht 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: Tool-Eingaben validieren/bereinigen, bevor sie an das Modell zurückgegeben werden,
        // um Prompt-Injection-Schwachstellen zu vermeiden.
        if (name == null || name.length() > 50 || !name.matches("^[a-zA-Z0-9 ]+$")) {
            throw new MCPException("Ungültiger Name angegeben");
        }
        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 mappt 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 und Anti-Patterns

SymptomKorrektes Muster
Import von com.google.gson oder com.fasterxml.jacksonVerwenden Sie org.tinystruct.data.component.Builder / Builders.
Verwendung von List<Builder> für JSON-ArraysVerwenden Sie Builders, um Probleme mit generischer Typ-Auslöschung zu vermeiden.
ApplicationRuntimeException: template not foundRufen Sie setTemplateRequired(false) in init() für reine API-Apps auf.
Annotieren von private-Methoden mit @ActionAktionen müssen public sein, um vom Framework registriert zu werden.
Hartcodierung 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 gelistet ist.
CLI-Argument nicht sichtbarÜbergeben Sie es mit --key value; greifen Sie mit getContext().getAttribute("--key") darauf zu.
Zwei Methoden gleicher Pfad, falsche feuertLegen Sie einen expliziten mode fest (z. B. HTTP_GET vs HTTP_POST), um zu trennen.

Best Practices

  1. Granulare Anwendungen: Teilen Sie die Logik in kleinere, fokussierte Anwendungen statt in eine monolithische Klasse.
  2. Aufsetzen 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. Kontext statt 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() im Ereignis-Handler.

Technische Referenz

Ausführliche Anleitungen sind im Verzeichnis references/ verfügbar:

Referenz-Quelldateien (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 — Fließender 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/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

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.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Verwandte Skills