universal-agent-memory 0.1.4 → 0.2.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.
Files changed (73) hide show
  1. package/dist/analyzers/index.d.ts.map +1 -1
  2. package/dist/analyzers/index.js +75 -0
  3. package/dist/analyzers/index.js.map +1 -1
  4. package/dist/bin/cli.js +207 -0
  5. package/dist/bin/cli.js.map +1 -1
  6. package/dist/cli/agent.d.ts +20 -0
  7. package/dist/cli/agent.d.ts.map +1 -0
  8. package/dist/cli/agent.js +388 -0
  9. package/dist/cli/agent.js.map +1 -0
  10. package/dist/cli/coord.d.ts +7 -0
  11. package/dist/cli/coord.d.ts.map +1 -0
  12. package/dist/cli/coord.js +145 -0
  13. package/dist/cli/coord.js.map +1 -0
  14. package/dist/cli/deploy.d.ts +19 -0
  15. package/dist/cli/deploy.d.ts.map +1 -0
  16. package/dist/cli/deploy.js +267 -0
  17. package/dist/cli/deploy.js.map +1 -0
  18. package/dist/cli/task.d.ts +33 -0
  19. package/dist/cli/task.d.ts.map +1 -0
  20. package/dist/cli/task.js +570 -0
  21. package/dist/cli/task.js.map +1 -0
  22. package/dist/coordination/database.d.ts +13 -0
  23. package/dist/coordination/database.d.ts.map +1 -0
  24. package/dist/coordination/database.js +131 -0
  25. package/dist/coordination/database.js.map +1 -0
  26. package/dist/coordination/deploy-batcher.d.ts +38 -0
  27. package/dist/coordination/deploy-batcher.d.ts.map +1 -0
  28. package/dist/coordination/deploy-batcher.js +401 -0
  29. package/dist/coordination/deploy-batcher.js.map +1 -0
  30. package/dist/coordination/index.d.ts +4 -0
  31. package/dist/coordination/index.d.ts.map +1 -0
  32. package/dist/coordination/index.js +4 -0
  33. package/dist/coordination/index.js.map +1 -0
  34. package/dist/coordination/service.d.ts +79 -0
  35. package/dist/coordination/service.d.ts.map +1 -0
  36. package/dist/coordination/service.js +591 -0
  37. package/dist/coordination/service.js.map +1 -0
  38. package/dist/generators/claude-md.js +2 -1
  39. package/dist/generators/claude-md.js.map +1 -1
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +2 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/tasks/coordination.d.ts +74 -0
  45. package/dist/tasks/coordination.d.ts.map +1 -0
  46. package/dist/tasks/coordination.js +237 -0
  47. package/dist/tasks/coordination.js.map +1 -0
  48. package/dist/tasks/database.d.ts +14 -0
  49. package/dist/tasks/database.d.ts.map +1 -0
  50. package/dist/tasks/database.js +128 -0
  51. package/dist/tasks/database.js.map +1 -0
  52. package/dist/tasks/index.d.ts +5 -0
  53. package/dist/tasks/index.d.ts.map +1 -0
  54. package/dist/tasks/index.js +5 -0
  55. package/dist/tasks/index.js.map +1 -0
  56. package/dist/tasks/service.d.ts +39 -0
  57. package/dist/tasks/service.d.ts.map +1 -0
  58. package/dist/tasks/service.js +582 -0
  59. package/dist/tasks/service.js.map +1 -0
  60. package/dist/tasks/types.d.ts +224 -0
  61. package/dist/tasks/types.d.ts.map +1 -0
  62. package/dist/tasks/types.js +64 -0
  63. package/dist/tasks/types.js.map +1 -0
  64. package/dist/types/coordination.d.ts +240 -0
  65. package/dist/types/coordination.d.ts.map +1 -0
  66. package/dist/types/coordination.js +43 -0
  67. package/dist/types/coordination.js.map +1 -0
  68. package/dist/types/index.d.ts +1 -0
  69. package/dist/types/index.d.ts.map +1 -1
  70. package/dist/types/index.js +1 -0
  71. package/dist/types/index.js.map +1 -1
  72. package/package.json +1 -1
  73. package/templates/CLAUDE.template.md +335 -48
