mcp-taskflow 0.1.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/CHANGELOG.md +13 -0
- package/LICENSE.md +21 -0
- package/README.md +275 -0
- package/dist/config/pathResolver.d.ts +33 -0
- package/dist/config/pathResolver.d.ts.map +1 -0
- package/dist/config/pathResolver.js +130 -0
- package/dist/config/pathResolver.js.map +1 -0
- package/dist/data/fileOperations.d.ts +43 -0
- package/dist/data/fileOperations.d.ts.map +1 -0
- package/dist/data/fileOperations.js +248 -0
- package/dist/data/fileOperations.js.map +1 -0
- package/dist/data/memoryStore.d.ts +86 -0
- package/dist/data/memoryStore.d.ts.map +1 -0
- package/dist/data/memoryStore.js +216 -0
- package/dist/data/memoryStore.js.map +1 -0
- package/dist/data/rulesStore.d.ts +63 -0
- package/dist/data/rulesStore.d.ts.map +1 -0
- package/dist/data/rulesStore.js +196 -0
- package/dist/data/rulesStore.js.map +1 -0
- package/dist/data/schemas.d.ts +840 -0
- package/dist/data/schemas.d.ts.map +1 -0
- package/dist/data/schemas.js +265 -0
- package/dist/data/schemas.js.map +1 -0
- package/dist/data/taskSearchService.d.ts +110 -0
- package/dist/data/taskSearchService.d.ts.map +1 -0
- package/dist/data/taskSearchService.js +165 -0
- package/dist/data/taskSearchService.js.map +1 -0
- package/dist/data/taskStore.d.ts +192 -0
- package/dist/data/taskStore.d.ts.map +1 -0
- package/dist/data/taskStore.js +347 -0
- package/dist/data/taskStore.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +12 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +17 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/projectPromptBuilder.d.ts +13 -0
- package/dist/prompts/projectPromptBuilder.d.ts.map +1 -0
- package/dist/prompts/projectPromptBuilder.js +29 -0
- package/dist/prompts/projectPromptBuilder.js.map +1 -0
- package/dist/prompts/researchPromptBuilder.d.ts +10 -0
- package/dist/prompts/researchPromptBuilder.d.ts.map +1 -0
- package/dist/prompts/researchPromptBuilder.js +20 -0
- package/dist/prompts/researchPromptBuilder.js.map +1 -0
- package/dist/prompts/taskPromptBuilders.d.ts +87 -0
- package/dist/prompts/taskPromptBuilders.d.ts.map +1 -0
- package/dist/prompts/taskPromptBuilders.js +529 -0
- package/dist/prompts/taskPromptBuilders.js.map +1 -0
- package/dist/prompts/templateEngine.d.ts +102 -0
- package/dist/prompts/templateEngine.d.ts.map +1 -0
- package/dist/prompts/templateEngine.js +145 -0
- package/dist/prompts/templateEngine.js.map +1 -0
- package/dist/prompts/templateLoader.d.ts +61 -0
- package/dist/prompts/templateLoader.d.ts.map +1 -0
- package/dist/prompts/templateLoader.js +129 -0
- package/dist/prompts/templateLoader.js.map +1 -0
- package/dist/prompts/templates/v1/templates_en/analyzeTask/index.md +65 -0
- package/dist/prompts/templates/v1/templates_en/analyzeTask/iteration.md +12 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/backupInfo.md +1 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/cancel.md +7 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/empty.md +5 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/index.md +5 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/result.md +7 -0
- package/dist/prompts/templates/v1/templates_en/clearAllTasks/success.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/completed.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/index.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/notFound.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/result.md +5 -0
- package/dist/prompts/templates/v1/templates_en/deleteTask/success.md +5 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/analysisResult.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/complexity.md +15 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/dependencies.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/dependencyTasks.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/implementationGuide.md +3 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/index.md +39 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/notes.md +1 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/relatedFilesSummary.md +5 -0
- package/dist/prompts/templates/v1/templates_en/executeTask/verificationCriteria.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/complatedSummary.md +5 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/dependencies.md +1 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/error.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/implementationGuide.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/index.md +25 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/notFound.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/notes.md +1 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/relatedFiles.md +3 -0
- package/dist/prompts/templates/v1/templates_en/getTaskDetail/verificationCriteria.md +3 -0
- package/dist/prompts/templates/v1/templates_en/initProjectRules/index.md +81 -0
- package/dist/prompts/templates/v1/templates_en/listTasks/index.md +7 -0
- package/dist/prompts/templates/v1/templates_en/listTasks/notFound.md +3 -0
- package/dist/prompts/templates/v1/templates_en/listTasks/taskDetails.md +13 -0
- package/dist/prompts/templates/v1/templates_en/planTask/hasThought.md +4 -0
- package/dist/prompts/templates/v1/templates_en/planTask/index.md +96 -0
- package/dist/prompts/templates/v1/templates_en/planTask/noThought.md +4 -0
- package/dist/prompts/templates/v1/templates_en/planTask/tasks.md +17 -0
- package/dist/prompts/templates/v1/templates_en/processThought/complatedThought.md +6 -0
- package/dist/prompts/templates/v1/templates_en/processThought/index.md +13 -0
- package/dist/prompts/templates/v1/templates_en/processThought/moreThought.md +1 -0
- package/dist/prompts/templates/v1/templates_en/queryTask/index.md +24 -0
- package/dist/prompts/templates/v1/templates_en/queryTask/notFound.md +15 -0
- package/dist/prompts/templates/v1/templates_en/queryTask/taskDetails.md +5 -0
- package/dist/prompts/templates/v1/templates_en/reflectTask/index.md +57 -0
- package/dist/prompts/templates/v1/templates_en/researchMode/index.md +95 -0
- package/dist/prompts/templates/v1/templates_en/researchMode/previousState.md +9 -0
- package/dist/prompts/templates/v1/templates_en/splitTasks/index.md +34 -0
- package/dist/prompts/templates/v1/templates_en/splitTasks/taskDetails.md +12 -0
- package/dist/prompts/templates/v1/templates_en/tests/basic.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/analyzeTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/clearAllTasks.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/deleteTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/executeTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/getTaskDetail.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/initProjectRules.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/listTasks.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/planTask.md +3 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/processThought.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/queryTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/reflectTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/researchMode.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/splitTasks.md +83 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/updateTask.md +1 -0
- package/dist/prompts/templates/v1/templates_en/toolsDescription/verifyTask.md +37 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/emptyUpdate.md +5 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/fileDetails.md +1 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/index.md +7 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/notFound.md +5 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/success.md +9 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/successDetails.md +3 -0
- package/dist/prompts/templates/v1/templates_en/updateTaskContent/validation.md +5 -0
- package/dist/prompts/templates/v1/templates_en/verifyTask/index.md +19 -0
- package/dist/prompts/templates/v1/templates_en/verifyTask/noPass.md +12 -0
- package/dist/prompts/thoughtPromptBuilder.d.ts +11 -0
- package/dist/prompts/thoughtPromptBuilder.d.ts.map +1 -0
- package/dist/prompts/thoughtPromptBuilder.js +30 -0
- package/dist/prompts/thoughtPromptBuilder.js.map +1 -0
- package/dist/server/container.d.ts +111 -0
- package/dist/server/container.d.ts.map +1 -0
- package/dist/server/container.js +135 -0
- package/dist/server/container.js.map +1 -0
- package/dist/server/logger.d.ts +98 -0
- package/dist/server/logger.d.ts.map +1 -0
- package/dist/server/logger.js +295 -0
- package/dist/server/logger.js.map +1 -0
- package/dist/server/mcpServer.d.ts +162 -0
- package/dist/server/mcpServer.d.ts.map +1 -0
- package/dist/server/mcpServer.js +236 -0
- package/dist/server/mcpServer.js.map +1 -0
- package/dist/tools/project/index.d.ts +7 -0
- package/dist/tools/project/index.d.ts.map +1 -0
- package/dist/tools/project/index.js +7 -0
- package/dist/tools/project/index.js.map +1 -0
- package/dist/tools/project/projectTools.d.ts +17 -0
- package/dist/tools/project/projectTools.d.ts.map +1 -0
- package/dist/tools/project/projectTools.js +73 -0
- package/dist/tools/project/projectTools.js.map +1 -0
- package/dist/tools/research/index.d.ts +7 -0
- package/dist/tools/research/index.d.ts.map +1 -0
- package/dist/tools/research/index.js +7 -0
- package/dist/tools/research/index.js.map +1 -0
- package/dist/tools/research/researchTools.d.ts +16 -0
- package/dist/tools/research/researchTools.d.ts.map +1 -0
- package/dist/tools/research/researchTools.js +41 -0
- package/dist/tools/research/researchTools.js.map +1 -0
- package/dist/tools/task/index.d.ts +8 -0
- package/dist/tools/task/index.d.ts.map +1 -0
- package/dist/tools/task/index.js +8 -0
- package/dist/tools/task/index.js.map +1 -0
- package/dist/tools/task/taskTools.d.ts +32 -0
- package/dist/tools/task/taskTools.d.ts.map +1 -0
- package/dist/tools/task/taskTools.js +542 -0
- package/dist/tools/task/taskTools.js.map +1 -0
- package/dist/tools/thought/index.d.ts +7 -0
- package/dist/tools/thought/index.d.ts.map +1 -0
- package/dist/tools/thought/index.js +7 -0
- package/dist/tools/thought/index.js.map +1 -0
- package/dist/tools/thought/thoughtTools.d.ts +16 -0
- package/dist/tools/thought/thoughtTools.d.ts.map +1 -0
- package/dist/tools/thought/thoughtTools.js +47 -0
- package/dist/tools/thought/thoughtTools.js.map +1 -0
- package/docs/API.md +32 -0
- package/docs/ARCHITECTURE.md +44 -0
- package/docs/COMPATIBILITY_REPORT.md +26 -0
- package/docs/PERFORMANCE.md +66 -0
- package/package.json +77 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
### [0.1.0](https://www.npmjs.com/package/taskflow-mcp/v/0.1.0) - 2026-02-05
|
|
8
|
+
|
|
9
|
+
Initial package release
|
|
10
|
+
|
|
11
|
+
This project uses Changesets to generate release notes.
|
|
12
|
+
|
|
13
|
+
For a new release, run the Changesets workflow to create a release PR with version bumps and changelog updates.
|
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 TaskFlow MCP contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# TaskFlow MCP
|
|
2
|
+
|
|
3
|
+
[](https://badge.fury.io/js/mcp-taskflow)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Table of Contents 📌
|
|
8
|
+
|
|
9
|
+
- [Overview](#overview-)
|
|
10
|
+
- [What Is MCP?](#what-is-mcp-)
|
|
11
|
+
- [Quick Start](#quick-start-)
|
|
12
|
+
- [Installation](#installation-)
|
|
13
|
+
- [Basic Usage](#basic-usage-)
|
|
14
|
+
- [Tools Overview](#tools-overview-)
|
|
15
|
+
- [Example: Agent-in-the-Loop (ReBAC Feature)](#example-agent-in-the-loop-rebac-feature-)
|
|
16
|
+
- [Documentation](#documentation-)
|
|
17
|
+
- [Development](#development-)
|
|
18
|
+
- [Versioning](#versioning-)
|
|
19
|
+
- [License](#license-)
|
|
20
|
+
|
|
21
|
+
A local Model Context Protocol (MCP) server that gives AI agents structured task planning, execution tracking, and guided research workflows.
|
|
22
|
+
|
|
23
|
+
## Overview ✨
|
|
24
|
+
|
|
25
|
+
TaskFlow MCP helps agents turn vague goals into concrete, trackable work. It provides a persistent task system plus research and reasoning tools so agents can plan, execute, and verify tasks without re‑sending long context every time.
|
|
26
|
+
|
|
27
|
+
### Why Use It ✅
|
|
28
|
+
|
|
29
|
+
- **Lower token use**: retrieve structured task summaries instead of restating context.
|
|
30
|
+
- **Smarter workflows**: dependency‑aware planning reduces rework.
|
|
31
|
+
- **Better handoffs**: tasks, notes, and research state persist across sessions.
|
|
32
|
+
- **More reliable execution**: schemas validate tool inputs.
|
|
33
|
+
- **Auditability**: clear task history, verification, and scores.
|
|
34
|
+
|
|
35
|
+
## What Is MCP? 🤔
|
|
36
|
+
|
|
37
|
+
MCP is a standard way for AI tools to call external capabilities over JSON‑RPC (usually STDIO). This server exposes tools that an agent can invoke to plan work, track progress, and keep context consistent across long sessions.
|
|
38
|
+
|
|
39
|
+
## Quick Start 🚀
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pnpm install
|
|
43
|
+
pnpm build
|
|
44
|
+
pnpm start
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Installation 📦
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# npm
|
|
51
|
+
npm install
|
|
52
|
+
|
|
53
|
+
# yarn
|
|
54
|
+
yarn install
|
|
55
|
+
|
|
56
|
+
# pnpm
|
|
57
|
+
pnpm install
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Basic Usage ▶️
|
|
61
|
+
|
|
62
|
+
### Start the server
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pnpm start
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Configure data directory (optional)
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# PowerShell
|
|
72
|
+
$env:DATA_DIR="${PWD}\.mcp-tasks"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Client Setup 📎
|
|
76
|
+
|
|
77
|
+
Use `npx` to run the MCP server directly from GitHub. Replace `<DATA_DIR>` with your preferred data path.
|
|
78
|
+
|
|
79
|
+
Path examples:
|
|
80
|
+
- Windows: `<DATA_DIR>` = `C:\repos\mcp-taskflow\.mcp-tasks`
|
|
81
|
+
- macOS/Linux: `<DATA_DIR>` = `/Users/you/repos/mcp-taskflow/.mcp-tasks`
|
|
82
|
+
|
|
83
|
+
### VS Code (`.vscode/mcp.json`)
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"servers": {
|
|
88
|
+
"mcp-taskflow": {
|
|
89
|
+
"type": "stdio",
|
|
90
|
+
"command": "npx",
|
|
91
|
+
"args": ["mcp-taskflow"],
|
|
92
|
+
"env": {
|
|
93
|
+
"DATA_DIR": "<DATA_DIR>"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Claude Desktop (settings JSON)
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"mcpServers": {
|
|
105
|
+
"mcp-taskflow": {
|
|
106
|
+
"command": "npx",
|
|
107
|
+
"args": ["mcp-taskflow"],
|
|
108
|
+
"env": { "DATA_DIR": "<DATA_DIR>" }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Codex (config.toml)
|
|
115
|
+
|
|
116
|
+
```toml
|
|
117
|
+
[mcp_servers.mcp-taskflow]
|
|
118
|
+
type = "stdio"
|
|
119
|
+
command = "npx"
|
|
120
|
+
args = ["mcp-taskflow"]
|
|
121
|
+
env = { DATA_DIR="<DATA_DIR>" }
|
|
122
|
+
startup_timeout_sec = 120
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Tools Overview 🧰
|
|
126
|
+
|
|
127
|
+
TaskFlow MCP exposes a focused toolset. Most clients surface these as callable actions for your agent.
|
|
128
|
+
|
|
129
|
+
### Planning
|
|
130
|
+
|
|
131
|
+
- **plan_task**: turn a goal into a structured plan
|
|
132
|
+
- **split_tasks**: split a plan into discrete tasks with dependencies
|
|
133
|
+
- **analyze_task**: capture analysis and rationale
|
|
134
|
+
- **reflect_task**: record reflections and improvements
|
|
135
|
+
|
|
136
|
+
### Task Management
|
|
137
|
+
|
|
138
|
+
- **list_tasks**: list tasks by status
|
|
139
|
+
- **get_task_detail**: show full details for a task
|
|
140
|
+
- **query_task**: search tasks by keyword or ID
|
|
141
|
+
- **create_task**: create a task directly
|
|
142
|
+
- **update_task**: update status, notes, dependencies, or metadata
|
|
143
|
+
- **delete_task**: remove a task by ID
|
|
144
|
+
- **clear_all_tasks**: clear the task list
|
|
145
|
+
|
|
146
|
+
### Workflow
|
|
147
|
+
|
|
148
|
+
- **execute_task**: mark a task in progress and generate an execution prompt
|
|
149
|
+
- **verify_task**: score and mark a task complete
|
|
150
|
+
|
|
151
|
+
### Research & Project
|
|
152
|
+
|
|
153
|
+
- **research_mode**: guided research with state tracking
|
|
154
|
+
- **process_thought**: capture a structured reasoning step
|
|
155
|
+
- **init_project_rules**: create or refresh project rules
|
|
156
|
+
- **get_server_info**: get server status and task counts
|
|
157
|
+
|
|
158
|
+
## Example: Agent-in-the-Loop (ReBAC Feature) 🧪
|
|
159
|
+
|
|
160
|
+
Below is a simple, human‑readable script that shows how a user might ask an agent to plan and execute a feature. The agent uses TaskFlow MCP tools behind the scenes, but you don’t need MCP details to follow the flow.
|
|
161
|
+
|
|
162
|
+
**User**
|
|
163
|
+
“I want to add a Relationship‑Based system. Create a task list and start working through it.”
|
|
164
|
+
|
|
165
|
+
**Agent**
|
|
166
|
+
“I’ll plan the work, split it into tasks, and track progress as we go.”
|
|
167
|
+
|
|
168
|
+
**Agent (planning summary)**
|
|
169
|
+
“Here’s a structured plan with dependencies and a clear execution order.”
|
|
170
|
+
|
|
171
|
+
1. **Define the ReBAC model**
|
|
172
|
+
- Entities, relations, and permission checks
|
|
173
|
+
- Identify critical query patterns
|
|
174
|
+
2. **Design the storage layer**
|
|
175
|
+
- Graph storage schema and indexes
|
|
176
|
+
- Query strategy for path checks
|
|
177
|
+
3. **Implement the policy engine**
|
|
178
|
+
- Relationship evaluation
|
|
179
|
+
- Cached query results
|
|
180
|
+
4. **Integrate with existing auth**
|
|
181
|
+
- Request context mapping
|
|
182
|
+
- Backward compatibility
|
|
183
|
+
5. **Add tests and benchmarks**
|
|
184
|
+
- Unit tests for rules
|
|
185
|
+
- Integration tests for policy decisions
|
|
186
|
+
|
|
187
|
+
**Agent (starts work)**
|
|
188
|
+
“I’ll mark the first task as in progress and add notes as I go.”
|
|
189
|
+
|
|
190
|
+
**Progress updates**
|
|
191
|
+
- Task 1: In progress — “Drafted entity/relationship schema and example checks”
|
|
192
|
+
- Task 1: Completed — “Added model doc and validation rules”
|
|
193
|
+
- Task 2: In progress — “Evaluating graph storage options”
|
|
194
|
+
|
|
195
|
+
**Task verification example (with scoring and challenges)**
|
|
196
|
+
**Agent**
|
|
197
|
+
“I’ve verified Task 1 and logged a score.”
|
|
198
|
+
|
|
199
|
+
- **Score**: 92/100
|
|
200
|
+
- **Checks passed**: model completeness, schema validation, examples included
|
|
201
|
+
- **Challenges**: ambiguous relationship naming in legacy data; resolved by adding a normalization step and a short mapping table
|
|
202
|
+
- **Next step**: start Task 2 with the normalized model in place
|
|
203
|
+
|
|
204
|
+
**Why this helps**
|
|
205
|
+
- The agent keeps a durable task list and status updates.
|
|
206
|
+
- You can stop and resume without losing context.
|
|
207
|
+
- Large features become manageable, with explicit dependencies.
|
|
208
|
+
|
|
209
|
+
## Documentation 📚
|
|
210
|
+
|
|
211
|
+
| Document | Purpose |
|
|
212
|
+
|---|---|
|
|
213
|
+
| **[docs/API.md](./docs/API.md)** | Tool overview and API surface |
|
|
214
|
+
| **[docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md)** | High-level architecture |
|
|
215
|
+
| **[docs/PERFORMANCE.md](./docs/PERFORMANCE.md)** | Benchmarks and performance targets |
|
|
216
|
+
| **[AI_AGENT_QUICK_REFERENCE.md](./AI_AGENT_QUICK_REFERENCE.md)** | Agent workflow reference |
|
|
217
|
+
| **[SECURITY.md](./SECURITY.md)** | Threat model and controls |
|
|
218
|
+
| **[CONTRIBUTING.md](./CONTRIBUTING.md)** | Contribution workflow and changesets |
|
|
219
|
+
| **[CHANGELOG.md](./CHANGELOG.md)** | Release notes |
|
|
220
|
+
|
|
221
|
+
## Development 🛠️
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
pnpm test
|
|
225
|
+
pnpm type-check
|
|
226
|
+
pnpm lint
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Versioning 🏷️
|
|
230
|
+
|
|
231
|
+
This project uses **Changesets** for versioning and release notes. See `CONTRIBUTING.md` for guidance.
|
|
232
|
+
|
|
233
|
+
## Release and Git-Based Usage 🚢
|
|
234
|
+
|
|
235
|
+
Git-based execution assumes the repository is buildable and includes a valid `bin` entry in `package.json`. For production or shared use, prefer a tagged release published via Changesets.
|
|
236
|
+
|
|
237
|
+
Typical flow:
|
|
238
|
+
1. Add a changeset in your PR.
|
|
239
|
+
2. CI creates a release PR with version bumps and changelog entries.
|
|
240
|
+
3. Merging the release PR publishes to npm and creates a GitHub release.
|
|
241
|
+
|
|
242
|
+
Use git-based execution for fast testing; use npm releases for stable installs.
|
|
243
|
+
|
|
244
|
+
### Git-based launch (recommended)
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
# pnpm
|
|
248
|
+
pnpm dlx git+https://github.com/CalebGerman/mcp-taskflow.git mcp-taskflow
|
|
249
|
+
|
|
250
|
+
# npx (fallback)
|
|
251
|
+
npx git+https://github.com/CalebGerman/mcp-taskflow.git mcp-taskflow
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Prerequisites**:
|
|
255
|
+
- `bin` entry points to `dist/index.js`
|
|
256
|
+
- `pnpm build` completes successfully
|
|
257
|
+
|
|
258
|
+
## License 📄
|
|
259
|
+
|
|
260
|
+
MIT. See **[LICENSE.md](./LICENSE.md)**.
|
|
261
|
+
|
|
262
|
+
## Credit 🙏
|
|
263
|
+
|
|
264
|
+
Inspired by:
|
|
265
|
+
|
|
266
|
+
```text
|
|
267
|
+
https://github.com/cjo4m06/mcp-shrimp-task-manager
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Also informed by related MCP server patterns and workflows:
|
|
271
|
+
|
|
272
|
+
```text
|
|
273
|
+
https://www.nuget.org/packages/Mcp.TaskAndResearch
|
|
274
|
+
```
|
|
275
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path resolution and sanitization utilities.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Resolve workspace root directory.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveWorkspaceRoot(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve data directory path
|
|
10
|
+
* Uses DATA_DIR environment variable or defaults to .mcp-tasks
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveDataDir(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Sanitize a user-provided file path.
|
|
15
|
+
*/
|
|
16
|
+
export declare function sanitizePath(userPath: string, baseDir: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Get sanitized path within data directory.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getDataPath(relativePath: string, dataDirOverride?: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Ensure directory exists, creating it if necessary.
|
|
23
|
+
*/
|
|
24
|
+
export declare function ensureDirectory(dirPath: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Validate that a path exists and is within allowed directory.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isValidPath(filePath: string, allowedDir: string): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve template file path.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveTemplatePath(templatePath: string): string;
|
|
33
|
+
//# sourceMappingURL=pathResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathResolver.d.ts","sourceRoot":"","sources":["../../src/config/pathResolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAqC7C;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAWvC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAyBtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAShE"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path resolution and sanitization utilities.
|
|
3
|
+
*/
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { dirname } from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Get the current file's directory (ESM equivalent of __dirname)
|
|
9
|
+
*/
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
/**
|
|
13
|
+
* Resolve workspace root directory.
|
|
14
|
+
*/
|
|
15
|
+
export function resolveWorkspaceRoot() {
|
|
16
|
+
// Priority 1: Environment variable
|
|
17
|
+
if (process.env['MCP_WORKSPACE_ROOT']) {
|
|
18
|
+
return path.resolve(process.env['MCP_WORKSPACE_ROOT']);
|
|
19
|
+
}
|
|
20
|
+
// Priority 2: Current working directory
|
|
21
|
+
const cwd = process.cwd();
|
|
22
|
+
// Protected directories check (don't use system directories)
|
|
23
|
+
const protectedDirs = [
|
|
24
|
+
'/etc',
|
|
25
|
+
'/usr',
|
|
26
|
+
'/bin',
|
|
27
|
+
'/sbin',
|
|
28
|
+
'/sys',
|
|
29
|
+
'/proc',
|
|
30
|
+
'C:\\Windows',
|
|
31
|
+
'C:\\Program Files',
|
|
32
|
+
];
|
|
33
|
+
const isProtected = protectedDirs.some(dir => cwd.toLowerCase().startsWith(dir.toLowerCase()));
|
|
34
|
+
if (!isProtected) {
|
|
35
|
+
return cwd;
|
|
36
|
+
}
|
|
37
|
+
// Priority 3: User home directory (fallback)
|
|
38
|
+
const homeDir = process.env['HOME'] || process.env['USERPROFILE'];
|
|
39
|
+
if (homeDir) {
|
|
40
|
+
return homeDir;
|
|
41
|
+
}
|
|
42
|
+
// Last resort: current directory
|
|
43
|
+
return cwd;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve data directory path
|
|
47
|
+
* Uses DATA_DIR environment variable or defaults to .mcp-tasks
|
|
48
|
+
*/
|
|
49
|
+
export function resolveDataDir() {
|
|
50
|
+
const workspaceRoot = resolveWorkspaceRoot();
|
|
51
|
+
const dataDirName = process.env['DATA_DIR'] || '.mcp-tasks';
|
|
52
|
+
// If DATA_DIR is absolute, use it directly
|
|
53
|
+
if (path.isAbsolute(dataDirName)) {
|
|
54
|
+
return dataDirName;
|
|
55
|
+
}
|
|
56
|
+
// Otherwise, relative to workspace root
|
|
57
|
+
return path.join(workspaceRoot, dataDirName);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Sanitize a user-provided file path.
|
|
61
|
+
*/
|
|
62
|
+
export function sanitizePath(userPath, baseDir) {
|
|
63
|
+
// Ensure baseDir is absolute
|
|
64
|
+
const absoluteBaseDir = path.resolve(baseDir);
|
|
65
|
+
// Normalize separators to avoid mixed-separator traversal bypasses
|
|
66
|
+
const normalizedUserPath = userPath.replace(/[\\/]+/g, path.sep);
|
|
67
|
+
// Resolve user path relative to base directory
|
|
68
|
+
const resolvedPath = path.resolve(absoluteBaseDir, normalizedUserPath);
|
|
69
|
+
// Verify path is within baseDir
|
|
70
|
+
const relativePath = path.relative(absoluteBaseDir, resolvedPath);
|
|
71
|
+
const isOutside = relativePath === '' ? false :
|
|
72
|
+
relativePath.startsWith(`..${path.sep}`) ||
|
|
73
|
+
relativePath === '..' ||
|
|
74
|
+
path.isAbsolute(relativePath);
|
|
75
|
+
if (isOutside) {
|
|
76
|
+
throw new Error(`Access denied: path '${userPath}' resolves outside allowed directory`);
|
|
77
|
+
}
|
|
78
|
+
return resolvedPath;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get sanitized path within data directory.
|
|
82
|
+
*/
|
|
83
|
+
export function getDataPath(relativePath, dataDirOverride) {
|
|
84
|
+
const dataDir = dataDirOverride ?? resolveDataDir();
|
|
85
|
+
return sanitizePath(relativePath, dataDir);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Ensure directory exists, creating it if necessary.
|
|
89
|
+
*/
|
|
90
|
+
export async function ensureDirectory(dirPath) {
|
|
91
|
+
const fs = await import('fs/promises');
|
|
92
|
+
try {
|
|
93
|
+
await fs.access(dirPath);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Directory doesn't exist, create it
|
|
97
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Validate that a path exists and is within allowed directory.
|
|
102
|
+
*/
|
|
103
|
+
export async function isValidPath(filePath, allowedDir) {
|
|
104
|
+
try {
|
|
105
|
+
// Check containment
|
|
106
|
+
const absoluteAllowedDir = path.resolve(allowedDir);
|
|
107
|
+
if (!filePath.startsWith(absoluteAllowedDir)) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
// Check existence
|
|
111
|
+
const fs = await import('fs/promises');
|
|
112
|
+
await fs.access(filePath);
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Resolve template file path.
|
|
121
|
+
*/
|
|
122
|
+
export function resolveTemplatePath(templatePath) {
|
|
123
|
+
// Get the dist directory
|
|
124
|
+
const distDir = path.resolve(__dirname, '..');
|
|
125
|
+
// Templates are in dist/prompts/templates/v1/templates_en/
|
|
126
|
+
const templatesBaseDir = path.join(distDir, 'prompts', 'templates', 'v1', 'templates_en');
|
|
127
|
+
// Sanitize to prevent directory traversal
|
|
128
|
+
return sanitizePath(templatePath, templatesBaseDir);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=pathResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathResolver.js","sourceRoot":"","sources":["../../src/config/pathResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomic JSON File Operations
|
|
3
|
+
*
|
|
4
|
+
* Implements atomic write using temp file + fsync + rename.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
/**
|
|
8
|
+
* File operation errors with detailed context
|
|
9
|
+
*/
|
|
10
|
+
export declare class FileOperationError extends Error {
|
|
11
|
+
readonly filePath: string;
|
|
12
|
+
readonly operation: 'read' | 'write' | 'delete';
|
|
13
|
+
readonly originalError?: unknown | undefined;
|
|
14
|
+
constructor(message: string, filePath: string, operation: 'read' | 'write' | 'delete', originalError?: unknown | undefined);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Read and parse JSON file with Zod schema validation.
|
|
18
|
+
*/
|
|
19
|
+
export declare function readJsonFile<T>(filePath: string, schema: z.ZodSchema<T>): Promise<T>;
|
|
20
|
+
/**
|
|
21
|
+
* Write JSON file atomically using temp file + rename pattern.
|
|
22
|
+
*/
|
|
23
|
+
export declare function writeJsonFile<T>(filePath: string, data: T, schema: z.ZodSchema<T>): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a file exists
|
|
26
|
+
*
|
|
27
|
+
* @param filePath - Absolute file path
|
|
28
|
+
* @returns true if file exists, false otherwise
|
|
29
|
+
*/
|
|
30
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Read JSON file or return default value if file doesn't exist.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readJsonFileOrDefault<T>(filePath: string, schema: z.ZodSchema<T>, defaultValue: T): Promise<T>;
|
|
35
|
+
/**
|
|
36
|
+
* List all files in a directory.
|
|
37
|
+
*/
|
|
38
|
+
export declare function listFiles(dirPath: string): Promise<string[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Delete a file with retry logic.
|
|
41
|
+
*/
|
|
42
|
+
export declare function deleteFile(filePath: string): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=fileOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileOperations.d.ts","sourceRoot":"","sources":["../../src/data/fileOperations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,QAAQ,EAAE,MAAM;aAChB,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ;aACtC,aAAa,CAAC,EAAE,OAAO;gBAHvC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,EACtC,aAAa,CAAC,EAAE,OAAO,YAAA;CAK1C;AAgDD;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,CAAC,CAmDZ;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,IAAI,CAAC,CAsDf;AAkCD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACtB,YAAY,EAAE,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAelE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhE"}
|