@stackmemoryai/stackmemory 0.1.0 → 0.2.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/dist/scripts/initialize.js +15 -15
- package/dist/scripts/initialize.js.map +1 -1
- package/dist/scripts/status.js +21 -11
- package/dist/scripts/status.js.map +1 -1
- package/dist/src/beads/beads-task-store.d.ts +117 -0
- package/dist/src/beads/beads-task-store.d.ts.map +1 -0
- package/dist/src/beads/beads-task-store.js +318 -0
- package/dist/src/beads/beads-task-store.js.map +1 -0
- package/dist/src/beads/task-aware-context.d.ts +103 -0
- package/dist/src/beads/task-aware-context.d.ts.map +1 -0
- package/dist/src/beads/task-aware-context.js +395 -0
- package/dist/src/beads/task-aware-context.js.map +1 -0
- package/dist/src/beads-task-store.d.ts +117 -0
- package/dist/src/beads-task-store.d.ts.map +1 -0
- package/dist/src/beads-task-store.js +318 -0
- package/dist/src/beads-task-store.js.map +1 -0
- package/dist/src/cli/cli.d.ts +7 -0
- package/dist/src/cli/cli.d.ts.map +1 -0
- package/dist/src/cli/cli.js +471 -0
- package/dist/src/cli/cli.js.map +1 -0
- package/dist/src/core/error-handler.d.ts +46 -0
- package/dist/src/core/error-handler.d.ts.map +1 -0
- package/dist/src/core/error-handler.js +212 -0
- package/dist/src/core/error-handler.js.map +1 -0
- package/dist/src/core/frame-manager.d.ts +106 -0
- package/dist/src/core/frame-manager.d.ts.map +1 -0
- package/dist/src/core/frame-manager.js +387 -0
- package/dist/src/core/frame-manager.js.map +1 -0
- package/dist/src/core/logger.d.ts +24 -0
- package/dist/src/core/logger.d.ts.map +1 -0
- package/dist/src/core/logger.js +121 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/logger.test.d.ts +2 -0
- package/dist/src/core/logger.test.d.ts.map +1 -0
- package/dist/src/core/logger.test.js +31 -0
- package/dist/src/core/logger.test.js.map +1 -0
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/integrations/linear-auth.d.ts +99 -0
- package/dist/src/integrations/linear-auth.d.ts.map +1 -0
- package/dist/src/integrations/linear-auth.js +319 -0
- package/dist/src/integrations/linear-auth.js.map +1 -0
- package/dist/src/integrations/linear-auto-sync.d.ts +77 -0
- package/dist/src/integrations/linear-auto-sync.d.ts.map +1 -0
- package/dist/src/integrations/linear-auto-sync.js +268 -0
- package/dist/src/integrations/linear-auto-sync.js.map +1 -0
- package/dist/src/integrations/linear-client.d.ts +86 -0
- package/dist/src/integrations/linear-client.d.ts.map +1 -0
- package/dist/src/integrations/linear-client.js +275 -0
- package/dist/src/integrations/linear-client.js.map +1 -0
- package/dist/src/integrations/linear-config.d.ts +51 -0
- package/dist/src/integrations/linear-config.d.ts.map +1 -0
- package/dist/src/integrations/linear-config.js +103 -0
- package/dist/src/integrations/linear-config.js.map +1 -0
- package/dist/src/integrations/linear-sync.d.ts +95 -0
- package/dist/src/integrations/linear-sync.d.ts.map +1 -0
- package/dist/src/integrations/linear-sync.js +340 -0
- package/dist/src/integrations/linear-sync.js.map +1 -0
- package/dist/src/mcp/mcp-server.d.ts +38 -0
- package/dist/src/mcp/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp/mcp-server.js +812 -0
- package/dist/src/mcp/mcp-server.js.map +1 -0
- package/dist/src/pebbles/pebbles-task-store.d.ts +117 -0
- package/dist/src/pebbles/pebbles-task-store.d.ts.map +1 -0
- package/dist/src/pebbles/pebbles-task-store.js +335 -0
- package/dist/src/pebbles/pebbles-task-store.js.map +1 -0
- package/dist/src/pebbles/task-aware-context.d.ts +103 -0
- package/dist/src/pebbles/task-aware-context.d.ts.map +1 -0
- package/dist/src/pebbles/task-aware-context.js +412 -0
- package/dist/src/pebbles/task-aware-context.js.map +1 -0
- package/dist/src/task-aware-context.d.ts +103 -0
- package/dist/src/task-aware-context.d.ts.map +1 -0
- package/dist/src/task-aware-context.js +395 -0
- package/dist/src/task-aware-context.js.map +1 -0
- package/package.json +41 -9
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Initialize StackMemory in the current project
|
|
4
4
|
*/
|
|
5
|
-
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
5
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync, } from 'fs';
|
|
6
6
|
import { join } from 'path';
|
|
7
7
|
import { execSync } from 'child_process';
|
|
8
8
|
import chalk from 'chalk';
|
|
@@ -21,9 +21,9 @@ else {
|
|
|
21
21
|
const gitignorePath = join(projectRoot, '.gitignore');
|
|
22
22
|
const gitignoreEntry = '\n# StackMemory\n.stackmemory/*.db\n.stackmemory/*.db-*\n';
|
|
23
23
|
if (existsSync(gitignorePath)) {
|
|
24
|
-
const gitignore =
|
|
24
|
+
const gitignore = readFileSync(gitignorePath, 'utf-8');
|
|
25
25
|
if (!gitignore.includes('.stackmemory')) {
|
|
26
|
-
|
|
26
|
+
appendFileSync(gitignorePath, gitignoreEntry);
|
|
27
27
|
console.log(chalk.green('✓') + ' Added .stackmemory to .gitignore');
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -38,7 +38,7 @@ if (!existsSync(configPath)) {
|
|
|
38
38
|
projectId: projectRoot.split('/').pop(),
|
|
39
39
|
userId: process.env.USER || 'default',
|
|
40
40
|
teamId: 'local',
|
|
41
|
-
initialized: new Date().toISOString()
|
|
41
|
+
initialized: new Date().toISOString(),
|
|
42
42
|
};
|
|
43
43
|
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
44
44
|
console.log(chalk.green('✓') + ' Created config file');
|
|
@@ -50,7 +50,7 @@ if (!existsSync(jsonlPath)) {
|
|
|
50
50
|
id: 'init_' + Date.now(),
|
|
51
51
|
type: 'system',
|
|
52
52
|
content: 'StackMemory initialized',
|
|
53
|
-
timestamp: Date.now()
|
|
53
|
+
timestamp: Date.now(),
|
|
54
54
|
};
|
|
55
55
|
writeFileSync(jsonlPath, JSON.stringify(initialFrame) + '\n');
|
|
56
56
|
console.log(chalk.green('✓') + ' Created frames.jsonl');
|
|
@@ -59,15 +59,15 @@ if (!existsSync(jsonlPath)) {
|
|
|
59
59
|
const mcpConfigPath = join(process.env.HOME || '~', '.config', 'claude', 'mcp.json');
|
|
60
60
|
console.log(chalk.blue('\n📝 MCP Configuration for Claude Code:\n'));
|
|
61
61
|
const mcpConfig = {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
62
|
+
mcpServers: {
|
|
63
|
+
stackmemory: {
|
|
64
|
+
command: 'node',
|
|
65
|
+
args: [join(projectRoot, 'dist', 'mcp-server.js')],
|
|
66
|
+
env: {
|
|
67
|
+
PROJECT_ROOT: projectRoot,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
71
|
};
|
|
72
72
|
console.log(chalk.gray('Add this to your Claude Code MCP configuration:'));
|
|
73
73
|
console.log(chalk.gray('(' + mcpConfigPath + ')\n'));
|
|
@@ -78,7 +78,7 @@ try {
|
|
|
78
78
|
execSync('npm run build', { stdio: 'inherit', cwd: projectRoot });
|
|
79
79
|
console.log(chalk.green('✓') + ' Build completed');
|
|
80
80
|
}
|
|
81
|
-
catch
|
|
81
|
+
catch {
|
|
82
82
|
console.log(chalk.yellow('⚠') + ' Build failed - run npm run build manually');
|
|
83
83
|
}
|
|
84
84
|
console.log(chalk.green.bold('\n✅ StackMemory initialized successfully!\n'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../scripts/initialize.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../scripts/initialize.ts"],"names":[],"mappings":"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"}
|
package/dist/scripts/status.js
CHANGED
|
@@ -19,7 +19,9 @@ console.log(chalk.blue.bold('\n📊 StackMemory Status\n'));
|
|
|
19
19
|
const stats = {
|
|
20
20
|
contexts: db.prepare('SELECT COUNT(*) as count FROM contexts').get(),
|
|
21
21
|
frames: db.prepare('SELECT COUNT(*) as count FROM frames').get(),
|
|
22
|
-
attention: db
|
|
22
|
+
attention: db
|
|
23
|
+
.prepare('SELECT COUNT(*) as count FROM attention_log')
|
|
24
|
+
.get(),
|
|
23
25
|
};
|
|
24
26
|
console.log(chalk.green('Database:') + ` ${dbPath}`);
|
|
25
27
|
console.log(chalk.green('Contexts:') + ` ${stats.contexts.count}`);
|
|
@@ -27,12 +29,14 @@ console.log(chalk.green('Frames:') + ` ${stats.frames.count}`);
|
|
|
27
29
|
console.log(chalk.green('Attention logs:') + ` ${stats.attention.count}`);
|
|
28
30
|
// Get top contexts by importance
|
|
29
31
|
console.log(chalk.blue('\n🎯 Top Contexts by Importance:\n'));
|
|
30
|
-
const topContexts = db
|
|
32
|
+
const topContexts = db
|
|
33
|
+
.prepare(`
|
|
31
34
|
SELECT type, substr(content, 1, 60) as preview, importance, access_count
|
|
32
35
|
FROM contexts
|
|
33
36
|
ORDER BY importance DESC, access_count DESC
|
|
34
37
|
LIMIT 5
|
|
35
|
-
`)
|
|
38
|
+
`)
|
|
39
|
+
.all();
|
|
36
40
|
topContexts.forEach((ctx, i) => {
|
|
37
41
|
const importance = '●'.repeat(Math.round(ctx.importance * 5));
|
|
38
42
|
console.log(chalk.cyan(`${i + 1}.`) +
|
|
@@ -42,22 +46,25 @@ topContexts.forEach((ctx, i) => {
|
|
|
42
46
|
console.log(chalk.gray(` ${ctx.preview}...`));
|
|
43
47
|
});
|
|
44
48
|
// Get active frames
|
|
45
|
-
const activeFrames = db
|
|
49
|
+
const activeFrames = db
|
|
50
|
+
.prepare(`
|
|
46
51
|
SELECT task, datetime(created_at, 'unixepoch') as started
|
|
47
52
|
FROM frames
|
|
48
53
|
WHERE status = 'active'
|
|
49
54
|
ORDER BY created_at DESC
|
|
50
55
|
LIMIT 3
|
|
51
|
-
`)
|
|
56
|
+
`)
|
|
57
|
+
.all();
|
|
52
58
|
if (activeFrames.length > 0) {
|
|
53
59
|
console.log(chalk.blue('\n🔄 Active Tasks:\n'));
|
|
54
|
-
activeFrames.forEach(frame => {
|
|
60
|
+
activeFrames.forEach((frame) => {
|
|
55
61
|
console.log(chalk.green('•') + ` ${frame.task}`);
|
|
56
62
|
console.log(chalk.gray(` Started: ${frame.started}`));
|
|
57
63
|
});
|
|
58
64
|
}
|
|
59
65
|
// Get recent attention patterns
|
|
60
|
-
const recentAttention = db
|
|
66
|
+
const recentAttention = db
|
|
67
|
+
.prepare(`
|
|
61
68
|
SELECT
|
|
62
69
|
substr(query, 1, 50) as query_preview,
|
|
63
70
|
COUNT(*) as count
|
|
@@ -66,19 +73,22 @@ const recentAttention = db.prepare(`
|
|
|
66
73
|
GROUP BY query_preview
|
|
67
74
|
ORDER BY count DESC
|
|
68
75
|
LIMIT 3
|
|
69
|
-
`)
|
|
76
|
+
`)
|
|
77
|
+
.all();
|
|
70
78
|
if (recentAttention.length > 0) {
|
|
71
79
|
console.log(chalk.blue('\n👁️ Recent Query Patterns:\n'));
|
|
72
|
-
recentAttention.forEach(pattern => {
|
|
80
|
+
recentAttention.forEach((pattern) => {
|
|
73
81
|
console.log(chalk.yellow('?') + ` "${pattern.query_preview}..." (${pattern.count}x)`);
|
|
74
82
|
});
|
|
75
83
|
}
|
|
76
84
|
// Show context decay
|
|
77
|
-
const oldContexts = db
|
|
85
|
+
const oldContexts = db
|
|
86
|
+
.prepare(`
|
|
78
87
|
SELECT COUNT(*) as count
|
|
79
88
|
FROM contexts
|
|
80
89
|
WHERE last_accessed < unixepoch() - 86400 * 7
|
|
81
|
-
`)
|
|
90
|
+
`)
|
|
91
|
+
.get();
|
|
82
92
|
if (oldContexts.count > 0) {
|
|
83
93
|
console.log(chalk.yellow(`\n⚠️ ${oldContexts.count} contexts haven't been accessed in 7+ days`));
|
|
84
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../scripts/status.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAClC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;AAE/D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAEpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;AAE1D,iBAAiB;AACjB,MAAM,KAAK,GAAG;IACZ,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAS;IAC3E,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,EAAS;IACvE,SAAS,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../scripts/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Beads-Inspired Task Storage
|
|
3
|
+
* Git-native JSONL storage with SQLite cache for tasks
|
|
4
|
+
*/
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'cancelled';
|
|
7
|
+
export type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';
|
|
8
|
+
export interface BeadsTask {
|
|
9
|
+
id: string;
|
|
10
|
+
type: 'task_create' | 'task_update' | 'task_complete' | 'task_block';
|
|
11
|
+
timestamp: number;
|
|
12
|
+
parent_id?: string;
|
|
13
|
+
frame_id: string;
|
|
14
|
+
title: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
status: TaskStatus;
|
|
17
|
+
priority: TaskPriority;
|
|
18
|
+
assignee?: string;
|
|
19
|
+
created_at: number;
|
|
20
|
+
started_at?: number;
|
|
21
|
+
completed_at?: number;
|
|
22
|
+
estimated_effort?: number;
|
|
23
|
+
actual_effort?: number;
|
|
24
|
+
depends_on: string[];
|
|
25
|
+
blocks: string[];
|
|
26
|
+
tags: string[];
|
|
27
|
+
external_refs?: {
|
|
28
|
+
linear?: {
|
|
29
|
+
id: string;
|
|
30
|
+
url: string;
|
|
31
|
+
};
|
|
32
|
+
github?: {
|
|
33
|
+
issue: number;
|
|
34
|
+
url: string;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
context_score?: number;
|
|
38
|
+
last_accessed?: number;
|
|
39
|
+
}
|
|
40
|
+
export interface TaskMetrics {
|
|
41
|
+
total_tasks: number;
|
|
42
|
+
by_status: Record<TaskStatus, number>;
|
|
43
|
+
by_priority: Record<TaskPriority, number>;
|
|
44
|
+
completion_rate: number;
|
|
45
|
+
avg_effort_accuracy: number;
|
|
46
|
+
blocked_tasks: number;
|
|
47
|
+
overdue_tasks: number;
|
|
48
|
+
}
|
|
49
|
+
export declare class BeadsTaskStore {
|
|
50
|
+
private db;
|
|
51
|
+
private projectRoot;
|
|
52
|
+
private tasksFile;
|
|
53
|
+
private cacheFile;
|
|
54
|
+
constructor(projectRoot: string, db: Database.Database);
|
|
55
|
+
private initializeCache;
|
|
56
|
+
/**
|
|
57
|
+
* Load existing tasks from JSONL into SQLite cache
|
|
58
|
+
*/
|
|
59
|
+
private loadFromJSONL;
|
|
60
|
+
/**
|
|
61
|
+
* Create a new task with content-hash ID
|
|
62
|
+
*/
|
|
63
|
+
createTask(options: {
|
|
64
|
+
title: string;
|
|
65
|
+
description?: string;
|
|
66
|
+
priority?: TaskPriority;
|
|
67
|
+
frameId: string;
|
|
68
|
+
parentId?: string;
|
|
69
|
+
dependsOn?: string[];
|
|
70
|
+
tags?: string[];
|
|
71
|
+
estimatedEffort?: number;
|
|
72
|
+
assignee?: string;
|
|
73
|
+
}): string;
|
|
74
|
+
/**
|
|
75
|
+
* Update task status with new event
|
|
76
|
+
*/
|
|
77
|
+
updateTaskStatus(taskId: string, newStatus: TaskStatus, reason?: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* Add dependency relationship
|
|
80
|
+
*/
|
|
81
|
+
addDependency(taskId: string, dependsOnId: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* Get current active tasks
|
|
84
|
+
*/
|
|
85
|
+
getActiveTasks(frameId?: string): BeadsTask[];
|
|
86
|
+
/**
|
|
87
|
+
* Get task by ID (latest version)
|
|
88
|
+
*/
|
|
89
|
+
getTask(taskId: string): BeadsTask | undefined;
|
|
90
|
+
/**
|
|
91
|
+
* Get tasks that are blocking other tasks
|
|
92
|
+
*/
|
|
93
|
+
getBlockingTasks(): BeadsTask[];
|
|
94
|
+
/**
|
|
95
|
+
* Get metrics for current project
|
|
96
|
+
*/
|
|
97
|
+
getMetrics(): TaskMetrics;
|
|
98
|
+
/**
|
|
99
|
+
* Export tasks for Linear integration (Phase 2)
|
|
100
|
+
*/
|
|
101
|
+
exportForLinear(): Array<{
|
|
102
|
+
title: string;
|
|
103
|
+
description?: string;
|
|
104
|
+
priority: number;
|
|
105
|
+
status: string;
|
|
106
|
+
estimate?: number;
|
|
107
|
+
dependencies: string[];
|
|
108
|
+
}>;
|
|
109
|
+
private appendTask;
|
|
110
|
+
private upsertToCache;
|
|
111
|
+
private generateTaskId;
|
|
112
|
+
private hydrateTask;
|
|
113
|
+
private hydrateTasks;
|
|
114
|
+
private mapPriorityToLinear;
|
|
115
|
+
private mapStatusToLinear;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=beads-task-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beads-task-store.d.ts","sourceRoot":"","sources":["../../../src/beads/beads-task-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Beads-Inspired Task Storage
|
|
3
|
+
* Git-native JSONL storage with SQLite cache for tasks
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from 'crypto';
|
|
6
|
+
import { appendFile, existsSync, mkdirSync, readFileSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { logger } from '../core/logger.js';
|
|
9
|
+
export class BeadsTaskStore {
|
|
10
|
+
db;
|
|
11
|
+
projectRoot;
|
|
12
|
+
tasksFile;
|
|
13
|
+
cacheFile;
|
|
14
|
+
constructor(projectRoot, db) {
|
|
15
|
+
this.projectRoot = projectRoot;
|
|
16
|
+
this.db = db;
|
|
17
|
+
// Ensure .stackmemory directory exists
|
|
18
|
+
const stackmemoryDir = join(projectRoot, '.stackmemory');
|
|
19
|
+
if (!existsSync(stackmemoryDir)) {
|
|
20
|
+
mkdirSync(stackmemoryDir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
this.tasksFile = join(stackmemoryDir, 'tasks.jsonl');
|
|
23
|
+
this.cacheFile = join(stackmemoryDir, 'cache.db');
|
|
24
|
+
this.initializeCache();
|
|
25
|
+
this.loadFromJSONL();
|
|
26
|
+
}
|
|
27
|
+
initializeCache() {
|
|
28
|
+
this.db.exec(`
|
|
29
|
+
CREATE TABLE IF NOT EXISTS task_cache (
|
|
30
|
+
id TEXT PRIMARY KEY,
|
|
31
|
+
type TEXT NOT NULL,
|
|
32
|
+
timestamp INTEGER NOT NULL,
|
|
33
|
+
parent_id TEXT,
|
|
34
|
+
frame_id TEXT NOT NULL,
|
|
35
|
+
title TEXT NOT NULL,
|
|
36
|
+
description TEXT,
|
|
37
|
+
status TEXT NOT NULL,
|
|
38
|
+
priority TEXT NOT NULL,
|
|
39
|
+
assignee TEXT,
|
|
40
|
+
created_at INTEGER NOT NULL,
|
|
41
|
+
started_at INTEGER,
|
|
42
|
+
completed_at INTEGER,
|
|
43
|
+
estimated_effort INTEGER,
|
|
44
|
+
actual_effort INTEGER,
|
|
45
|
+
depends_on TEXT DEFAULT '[]',
|
|
46
|
+
blocks TEXT DEFAULT '[]',
|
|
47
|
+
tags TEXT DEFAULT '[]',
|
|
48
|
+
external_refs TEXT DEFAULT '{}',
|
|
49
|
+
context_score REAL DEFAULT 0.5,
|
|
50
|
+
last_accessed INTEGER
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_task_status ON task_cache(status);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_task_priority ON task_cache(priority);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_task_frame ON task_cache(frame_id);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_task_timestamp ON task_cache(timestamp);
|
|
57
|
+
CREATE INDEX IF NOT EXISTS idx_task_parent ON task_cache(parent_id);
|
|
58
|
+
`);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load existing tasks from JSONL into SQLite cache
|
|
62
|
+
*/
|
|
63
|
+
loadFromJSONL() {
|
|
64
|
+
if (!existsSync(this.tasksFile))
|
|
65
|
+
return;
|
|
66
|
+
const content = readFileSync(this.tasksFile, 'utf-8');
|
|
67
|
+
const lines = content.split('\n').filter(line => line.trim());
|
|
68
|
+
let loaded = 0;
|
|
69
|
+
for (const line of lines) {
|
|
70
|
+
try {
|
|
71
|
+
const task = JSON.parse(line);
|
|
72
|
+
this.upsertToCache(task);
|
|
73
|
+
loaded++;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
logger.warn('Failed to parse task line', { line, error });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
logger.info('Loaded tasks from JSONL', { loaded, file: this.tasksFile });
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create a new task with content-hash ID
|
|
83
|
+
*/
|
|
84
|
+
createTask(options) {
|
|
85
|
+
const now = Math.floor(Date.now() / 1000);
|
|
86
|
+
// Create content for hash (ensures deterministic ID)
|
|
87
|
+
const content = `${options.title}:${options.frameId}:${now}:${Math.random()}`;
|
|
88
|
+
const id = this.generateTaskId(content);
|
|
89
|
+
const task = {
|
|
90
|
+
id,
|
|
91
|
+
type: 'task_create',
|
|
92
|
+
timestamp: now,
|
|
93
|
+
parent_id: options.parentId,
|
|
94
|
+
frame_id: options.frameId,
|
|
95
|
+
title: options.title,
|
|
96
|
+
description: options.description,
|
|
97
|
+
status: 'pending',
|
|
98
|
+
priority: options.priority || 'medium',
|
|
99
|
+
assignee: options.assignee,
|
|
100
|
+
created_at: now,
|
|
101
|
+
estimated_effort: options.estimatedEffort,
|
|
102
|
+
depends_on: options.dependsOn || [],
|
|
103
|
+
blocks: [],
|
|
104
|
+
tags: options.tags || [],
|
|
105
|
+
context_score: 0.5
|
|
106
|
+
};
|
|
107
|
+
this.appendTask(task);
|
|
108
|
+
return id;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Update task status with new event
|
|
112
|
+
*/
|
|
113
|
+
updateTaskStatus(taskId, newStatus, reason) {
|
|
114
|
+
const existing = this.getTask(taskId);
|
|
115
|
+
if (!existing)
|
|
116
|
+
throw new Error(`Task not found: ${taskId}`);
|
|
117
|
+
const now = Math.floor(Date.now() / 1000);
|
|
118
|
+
const updates = {
|
|
119
|
+
status: newStatus,
|
|
120
|
+
timestamp: now
|
|
121
|
+
};
|
|
122
|
+
// Automatic time tracking
|
|
123
|
+
if (newStatus === 'in_progress' && existing.status === 'pending') {
|
|
124
|
+
updates.started_at = now;
|
|
125
|
+
updates.type = 'task_update';
|
|
126
|
+
}
|
|
127
|
+
else if (newStatus === 'completed' && existing.status === 'in_progress') {
|
|
128
|
+
updates.completed_at = now;
|
|
129
|
+
updates.type = 'task_complete';
|
|
130
|
+
if (existing.started_at) {
|
|
131
|
+
updates.actual_effort = Math.floor((now - existing.started_at) / 60); // Minutes
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else if (newStatus === 'blocked') {
|
|
135
|
+
updates.type = 'task_block';
|
|
136
|
+
}
|
|
137
|
+
const updatedTask = { ...existing, ...updates };
|
|
138
|
+
this.appendTask(updatedTask);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Add dependency relationship
|
|
142
|
+
*/
|
|
143
|
+
addDependency(taskId, dependsOnId) {
|
|
144
|
+
const task = this.getTask(taskId);
|
|
145
|
+
const dependsOnTask = this.getTask(dependsOnId);
|
|
146
|
+
if (!task)
|
|
147
|
+
throw new Error(`Task not found: ${taskId}`);
|
|
148
|
+
if (!dependsOnTask)
|
|
149
|
+
throw new Error(`Dependency task not found: ${dependsOnId}`);
|
|
150
|
+
// Update task dependencies
|
|
151
|
+
const updatedTask = {
|
|
152
|
+
...task,
|
|
153
|
+
depends_on: [...new Set([...task.depends_on, dependsOnId])],
|
|
154
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
155
|
+
type: 'task_update'
|
|
156
|
+
};
|
|
157
|
+
// Update blocking task
|
|
158
|
+
const updatedBlockingTask = {
|
|
159
|
+
...dependsOnTask,
|
|
160
|
+
blocks: [...new Set([...dependsOnTask.blocks, taskId])],
|
|
161
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
162
|
+
type: 'task_update'
|
|
163
|
+
};
|
|
164
|
+
this.appendTask(updatedTask);
|
|
165
|
+
this.appendTask(updatedBlockingTask);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get current active tasks
|
|
169
|
+
*/
|
|
170
|
+
getActiveTasks(frameId) {
|
|
171
|
+
let query = `
|
|
172
|
+
SELECT * FROM task_cache
|
|
173
|
+
WHERE status IN ('pending', 'in_progress')
|
|
174
|
+
`;
|
|
175
|
+
const params = [];
|
|
176
|
+
if (frameId) {
|
|
177
|
+
query += ` AND frame_id = ?`;
|
|
178
|
+
params.push(frameId);
|
|
179
|
+
}
|
|
180
|
+
query += ` ORDER BY priority DESC, created_at ASC`;
|
|
181
|
+
const rows = this.db.prepare(query).all(...params);
|
|
182
|
+
return this.hydrateTasks(rows);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Get task by ID (latest version)
|
|
186
|
+
*/
|
|
187
|
+
getTask(taskId) {
|
|
188
|
+
const row = this.db.prepare(`
|
|
189
|
+
SELECT * FROM task_cache WHERE id = ?
|
|
190
|
+
`).get(taskId);
|
|
191
|
+
return row ? this.hydrateTask(row) : undefined;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get tasks that are blocking other tasks
|
|
195
|
+
*/
|
|
196
|
+
getBlockingTasks() {
|
|
197
|
+
const rows = this.db.prepare(`
|
|
198
|
+
SELECT * FROM task_cache
|
|
199
|
+
WHERE JSON_ARRAY_LENGTH(blocks) > 0
|
|
200
|
+
AND status NOT IN ('completed', 'cancelled')
|
|
201
|
+
ORDER BY priority DESC
|
|
202
|
+
`).all();
|
|
203
|
+
return this.hydrateTasks(rows);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get metrics for current project
|
|
207
|
+
*/
|
|
208
|
+
getMetrics() {
|
|
209
|
+
const statusCounts = this.db.prepare(`
|
|
210
|
+
SELECT status, COUNT(*) as count
|
|
211
|
+
FROM task_cache
|
|
212
|
+
GROUP BY status
|
|
213
|
+
`).all();
|
|
214
|
+
const priorityCounts = this.db.prepare(`
|
|
215
|
+
SELECT priority, COUNT(*) as count
|
|
216
|
+
FROM task_cache
|
|
217
|
+
GROUP BY priority
|
|
218
|
+
`).all();
|
|
219
|
+
const totalTasks = statusCounts.reduce((sum, s) => sum + s.count, 0);
|
|
220
|
+
const completedTasks = statusCounts.find(s => s.status === 'completed')?.count || 0;
|
|
221
|
+
const blockedTasks = statusCounts.find(s => s.status === 'blocked')?.count || 0;
|
|
222
|
+
// Calculate effort accuracy
|
|
223
|
+
const effortRows = this.db.prepare(`
|
|
224
|
+
SELECT estimated_effort, actual_effort
|
|
225
|
+
FROM task_cache
|
|
226
|
+
WHERE estimated_effort IS NOT NULL
|
|
227
|
+
AND actual_effort IS NOT NULL
|
|
228
|
+
`).all();
|
|
229
|
+
let avgEffortAccuracy = 0;
|
|
230
|
+
if (effortRows.length > 0) {
|
|
231
|
+
const accuracies = effortRows.map(r => 1 - Math.abs(r.estimated_effort - r.actual_effort) / Math.max(r.estimated_effort, 1));
|
|
232
|
+
avgEffortAccuracy = accuracies.reduce((sum, acc) => sum + acc, 0) / accuracies.length;
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
total_tasks: totalTasks,
|
|
236
|
+
by_status: Object.fromEntries(statusCounts.map(s => [s.status, s.count])),
|
|
237
|
+
by_priority: Object.fromEntries(priorityCounts.map(p => [p.priority, p.count])),
|
|
238
|
+
completion_rate: totalTasks > 0 ? completedTasks / totalTasks : 0,
|
|
239
|
+
avg_effort_accuracy: avgEffortAccuracy,
|
|
240
|
+
blocked_tasks: blockedTasks,
|
|
241
|
+
overdue_tasks: 0 // TODO: implement due dates
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Export tasks for Linear integration (Phase 2)
|
|
246
|
+
*/
|
|
247
|
+
exportForLinear() {
|
|
248
|
+
const tasks = this.db.prepare(`
|
|
249
|
+
SELECT * FROM task_cache
|
|
250
|
+
WHERE external_refs IS NULL OR JSON_EXTRACT(external_refs, '$.linear') IS NULL
|
|
251
|
+
ORDER BY created_at ASC
|
|
252
|
+
`).all();
|
|
253
|
+
return tasks.map(task => ({
|
|
254
|
+
title: task.title,
|
|
255
|
+
description: task.description,
|
|
256
|
+
priority: this.mapPriorityToLinear(task.priority),
|
|
257
|
+
status: this.mapStatusToLinear(task.status),
|
|
258
|
+
estimate: task.estimated_effort,
|
|
259
|
+
dependencies: JSON.parse(task.depends_on || '[]')
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
// Private methods
|
|
263
|
+
appendTask(task) {
|
|
264
|
+
// Append to JSONL file (git-tracked source of truth)
|
|
265
|
+
const jsonLine = JSON.stringify(task) + '\n';
|
|
266
|
+
appendFile(this.tasksFile, jsonLine, (err) => {
|
|
267
|
+
if (err)
|
|
268
|
+
logger.error(`Failed to append task ${task.id} to JSONL: ${err.message}`);
|
|
269
|
+
});
|
|
270
|
+
// Update SQLite cache (for fast queries)
|
|
271
|
+
this.upsertToCache(task);
|
|
272
|
+
logger.info('Appended task', {
|
|
273
|
+
id: task.id,
|
|
274
|
+
type: task.type,
|
|
275
|
+
title: task.title,
|
|
276
|
+
status: task.status
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
upsertToCache(task) {
|
|
280
|
+
this.db.prepare(`
|
|
281
|
+
INSERT OR REPLACE INTO task_cache (
|
|
282
|
+
id, type, timestamp, parent_id, frame_id, title, description,
|
|
283
|
+
status, priority, assignee, created_at, started_at, completed_at,
|
|
284
|
+
estimated_effort, actual_effort, depends_on, blocks, tags,
|
|
285
|
+
external_refs, context_score, last_accessed
|
|
286
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
287
|
+
`).run(task.id, task.type, task.timestamp, task.parent_id, task.frame_id, task.title, task.description, task.status, task.priority, task.assignee, task.created_at, task.started_at, task.completed_at, task.estimated_effort, task.actual_effort, JSON.stringify(task.depends_on), JSON.stringify(task.blocks), JSON.stringify(task.tags), JSON.stringify(task.external_refs || {}), task.context_score, task.last_accessed);
|
|
288
|
+
}
|
|
289
|
+
generateTaskId(content) {
|
|
290
|
+
const hash = createHash('sha256').update(content).digest('hex');
|
|
291
|
+
return `tsk-${hash.substring(0, 8)}`;
|
|
292
|
+
}
|
|
293
|
+
hydrateTask = (row) => ({
|
|
294
|
+
...row,
|
|
295
|
+
depends_on: JSON.parse(row.depends_on || '[]'),
|
|
296
|
+
blocks: JSON.parse(row.blocks || '[]'),
|
|
297
|
+
tags: JSON.parse(row.tags || '[]'),
|
|
298
|
+
external_refs: JSON.parse(row.external_refs || '{}')
|
|
299
|
+
});
|
|
300
|
+
hydrateTasks(rows) {
|
|
301
|
+
return rows.map(this.hydrateTask);
|
|
302
|
+
}
|
|
303
|
+
mapPriorityToLinear(priority) {
|
|
304
|
+
const map = { low: 1, medium: 2, high: 3, urgent: 4 };
|
|
305
|
+
return map[priority] || 2;
|
|
306
|
+
}
|
|
307
|
+
mapStatusToLinear(status) {
|
|
308
|
+
const map = {
|
|
309
|
+
pending: 'Backlog',
|
|
310
|
+
in_progress: 'In Progress',
|
|
311
|
+
completed: 'Done',
|
|
312
|
+
blocked: 'Blocked',
|
|
313
|
+
cancelled: 'Cancelled'
|
|
314
|
+
};
|
|
315
|
+
return map[status] || 'Backlog';
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=beads-task-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beads-task-store.js","sourceRoot":"","sources":["../../../src/beads/beads-task-store.ts"],"names":[],"mappings":"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"}
|