# Contributing

## Overview

## Overview <a href="#overview" id="overview"></a>

So how can you get involved?

## Objective <a href="#objective" id="objective"></a>

The objective of the `FSM2` project is to provide a simple yet powerful Finite State Machine implementation.

## Documentation <a href="#documentation" id="documentation"></a>

Any project is only as good as its documentation.

A key objective of `FSM2` is to provide quality documentation which makes it easy for both experienced and novices users to use the `FSM2` package.

## Community <a href="#community" id="community"></a>

Development is to be done as a collaborative approach to problem solving.

New ideas should be started by raising an issue to give the community a chance to discuss the pros and cons of the proposed change.

The community should be supportive of all contributors and users and negative language will not be tolerated.

### Coding Standards <a href="#coding-standards" id="coding-standards"></a>

The dart code base will adhere the 'effective dart' lint rules.

Code MUST be free of errors and warnings before it will be accepted.

All code must be formatting using the standard dartfmt tool before it is submitted.

Code MUST be well commented.

All public API's must include examples code in the comments.

Careful consideration is to be given to what methods/class are exposed as part of the public api. The objective is to expose the smallest API possible.

Abbreviations in variable, method and class names should be avoided.

The code should attempt to adhere to conventions that are recognisable to the broader Flutter community and any recommended by the Google Flutter team.

## Minimise included packages <a href="#minimise-included-packages" id="minimise-included-packages"></a>

Dart suffers from dll hell (where different package version from different dependencies conflict). To avoid being a source of dll hell we should aim to include the minimal set of package dependencies possible. We will have to balance this requirement with effort and long term maintenance issues.

ReCase is a good example. In reviewing the code base I found we had only used 3-4 lines of code from the package. So I copied those lines into our own class. Minimal maintenance will be required and we have eliminated usage of a popular package.

## Unit Tests <a href="#unit-tests" id="unit-tests"></a>

Code changes will need to be submitted with Unit Test that provides reasonable coverage of the new feature.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://fsm2.onepub.dev/contributing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
