Repository navigation
Releases
Taiga Support – Sprints, Stories, Status, and Team Data
This release extends Taiga integration by improving support for sprint navigation and adding status retrieval for user stories and tasks, enabling richer project tracking and analytics.
✨ New Features
📌 Sprint Support (Milestones)
- Retrieve all sprints (milestones) for a project
- Navigate sprint → user stories hierarchy
- Uses Taiga API endpoint
/api/v1/milestones
📌 User Stories by Sprint
- Retrieve all user stories associated with a specific sprint
- Uses Taiga API endpoint
/api/v1/userstories?milestone=<sprintId>
📌 Status Retrieval
- Retrieve user story statuses for a project
- Retrieve task statuses for a project
- Enables mapping of workflow states (e.g., New, In Progress, Done)
🔧 API Additions
New methods in TaigaClient:
List<TaigaSprint> getSprints(long projectId)
List<TaigaUserStory> getStoriesBySprint(long sprintId)
List<TaigaStatus> getUserStoryStatuses(long projectId)
List<TaigaStatus> getTaskStatuses(long projectId)🎯 Purpose
These additions enable applications using TULIP to:
- Navigate the full project → sprint → story → task hierarchy
- Retrieve workflow status definitions for stories and tasks
- Build sprint dashboards and burndown-style views
- Map and visualize progress across different status categories
- Integrate Taiga data into external tools with richer semantics
💻 Example Usage
TaigaClient taiga = new TaigaClient(host);
taiga.login(username, password);
// Retrieve sprints
List<TaigaSprint> sprints = taiga.getSprints(projectId);
for (TaigaSprint sprint : sprints) {
// Retrieve stories per sprint
List<TaigaUserStory> stories = taiga.getStoriesBySprint(sprint.getId());
for (TaigaUserStory story : stories) {
System.out.println(story.getSubject());
}
}
// Retrieve status mappings
List<TaigaStatus> storyStatuses = taiga.getUserStoryStatuses(projectId);
List<TaigaStatus> taskStatuses = taiga.getTaskStatuses(projectId);Taiga Support - Now retrieve Sprints and User Stories by Sprint
This release adds support for working with sprints (milestones) in Taiga
New Features
- Retrieve project sprints
- Added a method to obtain all sprints associated with a project.
- Uses the Taiga API endpoint /api/v1/milestones.
- Retrieve user stories by sprint
- Added a method to obtain all user stories belonging to a specific sprint.
- Uses the Taiga API endpoint /api/v1/userstories?milestone=.
API Additions
New methods in TaigaClient:
List<TaigaSprint> getSprints(long projectId)
List<TaigaUserStory> getStoriesBySprint(long sprintId)
Purpose
These additions enable applications using TULIP to:
• Navigate the project → sprint → story hierarchy
• Retrieve sprint planning information
• Build sprint dashboards or progress views
• Integrate Taiga sprint data into external tools
Example Usage
TaigaClient client = new TaigaClient(token);
List<TaigaSprint> sprints = client.getSprints(projectId);
for (TaigaSprint sprint : sprints) {
List<TaigaUserStory> stories = client.getStoriesBySprint(sprint.getId());
}
Notes
In Taiga, sprints are represented as milestones, and the new functionality exposes this concept directly through the TULIP API.
A Lexer Module for Compiler Construction
This release introduces a Lexical Analyzer (Lexer) component, designed to support projects in compiler construction
and programming language processing.
The lexer module provides functionality to scan input source code and convert it into a stream of tokens, which can then be consumed by a parser or other language processing tools.
New Package
tulip.compiler
The new lexer module allows applications to:
- Read source code from text input
- Identify lexical elements such as:
- identifiers
- keywords
- numbers
- operators
- delimiters
- Produce a structured stream of tokens for use in parsing stages
- Support experimentation with language design and compiler
construction
Example Usage
Lexer lexer = new Lexer(sourceCode);
lexer.run();
Vector<Token> tokens = lexer.getTokens();
for (Token token : tokens) {
System.out.println(token);
}Adding RTDE Support for Universal Robots e-Series
New Feature: Universal Robots RTDE Client
This release introduces Real-Time Data Exchange (RTDE) support in the TULIP library, enabling applications to access real-time data from Universal Robots e-Series collaborative robots.
The RTDE client allows developers to connect to a robot controller and retrieve streaming data such as:
- Joint positions
- TCP position and orientation
- Robot state variables
- Digital and analog I/O
- Runtime information from the robot controller
New Package
tulip.ur.rtde
This package provides classes responsible for:
- RTDE protocol negotiation
- Output variable configuration
- Binary data parsing
- Continuous robot telemetry streaming
Capabilities
The RTDE integration enables applications built with TULIP to:
- Connect to a Universal Robots e-Series controller
- Subscribe to real-time robot telemetry
- Retrieve robot state information at runtime
- Support robotics experimentation and teaching scenarios
Example Usage
RTDEClient rtde = new RTDEClient("192.168.0.10");
rtde.connect();
RobotState state = rtde.read();
System.out.println("Joint 1 position: " + state.getJointPosition(0));
System.out.println("TCP X position: " + state.getTcpX());Purpose
This addition expands TULIP beyond software project management and AI integrations by introducing robotics connectivity capabilities.
With this update, TULIP now supports applications that combine:
- GitHub repositories
- Taiga project management
- AI services (Groq)
- Real-time robotic systems (Universal Robots RTDE)
These capabilities make TULIP a versatile framework for software engineering education, robotics experimentation, and research prototypes involving intelligent systems and human-robot interaction.
Adding Groq API client
New Features
- Added Groq API client support to the TULIP library.
- New package: tulip.groq
Includes:
- GroqClient – main interface for interacting with the Groq API
- GroqConfig – configuration class for API key, base URL, and model
- GroqMessage – simple message object used for chat interactions
Capabilities
The Groq client supports:
- Chat completions using Groq LLMs
- Single prompt requests
- Multi-message conversations
- Configurable parameters (model, temperature, max tokens)
Example Usage
GroqConfig cfg = new GroqConfig(apiKey, baseUrl, model);
GroqClient groq = new GroqClient(cfg);
String answer = groq.chat("Explain the pipeline pattern in software engineering.");
Configuration
GROQ_API_KEY
GROQ_BASE_URL=https://api.groq.com/openai/v1
GROQ_MODEL=llama-3.3-70b-versatile
Purpose
This release extends TULIP to support AI-assisted features via Groq,
complementing the existing integrations with GitHub and Taiga.
Adding Taiga Client Integration
This update introduces support for Taiga.IO integration.
Previously, TULIP provided functionality only for interacting with the GitHub API. The library now includes a Taiga client module that allows applications to retrieve and interact with project data stored in Taiga. The new Taiga client provides methods to authenticate with the Taiga REST API and retrieve core project management entities, including:
Projects
Sprints (Milestones)
User Stories
Tasks
This addition enables TULIP to interact with both code repositories (GitHub) and project management platforms (Taiga).
v3.0
This release introduces a major upgrades
🚀 Highlights
Unified GitHub URL Parser
A single method now correctly handles:
- Plain repo URLs
- /tree/{branch}/{path}
- /blob/{branch}/{path}
- URLs missing branch/path (defaults to main)
Enhanced URLObject
- New isBlob() and isDirectory() helpers
- Cleaner structure for owner, repository, revision, path, and kind
- Improved debugging output
GitHub Token Auto-Loading
GitHubHandler now loads a GitHub token from: src/main/resources/tulip.properties
Falls back to anonymous mode with clear error messages if missing.
Better API Error Handling
User-friendly messages for:
- Missing tokens
- Rate limits
- Invalid file/directory URLs
- Blob/tree misuse