<!--
SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>

SPDX-License-Identifier: CC0-1.0
-->
# Contributing to Firmament

Contributions are tentatively welcomed. The structure of the mod is probably not really transparent to newcomers, but if
you are interested, feel free to tackle any [issues](https://github.com/nea89o/Firmament/issues/) or create your own
features.

## Community

If you need any help contributing feel free to join the [discord]. This is where you can raise more casual issues. Note
that using the discord is not mandatory for contributing. If you don't want to join the discord, feel free to ask
questions in issues or to otherwise contact me.

## State of Firmament

Many of the foundations of Firmament are not yet fix. If you find things confusing or think some of the fundamental
building blocks of Firmament should be changed, feel free to raise an issue. More than likely there is no deeper reason
for something confusing, aside from this being a bit of a sloppy project.

## Development workflow

Firmament is a fabric mod so the development workflow is quite similar to any other fabric mod. To build you will need a
Java capable IDE (strongly recommend IntelliJ here), as well as Java 21. To contribute back to Firmament you will need
to create a [fork](https://github.com/nea89o/Firmament/fork). This is your own copy of Firmament which you can change.
You can load that fork using IntelliJs "New" -> "Project from version control" import option. You might need to
authenticate your GitHub account to IntelliJ during this process or at a later point in time.

### JBR

By default, Firmament tries to launch with hotswapping enabled in the devenv. This will fail if your JVM does not 
support hotswapping. In that case you can either remove the hotswapping arguments, or you can use [JBR](jbr). You can
manually select JBR in your run configuration, after it has been generated by gradle.

```
-XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=external -javaagent:SOMEPATH
```

### Features

Typically, for each new set of features you will create a branch and then create a pull request back to the main
Firmament repo. Note that Firmament makes use of commit names to generate a changelog. As such the first line of each
commit should be something that can be interpreted by an end user. If you want to make an internal change you can use
the `[no changelog]` tag inside your commit message body to hide a commit from the changelog. Try to make one commit for
each feature. Don't worry if you have any problems with your git history, your pull request will history will be
rewritten to be fixed (but it would help me if you can keep your commit history clean).

[discord]: https://discord.gg/64pFP94AWA
[jbr]: https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr-release-21.0.5b631.16
