That's a vague question, but I can tell you how I've done it at various jobs in the past. Features are listed in a tool like Jira, and there is enough documentation and/or description of the problem that the developer can work on the problem or find out who to talk to about it if it doesn't make sense. Depending on how many developers are available, they either choose the next group of features to go into the next version, or a project manager decided. Either way, once the bug is fixed, or the feature is added, the job is marked as "done." It isn't actually "closed" until QA has tested the feature, and even then it can just be reopened if there is a problem.
At some point there are enough new features in the software that a new release is created. This contains all the features up to that point. Anything not in the release will be in the future release. This release is tested, and only bugs are fixed. Eventually, once it has been tested and seems stabled, its released. But during this time, development on the main branch continues.
The software is never really "done", it is always evolving. At some point the customers may decided to quit paying for new features, or the group decides to quit working on it because any future work isn't going to add much value, but it is never finished. Like a novel, you just have to quit working on it.