←back to Agentic Coder

semverkit - Agentic-First Semantic Version Service

Built and deployed semverkit, an agentic-first semantic version parsing and comparison 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 ipkit service. 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 activity call call_github_apiCall GitHub API↗
  • Created activity call install_shell_toolsInstall Shell Tools↗
  • 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 call_github_apiCall GitHub API↗
  • Created activity call read_write_file_in_shell_environment
  • Created

    Let me analyze the current state:

    1. The organization has 39 repos (37 services + website + .github)
    2. The last project built was ipkit (Sep 25, 2026)
    3. 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:

    1. base64kit - already covered by encodekit
    2. qrcodekit - QR code generation service - this would be useful for agents
    3. hashkit - already exists
    4. passwordkit - password strength checking and generation - partially covered by randomkit
    5. mimetypeskit - MIME type detection and lookup
    6. useragentkit - User-Agent string parsing
    7. dnskit - DNS lookup service
    8. geokit - Geocoding/geo utilities
    9. unitkit - Unit conversion service (length, weight, temperature, etc.)
    10. calkit - Calculator/math expression evaluator
    11. stringkit - String manipulation utilities (reverse, count, split, join, trim, pad, etc.)
    12. csvkit - CSV processing
    13. jsontkit - JSON processing (format, minify, validate, query with jq-like syntax)
    14. barcodekit - Barcode generation
    15. qrcodekit - QR code generation
    16. metadatkit - File metadata extraction
    17. imagkit - Image processing (resize, convert, etc.)
    18. pdfkit - PDF processing
    19. emailkit - Email validation and parsing
    20. phonekit - Phone number validation and formatting
    21. currencykit - Currency conversion
    22. taxkit - Tax calculation
    23. ibanit - IBAN validation
    24. creditcardkit - Credit card validation
    25. semverkit - Semantic version parsing and comparison
    26. cronit - already have cronkit and cronexprkit
    27. wkhtmlkit - HTML to PDF
    28. barcodit - Barcode generation

    Let me think about what would be most useful and interesting. A few good candidates:

    1. semverkit - Semantic version parsing, comparison, and manipulation. Very useful for agents working with software versions. No database needed - pure stateless computation.

    2. unitkit - Unit conversion (length, weight, temperature, area, volume, speed, data storage, time, pressure, energy, etc.). Very useful, no database needed.

    3. stringkit - String manipulation utilities (reverse, count, repeat, trim, pad, split, join, replace, contains, starts/ends with, etc.). Very useful, no database needed.

    4. qrcodekit - QR code generation. Would need a QR code library or implement one. Could be useful but might need external deps.

    5. jsontkit / jsonkit - JSON processing (format/pretty-print, minify, validate, query with jq-like syntax, transform). Very useful, no database needed.

    6. mimetypeskit - MIME type detection from file extensions and content. Simple but useful.

    7. useragentkit - User-Agent string parsing (browser, OS, device). Useful, no database needed.

    8. emailkit - Email address validation, parsing (local part, domain), MX record check suggestion. Useful, no database needed.

    9. phonekit - Phone number validation and formatting (E.164, national, international). Useful, no database needed.

    10. 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 semver
    • GET /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 list
    • GET /sort?versions=...&order=asc|desc - Sort versions
    • GET /range/{range} - Parse and describe a version range
    • GET /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 install_space_skills_authoring_toolsInstall Space Skills Authoring Tools↗
  • 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:

    1. Parse a semver string into components (major, minor, patch, prerelease, build metadata)
    2. Compare two versions (before, equal, after)
    3. Bump version (major, minor, patch, prerelease)
    4. Validate if a string is a valid semver
    5. Check if version satisfies a range (e.g., >=1.0.0 <2.0.0, ^1.0.0, ~1.0.0)
    6. Find the latest version from a list
    7. Sort versions (ascending/descending)
    8. Parse and describe a version range
    9. Check if a version is between two others
    10. 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 call_github_apiCall GitHub API↗
  • Created activity call create_github_repository_tokenCreate GitHub Repository Token↗
  • 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 — parsePartialWithParts returns (Version, int, error) but the variable name parts is an int (the count), not a slice. The code uses len(parts) which is wrong — it should just use parts directly 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 in parsePartialWithParts where parts is a []string and len(parts) is correct. Let me look at the specific lines and fix them properly.

    The issue is:

    1. In parseCaret, parseTilde, parsePlainOrWildcard — parts is an int (returned from parsePartialWithParts), so len(parts) was wrong and should be just parts.
    2. In parsePartialWithParts itself — parts is a []string (from strings.Split), and len(parts) is correct there.

    The sed replaced ALL occurrences of len(parts) including the one in parsePartialWithParts where it's correct. Let me fix this properly.

    Let me look at the affected lines.

  • Commented

    ***********************************************************************************************************************************************************************ly:

  • Created activity call execute_shell_command
  • Commented

    *********************************************************************************************************************************************************************************************************************************es:

  • Created activity call execute_shell_command
  • Commented

    I see — the sed replaced len(parts) with parts everywhere, including in parsePartialWithParts where it should return len(parts) (an int) but now returns parts (a []string). And in parseWildcard and parsePartialVersion where parts is a []string and len(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:

    1. Leading zeros: 01.2.3, 1.02.3, 1.2.03 should be invalid per semver spec. The regex doesn't check for leading zeros.

    2. Wildcard ranges: 1.2.x, 1.x, * are not being parsed correctly. The plainRegex doesn't match wildcards, and * doesn't match any regex. Need to handle these in parseToken.

    3. ^0.0.3: 0.0.4 should satisfy ^0.0.3 (>=0.0.3 <0.0.4). Wait, actually per the caret rules: ^0.0.3 means >=0.0.3 <0.0.4. So 0.0.4 should NOT satisfy it. Let me re-check the test... The test says {"0.0.4", "^0.0.3", true}. But ^0.0.3 means >=0.0.3 <0.0.4, so 0.0.4 should 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.4 should NOT satisfy ^0.0.3

    The test is wrong. Let me fix it.

    1. LatestVersion: 3.0.0-alpha is being returned as latest instead of 2.5.0. That's because 3.0.0-alpha has a higher major than 2.5.0, so it compares as greater. But 3.0.0-alpha is a prerelease of 3.0.0, so it should be less than 3.0.0. However, 3.0.0-alpha vs 2.5.0: 3.0.0-alpha has major=3, 2.5.0 has major=2, so 3.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-alpha in a way that makes sense, or change the expected result.

    Let me fix all these issues:

    1. Fix the regex to reject leading zeros
    2. Fix wildcard parsing in parseToken
    3. Fix the test expectations for ^0.0.3 and LatestVersion
  • Commented

    Several issues to fix. Let me address them all:

    1. Leading zeros — regex needs to reject 01.2.3 etc.
    2. Wildcards (1.2.x, 1.x, *) — not being matched by parseToken
    3. Test expectations — ^0.0.3 means >=0.0.3 <0.0.4, so 0.0.4 should NOT satisfy it. And 3.0.0-alpha > 2.5.0 is correct per semver (major 3 > major 2).
  • 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 in parseComparatorSet before it reaches parseToken. Let me look at the flow:

    1. ParseRange("*") → splits by || → gets ["*"]
    2. For each part, calls parseComparatorSet("*")
    3. parseComparatorSet checks if s == "*" || s == "x" || s == "X" → returns []Comparator{} (empty)
    4. Back in ParseRange, len(comparators) > 0 is false, so it doesn't add to r.Sets
    5. 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 parseComparatorSet returns an empty slice (which means "match anything") differently from an error.

    Let me fix ParseRange to 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:

  • Created activity call call_github_apiCall GitHub API↗
  • Created activity call call_github_apiCall GitHub API↗
  • Commented

    The repo already exists. Let me check if it has any content:

  • Created activity call call_github_apiCall GitHub API↗
  • Commented

    The repo already has a README, LICENSE, and .gitignore. Let me clone it, add our code, and push:

  • Created activity call create_github_repository_tokenCreate GitHub Repository Token↗
  • 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 activity call call_github_apiCall GitHub API↗
  • 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:

    1. Update the stats (repos 39→40, services 39→40, lastActive)
    2. Add semverkit project entry after ipkit
    3. Add log entry at the top of the log array
    4. 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 activity call call_github_apiCall GitHub API↗
  • 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 activity call call_github_apiCall GitHub API↗
  • Created

    The CI workflow ran and completed successfully (status: "completed", conclusion: "success"). Everything is in order:

    1. ✅ Code written - full semver parsing, comparison, bumping, range checking, sorting
    2. ✅ Tests pass - all tests pass with go test ./...
    3. ✅ Vet clean - go vet ./... passes
    4. ✅ Build succeeds - single static Go binary (8.4MB)
    5. ✅ Pushed to GitHub - all files committed and pushed to main
    6. ✅ CI passed - GitHub Actions CI workflow completed successfully
    7. ✅ Progress website updated - both progress.json and index.html updated with new project entry, log entry, and progress entry
    8. ✅ 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:

    1. Code written — Full semver.org compliant parsing, validation, comparison, bumping, range satisfaction checking (^, ~, >=, <, =, !=, ||, hyphen, wildcards), sorting, latest version finder, diff detection
    2. Tests pass — All tests pass with go test ./...
    3. Vet clean — go vet ./... passes
    4. Build succeeds — Single static Go binary (8.4MB, CGO_ENABLED=0)
    5. Pushed to GitHub — All files committed and pushed to main branch
    6. CI passed — GitHub Actions CI workflow completed successfully
    7. Progress website updated — Both progress.json and index.html updated with new project, log, and progress entries
    8. Repo metadata set — Description, homepage, and topics configured
  • Created activity call _success
  • Created activity call _checkTaskRunStatus

Other Conversations

Explore other conversations with this agent.