epiq 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "epiq",
3
- "version": "0.3.2",
4
- "license": "UNLICENSED",
3
+ "version": "0.3.4",
4
+ "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "EPIQ - CLI based issue tracker",
7
7
  "keywords": [
package/readme.md CHANGED
@@ -159,9 +159,6 @@ Clear all filters with `:filter clear`
159
159
 
160
160
  - Pro tip: just like in any terminal - if you need to do repeating tasks over and over again, you can just put yourself in the command mode, and then press arrow up, in order to access the last executed command. This helps a lot when you create tasks with similar names, or add the same tag to many tickets and so on.
161
161
 
162
- Starting the application will launch a wizard that sets you up in 20 seconds.
163
- It will result in settings persisted at `~/.epicrc`
164
-
165
162
  ---
166
163
 
167
164
  ## How epiq is synchronized
@@ -173,7 +170,46 @@ Epiq uses Git in the background to synchronize state between clients. No manual
173
170
 
174
171
  The `.epiq/` folder is non-authoritative and used for caching and local tracking. It can optionally be committed if you want your board state versioned alongside your code.
175
172
 
176
- > The system is designed to assure robustness and uses a number of techniques and design patterns to avoid merge conflicts.
173
+ ## Conflict Avoidance & Data Integrity
174
+
175
+ Epiq is designed to provide robustness in a distributed, Git-backed environment where multiple users may update state concurrently. Instead of mutating shared files, Epiq uses an event-sourced model to minimize merge conflicts and make concurrent changes predictable.
176
+
177
+ ### Event-sourced state
178
+
179
+ All changes are stored as **append-only events** in user-scoped files, rather than modifying a shared state file. This avoids in-place edits to the same lines and significantly reduces the likelihood of Git conflicts.
180
+
181
+ State is reconstructed in-memory by replaying a merge of all user logs.
182
+
183
+ ### Deterministic materialization
184
+
185
+ The current state is derived by replaying events in a deterministic order.
186
+
187
+ Events use a composite of time-sortable IDs (ULIDs) and a reference to the last known event ("edge"). On creation, events are appended relative to the last known event. If multiple events share the same reference point, their relative order is resolved using their time-based IDs.
188
+
189
+ This approach:
190
+
191
+ - Provides stable and reproducible ordering across machines
192
+ - Limits the impact of potential clock drift to small local ordering differences
193
+ - Ensures that concurrent updates converge to the same state
194
+
195
+ ### Conflict handling model
196
+
197
+ Epiq resolves concurrent changes at the event level:
198
+
199
+ - Events are designed to be **idempotent** where possible
200
+ - Later events take precedence when conflicts occur
201
+
202
+ Because events are append-only and scoped to 1 file per user, Git merges become trivial combinations of changes in independent files.
203
+
204
+ ### Local-first with eventual consistency
205
+
206
+ Epiq follows a **local-first** model:
207
+
208
+ - All operations apply instantly on the local machine
209
+ - Synchronization happens explicitly (`:sync`) or automatically
210
+ - When histories diverge, merging event logs and replaying them leads to a consistent state
211
+
212
+ > Frequent synchronization reduces divergence and keeps the system predictable
177
213
 
178
214
  ---
179
215