Skip to content

Commit 66487d8

Browse files
committed
docs: update tool count 58 → 67, add epic documentation across all docs
Update tool counts across ~40 files for 9 new tools (8 epic tools + tasks_reorder). Add epic tool reference, concepts guide, in-app help, and prompt builder support. Update architecture docs, REST API docs, site docs, and UI help content.
1 parent a02f665 commit 66487d8

44 files changed

Lines changed: 927 additions & 74 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
MCP server that builds a semantic graph memory from a project directory — indexing
66
markdown docs, TypeScript/JavaScript source code, and all project files into six
7-
interconnected graphs. Exposes 58 MCP tools + REST API + Web UI.
7+
interconnected graphs. Exposes 67 MCP tools + REST API + Web UI.
88

99
**Full documentation**: see [docs/](docs/README.md)
1010

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
An MCP server that builds a **semantic graph memory** from a project directory.
99
Indexes markdown docs, TypeScript/JavaScript source code, and all project files into graph structures,
10-
then exposes them as **58 MCP tools** + **REST API** + **Web UI**.
10+
then exposes them as **67 MCP tools** + **REST API** + **Web UI**.
1111

1212
![graphmemory dashboard](docs/img/dashboard-dark.png)
1313

@@ -131,7 +131,7 @@ See [docs/docker.md](docs/docker.md) for details.
131131
| **Workspaces** | Share knowledge/tasks/skills across related projects |
132132
| **Auth & ACL** | Password login (JWT), API keys, OAuth 2.0 (PKCE), 4-level access control |
133133

134-
## 58 MCP tools
134+
## 67 MCP tools
135135

136136
| Group | Tools |
137137
|-------|-------|
@@ -140,7 +140,8 @@ See [docs/docker.md](docs/docker.md) for details.
140140
| **Code** | `code_list_files`, `code_get_file_symbols`, `code_search`, `code_get_symbol`, `code_search_files` |
141141
| **Files** | `files_list`, `files_search`, `files_get_info` |
142142
| **Knowledge** | `notes_create`, `notes_update`, `notes_delete`, `notes_get`, `notes_list`, `notes_search`, `notes_create_link`, `notes_delete_link`, `notes_list_links`, `notes_find_linked`, `notes_add_attachment`, `notes_remove_attachment` |
143-
| **Tasks** | `tasks_create`, `tasks_update`, `tasks_delete`, `tasks_get`, `tasks_list`, `tasks_search`, `tasks_move`, `tasks_link`, `tasks_create_link`, `tasks_delete_link`, `tasks_find_linked`, `tasks_add_attachment`, `tasks_remove_attachment` |
143+
| **Tasks** | `tasks_create`, `tasks_update`, `tasks_delete`, `tasks_get`, `tasks_list`, `tasks_search`, `tasks_move`, `tasks_reorder`, `tasks_link`, `tasks_create_link`, `tasks_delete_link`, `tasks_find_linked`, `tasks_add_attachment`, `tasks_remove_attachment` |
144+
| **Epics** | `epics_create`, `epics_update`, `epics_delete`, `epics_get`, `epics_list`, `epics_search`, `epics_link_task`, `epics_unlink_task` |
144145
| **Skills** | `skills_create`, `skills_update`, `skills_delete`, `skills_get`, `skills_list`, `skills_search`, `skills_recall`, `skills_bump_usage`, `skills_link`, `skills_create_link`, `skills_delete_link`, `skills_find_linked`, `skills_add_attachment`, `skills_remove_attachment` |
145146

146147
## Web UI

SPEC.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ access control, and real-time updates.
2222

2323
See [docs/graphs-overview.md](docs/graphs-overview.md) for data models, node IDs, and edge types.
2424

25-
## 58 MCP tools
25+
## 67 MCP tools
2626

