kowainik/summoner
{ "createdAt": "2017-08-18T22:18:39Z", "defaultBranch": "main", "description": "đŽ đ§ Tool for scaffolding batteries-included production-level Haskell projects", "fullName": "kowainik/summoner", "homepage": "https://kowainik.github.io/projects/summoner", "language": "Haskell", "name": "summoner", "pushedAt": "2024-11-10T23:12:54Z", "stargazersCount": 712, "topics": [ "cli", "hacktoberfest", "haskell", "haskell-application", "project-template", "scaffold", "tui" ], "updatedAt": "2025-10-14T01:01:43Z", "url": "https://github.com/kowainik/summoner"}đŽ Summoner
Section titled âđŽ Summonerâ
So many of our dreams at first seem impossible, then they seem improbable, and then, when we summon the will, they soon become inevitable.
Christopher Reeve
Summoner is a tool for scaffolding fully configured batteries-included production-level Haskell projects.
Do you want to create a library that is to be uploaded to Hackage/Stackage, that builds with both Cabal and Stack and supports the latest three major GHC versions? Or are you building a production application which uses a custom prelude and has CI with GitHub Actions or Travis Linux and AppVeyors Windows checks? Maybe do you want to play with your idea in a single module without introducing the whole complexity of the Haskell projects? Summoner can help you do all that with minimal effort from you - it can even upload the project to GitHub if you wish!
By the way, Summoner operates as either CLI or TUI application, so you can choose what you are more comfortable with and install only the required one.
Structure
Section titled âStructureâ[Back to the Table of Contents] â
TUI demo
Section titled âTUI demoâ[Back to the Table of Contents] â
CLI demo
Section titled âCLI demoâ[Back to the Table of Contents] â
Examples
Section titled âExamplesâ[Back to the Table of Contents] â
You can also see complete examples in the following folder:
The directory contains the following examples:
cabal-minimal: Minimal Haskell project with the Cabal-only support, default settings and all of the integrations disabled.cabal-full: Cabal-only project with all integrations enabled.stack-full: Stack-only project with all integrations enabled.full-batteries: All batteries-included project which supports both build tools and shows every Summoner feature.
Features
Section titled âFeaturesâ[Back to the Table of Contents] â
Summoner is a tool that combines predefined configurations, command-line arguments and a chosen interface.
To fully understand the power in your hands with the help of Summoner, please read this section.
Below you can see highlighted features in different categories.
Project
Section titled âProjectâ[Back to the Table of Contents] â
Features related to the structure and content of the generated projects.
-
Support for Cabal and Stack build tools.
-
Ability to pick stanzas (library, executable, test-suite, benchmark).
-
Usage of common stanza to reduce
.cabalfileâs boilerplate. -
Option to include an alternative prelude, if desired. The project would then use the
mixinstechnique. -
Whole Hackage-upload checklist support (exhaustive
.cabalfile, PVP versioning, GHC options, conventional meta files). -
Support for multiple GHC versions, with thoughtful reflection on project meta, base versions (e.g.
base >= 4.9 && < 4.13), etc. -
Ability to create runnable Haskell scripts.
-
Different license support: MIT, BSD-2-Clause, BSD-3-Clause, GPL-2.0, GPL-3.0, LGPL-2.1, LGPL-3.0, AGPL-3.0, Apache-2.0, MPL-2.0, ISC, None (without file).
-
Creation of the
CHANGELOG.mdfile with PVP versioning policy. -
Ability to include any custom files (including
.stylish-haskell.yaml,CONTRIBUTING.md,CODEOWNERS,FUNDING.ymletc.). -
Usage of the
ghc-optionsfield with sensible defaults.If
ghc-optionsare not explicitly stated in the configuration file, then the following list of GHC flags is added to all stanzas:-Wall-Wcompat-Widentities-Wincomplete-uni-patterns-Wincomplete-record-updates-Wredundant-constraints-Wnoncanonical-monad-instances-fhide-source-paths (GHC ⊞ 8.2)-Wmissing-export-lists (GHC ⊞ 8.4)-Wpartial-fields (GHC ⊞ 8.4)-Wmissing-deriving-strategies (GHC ⊞ 8.8)-fwrite-ide-info (GHC ⊞ 8.8)-hiedir=.hie (GHC ⊞ 8.8)-Wunused-packages (GHC ⊞ 8.10)Besides, the following GHC options are added to the executable, tests and benchmark stanzas:
-threaded-rtsopts-with-rtsopts=-N
[Back to the Table of Contents] â
- Initialisation of the git repository inside the project folder.
- Initial commit creation.
- Uploading the repository to GitHub.
- Exhaustive
.gitignorefile. - Formation of the
READMEfile with Hackage, Stackage and CI badges. - Linking to the GitHub repository in the
.cabalfile. - Ability to include your custom GitHub meta files:
CONTRIBUTING.md,CODEOWNERS,.github/pull_request_template.md, etc. - Guessing user credentials from the local
.gitconfigfile.
[Back to the Table of Contents] â
- Generation of the
.travis.ymlfile that runs build and tests on CI under Linux using Dead simple Haskell Travis Settings for Cabal and Stack. - Generation of the
appveyor.yamlfile which runs build and tests on CI under Windows. - Generation of the
.github/workflows/ci.ymlfile that runs build and tests on GitHub Actions CI under Linux using Cabal. - Configuration matrix on CI to build with multiple GHC versions and various build tools.
-Werroris enabled on CI not to miss any warnings.- Run HLint checks on CI.
[Back to the Table of Contents] â
- Carefully collected Haskell project best practices gathered in your projectsâ scaffold.
- Generate beginner-friendly default configuration using the
summon configcommand. - Ability to create a project in the offline mode.
- Ability to check GHC-specific versions of the corresponding
baselibrary and Stackage snapshot resolver viasummon show ghccommand.
Project structure example
Section titled âProject structure exampleâ[Back to the Table of Contents] â
This is an example of the project hierarchy you can get if you are running Summonerâs new command with all options enabled:
project-name/âââ app/â  âââ Main.hsâââ benchmark/â  âââ Main.hsâââ src/â âââ ProjectName.hsâ  âââ Prelude.hsâââ test/â  âââ Spec.hsâââ CHANGELOG.mdâââ CONTRIBUTING.mdâââ LICENSEâââ project-name.cabalâââ README.mdâââ Setup.hsâââ stack.yamlâââ stack-8.6.5.yamlâââ appveyor.ymlâââ .gitâââ .gitignoreâââ .stylish-haskell.yamlâââ .travis.ymlGet started
Section titled âGet startedâ[Back to the Table of Contents] â
Prerequisites
Section titled âPrerequisitesâ[Back to the Table of Contents] â
To start using Summoner make sure that you have the following tools installed on your machine:
git⊞ 2.28 â to initialize the GitHub repo.hubâ to upload the project to GitHub.curlâ to download licenses.
We also have minimal version requirements for build tools:
However, it is always recommended to use the newest versions of build tools.
Installation
Section titled âInstallationâ[Back to the Table of Contents] â
Summon contains two executables:
summon: scaffold projects using interactive CLI mode.summon-tui: scaffold projects using TUI.
Below you can find the description of how to install each of them so you can choose the one you want.
Summon-TUI
Section titled âSummon-TUIâ[Back to the Table of Contents] â
NOTE:
summon-tuiis not supported on Windows. See this issue.
TUI: download binary
Section titled âTUI: download binaryâ[Back to the Table of Contents] â
You can download binary directly from GitHub releases.
After downloading binary, make it executable and copy it under convenient location, for example:
chmod +x summon-cli-linuxmv summon-cli-linux ~/.local/bin/summonTUI: Homebrew
Section titled âTUI: Homebrewâ[Back to the Table of Contents] â
If you are on MacOS, you can get Summoner using Homebrew Kowainikâs Tap.
You need to run the following command for that:
$ brew install kowainik/tap/summoner-tuiTUI: Ubuntu
Section titled âTUI: Ubuntuâ[Back to the Table of Contents] â
If you are on Ubuntu, you can get Summoner from Kowainikâs PPA.
You need to run the following commands for that:
$ sudo add-apt-repository ppa:kowainik/summoner-tui$ sudo apt update$ sudo apt install summoner-tuiTUI: from Hackage
Section titled âTUI: from Hackageâ[Back to the Table of Contents] â
Using cabal:
cabal updatecabal install summoner-tuiTUI: from source
Section titled âTUI: from sourceâ[Back to the Table of Contents] â
Fetch the repo using cabal:
cabal get -s summoneror clone the directory from GitHub:
git clone https://github.com/kowainik/summoner.gitStep into the directory:
cd summonerBuild and install using cabal:
cabal install summoner-tui:exe:summon-tuiBuild and install using stack:
stack install summoner-tui:exe:summon-tuiSummon-CLI
Section titled âSummon-CLIâ[Back to the Table of Contents] â
CLI: download binary
Section titled âCLI: download binaryâ[Back to the Table of Contents] â
You can download binary directly from GitHub releases.
After downloading binary, make it executable and copy it under convenient location, for example:
chmod +x summon-cli-linuxmv summon-cli-linux ~/.local/bin/summonCLI: Homebrew
Section titled âCLI: Homebrewâ[Back to the Table of Contents] â
If you are on MacOS, you can get Summoner using Homebrew Kowainikâs Tap.
You need to run the following command for that:
$ brew install kowainik/tap/summoner-cliCLI: Ubuntu
Section titled âCLI: Ubuntuâ[Back to the Table of Contents] â
If you are on Ubuntu, you can get Summoner from Kowainikâs PPA.
You need to run the following commands for that:
$ sudo add-apt-repository ppa:kowainik/summoner-cli$ sudo apt update$ sudo apt install summoner-cliCLI: from Hackage
Section titled âCLI: from Hackageâ[Back to the Table of Contents] â
Using cabal:
cabal updatecabal install summonerCLI: from source
Section titled âCLI: from sourceâ[Back to the Table of Contents] â
Fetch the repo using cabal:
cabal get -s summoneror clone the directory from GitHub:
git clone https://github.com/kowainik/summoner.gitStep into the directory:
cd summonerBuild and install using cabal:
cabal install summoner-cli:exe:summonBuild and install using stack:
stack install summoner:exe:summon[Back to the Table of Contents] â
You can turn on bash auto-completion by running the following command:
source <(summon --bash-completion-script `which summon`)[Back to the Table of Contents] â
To start summoning projects nothing additional is required. However, to tweak your settings further, you can use additional configuration settings.
There are several options you can use to set particular configurations for new projects (in increasing order of priority):
- Default configuration file (
~/.summoner.toml). - Fields
user.login,user.nameanduser.emailfrom~/.gitconfig. - Explicitly specified configuration file by
--file FILENAMEoption (used instead of the default one if specified). - Options that are stated by CLI arguments.
- User input. It could be
- TUI â User data specified in the window of
summon-tui. - CLI â Interactively inputted answers during execution of the
summoncommand (for the options that were not specified on previous steps).
- TUI â User data specified in the window of
To cut a long story short, the configuration uses Partial Options Monoid Pattern.
File configuration
Section titled âFile configurationâ[Back to the Table of Contents] â
Here is the list of the options that can be configured to suit your needs. If options are not specified, they are asked interactively (or some sensible defaults are used).
| Field | Type | Description |
|---|---|---|
cabal | Bool | Add Cabal support? |
stack | Bool | Add Stack support? |
owner | Text | GitHub login. |
fullName | Text | Full name. |
email | Text | E-mail address. |
license | License | One of: MIT, BSD2, BSD3, GPL-2, GPL-3, LGPL-2.1, LGPL-3, AGPL-3, Apache-2.0, MPL-2.0, None. |
ghcVersions | [GHC] | summoner uses default GHC-9.0.2. However, additionally you can specify other versions. For each version x.y.z the stack-x.y.z.yaml will be created. Use summon show ghc to see all supported GHC versions. |
github | Bool | Turn on GitHub integration by default? |
gitignore | [Text] | List of files you want added to the default .gitignore. (Ignored if github = false) |
noUpload | Bool | Do not upload to GitHub, but create all GitHub related files if specified (Ignored if github = false) |
private | Bool | Create private repository by default? (Ignored if github = false) |
githubActions | Bool | Turn on GitHub Actions integration by default? (Currently working with Cabal only. Ignored if github = false) |
travis | Bool | Turn on Travis integration by default? (Ignored if github = false) |
appveyor | Bool | Turn on AppVeyor integration by default? (Ignored if github = false) |
lib | Bool | Create src folder with simple ProjectName.hs file and library target? |
exe | Bool | Create app folder with simple Main.hs file and executable target? |
test | Bool | Create test folder with simple Spec.hs file and test target? |
bench | Bool | Create benchmark folder with Main.hs file with gauge library usage example? |
extensions | [Text] | List of the default extensions to add into default-extensions section in the .cabal. |
ghc-options | [Text] | List of the default GHC options to add into ghc-options section in the .cabal. |
files | Map FilePath Source | Custom mapping of files to their sources. Represented as a list of inline tables in TOML in a format like files = [ { path = "foo", url = "https://..." }, ... ]. Supported file types: url, local, raw. |
[prelude] | ||
package | Text | The package name of the custom prelude youâd like to use in the project (doesnât work without module field). |
module | Text | The module name of the custom prelude youâd like to use in the project (doesnât work without package field). |
You can create default configuration using the summon config
command. See [the default content here]!(summoner-cli/test/golden/summoner-default.toml).
For a real-life example of the configuration, see the configuration for projects of the Kowainik organization.
Command line arguments
Section titled âCommand line argumentsâ[Back to the Table of Contents] â
Available commands:
Usage: summon COMMAND Set up your own Haskell project
Available commands: new Create a new Haskell project script Create a new Haskell script show Show available licenses or ghc versions config Create default TOML configuration for summoner
Available global options: -h, --help Show this help text -v, --version Show summoner's versionsummon new command:
Section titled âsummon new command:â[Back to the Table of Contents] â
Usage: summon new PROJECT_NAME [--ignore-config] [--no-upload] [--offline] [-f|--file FILENAME] [--cabal] [--stack] [--prelude-package PACKAGE_NAME] [--prelude-module MODULE_NAME] [with [OPTIONS]] [without [OPTIONS]]
Available options: -h, --help Show this help text --ignore-config Ignore configuration file --no-upload Do not upload to GitHub. Special case of the '--offline' flag. --offline Offline mode: create project with 'All Rights Reserved' license and without uploading to GitHub. --cabal Cabal support for the project --stack Stack support for the project -f, --file FILENAME Path to the toml file with configurations. If not specified '~/.summoner.toml' will be used by default --prelude-package PACKAGE_NAME Name for the package of the custom prelude to use in the project --prelude-module MODULE_NAME Name for the module of the custom prelude to use in the project
Available commands: with Specify options to enable without Specify options to disable
Available command options: -h, --help Show this help text -g, --github Github integration -p, --private Create private GitHub repository -a, --actions GitHub Actions CI integration -c, --travis Travis CI integration -w, --app-veyor AppVeyor CI integration -l, --library Library target -e, --exec Executable target -t, --test Tests -b, --benchmark Benchmarkssummon script command:
Section titled âsummon script command:â[Back to the Table of Contents] â
Usage: summon script BUILD_TOOL [-g|--ghc GHC_VERSION] [-n|--name FILE_NAME] Create a new Haskell script
Available options: -h,--help Show this help text -g,--ghc GHC_VERSION Version of the compiler to be used for script -n,--name FILE_NAME Name of the script filesummon show command:
Section titled âsummon show command:â[Back to the Table of Contents] â
Usage: summon show COMMAND Show supported licenses or ghc versions
Available commands: ghc Show available ghc versions license Show available licenses license [LICENSE_NAME] Show specific license text
Available options: -h, --help Show this help textFor example, the following command preconfigures the project settings with the
custom prelude relude, included library, executable, test stanzas (but without
benchmarks), creates a private repository on GitHub with the GitHub Actions CI,
Travis CI and AppVeyor CI integrated.
summon new my-project with -letgcpwa without -b --prelude-package relude --prelude-module Reludesummon config command:
Section titled âsummon config command:â[Back to the Table of Contents] â
Usage: summon config [-f|--file=FILENAME] Create a default TOML configuration file for summoner
Available options: -h,--help Show this help text -f,--file=FILENAME Path to the toml file with configurations. If not specified '~/.summoner.toml' will be used by defaultThis command will generate a TOML configuration file with the default settings that can be used to scaffold future Haskell packages. It contains all options supported by Summoner with comments and examples. Though, all options would be turned off by default and to use them one will need to uncomment the corresponding lines. See [the default content here]!(summoner-cli/test/golden/summoner-default.toml).
Possible command usages:
summon configsummon config --file ~/.summoner-demo.toml[Back to the Table of Contents] â
TUI new command
Section titled âTUI new commandâ[Back to the Table of Contents] â