@@ -0,0 +1,128 @@
1
+ import Database from 'better-sqlite3';
2
+ import { existsSync, mkdirSync } from 'fs';
3
+ import { dirname } from 'path';
4
+ export class TaskDatabase {
5
+ db;
6
+ static instance = null;
7
+ constructor(dbPath) {
8
+ const dir = dirname(dbPath);
9
+ if (!existsSync(dir)) {
10
+ mkdirSync(dir, { recursive: true });
11
+ }
12
+ this.db = new Database(dbPath);
13
+ this.initSchema();
14
+ }
15
+ static getInstance(dbPath) {
16
+ if (!TaskDatabase.instance) {
17
+ TaskDatabase.instance = new TaskDatabase(dbPath);
18
+ }
19
+ return TaskDatabase.instance;
20
+ }
21
+ static resetInstance() {
22
+ if (TaskDatabase.instance) {
23
+ TaskDatabase.instance.close();
24
+ TaskDatabase.instance = null;
25
+ }
26
+ }
27
+ getDatabase() {
28
+ return this.db;
29
+ }
30
+ initSchema() {
31
+ this.db.exec(`
32
+ -- Tasks (core)
33
+ CREATE TABLE IF NOT EXISTS tasks (
34
+ id TEXT PRIMARY KEY,
35
+ title TEXT NOT NULL,
36
+ description TEXT,
37
+ type TEXT NOT NULL CHECK(type IN ('task', 'bug', 'feature', 'epic', 'chore', 'story')) DEFAULT 'task',
38
+ status TEXT NOT NULL CHECK(status IN ('open', 'in_progress', 'blocked', 'done', 'wont_do')) DEFAULT 'open',
39
+ priority INTEGER NOT NULL CHECK(priority BETWEEN 0 AND 4) DEFAULT 2,
40
+ assignee TEXT,
41
+ worktree_branch TEXT,
42
+ labels TEXT,
43
+ notes TEXT,
44
+ parent_id TEXT,
45
+ created_at TEXT NOT NULL,
46
+ updated_at TEXT NOT NULL,
47
+ closed_at TEXT,
48
+ closed_reason TEXT,
49
+ FOREIGN KEY (parent_id) REFERENCES tasks(id)
50
+ );
51
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
52
+ CREATE INDEX IF NOT EXISTS idx_tasks_type ON tasks(type);
53
+ CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority);
54
+ CREATE INDEX IF NOT EXISTS idx_tasks_assignee ON tasks(assignee);
55
+ CREATE INDEX IF NOT EXISTS idx_tasks_parent ON tasks(parent_id);
56
+
57
+ -- Dependencies (DAG edges)
58
+ CREATE TABLE IF NOT EXISTS task_dependencies (
59
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
60
+ from_task TEXT NOT NULL,
61
+ to_task TEXT NOT NULL,
62
+ dep_type TEXT NOT NULL CHECK(dep_type IN ('blocks', 'related', 'discovered_from')),
63
+ created_at TEXT NOT NULL,
64
+ FOREIGN KEY (from_task) REFERENCES tasks(id),
65
+ FOREIGN KEY (to_task) REFERENCES tasks(id),
66
+ UNIQUE(from_task, to_task)
67
+ );
68
+ CREATE INDEX IF NOT EXISTS idx_deps_from ON task_dependencies(from_task);
69
+ CREATE INDEX IF NOT EXISTS idx_deps_to ON task_dependencies(to_task);
70
+ CREATE INDEX IF NOT EXISTS idx_deps_type ON task_dependencies(dep_type);
71
+
72
+ -- Task history (audit trail)
73
+ CREATE TABLE IF NOT EXISTS task_history (
74
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
75
+ task_id TEXT NOT NULL,
76
+ field TEXT NOT NULL,
77
+ old_value TEXT,
78
+ new_value TEXT,
79
+ changed_by TEXT,
80
+ changed_at TEXT NOT NULL,
81
+ FOREIGN KEY (task_id) REFERENCES tasks(id)
82
+ );
83
+ CREATE INDEX IF NOT EXISTS idx_history_task ON task_history(task_id);
84
+ CREATE INDEX IF NOT EXISTS idx_history_time ON task_history(changed_at);
85
+
86
+ -- Task activity (for coordination integration)
87
+ CREATE TABLE IF NOT EXISTS task_activity (
88
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
89
+ task_id TEXT NOT NULL,
90
+ agent_id TEXT NOT NULL,
91
+ activity TEXT NOT NULL CHECK(activity IN ('claimed', 'released', 'commented', 'updated', 'created', 'closed')),
92
+ details TEXT,
93
+ timestamp TEXT NOT NULL,
94
+ FOREIGN KEY (task_id) REFERENCES tasks(id)
95
+ );
96
+ CREATE INDEX IF NOT EXISTS idx_activity_task ON task_activity(task_id);
97
+ CREATE INDEX IF NOT EXISTS idx_activity_agent ON task_activity(agent_id);
98
+
99
+ -- Compacted summaries (memory decay)
100
+ CREATE TABLE IF NOT EXISTS task_summaries (
101
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
102
+ original_ids TEXT NOT NULL,
103
+ summary TEXT NOT NULL,
104
+ labels TEXT,
105
+ closed_period TEXT,
106
+ created_at TEXT NOT NULL
107
+ );
108
+ CREATE INDEX IF NOT EXISTS idx_summaries_period ON task_summaries(closed_period);
109
+
110
+ -- Sync metadata
111
+ CREATE TABLE IF NOT EXISTS task_sync_meta (
112
+ key TEXT PRIMARY KEY,
113
+ value TEXT NOT NULL,
114
+ updated_at TEXT NOT NULL
115
+ );
116
+ `);
117
+ }
118
+ close() {
119
+ this.db.close();
120
+ }
121
+ }
122
+ export function getDefaultTaskDbPath() {
123
+ return './.uam/tasks/tasks.db';
124
+ }
125
+ export function getDefaultTaskJSONLPath() {
126
+ return './.uam/tasks/tasks.jsonl';
127
+ }
128
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/tasks/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,OAAO,YAAY;IACf,EAAE,CAAoB;IACtB,MAAM,CAAC,QAAQ,GAAwB,IAAI,CAAC;IAEpD,YAAoB,MAAc;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,MAAc;QAC/B,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3B,YAAY,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC1B,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC9B,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqFZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;;AAGH,MAAM,UAAU,oBAAoB;IAClC,OAAO,uBAAuB,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,0BAA0B,CAAC;AACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './types.js';
2
+ export * from './database.js';
3
+ export * from './service.js';
4
+ export * from './coordination.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './types.js';
2
+ export * from './database.js';
3
+ export * from './service.js';
4
+ export * from './coordination.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { Task, TaskWithRelations, TaskDependency, TaskHistoryEntry, TaskActivity, TaskSummary, TaskStats, CreateTaskInput, UpdateTaskInput, TaskFilter, DependencyType } from './types.js';
2
+ export interface TaskServiceConfig {
3
+ dbPath?: string;
4
+ jsonlPath?: string;
5
+ agentId?: string;
6
+ }
7
+ export declare class TaskService {
8
+ private db;
9
+ private jsonlPath;
10
+ private agentId?;
11
+ constructor(config?: TaskServiceConfig);
12
+ private generateId;
13
+ create(input: CreateTaskInput): Task;
14
+ get(id: string): Task | null;
15
+ getWithRelations(id: string): TaskWithRelations | null;
16
+ update(id: string, input: UpdateTaskInput): Task | null;
17
+ close(id: string, reason?: string): Task | null;
18
+ delete(id: string): boolean;
19
+ list(filter?: TaskFilter): Task[];
20
+ ready(): TaskWithRelations[];
21
+ blocked(): TaskWithRelations[];
22
+ getChildren(parentId: string): Task[];
23
+ addDependency(fromTask: string, toTask: string, depType?: DependencyType): TaskDependency | null;
24
+ removeDependency(fromTask: string, toTask: string): boolean;
25
+ getDependencies(taskId: string): TaskDependency[];
26
+ getBlockers(taskId: string): Task[];
27
+ private wouldCreateCycle;
28
+ private recordHistory;
29
+ private recordActivity;
30
+ getHistory(taskId: string): TaskHistoryEntry[];
31
+ getActivity(taskId: string): TaskActivity[];
32
+ getStats(): TaskStats;
33
+ exportToJSONL(): string;
34
+ saveToJSONL(): void;
35
+ importFromJSONL(): number;
36
+ compact(olderThanDays?: number): TaskSummary | null;
37
+ getSummaries(): TaskSummary[];
38
+ }
39
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tasks/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,IAAI,EACJ,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,SAAS,EACT,eAAe,EACf,eAAe,EACf,UAAU,EAIV,cAAc,EAGf,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,MAAM,GAAE,iBAAsB;IAS1C,OAAO,CAAC,UAAU;IAQlB,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAgDpC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAiB5B,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAgCtD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAmGvD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAiB/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAiB3B,IAAI,CAAC,MAAM,GAAE,UAAe,GAAG,IAAI,EAAE;IAgFrC,KAAK,IAAI,iBAAiB,EAAE;IAO5B,OAAO,IAAI,iBAAiB,EAAE;IAO9B,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE;IAMrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAyB,GAAG,cAAc,GAAG,IAAI;IAsC1G,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAO3D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE;IASjD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE;IAanC,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;IAUtB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAW9C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE;IAY3C,QAAQ,IAAI,SAAS;IAyCrB,aAAa,IAAI,MAAM;IAkCvB,WAAW,IAAI,IAAI;IAUnB,eAAe,IAAI,MAAM;IA2DzB,OAAO,CAAC,aAAa,SAAK,GAAG,WAAW,GAAG,IAAI;IAkE/C,YAAY,IAAI,WAAW,EAAE;CAa9B"}