2727
| Group | Count | Condition |
2828
|-------|-------|-----------|
@@ -31,7 +31,8 @@ See [docs/graphs-overview.md](docs/graphs-overview.md) for data models, node IDs
3131
| Code | 5 | code enabled |
3232
| File index | 3 | always |
3333
| Knowledge | 12 | always |
34-
| Tasks | 13 | always |
34+
| Tasks | 14 | always |
35+
| Epics | 8 | task graph enabled |
3536
| Skills | 14 | always |
3637

3738
See [docs/api-mcp.md](docs/api-mcp.md) for schemas and [docs/mcp-tools-guide.md](docs/mcp-tools-guide.md) for usage guide.

docs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
- [REST API](api-rest.md) — full endpoint reference
4545
- [REST API Patterns](api-patterns.md) — middleware chain, validation, auth, error handling, mutation serialization
46-
- [MCP Tools Reference](api-mcp.md) — all 58 MCP tools with input/output schemas
46+
- [MCP Tools Reference](api-mcp.md) — all 67 MCP tools with input/output schemas
4747
- [MCP Tools Guide](mcp-tools-guide.md) — detailed descriptions, when to use, best practices
4848
- [WebSocket](api-websocket.md) — real-time event types and format
4949

docs/api-mcp.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
**Files**: `src/api/index.ts`, `src/api/tools/`
44

5-
58 MCP tools exposed via HTTP transport.
5+
67 MCP tools exposed via HTTP transport.
66

77
## Authentication
88

@@ -33,7 +33,8 @@ The set of tools registered for an MCP session depends on:
3333
| Code | 5 | code graph enabled | `tools/code/` |
3434
| File index | 3 | file index enabled | `tools/file-index/` |
3535
| Knowledge | 12 | knowledge graph enabled | `tools/knowledge/` |
36-
| Tasks | 13 | task graph enabled | `tools/tasks/` |
36+
| Tasks | 14 | task graph enabled | `tools/tasks/` |
37+
| Epics | 8 | task graph enabled | `tools/epics/` |
3738
| Skills | 14 | skill graph enabled | `tools/skills/` |
3839

3940
## Context tool
@@ -121,6 +122,22 @@ Requires both DocGraph and CodeGraph to be enabled. Bridges code definitions wit
121122
| `tasks_find_linked` | `targetId`, `targetGraph` + optional `kind`, `projectId` | `[{ taskId, title, kind, status, priority, tags }]` |
122123
| `tasks_add_attachment` | `taskId`, `filePath` (absolute path on disk) | `{ filename, mimeType, size, addedAt }` |
123124
| `tasks_remove_attachment` | `taskId`, `filename` | `{ deleted: filename }` |
125+
| `tasks_reorder` | `taskId`, `beforeId?`, `afterId?` | `{ taskId, order }` |
126+
127+
## Epic tools
128+
129+
Epics use the TaskGraph with a `nodeType: "epic"` discriminator. They group tasks via `belongs_to` edges.
130+
131+
| Tool | Input | Output |
132+
|------|-------|--------|
133+
| `epics_create` | `title`, `description` + optional `status`, `priority`, `tags` | `{ epicId }` |
134+
| `epics_update` | `epicId` + optional `title`, `description`, `status`, `priority`, `tags`, `expectedVersion` | `{ epicId, updated }` |
135+
| `epics_delete` | `epicId` | `{ epicId, deleted }` |
136+
| `epics_get` | `epicId` | `{ id, title, description, status, priority, tags, tasks, createdAt, updatedAt }` |
137+
| `epics_list` | optional `status`, `priority`, `tag`, `filter`, `limit` | `[{ id, title, description, status, priority, tags, taskCount, createdAt, updatedAt }]` |
138+
| `epics_search` | `query` + optional `topK`, `maxResults`, `minScore`, `searchMode` | `[{ id, title, description, status, priority, tags, score }]` |
139+
| `epics_link_task` | `epicId`, `taskId` | `{ epicId, taskId, linked }` |
140+
| `epics_unlink_task` | `epicId`, `taskId` | `{ epicId, taskId, unlinked }` |
124141

