epiq 1.10.0 → 1.12.0

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,6 +1,6 @@
1
1
  {
2
2
  "name": "epiq",
3
- "version": "1.10.0",
3
+ "version": "1.12.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "EPIQ - ergonomic, distributed CLI-first issue tracker TUI ready for the agentic era",
package/readme.md CHANGED
@@ -6,7 +6,7 @@ _Issue tracking as code. Open source, distributed, local-first, and code-native.
6
6
 
7
7
  Epiq provides issue tracking as a portable, integrated part of the development environment, with access to all the powerful tooling developers are used to.
8
8
 
9
- > Manage your projects in a visual kanban board — in your terminal or in your browser — while keeping all state local, Git-backed, and versioned.
9
+ > Kanban to review workflows in your terminal or in your browser - while keeping all state local, Git-backed, and versioned.
10
10
 
11
11
  With great attention to user ergonomics and developer experience, epiq strives to make project management painless and friction free.
12
12
 
@@ -18,21 +18,20 @@ Agents now run whole sprints unattended. Because state is a full event log, you
18
18
 
19
19
  ## Code, linked to tickets
20
20
 
21
- Prefix a commit's subject with the ticket's ref and the two are linked:
21
+ Prefix a commit's subject with the ticket's ref to link the two:
22
22
 
23
23
  ```
24
- git commit -m "1YRTG8T document the commit-to-ticket link in the readme"
24
+ git commit -m "1YRTG8T ...<some message>"
25
25
  ```
26
26
 
27
- That commit now shows up in the ticket's **Commits** tab with its diffstat, and expands into a per-file diff right inside the ticket. Drag across diff lines to quote them into a comment on the ticket, or file a new ticket straight from the selection — the quote links back to the exact lines. The scrubber plots commits alongside board events; click a commit dot to open its diff in the ticket it belongs to.
27
+ Linking makes a commit show up in the ticket code-diff tab. You can comment on selected lines, and also file a new ticket straight from the selection. The MCP exploses this reference as a `ref` property agents can refer to.
28
28
 
29
29
  ![A ticket's Commits tab, showing the diff of a linked commit](https://raw.githubusercontent.com/ljtn/epiq/main/source/assets/code-diff.jpeg)
30
30
 
31
- The link is nothing more than the commit subject: Epiq matches commits whose subject starts with `<REF> ` (case-insensitive) and stores nothing else. That makes it robust — no hooks, no database — but it means your merge strategy has to keep those subjects on the branch you inspect:
31
+ Preserve the linking post-merge via conventions:
32
32
 
33
- - **Prefix every commit** with the ref of the ticket it belongs to. Agents get it from the `ref` field on `epiq_issue_list` and `epiq_board_list` responses.
34
- - **Rebase-merge** (`gh pr merge --rebase`) so the ref-prefixed commits land on `main` as they are. A merge commit adds a subject carrying no ref; a squash merge folds every commit into one whose subject GitHub invents from the PR title, and the link is gone.
35
- - Squashing _within_ one ticket's commits is fine as long as the result keeps the prefix. Never squash commits carrying different refs into one.
33
+ - **Rebase-merge** It is advised to rebase-merge so the ref-prefixed commits land on `main` as they are, preserving linking post-merge.
34
+ - Squashing _within_ one ticket's commits is fine as long as the result keeps the prefix. Do not squash commits carrying different refs into one.
36
35
 
37
36
  ## Terminal + Browser
38
37
 
@@ -42,36 +41,19 @@ Epiq originated from the command line and offers a first-class terminal experien
42
41
 
43
42
  ## What is epiq?
44
43
 
45
- Epiq is a self hosted, vim-inspired issue tracker that brings developer experience to project management. It renders either as ASCII, or as a web GUI, and persists state as an immutable distributed event log, versioned and synchronized through Git.
46
-
47
- ## Why Epiq?
44
+ Epiq is a self hosted issue tracker that allows you to review workflows in real time or after the fact via replay. It persists state as an immutable event log, versioned and synchronized via Git.
48
45
 
49
46
  Most issue trackers live outside your workflow. Instead of a centralized, managed service, Epiq keeps project state alongside your repository, where it travels with your code.
50
47
 
51
- These design choices result in a system that is:
48
+ These design choices result in a system that offers:
52
49
 
50
+ - **Workflow replay**, - inspect what happened while you were away, as if it happens now
53
51
  - **Simple setup** — no accounts, SaaS, or external services required
54
52
  - **Repo-native** — your issues can live where your code lives
55
53
  - **Offline-friendly** — works anywhere, with eventual consistency
56
- - **Speed** — local first, and eventual consistency makes Epiq edits instant
57
- - **Portable** — run on your local machine, on a remote Linux server or your grandma’s connected toaster
54
+ - **Fast** — local first, and eventual consistency makes Epiq edits instant
55
+ - **Portable** — runs on your local machine, on a remote Linux server or your grandma’s connected toaster
58
56
  - **Command driven** — scriptable and automation-friendly, ready for the agentic era
59
- - **Versioned** — changes are tracked and recoverable through Git
60
-
61
- ## A Features
62
-
63
- - Issue tracking — track work in tickets with name, description, tags, assignees, history log, etc.
64
- - Ergonomics — fast keyboard-driven UX, command line with history, syntax highlighting etc.
65
- - Command palette — press `?` to open a scrollable overview of all available commands and descriptions
66
- - Time travel — inspect the board as it was 1h, 1 week or 1 year ago, or replay its history as an animation
67
- - Linked commits — prefix commits with a ticket ref to browse their diffs from the ticket, quote lines into comments, and see them on the timeline
68
- - Filtering — query issues by description, tags, assignees, etc.
69
- - Autocompletion — minimize typing, stay in flow, reuse previous commands
70
- - Multi-user — collaborative synchronization via Git
71
- - Traceable event log — state is a full history of every change ever made
72
- - Export — write the current board layout to markdown
73
- - Browser GUI — graphical interface powered by the same Git-backed state
74
- - MCP integration — Model Context Protocol support for agent interaction
75
57
 
76
58
  ---
77
59
 
@@ -138,59 +120,6 @@ epiq gui
138
120
  > Epiq manages a dedicated Git state branch and worktree automatically as the source of truth for synchronization.
139
121
  > - A local debug log at `.epiq/log/epiq.log` — check it first if sync, boot, or a Git operation is misbehaving.
140
122
 
141
- ## Usage Guide (TUI)
142
-
143
- ### Help
144
-
145
- - The first thing to know is that you always can access help with `:help`.
146
- - Press `?` anytime to open the command palette with all available commands and descriptions.
147
-
148
- ### Navigation
149
-
150
- - The second thing to know is that you can navigate with the keyboard using arrow keys or `h` `j` `k` `l`.
151
- - Hold `shift` to move five at a time — `shift` with an arrow, or the shifted vim key (`J` / `K` down a lane, `H` / `L` across the board). A jump stops at the first and last item rather than wrapping, so holding it takes you to the end.
152
- - You can enter nodes with `enter`, and navigate out of a context with `q` or `esc`
153
-
154
- ### Commands
155
-
156
- - If you type `:` you are put in command line mode and can now insert commands.
157
- - Commands are context-aware, so for instance `:close` only exists for issues.
158
-
159
- ### Create nodes: issue | swimlane | board
160
-
161
- - Create nodes with `:new issue|swimlane|board <Name of new node>`.
162
-
163
- ### Comment
164
-
165
- - Comment on issues with `:comment <your-input>`. Comments can be edited or deleted with the regular ':edit ...' or ':delete' commands.
166
-
167
- ### Move nodes
168
-
169
- - Move nodes by pressing `m`. This sets you in a move state, after which you can navigate as normal, navigate to the target location, then press m again to confirm new location. `shift`+arrow carries the node five places at a time, and nothing is written until you confirm.
170
-
171
- ### Filtering
172
-
173
- - Apply filters with the `filter` command followed by a target, and a qualifier. So in order to filter all issues with a `prio` tag you can write `:filter tag prio` and hit `enter`. You can build a combination of filters by running several filter commands in succession.
174
-
175
- Clear all filters with `:filter clear`
176
-
177
- ### Time travel
178
-
179
- - Inspect the board as it was with `:peek <offset>`, where offset is `<n>h`, `d`, `w`, `mo` or `y` — so `:peek 3d` is the board three days ago. An absolute `YYYY-MM-DD` date works too. Step with `:peek prev|next`, and return with `:peek now`.
180
- - Where `:peek` shows a frozen snapshot, `:replay 1mo` plays history forward from that point as an animation. An optional second argument sets the playback duration, e.g. `:replay 1mo 30s`.
181
- - While peeking or replaying, the board is read-only.
182
-
183
- ### Close issue
184
-
185
- - Close issues with `:close`. This moves the issue to a special board named `Closed` which you can find if you navigate up (press `q`) a few times.
186
-
187
- ### Reopen
188
-
189
- - You can reopen a task by visiting the `Closed` board, selecting an issue and typing command `:reopen`. This will restore the issue to its last previous location.
190
-
191
- ### Reuse command
192
-
193
- - 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.
194
123
 
195
124
  ---
196
125
 
@@ -204,25 +133,13 @@ The reliable way to register the server is with the `claude mcp add` command —
204
133
 
205
134
  ```bash
206
135
  # Available everywhere (recommended)
207
- claude mcp add --scope user epiq -- npx -y -p epiq epiq-mcp
136
+ claude mcp add --scope user epiq -- npx -y --package=epiq epiq-mcp
208
137
 
209
138
  # Or only in the current project
210
- claude mcp add epiq -- npx -y -p epiq epiq-mcp
139
+ claude mcp add epiq -- npx -y --package=epiq epiq-mcp
211
140
  ```
212
141
 
213
- Use `--scope user` to make Epiq available in every directory; omit it to register Epiq only for the current project. Verify the connection with `claude mcp list` (it should report `epiq … ✔ Connected`). MCP servers are loaded at startup, so **restart Claude Code** after adding the server before its tools become available.
214
-
215
- ### Setting up a board from an agent
216
-
217
- An agent can initialize a repository without anyone opening the TUI. `epiq_project_init` runs the same steps as `:init` — state branch, default board, `.epiq/project.json` — in the repository at `repoRoot` (default: the current directory), which must have no uncommitted changes. It tries to push both branches and reports a push that fails as a warning rather than an error, so a repository without a remote still works.
218
-
219
- On a machine with no `~/.epiq-global/config.json` yet, the tool also records the user's setup. Called without the answers it fails, naming what it still needs, so the agent asks the user and calls again:
220
-
221
- - `userName` — how the user wants to appear on the board
222
- - `preferredEditor` — the command that opens a file, e.g. `vim` or `code --wait`
223
- - `autoSync` — whether the TUI and GUI sync with the remote on their own
224
-
225
- Whatever was given is kept between calls. On a machine that is already set up the tool fills in nothing and changes nothing: a different answer is refused, since renaming the configured user would rename them on every board. The name recorded is the user's, not the agent's: an agent running under its own identity (see below) is refused if it passes that name here.
142
+ Verify the connection with `claude mcp list` (it should report `epiq … ✔ Connected`). MCP servers are loaded at startup, so **restart Claude Code** after adding the server before its tools become available.
226
143
 
227
144
  ### Skills
228
145
 
@@ -230,49 +147,9 @@ Find skill at `.claude/skills/epiq/SKILL.md` that documents a recommended workfl
230
147
 
231
148
  ### Agent identity
232
149
 
233
- Every process — your TUI, your GUI, each agent's MCP server — writes as the user in `~/.epiq-global/config.json`, so by default the board cannot tell one agent from another. Name an agent's server and it gets its own identity:
234
-
235
- ```bash
236
- claude mcp add --scope user epiq -- npx -y -p epiq epiq-mcp claude
237
- ```
238
-
239
- Or, in a hand-written config, as the argument after the command:
240
-
241
- ```json
242
- {
243
- "mcpServers": {
244
- "epiq": {
245
- "command": "npx",
246
- "args": ["-y", "-p", "epiq", "epiq-mcp", "claude"]
247
- }
248
- }
249
- }
250
- ```
251
-
252
- That agent then shows up in the contributor list, assigns itself rather than you, and authors its own events. The id is derived from the name, so one name is one contributor on every machine — reuse names instead of inventing one per session, or the registry fills with single-run identities. Naming yourself changes nothing.
253
-
254
- `EPIQ_USER_NAME` does the same thing through the environment, for a client whose config sets variables more readily than arguments:
150
+ Every process — your TUI, your GUI, each agent's MCP server - writes as your user, so by default the board cannot tell one agent from another. The MCP allows agents to assume an identity, so at the start of a session, tell your agent which name it should assume.
255
151
 
256
- ```json
257
- {
258
- "mcpServers": {
259
- "epiq": {
260
- "command": "npx",
261
- "args": ["-y", "-p", "epiq", "epiq-mcp"],
262
- "env": {"EPIQ_USER_NAME": "claude"}
263
- }
264
- }
265
- }
266
- ```
267
-
268
- Setting both is an error unless they agree, rather than one quietly winning. `EPIQ_USER_ID` pins the id explicitly (26 characters of Crockford base32) if you would rather choose it, and stays environment-only.
269
-
270
- The TUI and GUI take the same name as `--as`, since their first argument is already the command:
271
-
272
- ```bash
273
- epiq --as claude
274
- epiq gui --as claude
275
- ```
152
+ That agent then shows up in the contributor list, assigns itself rather than you, and authors its own events. This can be useful when tracing many agents at the same time. Consider reusing names instead of inventing one per session, or the registry fills with single-run identities.
276
153
 
277
154
  ### Other MCP clients
278
155
 
@@ -293,9 +170,7 @@ Once registered, agents can interact with your local Epiq instance through the M
293
170
 
294
171
  ### Sandboxed or network-restricted environments
295
172
 
296
- `npx -y -p epiq epiq-mcp` resolves the package against the npm registry **every time it starts**, even if it's already cached locally. In agent sandboxes with restricted network access, this can make the MCP server appear to hang — `npx` retries DNS resolution instead of failing fast, and there's no MCP-level error to explain why.
297
-
298
- If you're running Epiq's MCP server in such an environment, install it globally once and point your MCP config at the resolved executable directly, bypassing `npx` (and the registry lookup) entirely on every subsequent start:
173
+ `npx -y -p epiq epiq-mcp` resolves the package against the npm registry **every time it starts**, even if it's already cached locally. In agent sandboxes with restricted network access, this can make the MCP server appear to hang. If you're running Epiq's MCP server in such an environment, install it globally once and point your MCP config at the resolved executable directly, bypassing `npx` (and the registry lookup) entirely on every subsequent start:
299
174
 
300
175
  ```bash
301
176
  npm install --global epiq