Section 1 â The main section where user inputs data or changes the configurations.
Section 2 â The structure of the project that is going to be created with the current configurations. This tree changes on-the-fly.
Section 3 â Hints, project status, or current errors in the configurations.
Section 4 â Useful hotkeys.
The TUI window opens with the pre-filled information received from a config file and command-line arguments. However, itâs possible to change any field as per your needs.
In the screenshot you can see that youâll be given a few text fields to fill in or some checkboxes that represent boolean values of the configurations. To help you fill in the correct input, there are some â info messages in the Status section, which give additional details about the current field.
To help you navigate between the form fields here are the available hotkeys:
| Key | Action |
|---|---|
| Esc | Abort summoner |
| Enter | If input is valid go to the Confirm window |
| Tab | Change the focus to the next active field |
| Shift + Tab | Change the focus to the previous active field |
| Space | Enable/disable current checkbox or radio button |
| Ctrl + d | Delete the input of the current text field |
| Ctrl + u | Delete the input of the current text field from the cursor position to the beginning |
| Ctrl + k | Delete the input of the current text field from the cursor position to the end |
| Ctrl + a | Move the cursor to the beginning of the current input field |
| Ctrl + e | Move the cursor to the end of the current input field |
| Up/Down | Scroll license list when focused |
Note that the form should be valid in order to be able to go to the Confirm window. If there are some errors in the input, you could see details about these errors in the Status section of the form.
TUI script command
Section titled âTUI script commandâ[Back to the Table of Contents] â
See CLI description of the summon script command.
TUI show command
Section titled âTUI show commandâ[Back to the Table of Contents] â
These commands display the list of supported GHC versions or Licenses. Also, when the license name is specified the window with the scrollable content of the License text is shown.
[Back to the Table of Contents] â
CLI new command
Section titled âCLI new commandâ[Back to the Table of Contents] â
In CLI mode of operation Summoner asks about every project setting. Most of the questions contain a default value, so you can press Enter to choose the default value. If some option is specified via a configuration file or CLI arguments, then the question is skipped and the predefined value is used.
CLI script command
Section titled âCLI script commandâ[Back to the Table of Contents] â
This command creates minimal cabal or stack script file which allows you to save some keystrokes and eliminates the need to remember magic words for scripts.
Cabal example: summon script cabal -n Main.hs generates executable file Main.hs with the following content:
#!/usr/bin/env cabal{- cabal:build-depends: , base ^>= 4.13.0.0-}
main :: IO ()main = putStrLn "Hello, World!"Stack example: summon script stack -n Main.hs generates executable file Main.hs with the following content:
#!/usr/bin/env stack{- stack --resolver lts-15.5 script --package base-}
main :: IO ()main = putStrLn "Hello, World!"CLI show command
Section titled âCLI show commandâ[Back to the Table of Contents] â
These commands display the list of supported GHC versions, or Licenses. Also, when the license name is specified, the content of the License is outputted to the terminal.
[Back to the Table of Contents] â
I want to use HTTPS remote for the created GitHub project, but it creates SSH one. How should I fix this?
We are using hub tool to create the projects at GitHub. It uses SSH so that you would get the remote links in the following format:
git@github.com:user/repo.gitWe can not change or configure this behaviour, but there are several workarounds in case you need to use HTTPS link for the remote.
- Change the remote of the repository after its creation:
git remote set-url origin https://github.com/user/repo.git
- Change
hubconfigurations globally. Simply run the following command:Terminal window git config --global hub.protocol https - Alternatively, change
hubconfigurations for a single session:export HUB_PROTOCOL="https"
Why some of the Stack checks on my TravisCI matrix are marked as âThis job is allowed to failâ?
Due to the Stack problem of working with older versions of Cabal, the build can
fail with Stack for some older GHCs. We are adding these checks into
allow_failures section, as this is a known issue, and there is no need for the
whole build to fail because of that.
For more information about the issue and some workarounds from Stack developers, see the following ticket:
For Developers
Section titled âFor Developersâ[Back to the Table of Contents] â
If youâd like to take part in the development processes, here are a few things to keep in mind:
- Summoner is a multi-package project which has two packages inside:
summoner-cliandsummoner-tui. We are supporting the same functionality in both of them, so, if itâs possible, you should add/change the code in both of the packages. - Summoner uses the custom prelude
relude. - We are using the Kowainik style guide.
- To sum up, here is the Contributing guide we use across the repositories.
- This project is contributor-friendly, so be kind to other people working on the project.
Dependencies
Section titled âDependenciesâ[Back to the Table of Contents] â
On Linux, to build the summoner-tui youâll need to have libtinfo installed. The easiest way to get this is from your systemâs package manager and is usually available as the package libtinfo-dev.
[Back to the Table of Contents] â
To build the project you can use the following commands:
cabal build allfor Cabal and
stack buildfor Stack.
[Back to the Table of Contents] â
Summoner uses the golden tests technique for assuring the correctness of the generated files. For this purpose, we have the golden folder with two sample projects to test against.
To actually run tests you need to run:
cabal test allor, if using Stack
stack test[Back to the Table of Contents] â
Building Summoner with the recommended method creates two executables: summon and summon-tui. To run the compiled executable you can use the following commands:
cabal exec summon -- SOME_COMMANDcabal exec summon-tui -- SOME_COMMANDor, if using Stack
stack exec summon -- SOME_COMMANDstack exec summon-tui -- SOME_COMMANDGenerate golden tests
Section titled âGenerate golden testsâTo regenerate the content of all projects on disk, use the following command:
cabal run ggAcknowledgments
Section titled âAcknowledgmentsâ[Back to the Table of Contents] â
This project was inspired by Aelve/new-hs, which is the tool with the same goal but itâs only for creating cabal projects.
Icons made by Nikita Golubev from Flaticon is licensed by CC 3.0 BY.