125142
## Skill tools
126143

docs/api-rest.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ See [Authentication](authentication.md) for details on auth middleware.
8383
| PUT | `/api/projects/:id/tasks/:taskId` | Update task (partial) |
8484
| DELETE | `/api/projects/:id/tasks/:taskId` | Delete task (204) |
8585
| POST | `/api/projects/:id/tasks/:taskId/move` | Move task status (body: `status`) |
86+
| POST | `/api/projects/:id/tasks/:taskId/reorder` | Reorder task (body: `beforeId?`, `afterId?`) |
87+
| POST | `/api/projects/:id/tasks/bulk/move` | Bulk move tasks (body: `taskIds`, `status`) |
88+
| POST | `/api/projects/:id/tasks/bulk/priority` | Bulk set priority (body: `taskIds`, `priority`) |
89+
| POST | `/api/projects/:id/tasks/bulk/delete` | Bulk delete tasks (body: `taskIds`) |
8690
| GET | `/api/projects/:id/tasks/search?q=...` | Search tasks |
8791
| POST | `/api/projects/:id/tasks/links` | Create task link |
8892
| DELETE | `/api/projects/:id/tasks/links` | Delete task link |
@@ -93,6 +97,20 @@ See [Authentication](authentication.md) for details on auth middleware.
9397
| GET | `/api/projects/:id/tasks/:taskId/attachments/:filename` | Download attachment |
9498
| DELETE | `/api/projects/:id/tasks/:taskId/attachments/:filename` | Delete attachment |
9599

100+
## Epic endpoints
101+
102+
| Method | Path | Description |
103+
|--------|------|-------------|
104+
| GET | `/api/projects/:id/epics` | List epics (query: `status`, `priority`, `tag`, `filter`, `limit`) |
105+
| POST | `/api/projects/:id/epics` | Create epic (body: `title`, `description`, `priority`, `status`, `tags`) |
106+
| GET | `/api/projects/:id/epics/search?q=...` | Search epics |
107+
| GET | `/api/projects/:id/epics/:epicId` | Get epic (includes linked tasks) |
108+
| PUT | `/api/projects/:id/epics/:epicId` | Update epic (partial) |
109+
| DELETE | `/api/projects/:id/epics/:epicId` | Delete epic (204) |
110+
| POST | `/api/projects/:id/epics/:epicId/link` | Link task to epic (body: `taskId`) |
111+
| DELETE | `/api/projects/:id/epics/:epicId/link` | Unlink task from epic (body: `taskId`) |
112+
| GET | `/api/projects/:id/epics/:epicId/tasks` | List tasks belonging to epic |
113+
96114
## Skill endpoints
97115

98116
| Method | Path | Description |

docs/architecture.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
┌────────┐ ┌──────────┐ ┌──────────┐
5858
│ MCP │ │ REST API │ │ UI │
5959
│ Tools │ │ Express │ │ React │
60-
│ (58) │ │ + WS │ │ + Vite │
60+
│ (67) │ │ + WS │ │ + Vite │
6161
└────────┘ └──────────┘ └──────────┘
6262
```
6363

@@ -91,7 +91,7 @@ Entry point: `src/cli/index.ts` (Commander.js). Three main commands (`index`, `m
9191

9292
Three interfaces to the graph layer:
9393

94-
- **MCP Tools** (`src/api/tools/`) — 58 tools exposed via MCP protocol (HTTP)
94+
- **MCP Tools** (`src/api/tools/`) — 67 tools exposed via MCP protocol (HTTP)
9595
- **REST API** (`src/api/rest/`) — Express routes for CRUD + search
9696
- **WebSocket** (`src/api/rest/websocket.ts`) — real-time event push
9797

