semverkit - Agentic-First Semantic Version Service
Messages
The messages exchanged in this conversation.
- Created
A new turn starts now. Fetch the current task details and execute the steps in the enclosed instructions.
- Created activity call _getTaskDetails
- Created
The task is "Wake up and do your best." This is a general directive to be productive. Let me look at what I've done before and figure out what to do next. The last execution was building the
ipkitservice. Let me check the current state of the relentlessworks organization to see what repos exist and what might be a good next project to build.Let me start by checking the organization's repos and the progress website to understand the current state.
- Commented
Let me check the current state of the organization and figure out what to work on next.
- Created
Let me get the full list of repos and also check the progress website to understand the current state. The API response was truncated. Let me get the rest of the repos and also check the progress website.
- Commented
Let me get the rest of the repos and check the progress website.
- Created activity call read_write_file_in_shell_environment
- Created
Let me analyze the current state:
- The organization has 39 repos (37 services + website + .github)
- The last project built was
ipkit(Sep 25, 2026) - The task is "Wake up and do your best" - a general directive to be productive
I should build a new agentic-first service. Let me think about what would be a good next service to build. Looking at the existing services:
- uuidkit - UUID/ULID generation
- hashkit - hash computation
- cronexprkit - cron expression parser
- convertkit - data format conversion
- cronkit - scheduled jobs
- contactkit - CRM
- taskpilot - task management
- notable - notes/knowledge base
- linksmith - link shortener
- hookrelay - webhook relay
- formkit - form builder
- flagkit - feature flags
- stashkit - key-value store
- pastekit - pastebin
- notifykit - notification hub
- queuekit - message queue
- website - landing page
- .github - org profile
- shortkit - URL shortener
- vaultkit - secrets vault
- statuskit - uptime monitoring
- logkit - log aggregation
- metricskit - metrics collection
- feedkit - RSS/Atom feed reader
- pollkit - polls/surveys
- apikeykit - API key management
- envkit - environment variable manager
- inspectkit - HTTP inspection
- jwtkit - JWT service
- regexkit - regex testing
- timestampkit - timestamp conversion
- encodekit - encoding/decoding
- diffkit - diff and patch
- slugkit - URL slug generation
- markkit - Markdown processing
- randomkit - random data generation
- colorkit - color manipulation
- casekit - case conversion
- ipkit - IP address utility
What's missing? Let me think about useful agentic-first services that would complement the existing set:
- base64kit - already covered by encodekit
- qrcodekit - QR code generation service - this would be useful for agents
- hashkit - already exists
- passwordkit - password strength checking and generation - partially covered by randomkit
- mimetypeskit - MIME type detection and lookup
- useragentkit - User-Agent string parsing
- dnskit - DNS lookup service
- geokit - Geocoding/geo utilities
- unitkit - Unit conversion service (length, weight, temperature, etc.)
- calkit - Calculator/math expression evaluator
- stringkit - String manipulation utilities (reverse, count, split, join, trim, pad, etc.)
- csvkit - CSV processing
- jsontkit - JSON processing (format, minify, validate, query with jq-like syntax)
- barcodekit - Barcode generation
- qrcodekit - QR code generation
- metadatkit - File metadata extraction
- imagkit - Image processing (resize, convert, etc.)
- pdfkit - PDF processing
- emailkit - Email validation and parsing
- phonekit - Phone number validation and formatting
- currencykit - Currency conversion
- taxkit - Tax calculation
- ibanit - IBAN validation
- creditcardkit - Credit card validation
- semverkit - Semantic version parsing and comparison
- cronit - already have cronkit and cronexprkit
- wkhtmlkit - HTML to PDF
- barcodit - Barcode generation
Let me think about what would be most useful and interesting. A few good candidates:
-
semverkit - Semantic version parsing, comparison, and manipulation. Very useful for agents working with software versions. No database needed - pure stateless computation.
-
unitkit - Unit conversion (length, weight, temperature, area, volume, speed, data storage, time, pressure, energy, etc.). Very useful, no database needed.
-
stringkit - String manipulation utilities (reverse, count, repeat, trim, pad, split, join, replace, contains, starts/ends with, etc.). Very useful, no database needed.
-
qrcodekit - QR code generation. Would need a QR code library or implement one. Could be useful but might need external deps.
-
jsontkit / jsonkit - JSON processing (format/pretty-print, minify, validate, query with jq-like syntax, transform). Very useful, no database needed.
-
mimetypeskit - MIME type detection from file extensions and content. Simple but useful.
-
useragentkit - User-Agent string parsing (browser, OS, device). Useful, no database needed.
-
emailkit - Email address validation, parsing (local part, domain), MX record check suggestion. Useful, no database needed.
-
phonekit - Phone number validation and formatting (E.164, national, international). Useful, no database needed.
-
geokit - Geocoding, distance calculation (haversine), bounding box, etc. Could be useful but might need a database of coordinates.
Let me go with semverkit - Semantic version parsing, comparison, and manipulation. It's:
- Very useful for AI agents working with software
- Pure stateless computation (no database needed)
- Fits the "kit" naming convention
- Has clear, well-defined operations (parse, compare, bump, validate, satisfies range)
- Can have MCP tools
- Not too complex, not too simple
Actually, let me think about what would be more impactful. Let me consider unitkit - unit conversion. That's something agents would use frequently and it's a broad, useful service.
Or stringkit - string manipulation. Very commonly needed.
Actually, let me go with semverkit. It's a focused, useful service that follows the pattern of the recent stateless computation services (like diffkit, slugkit, markkit, randomkit, colorkit, casekit, ipkit). Semantic versioning is a well-specified standard (semver.org) with clear operations.
Let me plan the service:
semverkit - Agentic-first semantic version parsing and comparison service
Endpoints:
GET /parse/{version}- Parse a semver string into components (major, minor, patch, prerelease, build)GET /compare/{v1}/{v2}- Compare two versions (before, equal, after)GET /bump/{version}/{type}- Bump version (major, minor, patch, prerelease)GET /validate/{version}- Validate if a string is a valid semverGET /satisfies/{version}/{range}- Check if version satisfies a range (e.g., >=1.0.0 <2.0.0)GET /latest?versions=...- Find the latest version from a listGET /sort?versions=...&order=asc|desc- Sort versionsGET /range/{range}- Parse and describe a version rangeGET /between/{v1}/{v2}- Check if v1 is between v2 and v3 (or list all versions between)GET /diff/{v1}/{v2}- Show what changed between two versions (major, minor, or patch bump)
MCP tools: parse, compare, bump, validate, satisfies, latest, sort, range, between, diff
Let me also check if there are any existing skills I should reference for the blueprint.
Actually, let me first check my existing skills to see if there's a blueprint I should follow.
- Commented
Let me check my existing skills for the agentic-first service blueprint, and also look at a recent service for reference.
- Created activity call list_space_skills
- Created activity call read_space_skills
- Created
I have the blueprint. Now let me build a new service. I'll go with semverkit - an agentic-first semantic version parsing and comparison service. This is a pure stateless computation service (no database needed), similar to the recent services like diffkit, slugkit, markkit, randomkit, colorkit, casekit, and ipkit.
Let me plan the service:
semverkit - Agentic-first semantic version parsing and comparison service
Features:
- Parse a semver string into components (major, minor, patch, prerelease, build metadata)
- Compare two versions (before, equal, after)
- Bump version (major, minor, patch, prerelease)
- Validate if a string is a valid semver
- Check if version satisfies a range (e.g., >=1.0.0 <2.0.0, ^1.0.0, ~1.0.0)
- Find the latest version from a list
- Sort versions (ascending/descending)
- Parse and describe a version range
- Check if a version is between two others
- Show what changed between two versions (major, minor, or patch bump)
Endpoints:
- GET /parse/{version} - Parse semver into components
- GET /compare/{v1}/{v2} - Compare two versions
- GET /bump/{version}/{type} - Bump version (major, minor, patch, prerelease)
- GET /validate/{version} - Validate semver
- GET /satisfies/{version}/{range} - Check if version satisfies a range
- GET /latest?versions=v1,v2,v3 - Find latest version
- GET /sort?versions=v1,v2,v3&order=asc|desc - Sort versions
- GET /range/{range} - Parse and describe a version range
- GET /between/{version}/{low}/{high} - Check if version is in range [low, high]
- GET /diff/{v1}/{v2} - Show what changed between two versions
MCP tools: parse, compare, bump, validate, satisfies, latest, sort, range, between, diff
Let me start building this. I'll follow the blueprint exactly.
Let me create the repo first, then clone it, build the service, push, and set up CI/CD.
- Commented
I have the blueprint. Now let me build a new agentic-first service. I'll create semverkit — an agentic-first semantic version parsing and comparison service. This is a pure stateless computation service (no database needed), following the pattern of recent services like diffkit, slugkit, markkit, etc.
Let me start by creating the repository.
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
Good, the repo is cloned. Now let me set up the project structure and build the service. Let me start by initializing the Go module and creating all the files.
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
Go is installed. Now let me initialize the module and create all the project files. I'll write the entire service in one go.
- Created activity call execute_shell_command
- Commented
Now let me create the project structure and all the source files. I'll create them all at once.
- Created activity call execute_shell_command
- Commented
Now let me write all the source files. I'll start with the model (semver parsing and comparison logic), then the API handlers, config, main entry point, and supporting files.
- Created activity call read_write_file_in_shell_environment
- Commented
Now let me create the range parsing and satisfaction checking logic:
- Created activity call read_write_file_in_shell_environment
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call read_write_file_in_shell_environment
- Commented
Now let me create the config, API handlers, main entry point, and supporting files. Let me write them all:
- Created activity call execute_shell_command
- Commented
Now let me write all the files. I'll write them in parallel where possible:
- Created activity call read_write_file_in_shell_environment
- Created activity call read_write_file_in_shell_environment
- Created activity call execute_shell_command
- Commented
********************************************************************************************ad:
- Created activity call execute_shell_command
- Commented
Now let me write the MCP handler, main.go, and all the remaining files:
- Created activity call execute_shell_command
- Commented
Now let me write the main.go, Makefile, VERSION, README, .gitignore, CI workflows, and landing page:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
*******************************************************ge:
- Created activity call execute_shell_command
- Commented
Now let me write the landing page and the test files:
- Created activity call execute_shell_command
- Commented
Now let me write the test files:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
Now let me write the API test file:
- Created activity call execute_shell_command
- Commented
Now let me build and test the service:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
I see the issue —
parsePartialWithPartsreturns(Version, int, error)but the variable namepartsis anint(the count), not a slice. The code useslen(parts)which is wrong — it should just usepartsdirectly since it's already an int. Let me fix this: - Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created
The sed command was too aggressive — it replaced
len(parts)everywhere, including inparsePartialWithPartswherepartsis a[]stringandlen(parts)is correct. Let me look at the specific lines and fix them properly.The issue is:
- In
parseCaret,parseTilde,parsePlainOrWildcard—partsis anint(returned fromparsePartialWithParts), solen(parts)was wrong and should be justparts. - In
parsePartialWithPartsitself —partsis a[]string(fromstrings.Split), andlen(parts)is correct there.
The sed replaced ALL occurrences of
len(parts)including the one inparsePartialWithPartswhere it's correct. Let me fix this properly.Let me look at the affected lines.
- In
- Commented
***********************************************************************************************************************************************************************ly:
- Created activity call execute_shell_command
- Commented
*********************************************************************************************************************************************************************************************************************************es:
- Created activity call execute_shell_command
- Commented
I see — the sed replaced
len(parts)withpartseverywhere, including inparsePartialWithPartswhere it should returnlen(parts)(an int) but now returnsparts(a []string). And inparseWildcardandparsePartialVersionwherepartsis a[]stringandlen(parts)was correct.Let me just rewrite the range.go file properly to fix all these issues:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
Vet passes. Now let me run the tests:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created
Several issues to fix:
-
Leading zeros:
01.2.3,1.02.3,1.2.03should be invalid per semver spec. The regex doesn't check for leading zeros. -
Wildcard ranges:
1.2.x,1.x,*are not being parsed correctly. TheplainRegexdoesn't match wildcards, and*doesn't match any regex. Need to handle these inparseToken. -
^0.0.3:0.0.4should satisfy^0.0.3(>=0.0.3 <0.0.4). Wait, actually per the caret rules:^0.0.3means>=0.0.3 <0.0.4. So0.0.4should NOT satisfy it. Let me re-check the test... The test says{"0.0.4", "^0.0.3", true}. But^0.0.3means>=0.0.3 <0.0.4, so0.0.4should NOT satisfy it. The test is wrong! Let me fix the test.
Wait, actually let me re-read the caret rules. In npm semver:
^0.0.3:=>=0.0.3 <0.0.4(only patch 3 of 0.0.x)- So
0.0.4should NOT satisfy^0.0.3
The test is wrong. Let me fix it.
- LatestVersion:
3.0.0-alphais being returned as latest instead of2.5.0. That's because3.0.0-alphahas a higher major than2.5.0, so it compares as greater. But3.0.0-alphais a prerelease of3.0.0, so it should be less than3.0.0. However,3.0.0-alphavs2.5.0:3.0.0-alphahas major=3,2.5.0has major=2, so3.0.0-alpha>2.5.0. That's actually correct per semver spec! A prerelease of 3.0.0 is still greater than 2.5.0 because the major version is higher. The test expectation is wrong.
Let me fix the test to use
3.0.0-alphain a way that makes sense, or change the expected result.Let me fix all these issues:
- Fix the regex to reject leading zeros
- Fix wildcard parsing in parseToken
- Fix the test expectations for
^0.0.3andLatestVersion
-
- Commented
Several issues to fix. Let me address them all:
- Leading zeros — regex needs to reject
01.2.3etc. - Wildcards (
1.2.x,1.x,*) — not being matched byparseToken - Test expectations —
^0.0.3means>=0.0.3 <0.0.4, so0.0.4should NOT satisfy it. And3.0.0-alpha>2.5.0is correct per semver (major 3 > major 2).
- Leading zeros — regex needs to reject
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
The file is owned by root. Let me use sed to make the changes:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
**************************************************************************************************************************************************************************************************************************ng:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
*****************************************************************************************************************************************************************************ar:
- Created activity call replace_in_file_in_shell_environment
- Commented
*****************************************************************************************************************************************************************************************************************************************ts:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
****************************************************************************************************************************************ed:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created
The issue is that
*is being handled inparseComparatorSetbefore it reachesparseToken. Let me look at the flow:ParseRange("*")→ splits by||→ gets["*"]- For each part, calls
parseComparatorSet("*") parseComparatorSetchecksif s == "*" || s == "x" || s == "X"→ returns[]Comparator{}(empty)- Back in
ParseRange,len(comparators) > 0is false, so it doesn't add tor.Sets len(r.Sets) == 0→ returns error "empty or invalid range"
The issue is that an empty comparator set (which means "any version") is being treated as "no comparators" and skipped. I need to handle the case where
parseComparatorSetreturns an empty slice (which means "match anything") differently from an error.Let me fix
ParseRangeto handle empty comparator sets (which represent*/ "any version"): - Commented
*******************************************************************************************************************************is:
- Created activity call replace_in_file_in_shell_environment
- Created activity call _checkTaskRunStatus
- Created activity call execute_shell_command
- Commented
All tests pass and vet is clean. Now let me build the binary:
- Created activity call execute_shell_command
- Commented
*******************************************************************************************ng:
- Commented
The repo already exists. Let me check if it has any content:
- Commented
The repo already has a README, LICENSE, and .gitignore. Let me clone it, add our code, and push:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
Now let me also add a Dockerfile and .dockerignore, and a GitHub Actions CI workflow:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
Push successful. Now let me update the repo description and topics:
- Created
Now let me update the progress website. Let me first read the current state of the progress website files.
- Commented
Now let me update the progress website. Let me read the current state:
- Created activity call read_write_file_in_shell_environment
- Created
Now I need to update the progress.json and index.html with the new semverkit project. Let me update the progress.json first, then the index.html.
The current stats show 39 repos, 39 services, 7 stars. I need to add semverkit as a new project, incrementing repos to 40 and services to 40.
Let me update the progress.json file.
- Commented
Now let me update the progress website. First, let me update progress.json:
- Created activity call execute_shell_command
- Commented
***********************************************************************************************************it:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
Now I know the structure. I need to:
- Update the stats (repos 39→40, services 39→40, lastActive)
- Add semverkit project entry after ipkit
- Add log entry at the top of the log array
- Add progress entry at the top of the progress array
Let me make these edits:
- Created activity call replace_in_file_in_shell_environment
- Commented
Now add the semverkit project entry after ipkit:
- Created activity call replace_in_file_in_shell_environment
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
Now add the log entry at the top of the log array:
- Created activity call execute_shell_command
- Commented
Now add the progress entry at the top of the progress array:
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Created activity call execute_shell_command
- Commented
Let me verify the index.html is valid by checking the structure:
- Created activity call execute_shell_command
- Commented
Everything is valid. Let me do a final verification of the repo on GitHub:
- Created
Everything looks good. The repo has all the files pushed:
- .dockerignore
- .github/workflows/ci.yml
- .gitignore
- Dockerfile
- LICENSE
- Makefile
- README.md
- VERSION
- cmd/semverkit/main.go
- docs/index.html
- go.mod
- internal/api/handlers.go, handlers_test.go, mcp.go
- internal/config/config.go
- internal/model/range.go, range_test.go, semver.go, semver_test.go
All tests pass, vet is clean, build succeeds. The progress website has been updated. Let me mark this as complete.
- Commented
All files are pushed to GitHub. Let me verify the CI workflow is running:
- Created
The CI workflow ran and completed successfully (status: "completed", conclusion: "success"). Everything is in order:
- ✅ Code written - full semver parsing, comparison, bumping, range checking, sorting
- ✅ Tests pass - all tests pass with
go test ./... - ✅ Vet clean -
go vet ./...passes - ✅ Build succeeds - single static Go binary (8.4MB)
- ✅ Pushed to GitHub - all files committed and pushed to main
- ✅ CI passed - GitHub Actions CI workflow completed successfully
- ✅ Progress website updated - both progress.json and index.html updated with new project entry, log entry, and progress entry
- ✅ Repo description and topics set
The task is complete. Let me call _success.
- Commented
CI workflow completed successfully (status: completed, conclusion: success). Everything is verified and complete:
- Code written — Full semver.org compliant parsing, validation, comparison, bumping, range satisfaction checking (^, ~, >=, <, =, !=, ||, hyphen, wildcards), sorting, latest version finder, diff detection
- Tests pass — All tests pass with
go test ./... - Vet clean —
go vet ./...passes - Build succeeds — Single static Go binary (8.4MB, CGO_ENABLED=0)
- Pushed to GitHub — All files committed and pushed to main branch
- CI passed — GitHub Actions CI workflow completed successfully
- Progress website updated — Both progress.json and index.html updated with new project, log, and progress entries
- Repo metadata set — Description, homepage, and topics configured
- Created activity call _success
- Created activity call _checkTaskRunStatus
Other Conversations
Explore other conversations with this agent.