# Pijul requirements

## User-friendly
 - user must feel that pijul is fast
 - user must see clear error messages
 - user must have mental model map of .pijul implementation 
 - user must read good documentation
 - user must feel it's easy to install
 - user must feel interface is consistent
 - user must feel terminology is consistent
 - user must feel design is consistent
 - user must read interface in i18n languages
## Robust
 - user must read theoretically sound writeup
 - user must resolve conflicts natively
 - user must use monorepo workflow
 - user must use multirepo workflow
## Tooling
 - user must get machine-readable output for every command
 - user can integrate pijul into a command line server like soft-serve
 - user can track issues alongside alongside the code like fossil
 - user must read good documentation for the process of integration
 - user must feel that API is clear 
 - user must see clear API for cloning
 - user must see clear API for remote management
 - user must see clear API for identity management
 - user must see clear API for conflict resolution
 - user must see clear API for change history
## Repositories
 - user must initialize a repository
 - user must see automatically generated .pijul directory
 - user must see automatically generated .ignore file
 - user must see useful defaults in generated .ignore file
 - user must see .DS_Store in generated .ignore file on MacOS
 - user must see .git in generated .ignore file if directory has .git
 - user must clone a repository
 - user must clone a repository over ssh
 - user must clone a repository over https
 - user must see new directory with repository name
 - user must download project files from remote
 - user must download .pijul from remote
 - user must download .ignore from remote
 - user must import .git repository to .pijul repository
## Identities
 - user must create identity
 - user must feel it's easy to create identity
 - user must manage multiple identities
 - user must modify display name
 - user must modify identity name
 - user must modify email 
 - user won't modify encryption
 - user won't modify expiry
 - user must modify remote
 - user must feel it's secure to use an identity
 - user must use passphrases to secure identity 
 - user must rotate key 
 - user must revoke key
## Remotes
 - user must add a remote
 - user must edit a remote
 - user must remove a remove
 - user must feel it's easy to manage remote
 - user must read good documentation 
 - user must self-host over ssh
 - user must self-host over https
 - user must have different patch sets on remote A and remote B
 - user must push over ssh
 - user must push over https
 - user must pull over ssh
 - user must pull over https
## Changes
 - user must see modifications that are not yet recorded in a change
 - user must learn that working dir is recorded directly, there's no staging area 
 - user must pick which patches for each file to record change
 - user must split changes into multiple smaller changes
 - user must amend previous changes with new metadata
 - user must amend previous changes with new patches
 - user must sign changes with identity
 - user must track a file
 - user must track all files in a project `pijul add -r .`
 - user must track a directory
 - user must track all files in a directory
 - user must record tracked changes
 - user must record tracked changes with a custom message
 - user must ignore a file from tracking
 - user must see list of files not tracked and not ignored
## Sets of changes
 - user must compare sets of changes against each other
 - user must compare changes between two versions from history
 - user must compare single change to set of changes
 - user must see name of current version of repository, channel
 - user must tag, compress set of changes into snapshot 
 - user must merge two sets of changes
## Files
 - user must track file
 - user must untrack file
 - user must add a directory recursively
 - user must see how many files were tracked
 - user must see how many new changes are tracked
 - user won't see notification "tracked 1 path" if the file is already tracked
 - user must rename a file
 - user must track renamed file
 - user must move a file 
 - user must delete a file
 - user must purge file from history like `git filter-repo`
 - user must list tracked files
 - user must list untracked files
 - user must list tracked status of all files
 - user must ignore a file user via `.ignore`
## CLI
 - user must view status/summary of repository
 - user must use cli in system language according to 18n
 - french user must see french text in cli
 - user must feel the CLI terminology and idioms are consistent
 - user must view log of all changes
 - user must view log of most recent change
 - user must view modification history of changes
 - user must see when a change is created
 - user must see when a change amended to include added file
 - user must see when a change is unrecorded
 - user must compare differences with remote 
## Maintainers
 - maintainer must download user-submitted changes 
 - maintainer must be able to edit directory after downloading user-submitted changes 
 - maintainer must propose amendment to title and description without author input
 - maintainer should amend title and description without author input
 - maintainer should add author credit to changes not signed by original author
 - maintainer must rewrite history of changes
## Deprecated
 - user must see `error "pijul key" has been deprecated. Please run "pijul identity" instead.` for a deprecated command


# cast of characters
standing on the shoulders of [giants]https://smallcultfollowing.com/babysteps/blog/2023/10/20/using-rust/#fnref:3 from [wg-async]https://rust-lang.github.io/wg-async/vision/characters.html  

* Alan: the experienced git user, new to pijul
    * *Top priority*: conflict resolution -- that's what he is not getting from git
    * *Expectations*: absence of hard to resolve conflicts (he gets that now from his git), strong ecosystem, great tooling
* Grace: the darcs expert, new to pijul
    * *Top priority*: clear mental model -- that's what she was not getting from darcs
    * *Expectations*: able to do all the magical things she's used to from darcs
* Niklaus: new user from an unconventional background
    * *Top priority*: accessibility -- he's learning a lot of new things at once
    * *Expectations*: community -- the community enabled him to have early success, and he is excited to have it support him and him grow more
* Barbara: the experienced pijul user
    * *Top priority*: overall productivity and long-term maintenance -- she loves pijul, and wants to see it extended to new areas; she has an existing pijul repository to maintain
    * *Expectations*: elegance and craftsmanship, fits well with pijul