@@ -165,7 +165,8 @@ src/
165165
docs/ # 10 MCP doc tools
166166
code/ # 5 MCP code tools
167167
knowledge/ # 12 MCP knowledge tools
168-
tasks/ # 13 MCP task tools
168+
tasks/ # 14 MCP task tools
169+
epics/ # 8 MCP epic tools
169170
skills/ # 14 MCP skill tools
170171
file-index/ # 3 MCP file index tools
171172
context/ # 1 MCP context tool

docs/concepts-tasks.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,29 @@ Graph Memory tasks aren't meant to replace your project management tool. They se
156156

157157
Think of them as **working memory** for the AI-human collaboration, not as a permanent project management system.
158158

159+
## Task ordering
160+
161+
Tasks support an `order` field for manual positioning within a status column. The ordering system uses **gap-based integers** — new tasks are assigned order values with large gaps (e.g. 1000, 2000, 3000) so that inserting between two tasks just picks the midpoint without renumbering siblings.
162+
163+
The `tasks_reorder` tool repositions a task by specifying `beforeId` and/or `afterId` anchors. When gaps become too small, the system automatically renumbers all tasks in the column.
164+
165+
## Epics and hierarchy
166+
167+
Epics are higher-level groupings that organize related tasks into initiatives or milestones. They live in the same TaskGraph as tasks, distinguished by a `nodeType: "epic"` field.
168+
169+
Tasks are linked to epics via `belongs_to` edges:
170+
171+
```
172+
"implement-auth" → [belongs_to] → "q4-security-epic"
173+
"fix-session-bug" → [belongs_to] → "q4-security-epic"
174+
```
175+
176+
Key properties:
177+
- A task can belong to at most one epic
178+
- Deleting an epic removes the `belongs_to` edges but does not delete the tasks
179+
- Epics have the same status and priority fields as tasks
180+
- `epics_get` returns the epic with its full task list
181+
159182
## Configuration
160183

