{"id":25074392,"url":"https://github.com/freifeldroyi/quephaestus","last_synced_at":"2026-04-27T22:32:50.589Z","repository":{"id":274804824,"uuid":"921675648","full_name":"FreifeldRoyi/Quephaestus","owner":"FreifeldRoyi","description":"Craft Smarter, Deliver Faster","archived":false,"fork":false,"pushed_at":"2025-03-25T17:42:40.000Z","size":187,"stargazers_count":0,"open_issues_count":7,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-25T18:23:10.277Z","etag":null,"topics":["java","quarkus","qute","scaffolding","skeleton-template","template"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FreifeldRoyi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-24T11:59:31.000Z","updated_at":"2025-03-25T17:42:43.000Z","dependencies_parsed_at":"2025-03-09T17:36:09.251Z","dependency_job_id":null,"html_url":"https://github.com/FreifeldRoyi/Quephaestus","commit_stats":null,"previous_names":["freifeldroyi/quephaestus"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FreifeldRoyi%2FQuephaestus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FreifeldRoyi%2FQuephaestus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FreifeldRoyi%2FQuephaestus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FreifeldRoyi%2FQuephaestus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FreifeldRoyi","download_url":"https://codeload.github.com/FreifeldRoyi/Quephaestus/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246531986,"owners_count":20792735,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","quarkus","qute","scaffolding","skeleton-template","template"],"created_at":"2025-02-07T00:16:43.749Z","updated_at":"2026-04-27T22:32:50.574Z","avatar_url":"https://github.com/FreifeldRoyi.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Quephaestus\n\n[![Tests](https://github.com/FreifeldRoyi/Quephaestus/actions/workflows/build-and-test.yaml/badge.svg)](https://github.com/FreifeldRoyi/Quephaestus/actions/workflows/build-and-test.yaml)\n\n## Overview\n\u003e **Forge your own path. Build smarter. Deliver faster.**\n\nQuephaestus is a powerful yet flexible scaffolding tool designed to boost developer productivity. Unlike traditional\ngenerators that enforce rigid structures, Quephaestus allows you to define **your own templates, folder structures, and\nDSLs**. Whether you're creating a backend module, a set of configuration files, or any standardized project setup,\nQuephaestus lets you tailor the process to fit **your** workflow.\n\n## Why \"Quephaestus\"?\n\nThe name \"Quephaestus\" is a fusion of **\"Qu\"** (a nod to Quarkus, though the tool is not Quarkus-specific) and **\"\nHephaestus\"**, the Greek god of blacksmithing and craftsmanship. Just as Hephaestus forged legendary tools for the gods,\nQuephaestus helps developers forge their own tools, modules, and project structures.\n\n## Quick start\n\nQuephaestus provides two primary commands for generating files:\n\n```sh\n# Forge a Single File\nquephaestus forge -f path/to/my/config.yaml -m my-module-name -w path/to/working-directory -b path/to/base-directory my-element-name\n\n# Forge an Element group (Multiple Files)\nquephaestus forge-element-group -f path/to/my/config.yaml -m my-module-name -w path/to/working-directory -b path/to/base-directory my-group-name\n\n# -f --\u003e Path to the configuration file  \n# -m --\u003e Module name (used as a contextual grouping for the generated files)  \n# -w --\u003e Working directory. The root directory where all operations are performed (typically the project's main directory)  \n# -b --\u003e Base directory. A subdirectory inside the working directory where the forged files should be placed  \n# -d --\u003e Inline json data For example: -d \"{\\\"name\\\":\"123\", \\\"hello\\\": \\\"world\\\"}\"\n# -p --\u003e Payload. A path to a json file containing mappings for your data\n# -i --\u003e Interactive. Will ask for any missing data.   \n# --pre-forge/--post-forge --\u003e a script/command to execute before/after the forge completion\n# \u003celement-name\u003e` or `\u003cgroup-name\u003e` --\u003e The specific element or group to generate.  \n```\n\nForged files will be placed under:\n\n```\n[working-directory]/[base-directory]/[module]/[element path]/[filename]\n```\n\nWhere:\n\n- `[Working directory]` - The root of your project\n- `[Base directory]` - A common subdirectory for source files\n- `[element path]` - is defined in the `path` field of the configuration file\n- `[filename]` - follows the pattern in the `namePattern` field of the configuration file\n\n\u003e 📘 **Note**     \n\u003e If `-w` and `-b` are omitted, the current directory is used for both.\n\nFor example:  \n\nIn a java project named `awesome-project` all files are stored in a folder named `awesome-project`.  \nThe source files are, generally speaking, stored under `src/main/java/com/awesomeProject/`.\nGood candidates for working and base directories are `-w awesome-project -b src/main/java/com/awesomeProject`\n\n## Configuration\n\n```yaml\n# [Optional]\n# General definitions of project name and namespace. \n# Both will be added automatically as interpolation data\nproject: \"testproject\"            # optional\nnamespace: \"com.myproject\"        # optional\n\n# [Required]\n# An absolute/relative path to the templates' directory.\n# If relative, will be relative to the path of this configuration file\ntemplatesFolder: \"./templates\"\n\n# [Optional]\n# Can be a command, or an absolute/relative path to script\n# If relative, will be relative to the WORKING directory only\npreForgeScript: \"git commit\"      \npostForgeScript: \"./build.sh\"     \n\n# [Required]\n# Elements definition. Must define at least 1 element\n# An element's name can be anything. Suggestion: make it part of the DSL you use on a daily basis\n# path [Mandatory] - is the relative path in the project's folder, in which this element should be created\n#        NOTE 1: It is relative to the working + base dir + module name (`-m`) --\u003e workingDir/baseDir/moduleName/path\n#        NOTE 2: You can use interpolation slots\n# namePattern [Mandatory] - filename to use\n#        NOTE 1: You can use interpolation slots\nelements:\n  resource:\n    path: \"boundary/api/{version}\"\n    namePattern: \"{name.toPascalCase}Resource.go\"\n  orchestrator:\n    path: \"control\"\n    namePattern: \"{name.toPascalCase}Orchestrator.java\"\n\n# [Optional] (unless you are using an element group)\n# Element groups definition. Must define at least 1 element if defined\n# A group name can be anything. Suggestion: make it part of the DSL you use on a daily basis\n# elements [Mandatory] - A list of elements that this group will forge. \n#        NOTE 1: Each element, must be defined in the `elements` section\n# mappings [Optional] - Predefined mappings\n#        NOTE 1: You can use interpolation slots\nelementGroups:\n  full-module:\n    elements: [ resource, orchestrator ]\n    mappings:\n      name: \"{module}\"\n      version: \"v1\"\n```\n## Templates (`.qphs` Files)\n\nTemplates are stored in the folder specified by `templatesFolder` and should match element names. For example, if\n`resource` is an element, its corresponding template file should be `resource.qphs`.\n\nQuephaestus templates follow the **Qute** templating engine syntax. For more details, check out [Qute documentation](https://quarkus.io/guides/qute).  \n\n\u003e 📘 **Note**     \n\u003e There are several capabilities that are not supported at the moment:\n\u003e * namespaced expressions\n\u003e * Objects in expressions (e.g `{item}` or `{item.name}` where `item` is an object)\n\n## Installation\n\n### Build prerequisites \n\nTo build locally you would need to install GraalVM and native image locally.\nI suggest you use `sdkman` for this task. See this [guide](https://www.graalvm.org/latest/getting-started/#installing) for OS specific details.\nMake sure that you are actually running GraalVM and not another JVM.\n`mvn --version` should help figuring it out.  \n\n### Building a native executable locally\n\nOnce everything is installed and setup, run the following command to compile everything and create your executable:\n\n```shell\n# The `clean` step is optional as well as -DskipTests\n./mvnw clean package -DskipTests -Pnative\n```\n\nThis will generate an executable with `-runner` suffix in the `target` folder, that looks somewhat like this \n`quephaestus-{version}-{arch}-runner` (On windows it will be an `exe` file).  \nYou can copy it to `/usr/local/bin` to make it globally available.\n\n### Building an uber jar locally\n\nIf you are a Java savvy, and know your way around maven and jars, you can run the following command to compile everything into a single jar.  \nThis process is substantially faster than building the native image.\n\n```shell\n# The `clean` step is optional as well as -DskipTests\n./mvnw clean package -DskipTests -Dquarkus.package.jar.type=uber-jar\n```\n\nThis will generate an uber-jar with `-runner` suffix in the `target` folder, that looks somewhat like this\n`quephaestus-{version}-{arch}-runner`.\nYou can copy to your desired location\n\n### Formal release [TBD]\n\nAt the moment, I generate the executables in a [github pipeline](https://github.com/FreifeldRoyi/Quephaestus/actions/workflows/generate-executables.yaml) every once in a while.  \nFor simplicity reasons, the executable is uploaded as an artifact and not to the release page, and without a proper version.  In future releases it will be fixed.  \n\n## Glossary\n\n- **Element** → A reusable components in your DSL, used in your project. Example: `controller`, `repository`, or\n  `orchestrator`\n- **Template** → A `.qphs` file that serves as a skeleton for a generated file. It can include Qute expressions and\n  placeholders\n- **Module** → A contextual grouping for generated files. Can represent a domain (DDD) or a related set of components\n- **Element group** → A collection of elements, allowing multiple files to be forged together\n- **Working Directory** → The root directory where all operations are performed (usually the main project directory)\n- **Base Directory** → A subdirectory inside the working directory where forged files should be placed\n- **Mapping**: Static values to fill in template placeholders\n\n## Contribution\n\nWe welcome contributions! Here’s how you can help:\n\n- **Submit Issues**: Found a bug? Have an\n  idea? [Open an issue](https://github.com/FreifeldRoyi/Quephaestus/issues/new/choose)!\n- **Feature Requests**: Have an idea for a new subcommand? Let’s discuss!\n\n## Known issues\n\n* Due to a [bug in picocli lib](https://github.com/remkop/picocli/issues/2309), the `-d` \u0026 `-p` options, appear twice in\n  the usage printout\n* Several qute capabilities are not fully supported. See [templates](#templates-qphs-files)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreifeldroyi%2Fquephaestus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreifeldroyi%2Fquephaestus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreifeldroyi%2Fquephaestus/lists"}