saga-mcp 1.3.0 → 1.4.1
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/README.md +10 -1
- package/dist/db.js +5 -0
- package/dist/db.js.map +1 -1
- package/dist/helpers/sql-builder.js +1 -1
- package/dist/helpers/sql-builder.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +1 -1
- package/dist/schema.js +1 -0
- package/dist/schema.js.map +1 -1
- package/dist/tools/activity.js +17 -0
- package/dist/tools/activity.js.map +1 -1
- package/dist/tools/export-import.d.ts +4 -0
- package/dist/tools/export-import.js +222 -0
- package/dist/tools/export-import.js.map +1 -0
- package/dist/tools/tasks.js +71 -5
- package/dist/tools/tasks.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/manifest.json +5 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,7 +12,9 @@ A Jira-like project tracker MCP server for AI agents. SQLite-backed, per-project
|
|
|
12
12
|
- **Dashboard**: One tool call gives full project overview (stats, blocked tasks, recent changes)
|
|
13
13
|
- **Notes system**: Decisions, context, meeting notes, blockers — all searchable
|
|
14
14
|
- **Batch operations**: Create multiple subtasks or update multiple tasks in one call
|
|
15
|
-
- **
|
|
15
|
+
- **25 focused tools**: With MCP safety annotations on every tool
|
|
16
|
+
- **Import/export**: Full project backup and migration as JSON
|
|
17
|
+
- **Source references**: Link tasks to specific code locations
|
|
16
18
|
- **Cross-platform**: Works on macOS, Windows, and Linux
|
|
17
19
|
|
|
18
20
|
## Quick Start
|
|
@@ -130,6 +132,13 @@ No API keys, no accounts, no external services. Everything is stored locally in
|
|
|
130
132
|
| `activity_log` | View change history with filters | `readOnly: true` |
|
|
131
133
|
| `tracker_session_diff` | Show what changed since a given timestamp — call at session start | `readOnly: true` |
|
|
132
134
|
|
|
135
|
+
### Import / Export
|
|
136
|
+
|
|
137
|
+
| Tool | Description | Annotations |
|
|
138
|
+
|------|-------------|-------------|
|
|
139
|
+
| `tracker_export` | Export full project as nested JSON for backup or migration | `readOnly: true` |
|
|
140
|
+
| `tracker_import` | Import project from JSON (matching export format) | `readOnly: false` |
|
|
141
|
+
|
|
133
142
|
## Usage Examples
|
|
134
143
|
|
|
135
144
|
### Example 1: Starting a new project
|
package/dist/db.js
CHANGED
|
@@ -14,6 +14,11 @@ export function getDb() {
|
|
|
14
14
|
db.pragma('busy_timeout = 5000');
|
|
15
15
|
db.pragma('synchronous = NORMAL');
|
|
16
16
|
db.exec(SCHEMA_SQL);
|
|
17
|
+
// Migrations for existing databases
|
|
18
|
+
try {
|
|
19
|
+
db.exec('ALTER TABLE tasks ADD COLUMN source_ref TEXT');
|
|
20
|
+
}
|
|
21
|
+
catch { /* column already exists */ }
|
|
17
22
|
return db;
|
|
18
23
|
}
|
|
19
24
|
export function closeDb() {
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,EAAE,GAA6B,IAAI,CAAC;AAExC,MAAM,UAAU,KAAK;IACnB,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,mIAAmI,CACpI,CAAC;IACJ,CAAC;IAED,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAElC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,EAAE,GAA6B,IAAI,CAAC;AAExC,MAAM,UAAU,KAAK;IACnB,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,mIAAmI,CACpI,CAAC;IACJ,CAAC;IAED,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAElC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,oCAAoC;IACpC,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAEtG,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-builder.js","sourceRoot":"","sources":["../../src/helpers/sql-builder.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"sql-builder.js","sourceRoot":"","sources":["../../src/helpers/sql-builder.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;AAEjE,MAAM,UAAU,WAAW,CACzB,KAAa,EACb,EAAU,EACV,MAA+B,EAC/B,cAAwB;IAExB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO;QACL,GAAG,EAAE,UAAU,KAAK,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B;QACzE,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,YAAsB,EACtB,MAAiB,EACjB,GAAW,EACX,KAAa;IAEb,YAAY,CAAC,IAAI,CACf,mCAAmC,KAAK,mCAAmC,CAC5E,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { definitions as noteDefs, handlers as noteHandlers } from './tools/notes
|
|
|
10
10
|
import { definitions as dashboardDefs, handlers as dashboardHandlers } from './tools/dashboard.js';
|
|
11
11
|
import { definitions as searchDefs, handlers as searchHandlers } from './tools/search.js';
|
|
12
12
|
import { definitions as activityDefs, handlers as activityHandlers } from './tools/activity.js';
|
|
13
|
+
import { definitions as exportImportDefs, handlers as exportImportHandlers } from './tools/export-import.js';
|
|
13
14
|
import { closeDb } from './db.js';
|
|
14
15
|
const ALL_TOOLS = [
|
|
15
16
|
...projectDefs,
|
|
@@ -20,6 +21,7 @@ const ALL_TOOLS = [
|
|
|
20
21
|
...dashboardDefs,
|
|
21
22
|
...searchDefs,
|
|
22
23
|
...activityDefs,
|
|
24
|
+
...exportImportDefs,
|
|
23
25
|
];
|
|
24
26
|
const ALL_HANDLERS = {
|
|
25
27
|
...projectHandlers,
|
|
@@ -30,6 +32,7 @@ const ALL_HANDLERS = {
|
|
|
30
32
|
...dashboardHandlers,
|
|
31
33
|
...searchHandlers,
|
|
32
34
|
...activityHandlers,
|
|
35
|
+
...exportImportHandlers,
|
|
33
36
|
};
|
|
34
37
|
const server = new Server({ name: 'tracker', version: '1.0.0' }, { capabilities: { tools: {} } });
|
|
35
38
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,WAAW,IAAI,QAAQ,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,WAAW,IAAI,QAAQ,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,WAAW,IAAI,QAAQ,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,SAAS,GAAW;IACxB,GAAG,WAAW;IACd,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,WAAW;IACd,GAAG,QAAQ;IACX,GAAG,aAAa;IAChB,GAAG,UAAU;IACb,GAAG,YAAY;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SCHEMA_SQL = "\n-- Core hierarchy: projects > epics > tasks > subtasks\n\nCREATE TABLE IF NOT EXISTS projects (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'active'\n CHECK (status IN ('active', 'on_hold', 'completed', 'archived')),\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS epics (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'planned'\n CHECK (status IN ('planned', 'in_progress', 'completed', 'cancelled')),\n priority TEXT NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'critical')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS tasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n epic_id INTEGER NOT NULL REFERENCES epics(id) ON DELETE CASCADE,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'review', 'done', 'blocked')),\n priority TEXT NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'critical')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n assigned_to TEXT,\n estimated_hours REAL,\n actual_hours REAL,\n due_date TEXT,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS subtasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n title TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'done')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Unified notes (replaces summaries + status_updates + context)\n\nCREATE TABLE IF NOT EXISTS notes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n note_type TEXT NOT NULL DEFAULT 'general'\n CHECK (note_type IN (\n 'general', 'decision', 'context', 'meeting',\n 'technical', 'blocker', 'progress', 'release'\n )),\n related_entity_type TEXT CHECK (related_entity_type IN ('project', 'epic', 'task') OR related_entity_type IS NULL),\n related_entity_id INTEGER,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Automatic activity log\n\nCREATE TABLE IF NOT EXISTS activity_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_type TEXT NOT NULL,\n entity_id INTEGER NOT NULL,\n action TEXT NOT NULL,\n field_name TEXT,\n old_value TEXT,\n new_value TEXT,\n summary TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Indexes\n\nCREATE INDEX IF NOT EXISTS idx_epics_project_id ON epics(project_id);\nCREATE INDEX IF NOT EXISTS idx_tasks_epic_id ON tasks(epic_id);\nCREATE INDEX IF NOT EXISTS idx_subtasks_task_id ON subtasks(task_id);\n\nCREATE INDEX IF NOT EXISTS idx_projects_status ON projects(status);\nCREATE INDEX IF NOT EXISTS idx_epics_status ON epics(status);\nCREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\nCREATE INDEX IF NOT EXISTS idx_subtasks_status ON subtasks(status);\n\nCREATE INDEX IF NOT EXISTS idx_epics_priority ON epics(priority);\nCREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);\n\nCREATE INDEX IF NOT EXISTS idx_epics_sort ON epics(project_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_tasks_sort ON tasks(epic_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_subtasks_sort ON subtasks(task_id, sort_order);\n\nCREATE INDEX IF NOT EXISTS idx_notes_type ON notes(note_type);\nCREATE INDEX IF NOT EXISTS idx_notes_entity ON notes(related_entity_type, related_entity_id);\nCREATE INDEX IF NOT EXISTS idx_notes_created ON notes(created_at DESC);\n\nCREATE INDEX IF NOT EXISTS idx_activity_entity ON activity_log(entity_type, entity_id);\nCREATE INDEX IF NOT EXISTS idx_activity_created ON activity_log(created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_activity_action ON activity_log(action);\n\nCREATE INDEX IF NOT EXISTS idx_tasks_assigned ON tasks(assigned_to);\nCREATE INDEX IF NOT EXISTS idx_tasks_due ON tasks(due_date);\n";
|
|
1
|
+
export declare const SCHEMA_SQL = "\n-- Core hierarchy: projects > epics > tasks > subtasks\n\nCREATE TABLE IF NOT EXISTS projects (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'active'\n CHECK (status IN ('active', 'on_hold', 'completed', 'archived')),\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS epics (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'planned'\n CHECK (status IN ('planned', 'in_progress', 'completed', 'cancelled')),\n priority TEXT NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'critical')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS tasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n epic_id INTEGER NOT NULL REFERENCES epics(id) ON DELETE CASCADE,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'review', 'done', 'blocked')),\n priority TEXT NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'critical')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n assigned_to TEXT,\n estimated_hours REAL,\n actual_hours REAL,\n due_date TEXT,\n source_ref TEXT,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS subtasks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,\n title TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'done')),\n sort_order INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Unified notes (replaces summaries + status_updates + context)\n\nCREATE TABLE IF NOT EXISTS notes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n note_type TEXT NOT NULL DEFAULT 'general'\n CHECK (note_type IN (\n 'general', 'decision', 'context', 'meeting',\n 'technical', 'blocker', 'progress', 'release'\n )),\n related_entity_type TEXT CHECK (related_entity_type IN ('project', 'epic', 'task') OR related_entity_type IS NULL),\n related_entity_id INTEGER,\n tags TEXT NOT NULL DEFAULT '[]',\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Automatic activity log\n\nCREATE TABLE IF NOT EXISTS activity_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n entity_type TEXT NOT NULL,\n entity_id INTEGER NOT NULL,\n action TEXT NOT NULL,\n field_name TEXT,\n old_value TEXT,\n new_value TEXT,\n summary TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Indexes\n\nCREATE INDEX IF NOT EXISTS idx_epics_project_id ON epics(project_id);\nCREATE INDEX IF NOT EXISTS idx_tasks_epic_id ON tasks(epic_id);\nCREATE INDEX IF NOT EXISTS idx_subtasks_task_id ON subtasks(task_id);\n\nCREATE INDEX IF NOT EXISTS idx_projects_status ON projects(status);\nCREATE INDEX IF NOT EXISTS idx_epics_status ON epics(status);\nCREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\nCREATE INDEX IF NOT EXISTS idx_subtasks_status ON subtasks(status);\n\nCREATE INDEX IF NOT EXISTS idx_epics_priority ON epics(priority);\nCREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);\n\nCREATE INDEX IF NOT EXISTS idx_epics_sort ON epics(project_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_tasks_sort ON tasks(epic_id, sort_order);\nCREATE INDEX IF NOT EXISTS idx_subtasks_sort ON subtasks(task_id, sort_order);\n\nCREATE INDEX IF NOT EXISTS idx_notes_type ON notes(note_type);\nCREATE INDEX IF NOT EXISTS idx_notes_entity ON notes(related_entity_type, related_entity_id);\nCREATE INDEX IF NOT EXISTS idx_notes_created ON notes(created_at DESC);\n\nCREATE INDEX IF NOT EXISTS idx_activity_entity ON activity_log(entity_type, entity_id);\nCREATE INDEX IF NOT EXISTS idx_activity_created ON activity_log(created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_activity_action ON activity_log(action);\n\nCREATE INDEX IF NOT EXISTS idx_tasks_assigned ON tasks(assigned_to);\nCREATE INDEX IF NOT EXISTS idx_tasks_due ON tasks(due_date);\n";
|
package/dist/schema.js
CHANGED
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4HzB,CAAC"}
|
package/dist/tools/activity.js
CHANGED
|
@@ -166,6 +166,23 @@ function handleTaskBatchUpdate(args) {
|
|
|
166
166
|
if (priority && oldRow.priority !== priority) {
|
|
167
167
|
logActivity(db, 'task', id, 'updated', 'priority', oldRow.priority, priority, `Task '${newRow.title}' priority: ${oldRow.priority} -> ${priority}`);
|
|
168
168
|
}
|
|
169
|
+
// Auto time tracking
|
|
170
|
+
if (status === 'done' && oldRow.status !== 'done' && !newRow.actual_hours) {
|
|
171
|
+
const startEntry = db.prepare(`SELECT created_at FROM activity_log
|
|
172
|
+
WHERE entity_type = 'task' AND entity_id = ? AND action = 'status_changed'
|
|
173
|
+
AND field_name = 'status' AND new_value = 'in_progress'
|
|
174
|
+
ORDER BY created_at DESC LIMIT 1`).get(id);
|
|
175
|
+
if (startEntry) {
|
|
176
|
+
const startMs = new Date(startEntry.created_at + 'Z').getTime();
|
|
177
|
+
const nowMs = Date.now();
|
|
178
|
+
const hours = Math.round(((nowMs - startMs) / 3_600_000) * 10) / 10;
|
|
179
|
+
if (hours > 0) {
|
|
180
|
+
db.prepare('UPDATE tasks SET actual_hours = ? WHERE id = ?').run(hours, id);
|
|
181
|
+
newRow.actual_hours = hours;
|
|
182
|
+
logActivity(db, 'task', id, 'updated', 'actual_hours', null, String(hours), `Task '${newRow.title}' auto-tracked: ${hours}h`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
169
186
|
return newRow;
|
|
170
187
|
});
|
|
171
188
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/tools/activity.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/tools/activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { getDb } from '../db.js';
|
|
2
|
+
import { logActivity } from '../helpers/activity-logger.js';
|
|
3
|
+
export const definitions = [
|
|
4
|
+
{
|
|
5
|
+
name: 'tracker_export',
|
|
6
|
+
description: 'Export a full project as nested JSON. Includes all epics, tasks, subtasks, and related notes. Useful for backup, migration, or sharing.',
|
|
7
|
+
annotations: { title: 'Export Project', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
8
|
+
inputSchema: {
|
|
9
|
+
type: 'object',
|
|
10
|
+
properties: {
|
|
11
|
+
project_id: {
|
|
12
|
+
type: 'integer',
|
|
13
|
+
description: 'Project ID to export (omit if only one project exists)',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'tracker_import',
|
|
20
|
+
description: 'Import a project from JSON (matching tracker_export format). Creates all entities with new IDs and remaps references. Uses a transaction for atomicity.',
|
|
21
|
+
annotations: { title: 'Import Project', readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
22
|
+
inputSchema: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
data: {
|
|
26
|
+
type: 'object',
|
|
27
|
+
description: 'Full export JSON object from tracker_export',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
required: ['data'],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
function handleExport(args) {
|
|
35
|
+
const db = getDb();
|
|
36
|
+
let projectId = args.project_id;
|
|
37
|
+
if (!projectId) {
|
|
38
|
+
const first = db.prepare('SELECT id FROM projects LIMIT 1').get();
|
|
39
|
+
if (!first)
|
|
40
|
+
throw new Error('No projects found. Create a project first.');
|
|
41
|
+
projectId = first.id;
|
|
42
|
+
}
|
|
43
|
+
const project = db.prepare('SELECT * FROM projects WHERE id = ?').get(projectId);
|
|
44
|
+
if (!project)
|
|
45
|
+
throw new Error(`Project ${projectId} not found`);
|
|
46
|
+
const epics = db.prepare('SELECT * FROM epics WHERE project_id = ? ORDER BY sort_order, created_at')
|
|
47
|
+
.all(projectId);
|
|
48
|
+
const epicData = epics.map((epic) => {
|
|
49
|
+
const tasks = db.prepare('SELECT * FROM tasks WHERE epic_id = ? ORDER BY sort_order, created_at')
|
|
50
|
+
.all(epic.id);
|
|
51
|
+
const taskData = tasks.map((task) => {
|
|
52
|
+
const subtasks = db.prepare('SELECT * FROM subtasks WHERE task_id = ? ORDER BY sort_order, created_at')
|
|
53
|
+
.all(task.id);
|
|
54
|
+
return {
|
|
55
|
+
_original_id: task.id,
|
|
56
|
+
title: task.title,
|
|
57
|
+
description: task.description,
|
|
58
|
+
status: task.status,
|
|
59
|
+
priority: task.priority,
|
|
60
|
+
sort_order: task.sort_order,
|
|
61
|
+
assigned_to: task.assigned_to,
|
|
62
|
+
estimated_hours: task.estimated_hours,
|
|
63
|
+
actual_hours: task.actual_hours,
|
|
64
|
+
due_date: task.due_date,
|
|
65
|
+
source_ref: task.source_ref,
|
|
66
|
+
tags: task.tags,
|
|
67
|
+
metadata: task.metadata,
|
|
68
|
+
subtasks: subtasks.map((s) => ({
|
|
69
|
+
title: s.title,
|
|
70
|
+
status: s.status,
|
|
71
|
+
sort_order: s.sort_order,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
_original_id: epic.id,
|
|
77
|
+
name: epic.name,
|
|
78
|
+
description: epic.description,
|
|
79
|
+
status: epic.status,
|
|
80
|
+
priority: epic.priority,
|
|
81
|
+
sort_order: epic.sort_order,
|
|
82
|
+
tags: epic.tags,
|
|
83
|
+
metadata: epic.metadata,
|
|
84
|
+
tasks: taskData,
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
// Collect notes linked to this project, its epics, or its tasks
|
|
88
|
+
const notes = [];
|
|
89
|
+
notes.push(...db.prepare(`SELECT * FROM notes WHERE related_entity_type = 'project' AND related_entity_id = ?`).all(projectId));
|
|
90
|
+
const epicIds = epics.map((e) => e.id);
|
|
91
|
+
if (epicIds.length > 0) {
|
|
92
|
+
const placeholders = epicIds.map(() => '?').join(',');
|
|
93
|
+
notes.push(...db.prepare(`SELECT * FROM notes WHERE related_entity_type = 'epic' AND related_entity_id IN (${placeholders})`).all(...epicIds));
|
|
94
|
+
}
|
|
95
|
+
const allTaskIds = [];
|
|
96
|
+
for (const epic of epics) {
|
|
97
|
+
const tasks = db.prepare('SELECT id FROM tasks WHERE epic_id = ?')
|
|
98
|
+
.all(epic.id);
|
|
99
|
+
allTaskIds.push(...tasks.map((t) => t.id));
|
|
100
|
+
}
|
|
101
|
+
if (allTaskIds.length > 0) {
|
|
102
|
+
const placeholders = allTaskIds.map(() => '?').join(',');
|
|
103
|
+
notes.push(...db.prepare(`SELECT * FROM notes WHERE related_entity_type = 'task' AND related_entity_id IN (${placeholders})`).all(...allTaskIds));
|
|
104
|
+
}
|
|
105
|
+
// Include unlinked notes
|
|
106
|
+
notes.push(...db.prepare('SELECT * FROM notes WHERE related_entity_type IS NULL').all());
|
|
107
|
+
const noteData = notes.map((n) => ({
|
|
108
|
+
title: n.title,
|
|
109
|
+
content: n.content,
|
|
110
|
+
note_type: n.note_type,
|
|
111
|
+
related_entity_type: n.related_entity_type,
|
|
112
|
+
_original_related_entity_id: n.related_entity_id,
|
|
113
|
+
tags: n.tags,
|
|
114
|
+
metadata: n.metadata,
|
|
115
|
+
}));
|
|
116
|
+
return {
|
|
117
|
+
format_version: '1.0',
|
|
118
|
+
exported_at: new Date().toISOString(),
|
|
119
|
+
project: {
|
|
120
|
+
name: project.name,
|
|
121
|
+
description: project.description,
|
|
122
|
+
status: project.status,
|
|
123
|
+
tags: project.tags,
|
|
124
|
+
metadata: project.metadata,
|
|
125
|
+
epics: epicData,
|
|
126
|
+
},
|
|
127
|
+
notes: noteData,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function handleImport(args) {
|
|
131
|
+
const db = getDb();
|
|
132
|
+
const data = args.data;
|
|
133
|
+
if (data.format_version !== '1.0') {
|
|
134
|
+
throw new Error(`Unsupported format version: ${data.format_version}. Expected "1.0".`);
|
|
135
|
+
}
|
|
136
|
+
const projectData = data.project;
|
|
137
|
+
if (!projectData || !projectData.name) {
|
|
138
|
+
throw new Error('Invalid import data: missing project or project.name');
|
|
139
|
+
}
|
|
140
|
+
const result = db.transaction(() => {
|
|
141
|
+
const epicIdMap = new Map();
|
|
142
|
+
const taskIdMap = new Map();
|
|
143
|
+
// 1. Create project
|
|
144
|
+
const project = db.prepare('INSERT INTO projects (name, description, status, tags, metadata) VALUES (?, ?, ?, ?, ?) RETURNING *').get(projectData.name, projectData.description ?? null, projectData.status ?? 'active', projectData.tags ?? '[]', projectData.metadata ?? '{}');
|
|
145
|
+
const newProjectId = project.id;
|
|
146
|
+
logActivity(db, 'project', newProjectId, 'created', null, null, null, `Project '${projectData.name}' imported`);
|
|
147
|
+
// 2. Create epics and their children
|
|
148
|
+
const epics = projectData.epics ?? [];
|
|
149
|
+
let epicCount = 0;
|
|
150
|
+
let taskCount = 0;
|
|
151
|
+
let subtaskCount = 0;
|
|
152
|
+
for (const epicData of epics) {
|
|
153
|
+
const epic = db.prepare(`INSERT INTO epics (project_id, name, description, status, priority, sort_order, tags, metadata)
|
|
154
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?) RETURNING *`).get(newProjectId, epicData.name, epicData.description ?? null, epicData.status ?? 'planned', epicData.priority ?? 'medium', epicData.sort_order ?? 0, epicData.tags ?? '[]', epicData.metadata ?? '{}');
|
|
155
|
+
const newEpicId = epic.id;
|
|
156
|
+
if (epicData._original_id != null) {
|
|
157
|
+
epicIdMap.set(epicData._original_id, newEpicId);
|
|
158
|
+
}
|
|
159
|
+
epicCount++;
|
|
160
|
+
logActivity(db, 'epic', newEpicId, 'created', null, null, null, `Epic '${epicData.name}' imported`);
|
|
161
|
+
// 3. Create tasks
|
|
162
|
+
const tasks = epicData.tasks ?? [];
|
|
163
|
+
for (const taskData of tasks) {
|
|
164
|
+
const task = db.prepare(`INSERT INTO tasks (epic_id, title, description, status, priority, sort_order,
|
|
165
|
+
assigned_to, estimated_hours, actual_hours, due_date, source_ref, tags, metadata)
|
|
166
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING *`).get(newEpicId, taskData.title, taskData.description ?? null, taskData.status ?? 'todo', taskData.priority ?? 'medium', taskData.sort_order ?? 0, taskData.assigned_to ?? null, taskData.estimated_hours ?? null, taskData.actual_hours ?? null, taskData.due_date ?? null, taskData.source_ref ?? null, taskData.tags ?? '[]', taskData.metadata ?? '{}');
|
|
167
|
+
const newTaskId = task.id;
|
|
168
|
+
if (taskData._original_id != null) {
|
|
169
|
+
taskIdMap.set(taskData._original_id, newTaskId);
|
|
170
|
+
}
|
|
171
|
+
taskCount++;
|
|
172
|
+
logActivity(db, 'task', newTaskId, 'created', null, null, null, `Task '${taskData.title}' imported`);
|
|
173
|
+
// 4. Create subtasks
|
|
174
|
+
const subtasks = taskData.subtasks ?? [];
|
|
175
|
+
for (const subtaskData of subtasks) {
|
|
176
|
+
const subtask = db.prepare('INSERT INTO subtasks (task_id, title, status, sort_order) VALUES (?, ?, ?, ?) RETURNING *').get(newTaskId, subtaskData.title, subtaskData.status ?? 'todo', subtaskData.sort_order ?? 0);
|
|
177
|
+
subtaskCount++;
|
|
178
|
+
logActivity(db, 'subtask', subtask.id, 'created', null, null, null, `Subtask '${subtaskData.title}' imported`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// 5. Create notes with ID remapping
|
|
183
|
+
const importNotes = data.notes ?? [];
|
|
184
|
+
let noteCount = 0;
|
|
185
|
+
for (const noteData of importNotes) {
|
|
186
|
+
let relatedEntityType = noteData.related_entity_type;
|
|
187
|
+
let relatedEntityId = null;
|
|
188
|
+
const originalId = noteData._original_related_entity_id;
|
|
189
|
+
if (relatedEntityType && originalId != null) {
|
|
190
|
+
if (relatedEntityType === 'project') {
|
|
191
|
+
relatedEntityId = newProjectId;
|
|
192
|
+
}
|
|
193
|
+
else if (relatedEntityType === 'epic') {
|
|
194
|
+
relatedEntityId = epicIdMap.get(originalId) ?? null;
|
|
195
|
+
if (relatedEntityId === null)
|
|
196
|
+
relatedEntityType = null;
|
|
197
|
+
}
|
|
198
|
+
else if (relatedEntityType === 'task') {
|
|
199
|
+
relatedEntityId = taskIdMap.get(originalId) ?? null;
|
|
200
|
+
if (relatedEntityId === null)
|
|
201
|
+
relatedEntityType = null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const note = db.prepare(`INSERT INTO notes (title, content, note_type, related_entity_type, related_entity_id, tags, metadata)
|
|
205
|
+
VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING *`).get(noteData.title, noteData.content, noteData.note_type ?? 'general', relatedEntityType, relatedEntityId, noteData.tags ?? '[]', noteData.metadata ?? '{}');
|
|
206
|
+
noteCount++;
|
|
207
|
+
logActivity(db, 'note', note.id, 'created', null, null, null, `Note '${noteData.title}' imported`);
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
message: 'Import complete.',
|
|
211
|
+
project_id: newProjectId,
|
|
212
|
+
project_name: projectData.name,
|
|
213
|
+
counts: { epics: epicCount, tasks: taskCount, subtasks: subtaskCount, notes: noteCount },
|
|
214
|
+
};
|
|
215
|
+
})();
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
export const handlers = {
|
|
219
|
+
tracker_export: handleExport,
|
|
220
|
+
tracker_import: handleImport,
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=export-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-import.js","sourceRoot":"","sources":["../../src/tools/export-import.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/tasks.js
CHANGED
|
@@ -25,6 +25,18 @@ export const definitions = [
|
|
|
25
25
|
assigned_to: { type: 'string', description: 'Assignee name' },
|
|
26
26
|
estimated_hours: { type: 'number', description: 'Estimated hours' },
|
|
27
27
|
due_date: { type: 'string', description: 'Due date (YYYY-MM-DD)' },
|
|
28
|
+
source_ref: {
|
|
29
|
+
type: 'object',
|
|
30
|
+
description: 'Link to source code location',
|
|
31
|
+
properties: {
|
|
32
|
+
file: { type: 'string', description: 'File path' },
|
|
33
|
+
line_start: { type: 'integer', description: 'Start line number' },
|
|
34
|
+
line_end: { type: 'integer', description: 'End line number' },
|
|
35
|
+
repo: { type: 'string', description: 'Repository URL or name' },
|
|
36
|
+
commit: { type: 'string', description: 'Commit hash' },
|
|
37
|
+
},
|
|
38
|
+
required: ['file'],
|
|
39
|
+
},
|
|
28
40
|
tags: { type: 'array', items: { type: 'string' } },
|
|
29
41
|
},
|
|
30
42
|
required: ['epic_id', 'title'],
|
|
@@ -42,6 +54,12 @@ export const definitions = [
|
|
|
42
54
|
priority: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },
|
|
43
55
|
assigned_to: { type: 'string', description: 'Filter by assignee' },
|
|
44
56
|
tag: { type: 'string', description: 'Filter by tag' },
|
|
57
|
+
sort_by: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
enum: ['priority', 'created', 'due_date', 'status'],
|
|
60
|
+
default: 'priority',
|
|
61
|
+
description: 'Sort order: priority (critical first), created (newest first), due_date (earliest first), status (actionable first)',
|
|
62
|
+
},
|
|
45
63
|
limit: { type: 'integer', default: 50, description: 'Max results' },
|
|
46
64
|
},
|
|
47
65
|
},
|
|
@@ -74,6 +92,18 @@ export const definitions = [
|
|
|
74
92
|
estimated_hours: { type: 'number' },
|
|
75
93
|
actual_hours: { type: 'number' },
|
|
76
94
|
due_date: { type: 'string' },
|
|
95
|
+
source_ref: {
|
|
96
|
+
type: 'object',
|
|
97
|
+
description: 'Link to source code location',
|
|
98
|
+
properties: {
|
|
99
|
+
file: { type: 'string', description: 'File path' },
|
|
100
|
+
line_start: { type: 'integer', description: 'Start line number' },
|
|
101
|
+
line_end: { type: 'integer', description: 'End line number' },
|
|
102
|
+
repo: { type: 'string', description: 'Repository URL or name' },
|
|
103
|
+
commit: { type: 'string', description: 'Commit hash' },
|
|
104
|
+
},
|
|
105
|
+
required: ['file'],
|
|
106
|
+
},
|
|
77
107
|
sort_order: { type: 'integer' },
|
|
78
108
|
tags: { type: 'array', items: { type: 'string' } },
|
|
79
109
|
},
|
|
@@ -91,15 +121,32 @@ function handleTaskCreate(args) {
|
|
|
91
121
|
const assignedTo = args.assigned_to ?? null;
|
|
92
122
|
const estimatedHours = args.estimated_hours ?? null;
|
|
93
123
|
const dueDate = args.due_date ?? null;
|
|
124
|
+
const sourceRef = args.source_ref ? JSON.stringify(args.source_ref) : null;
|
|
94
125
|
const tags = JSON.stringify(args.tags ?? []);
|
|
95
126
|
const task = db
|
|
96
|
-
.prepare(`INSERT INTO tasks (epic_id, title, description, status, priority, assigned_to, estimated_hours, due_date, tags)
|
|
97
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING *`)
|
|
98
|
-
.get(epicId, title, description, status, priority, assignedTo, estimatedHours, dueDate, tags);
|
|
127
|
+
.prepare(`INSERT INTO tasks (epic_id, title, description, status, priority, assigned_to, estimated_hours, due_date, source_ref, tags)
|
|
128
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING *`)
|
|
129
|
+
.get(epicId, title, description, status, priority, assignedTo, estimatedHours, dueDate, sourceRef, tags);
|
|
99
130
|
const row = task;
|
|
100
131
|
logActivity(db, 'task', row.id, 'created', null, null, null, `Task '${title}' created`);
|
|
101
132
|
return task;
|
|
102
133
|
}
|
|
134
|
+
const PRIORITY_ORDER = "CASE t.priority WHEN 'critical' THEN 0 WHEN 'high' THEN 1 WHEN 'medium' THEN 2 WHEN 'low' THEN 3 END";
|
|
135
|
+
const STATUS_ORDER = "CASE t.status WHEN 'blocked' THEN 0 WHEN 'in_progress' THEN 1 WHEN 'review' THEN 2 WHEN 'todo' THEN 3 WHEN 'done' THEN 4 END";
|
|
136
|
+
function getTaskOrderClause(sortBy) {
|
|
137
|
+
switch (sortBy) {
|
|
138
|
+
case 'priority':
|
|
139
|
+
return `${PRIORITY_ORDER}, ${STATUS_ORDER}, t.sort_order, t.created_at`;
|
|
140
|
+
case 'status':
|
|
141
|
+
return `${STATUS_ORDER}, ${PRIORITY_ORDER}, t.sort_order, t.created_at`;
|
|
142
|
+
case 'due_date':
|
|
143
|
+
return `t.due_date IS NULL, t.due_date ASC, ${PRIORITY_ORDER}, t.created_at`;
|
|
144
|
+
case 'created':
|
|
145
|
+
return `t.created_at DESC`;
|
|
146
|
+
default:
|
|
147
|
+
return `${PRIORITY_ORDER}, ${STATUS_ORDER}, t.sort_order, t.created_at`;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
103
150
|
function handleTaskList(args) {
|
|
104
151
|
const db = getDb();
|
|
105
152
|
const epicId = args.epic_id;
|
|
@@ -107,6 +154,7 @@ function handleTaskList(args) {
|
|
|
107
154
|
const priority = args.priority;
|
|
108
155
|
const assignedTo = args.assigned_to;
|
|
109
156
|
const tag = args.tag;
|
|
157
|
+
const sortBy = args.sort_by ?? 'priority';
|
|
110
158
|
const limit = args.limit ?? 50;
|
|
111
159
|
const whereClauses = [];
|
|
112
160
|
const params = [];
|
|
@@ -140,7 +188,7 @@ function handleTaskList(args) {
|
|
|
140
188
|
LEFT JOIN subtasks s ON s.task_id = t.id
|
|
141
189
|
${whereStr}
|
|
142
190
|
GROUP BY t.id
|
|
143
|
-
ORDER BY
|
|
191
|
+
ORDER BY ${getTaskOrderClause(sortBy)}
|
|
144
192
|
LIMIT ?
|
|
145
193
|
`;
|
|
146
194
|
params.push(limit);
|
|
@@ -175,7 +223,7 @@ function handleTaskUpdate(args) {
|
|
|
175
223
|
throw new Error(`Task ${id} not found`);
|
|
176
224
|
const update = buildUpdate('tasks', id, args, [
|
|
177
225
|
'title', 'description', 'status', 'priority', 'assigned_to',
|
|
178
|
-
'estimated_hours', 'actual_hours', 'due_date', 'sort_order', 'tags',
|
|
226
|
+
'estimated_hours', 'actual_hours', 'due_date', 'source_ref', 'sort_order', 'tags',
|
|
179
227
|
]);
|
|
180
228
|
if (!update)
|
|
181
229
|
throw new Error('No fields to update');
|
|
@@ -183,6 +231,24 @@ function handleTaskUpdate(args) {
|
|
|
183
231
|
logEntityUpdate(db, 'task', id, newRow.title, oldRow, newRow, [
|
|
184
232
|
'status', 'priority', 'assigned_to', 'title',
|
|
185
233
|
]);
|
|
234
|
+
// Auto time tracking: when status changes to done and actual_hours wasn't manually set
|
|
235
|
+
const statusChanged = args.status && oldRow.status !== args.status;
|
|
236
|
+
if (statusChanged && args.status === 'done' && !args.actual_hours && !newRow.actual_hours) {
|
|
237
|
+
const startEntry = db.prepare(`SELECT created_at FROM activity_log
|
|
238
|
+
WHERE entity_type = 'task' AND entity_id = ? AND action = 'status_changed'
|
|
239
|
+
AND field_name = 'status' AND new_value = 'in_progress'
|
|
240
|
+
ORDER BY created_at DESC LIMIT 1`).get(id);
|
|
241
|
+
if (startEntry) {
|
|
242
|
+
const startMs = new Date(startEntry.created_at + 'Z').getTime();
|
|
243
|
+
const nowMs = Date.now();
|
|
244
|
+
const hours = Math.round(((nowMs - startMs) / 3_600_000) * 10) / 10; // 1 decimal
|
|
245
|
+
if (hours > 0) {
|
|
246
|
+
db.prepare('UPDATE tasks SET actual_hours = ? WHERE id = ?').run(hours, id);
|
|
247
|
+
newRow.actual_hours = hours;
|
|
248
|
+
logActivity(db, 'task', id, 'updated', 'actual_hours', null, String(hours), `Task '${newRow.title}' auto-tracked: ${hours}h`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
186
252
|
return newRow;
|
|
187
253
|
}
|
|
188
254
|
export const handlers = {
|
package/dist/tools/tasks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
package/manifest.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"manifest_version": "0.3",
|
|
3
3
|
"name": "saga-mcp",
|
|
4
4
|
"display_name": "Saga — Project Tracker for AI Agents",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.4.1",
|
|
6
6
|
"description": "A Jira-like project tracker MCP server for AI agents. SQLite-backed, per-project scoped, with full hierarchy and activity logging — so LLMs never lose track.",
|
|
7
|
-
"long_description": "Saga gives your AI assistant a structured SQLite database to track projects, epics, tasks, subtasks, notes, and decisions across sessions. No more scattered markdown files — one `tracker_dashboard` call gives full project context to resume work.\n\n**Key features:**\n- Full hierarchy: Projects > Epics > Tasks > Subtasks\n- SQLite: Self-contained `.tracker.db` file per project — zero setup\n- Activity log: Every mutation is automatically tracked\n- Dashboard: One tool call gives full project overview\n- Notes system: Decisions, context, meeting notes, blockers\n- Batch operations: Create multiple subtasks or update multiple tasks in one call\n-
|
|
7
|
+
"long_description": "Saga gives your AI assistant a structured SQLite database to track projects, epics, tasks, subtasks, notes, and decisions across sessions. No more scattered markdown files — one `tracker_dashboard` call gives full project context to resume work.\n\n**Key features:**\n- Full hierarchy: Projects > Epics > Tasks > Subtasks\n- SQLite: Self-contained `.tracker.db` file per project — zero setup\n- Activity log: Every mutation is automatically tracked\n- Dashboard: One tool call gives full project overview\n- Notes system: Decisions, context, meeting notes, blockers\n- Batch operations: Create multiple subtasks or update multiple tasks in one call\n- 25 focused tools with safety annotations\n- Import/export: Full project backup and migration as JSON",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "spranab",
|
|
10
10
|
"url": "https://github.com/spranab"
|
|
@@ -62,7 +62,9 @@
|
|
|
62
62
|
{ "name": "note_delete", "description": "Delete a note" },
|
|
63
63
|
{ "name": "tracker_search", "description": "Cross-entity search (projects, epics, tasks, notes)" },
|
|
64
64
|
{ "name": "activity_log", "description": "View change history with filters" },
|
|
65
|
-
{ "name": "tracker_session_diff", "description": "Show what changed since a given timestamp — call at session start" }
|
|
65
|
+
{ "name": "tracker_session_diff", "description": "Show what changed since a given timestamp — call at session start" },
|
|
66
|
+
{ "name": "tracker_export", "description": "Export full project as nested JSON for backup or migration" },
|
|
67
|
+
{ "name": "tracker_import", "description": "Import project from JSON (matching export format)" }
|
|
66
68
|
],
|
|
67
69
|
"compatibility": {
|
|
68
70
|
"platforms": ["darwin", "win32", "linux"],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "saga-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "A Jira-like project tracker MCP server for AI agents. SQLite-backed, per-project scoped, with full hierarchy (Projects > Epics > Tasks > Subtasks), activity logging, and a dashboard — so LLMs never lose track.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|