Here is a description of principles that guide design decisions.
Building a great shell is a huge effort and so is designing a great language and building a great runtime. Tackling all these at the same time is very hard. By building on top of well-designed language we narrow down the scope which improves the chance of success.
It is preferred to use existing Clojure features if they can be reasonably applied to keep the shell core small.
A lot of inspiration comes from fish shell, namely:
- user focus
- feature discoverability
- reasonable defaults and minimal configuration
When customization is necessary prefer extension points and function composition over introducing configuration options.
The overall strategy is to get to feature completeness as soon as possible with reasonable trade-offs. That means leveraging existing libraries as much as possible and writing simple code even though it may not provide best performance. It is important not to fall into the premature optimization trap.
After the feature completeness we can experiment with innovative ideas and try out new paradigms. Once we learn what sticks and what doesn't we can shift focus more on performance and stability.
Great inspiration to keep in mind is also suckless philosophy. Its main values of software are being simple, minimal and usable.