161184
```yaml

docs/graph-tasks.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ Task tracking with kanban workflow, priorities, due dates, estimates, assignees,
2424
| `createdAt` | number | Epoch ms |
2525
| `updatedAt` | number | Epoch ms |
2626
| `createdBy` | string | Author |
27+
| `nodeType` | `"task"` \| `"epic"` | Discriminator (default `"task"`) |
28+
| `order` | number \| null | Manual sort position (gap-based integers) |
2729
| `updatedBy` | string | Author |
2830
| `proxyFor` | object | Present only on phantom proxy nodes |
2931

@@ -52,6 +54,7 @@ Slug from title: `"implement-auth"`. Duplicates get `"implement-auth::2"`.
5254
| `subtask_of` | task → parent task |
5355
| `blocks` | task → blocked task |
5456
| `related_to` | free-form relation |
57+
| `belongs_to` | task → epic |
5558

5659
### Cross-graph links
5760

@@ -123,6 +126,7 @@ See [File Mirror](file-mirror.md) for details.
123126
| `listTasks(opts)` | List with filters (status, priority, tag, assignee) |
124127
| `searchTasks(query, opts)` | Hybrid search with BFS expansion |
125128
| `moveTask(taskId, status)` | Change status, manage completedAt |
129+
| `reorderTask(taskId, opts)` | Reposition task (beforeId/afterId anchors) |
126130

127131
### Link operations
128132

@@ -140,6 +144,19 @@ See [File Mirror](file-mirror.md) for details.
140144
| `addAttachment(taskId, filename, content)` | Add file attachment |
141145
| `removeAttachment(taskId, filename)` | Remove file attachment |
142146

147+
### Epic operations
148+
149+
| Method | Description |
150+
|--------|-------------|
151+
| `createEpic(fields)` | Create epic (nodeType: "epic"), embed, mirror |
152+
| `updateEpic(epicId, fields)` | Partial update, re-embed |
153+
| `deleteEpic(epicId)` | Delete epic and belongs_to edges (tasks preserved) |
154+
| `getEpic(epicId)` | Fetch epic with linked tasks list |
155+
| `listEpics(opts)` | List epics with filters |
156+
| `searchEpics(query, opts)` | Hybrid search over epics |
157+
| `linkTaskToEpic(epicId, taskId)` | Create belongs_to edge |
158+
| `unlinkTaskFromEpic(epicId, taskId)` | Remove belongs_to edge |
159+
143160
## Persistence
144161

145162
Stored as `tasks.json` in the `graphMemory` directory. In workspaces, shared across member projects.

docs/graphs-overview.md

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ The system maintains multiple graph types, all built on **Graphology** (in-memor
1010
| **CodeGraph** | `code.json` | `CodeGraphManager` | AST symbols from TS/JS source |
1111
| **KnowledgeGraph** | `knowledge.json` | `KnowledgeGraphManager` | User/LLM-created notes and facts |
1212
| **FileIndexGraph** | `file-index.json` | `FileIndexGraphManager` | All project files and directories |
13-
| **TaskGraph** | `tasks.json` | `TaskGraphManager` | Tasks with kanban workflow |
13+
| **TaskGraph** | `tasks.json` | `TaskGraphManager` | Tasks and epics with kanban workflow |
1414
| **SkillGraph** | `skills.json` | `SkillGraphManager` | Reusable recipes and procedures |
1515

1616
See individual graph pages for detailed documentation:
@@ -36,7 +36,7 @@ These graphs are populated automatically by the indexer scanning project files:
3636
These graphs are populated manually (by users or LLMs) via MCP tools or REST API:
3737

3838
- **KnowledgeGraph** — notes, facts, decisions
39-
- **TaskGraph** — tasks, kanban boards
39+
- **TaskGraph** — tasks, epics, kanban boards
4040
- **SkillGraph** — recipes, procedures
4141

4242
CRUD-only graphs also feature:
@@ -135,7 +135,7 @@ In workspaces, cross-graph links between projects use project-scoped proxy IDs:
135135
| CodeGraph | `"fileId"`, `"fileId::Symbol"`, `"fileId::Class::method"` | `"src/auth.ts"`, `"src/auth.ts::loginUser"` |
136136
| KnowledgeGraph | `"slug-from-title"`, `"slug::2"` | `"auth-uses-jwt"`, `"auth-uses-jwt::2"` |
137137
| FileIndexGraph | file path, dir path, `"."` | `"src/lib/config.ts"`, `"src/lib"`, `"."` |
138-
| TaskGraph | `"slug-from-title"`, `"slug::2"` | `"implement-auth"`, `"implement-auth::2"` |
138+
| TaskGraph | `"slug-from-title"`, `"slug::2"` (tasks and epics share IDs) | `"implement-auth"`, `"q4-auth-epic"` |
139139
| SkillGraph | `"slug-from-title"`, `"slug::2"` | `"add-rest-endpoint"`, `"add-rest-endpoint::2"` |
140140

141141
Slug generation uses `slugify()` — lowercase, replace non-alphanumeric with hyphens, trim, deduplicate with `::2`, `::3`, etc.
@@ -148,6 +148,15 @@ The tokenizer splits on whitespace, punctuation, and camelCase (`getUserById`
148148

149149
See [Search](search.md) for the hybrid search algorithm.
150150

151+
## Epics in TaskGraph
152+
153+
Epics are stored in the same TaskGraph alongside tasks, distinguished by a `nodeType` field:
154+
155+
- **Tasks** have `nodeType: "task"` (default)
156+
- **Epics** have `nodeType: "epic"`
157+
158+
Tasks are linked to epics via `belongs_to` edges. Epics support an `order` field for positioning, using gap-based integers for efficient reordering without renumbering siblings. This shared-graph approach avoids a separate persistence file while keeping epics and tasks queryable together.
159+
151160
## Enabled/disabled graphs
152161

153162
Each graph can be disabled in the config:

0 commit comments

Comments
 (0)