pmem-ai 0.7.1 → 0.7.3

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 (58) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +40 -2
  3. package/dist/commands/integration.js +1 -1
  4. package/dist/commands/mcp.d.ts +9 -0
  5. package/dist/commands/mcp.d.ts.map +1 -0
  6. package/dist/commands/mcp.js +64 -0
  7. package/dist/commands/mcp.js.map +1 -0
  8. package/dist/commands/milestone.d.ts +5 -0
  9. package/dist/commands/milestone.d.ts.map +1 -0
  10. package/dist/commands/milestone.js +197 -0
  11. package/dist/commands/milestone.js.map +1 -0
  12. package/dist/commands/rebuild.d.ts.map +1 -1
  13. package/dist/commands/rebuild.js +51 -7
  14. package/dist/commands/rebuild.js.map +1 -1
  15. package/dist/commands/update.d.ts +2 -0
  16. package/dist/commands/update.d.ts.map +1 -1
  17. package/dist/commands/update.js +87 -3
  18. package/dist/commands/update.js.map +1 -1
  19. package/dist/commands/verify.d.ts.map +1 -1
  20. package/dist/commands/verify.js +19 -8
  21. package/dist/commands/verify.js.map +1 -1
  22. package/dist/core/consistency.d.ts.map +1 -1
  23. package/dist/core/consistency.js +6 -0
  24. package/dist/core/consistency.js.map +1 -1
  25. package/dist/core/db.d.ts +20 -0
  26. package/dist/core/db.d.ts.map +1 -1
  27. package/dist/core/db.js +30 -0
  28. package/dist/core/db.js.map +1 -1
  29. package/dist/core/query/ask.d.ts +20 -0
  30. package/dist/core/query/ask.d.ts.map +1 -0
  31. package/dist/core/query/ask.js +256 -0
  32. package/dist/core/query/ask.js.map +1 -0
  33. package/dist/core/query/recall.d.ts +21 -0
  34. package/dist/core/query/recall.d.ts.map +1 -0
  35. package/dist/core/query/recall.js +148 -0
  36. package/dist/core/query/recall.js.map +1 -0
  37. package/dist/core/query/related.d.ts +29 -0
  38. package/dist/core/query/related.d.ts.map +1 -0
  39. package/dist/core/query/related.js +106 -0
  40. package/dist/core/query/related.js.map +1 -0
  41. package/dist/core/query/status.d.ts +24 -0
  42. package/dist/core/query/status.d.ts.map +1 -0
  43. package/dist/core/query/status.js +236 -0
  44. package/dist/core/query/status.js.map +1 -0
  45. package/dist/index.js +19 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/mcp/security.d.ts +21 -0
  48. package/dist/mcp/security.d.ts.map +1 -0
  49. package/dist/mcp/security.js +150 -0
  50. package/dist/mcp/security.js.map +1 -0
  51. package/dist/mcp/server.d.ts +2 -0
  52. package/dist/mcp/server.d.ts.map +1 -0
  53. package/dist/mcp/server.js +177 -0
  54. package/dist/mcp/server.js.map +1 -0
  55. package/docs/dogfooding.md +98 -0
  56. package/docs/pmem-rt.md +137 -0
  57. package/package.json +3 -2
  58. package/skills/pmem/SKILL.md +43 -2
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.askQuery = askQuery;
37
+ const path = __importStar(require("path"));
38
+ const fs_1 = require("../fs");
39
+ const db_1 = require("../db");
40
+ const manifest_1 = require("../manifest");
41
+ function askQuery(pmemPath, query) {
42
+ const dbPath = path.join(pmemPath, 'pmem.db');
43
+ if (!(0, fs_1.fileExists)(dbPath)) {
44
+ throw new Error('No SQLite database found. Run `pmem rebuild` first.');
45
+ }
46
+ const db = (0, db_1.openDatabase)(pmemPath);
47
+ (0, db_1.createSchema)(db);
48
+ const normalizedQuery = query.toLowerCase().trim();
49
+ const queryTokens = tokenize(normalizedQuery);
50
+ const matches = [];
51
+ const seenIds = new Set();
52
+ // Step 1: Exact match — card ID
53
+ const idMatches = db.prepare("SELECT * FROM cards WHERE (id = ? OR id LIKE ?) AND is_deleted = 0").all(normalizedQuery, `%${normalizedQuery}%`);
54
+ for (const card of idMatches) {
55
+ if (seenIds.has(card.id))
56
+ continue;
57
+ seenIds.add(card.id);
58
+ matches.push({
59
+ id: card.id,
60
+ title: card.title,
61
+ match_type: card.id === normalizedQuery ? 'exact_id' : 'exact_title',
62
+ confidence: card.id === normalizedQuery ? 0.95 : 0.85,
63
+ graph_distance: 0,
64
+ file: card.file_path,
65
+ });
66
+ }
67
+ // Step 2: Exact match — aliases
68
+ const aliasMatches = db.prepare(`SELECT c.* FROM cards c
69
+ JOIN aliases a ON c.id = a.card_id
70
+ WHERE (a.normalized_alias = ? OR a.normalized_alias LIKE ?)
71
+ AND c.is_deleted = 0`).all(normalizedQuery, `%${normalizedQuery}%`);
72
+ for (const card of aliasMatches) {
73
+ if (seenIds.has(card.id))
74
+ continue;
75
+ seenIds.add(card.id);
76
+ matches.push({
77
+ id: card.id,
78
+ title: card.title,
79
+ match_type: 'alias',
80
+ confidence: 0.9,
81
+ graph_distance: 0,
82
+ file: card.file_path,
83
+ });
84
+ }
85
+ // Step 3: Exact match — tags
86
+ const tagMatches = db.prepare(`SELECT c.* FROM cards c
87
+ JOIN tags t ON c.id = t.card_id
88
+ WHERE t.normalized_tag = ?
89
+ AND c.is_deleted = 0`).all(normalizedQuery);
90
+ for (const card of tagMatches) {
91
+ if (seenIds.has(card.id))
92
+ continue;
93
+ seenIds.add(card.id);
94
+ matches.push({
95
+ id: card.id,
96
+ title: card.title,
97
+ match_type: 'tag',
98
+ confidence: 0.7,
99
+ graph_distance: 0,
100
+ file: card.file_path,
101
+ });
102
+ }
103
+ // Token-based tag matching
104
+ for (const token of queryTokens) {
105
+ const tokenTagMatches = db.prepare(`SELECT c.* FROM cards c
106
+ JOIN tags t ON c.id = t.card_id
107
+ WHERE t.normalized_tag LIKE ?
108
+ AND c.is_deleted = 0`).all(`%${token}%`);
109
+ for (const card of tokenTagMatches) {
110
+ if (seenIds.has(card.id))
111
+ continue;
112
+ seenIds.add(card.id);
113
+ matches.push({
114
+ id: card.id,
115
+ title: card.title,
116
+ match_type: 'tag',
117
+ confidence: 0.6,
118
+ graph_distance: 0,
119
+ file: card.file_path,
120
+ });
121
+ }
122
+ }
123
+ // Step 4: Graph expansion — 1-hop neighbors
124
+ const matchedIdsAtThisPoint = new Set(matches.map(m => m.id));
125
+ for (const match of matches) {
126
+ const edges = db.prepare("SELECT * FROM edges WHERE from_id = ? OR to_id = ?").all(match.id, match.id);
127
+ for (const edge of edges) {
128
+ const neighborId = edge.from_id === match.id ? edge.to_id : edge.from_id;
129
+ if (matchedIdsAtThisPoint.has(neighborId) || seenIds.has(neighborId))
130
+ continue;
131
+ seenIds.add(neighborId);
132
+ const neighborCard = db.prepare("SELECT * FROM cards WHERE id = ? AND is_deleted = 0").get(neighborId);
133
+ if (neighborCard) {
134
+ matches.push({
135
+ id: neighborCard.id,
136
+ title: neighborCard.title,
137
+ match_type: 'graph_expansion',
138
+ confidence: 0.6,
139
+ graph_distance: 1,
140
+ file: neighborCard.file_path,
141
+ edge_type: edge.type,
142
+ from_card: match.id,
143
+ });
144
+ }
145
+ }
146
+ }
147
+ // Step 5: Keyword fallback — FTS5 if available, else LIKE
148
+ const directMatchesBeforeFallback = matches.filter(m => m.match_type !== 'graph_expansion');
149
+ if (directMatchesBeforeFallback.length === 0) {
150
+ if ((0, db_1.hasFTS5)(db)) {
151
+ try {
152
+ const ftsResults = db.prepare("SELECT c.*, rank FROM card_fts JOIN cards c ON card_fts.card_id = c.id WHERE card_fts MATCH ? AND c.is_deleted = 0 ORDER BY rank").all(normalizedQuery);
153
+ for (const row of ftsResults) {
154
+ if (seenIds.has(row.id))
155
+ continue;
156
+ seenIds.add(row.id);
157
+ matches.push({
158
+ id: row.id,
159
+ title: row.title,
160
+ match_type: 'keyword_fallback',
161
+ confidence: Math.min(0.5, 1 / (1 + (row.rank || 1))),
162
+ graph_distance: 0,
163
+ file: row.file_path,
164
+ });
165
+ }
166
+ }
167
+ catch {
168
+ // FTS5 query failed, fall through to LIKE fallback
169
+ }
170
+ }
171
+ // LIKE fallback
172
+ if (matches.filter(m => m.match_type === 'keyword_fallback').length === 0) {
173
+ const likePattern = `%${normalizedQuery}%`;
174
+ const likeResults = db.prepare("SELECT * FROM cards WHERE (title LIKE ? OR summary LIKE ?) AND is_deleted = 0").all(likePattern, likePattern);
175
+ for (const card of likeResults) {
176
+ if (seenIds.has(card.id))
177
+ continue;
178
+ seenIds.add(card.id);
179
+ const titleLower = card.title.toLowerCase();
180
+ const tokenOverlap = queryTokens.filter(t => titleLower.includes(t)).length;
181
+ matches.push({
182
+ id: card.id,
183
+ title: card.title,
184
+ match_type: 'keyword_fallback',
185
+ confidence: Math.min(0.5, tokenOverlap / Math.max(1, queryTokens.length)),
186
+ graph_distance: 0,
187
+ file: card.file_path,
188
+ });
189
+ }
190
+ }
191
+ }
192
+ // Step 6: Rerank
193
+ const typeOrder = {
194
+ exact_id: 5,
195
+ exact_title: 4,
196
+ alias: 3,
197
+ tag: 2,
198
+ graph_expansion: 1,
199
+ keyword_fallback: 0,
200
+ };
201
+ matches.sort((a, b) => {
202
+ return ((typeOrder[b.match_type] - typeOrder[a.match_type]) ||
203
+ (b.confidence - a.confidence) ||
204
+ (a.graph_distance - b.graph_distance));
205
+ });
206
+ // Step 7: Deduplicate
207
+ const dedupedIds = new Set();
208
+ const deduped = [];
209
+ for (const m of matches) {
210
+ if (dedupedIds.has(m.id))
211
+ continue;
212
+ dedupedIds.add(m.id);
213
+ deduped.push(m);
214
+ }
215
+ // Build recommended_files and evidence_paths
216
+ const recommendedFiles = [];
217
+ for (const m of deduped.slice(0, 8)) {
218
+ recommendedFiles.push(m.file);
219
+ }
220
+ const manifest = (0, manifest_1.loadManifest)(pmemPath);
221
+ const config = manifest ? (0, manifest_1.resolveConfig)(manifest) : { evidence_types: ['decision', 'trace'] };
222
+ const evidenceTypes = config.evidence_types;
223
+ const evidencePaths = [];
224
+ for (const m of deduped) {
225
+ const card = db.prepare("SELECT type, file_path FROM cards WHERE id = ? AND is_deleted = 0").get(m.id);
226
+ if (card && evidenceTypes.includes(card.type)) {
227
+ evidencePaths.push(card.file_path);
228
+ }
229
+ }
230
+ return {
231
+ query,
232
+ matched: deduped,
233
+ recommended_files: recommendedFiles,
234
+ evidence_paths: evidencePaths,
235
+ };
236
+ }
237
+ function tokenize(text) {
238
+ const tokens = [];
239
+ const words = text.split(/[\s,,。、;;::!!??()()\[\]【】{}]+/);
240
+ for (const word of words) {
241
+ if (word.length === 0)
242
+ continue;
243
+ if (/[一-鿿]/.test(word)) {
244
+ const cjkChars = word.match(/[一-鿿]/g) || [];
245
+ tokens.push(...cjkChars);
246
+ const nonCjk = word.replace(/[一-鿿]/g, '').trim();
247
+ if (nonCjk)
248
+ tokens.push(nonCjk.toLowerCase());
249
+ }
250
+ else {
251
+ tokens.push(word.toLowerCase());
252
+ }
253
+ }
254
+ return [...new Set(tokens)];
255
+ }
256
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../../src/core/query/ask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface RecallQueryResult {
2
+ project: string;
3
+ stage?: string;
4
+ focus: string;
5
+ state: string[];
6
+ next: string;
7
+ mustRead: string[];
8
+ dirty_flags_count: number;
9
+ recent_updates: Array<{
10
+ action: string;
11
+ summary: string | null;
12
+ created_at: string;
13
+ }>;
14
+ active_modules: string[];
15
+ active_foundation: string[];
16
+ }
17
+ export declare function recallQuery(pmemPath: string, options?: {
18
+ budget?: number;
19
+ since?: string;
20
+ }): RecallQueryResult;
21
+ //# sourceMappingURL=recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/core/query/recall.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,iBAAiB,CAmGpB"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.recallQuery = recallQuery;
37
+ const path = __importStar(require("path"));
38
+ const fs_1 = require("../fs");
39
+ const db_1 = require("../db");
40
+ const manifest_1 = require("../manifest");
41
+ const PMEM_DIR = '.pmem';
42
+ function recallQuery(pmemPath, options) {
43
+ const indexContent = (0, fs_1.readFile)(path.join(pmemPath, 'index.md'));
44
+ const stateContent = (0, fs_1.readFile)(path.join(pmemPath, 'state.md'));
45
+ const nextContent = (0, fs_1.readFile)(path.join(pmemPath, 'next.md'));
46
+ if (!indexContent) {
47
+ throw new Error('No .pmem/index.md found. Run `pmem init` first.');
48
+ }
49
+ const projectName = extractField(indexContent, 'Name:');
50
+ const projectStage = extractField(indexContent, 'Stage:');
51
+ const currentFocus = extractField(indexContent, 'Current Focus');
52
+ const stateLines = [];
53
+ if (stateContent) {
54
+ const lines = stateContent.split('\n');
55
+ let inSection = false;
56
+ for (const line of lines) {
57
+ if (line.startsWith('## ')) {
58
+ inSection = !line.includes('Overall Status');
59
+ }
60
+ else if (inSection && line.trim().startsWith('-')) {
61
+ stateLines.push(line.trim());
62
+ }
63
+ }
64
+ }
65
+ const nextStep = nextContent
66
+ ? extractField(nextContent, '## Recommended Next Step')
67
+ : 'No next step recorded.';
68
+ const manifest = (0, manifest_1.loadManifest)(pmemPath);
69
+ const config = manifest ? (0, manifest_1.resolveConfig)(manifest) : { foundational_types: ['module'] };
70
+ const foundationalTypes = config.foundational_types;
71
+ const result = {
72
+ project: projectName || 'Unknown',
73
+ stage: projectStage || undefined,
74
+ focus: currentFocus || 'No focus recorded.',
75
+ state: stateLines,
76
+ next: nextStep || 'No next step recorded.',
77
+ mustRead: [],
78
+ dirty_flags_count: 0,
79
+ recent_updates: [],
80
+ active_modules: [],
81
+ active_foundation: [],
82
+ };
83
+ const dbPath = path.join(pmemPath, 'pmem.db');
84
+ if (!(0, fs_1.fileExists)(dbPath)) {
85
+ result.mustRead.push('.pmem/state.md');
86
+ result.mustRead.push('.pmem/next.md');
87
+ return result;
88
+ }
89
+ const db = (0, db_1.openDatabase)(pmemPath);
90
+ (0, db_1.createSchema)(db);
91
+ let sinceThreshold = null;
92
+ if (options?.since) {
93
+ sinceThreshold = parseSince(options.since);
94
+ if (sinceThreshold === null) {
95
+ throw new Error(`Invalid --since format: "${options.since}". Use <N>h, <N>d, or <N>w (e.g. 24h, 7d, 1w).`);
96
+ }
97
+ }
98
+ const activeCards = sinceThreshold
99
+ ? db.prepare("SELECT * FROM cards WHERE is_deleted = 0 AND is_candidate = 0 AND updated_at >= ?").all(sinceThreshold)
100
+ : db.prepare("SELECT * FROM cards WHERE is_deleted = 0 AND is_candidate = 0").all();
101
+ const foundationalCards = activeCards.filter(c => foundationalTypes.includes(c.type));
102
+ result.active_foundation = foundationalCards.map(c => c.file_path);
103
+ result.active_modules = result.active_foundation;
104
+ result.mustRead.push('.pmem/state.md');
105
+ result.mustRead.push('.pmem/next.md');
106
+ for (const card of foundationalCards.slice(0, 5)) {
107
+ result.mustRead.push(card.file_path);
108
+ }
109
+ const dirtyFlagResult = db.prepare("SELECT COUNT(*) as count FROM dirty_flags WHERE resolved_at IS NULL").get();
110
+ result.dirty_flags_count = dirtyFlagResult.count;
111
+ const recentUpdates = db.prepare("SELECT action, summary, created_at FROM update_log ORDER BY created_at DESC LIMIT 5").all();
112
+ result.recent_updates = recentUpdates;
113
+ if (result.mustRead.length === 0) {
114
+ result.mustRead.push('.pmem/state.md');
115
+ result.mustRead.push('.pmem/next.md');
116
+ }
117
+ return result;
118
+ }
119
+ function extractField(content, fieldName) {
120
+ const lines = content.split('\n');
121
+ for (let i = 0; i < lines.length; i++) {
122
+ const line = lines[i];
123
+ if (line.includes(fieldName)) {
124
+ const val = line.split(fieldName)[1]?.trim();
125
+ if (val)
126
+ return val;
127
+ if (i + 1 < lines.length && lines[i + 1].trim()) {
128
+ return lines[i + 1].trim();
129
+ }
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ function parseSince(since) {
135
+ const match = since.match(/^(\d+)([hdw])$/);
136
+ if (!match)
137
+ return null;
138
+ const value = parseInt(match[1], 10);
139
+ const unit = match[2];
140
+ const ms = unit === 'h' ? value * 3600000
141
+ : unit === 'd' ? value * 86400000
142
+ : unit === 'w' ? value * 604800000
143
+ : 0;
144
+ if (ms === 0)
145
+ return null;
146
+ return new Date(Date.now() - ms).toISOString();
147
+ }
148
+ //# sourceMappingURL=recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../../src/core/query/recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ interface RelatedEdgeItem {
2
+ direction: 'out' | 'in';
3
+ target_id: string;
4
+ target_title: string;
5
+ target_type: string;
6
+ target_status: string | null;
7
+ source: string;
8
+ confidence: number;
9
+ }
10
+ export interface RelatedResult {
11
+ card: {
12
+ id: string;
13
+ type: string;
14
+ title: string;
15
+ status: string | null;
16
+ file: string;
17
+ };
18
+ total_edges: number;
19
+ edges_by_type: Record<string, RelatedEdgeItem[]>;
20
+ high_confidence: RelatedEdgeItem[];
21
+ needs_review: RelatedEdgeItem[];
22
+ }
23
+ export declare function relatedQuery(pmemPath: string, id: string, options?: {
24
+ depth?: number;
25
+ type?: string;
26
+ source?: 'explicit' | 'inferred' | 'mention' | 'all';
27
+ }): RelatedResult;
28
+ export {};
29
+ //# sourceMappingURL=related.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"related.d.ts","sourceRoot":"","sources":["../../../src/core/query/related.ts"],"names":[],"mappings":"AAKA,UAAU,eAAe;IACvB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IACjD,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK,CAAC;CACtD,GAAG,aAAa,CAgFhB"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.relatedQuery = relatedQuery;
37
+ const path = __importStar(require("path"));
38
+ const fs_1 = require("../fs");
39
+ const db_1 = require("../db");
40
+ function relatedQuery(pmemPath, id, options) {
41
+ const dbPath = path.join(pmemPath, 'pmem.db');
42
+ if (!(0, fs_1.fileExists)(dbPath)) {
43
+ throw new Error('No SQLite database found. Run `pmem rebuild` first.');
44
+ }
45
+ const edgeTypeFilter = options?.type;
46
+ const sourceFilter = (options?.source && options.source !== 'all')
47
+ ? options.source
48
+ : undefined;
49
+ const db = (0, db_1.openDatabase)(pmemPath);
50
+ (0, db_1.createSchema)(db);
51
+ const card = db.prepare('SELECT * FROM cards WHERE id = ? AND is_deleted = 0').get(id);
52
+ if (!card) {
53
+ throw new Error(`Node "${id}" not found in database.`);
54
+ }
55
+ let directEdges = (0, db_1.getEdgesForCard)(db, id, sourceFilter);
56
+ if (edgeTypeFilter) {
57
+ directEdges = directEdges.filter(e => e.type === edgeTypeFilter);
58
+ }
59
+ const getCard = (cardId) => {
60
+ return db.prepare('SELECT * FROM cards WHERE id = ? AND is_deleted = 0').get(cardId);
61
+ };
62
+ const edgesByType = {};
63
+ for (const edge of directEdges) {
64
+ const isOut = edge.from_id === id;
65
+ const targetId = isOut ? edge.to_id : edge.from_id;
66
+ const targetCard = getCard(targetId);
67
+ if (!edgesByType[edge.type]) {
68
+ edgesByType[edge.type] = [];
69
+ }
70
+ edgesByType[edge.type].push({
71
+ direction: isOut ? 'out' : 'in',
72
+ target_id: targetId,
73
+ target_title: targetCard?.title ?? targetId,
74
+ target_type: targetCard?.type ?? 'unknown',
75
+ target_status: targetCard?.status ?? null,
76
+ source: edge.source,
77
+ confidence: edge.confidence,
78
+ });
79
+ }
80
+ const highConfidence = [];
81
+ const needsReview = [];
82
+ for (const items of Object.values(edgesByType)) {
83
+ for (const item of items) {
84
+ if (item.source === 'inferred' && item.confidence < 0.7) {
85
+ needsReview.push(item);
86
+ }
87
+ else {
88
+ highConfidence.push(item);
89
+ }
90
+ }
91
+ }
92
+ return {
93
+ card: {
94
+ id: card.id,
95
+ type: card.type,
96
+ title: card.title,
97
+ status: card.status,
98
+ file: card.file_path,
99
+ },
100
+ total_edges: directEdges.length,
101
+ edges_by_type: edgesByType,
102
+ high_confidence: highConfidence,
103
+ needs_review: needsReview,
104
+ };
105
+ }
106
+ //# sourceMappingURL=related.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"related.js","sourceRoot":"","sources":["../../../src/core/query/related.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface StatusResult {
2
+ checked_at: string;
3
+ source: 'git' | 'mtime';
4
+ changes: Array<{
5
+ path: string;
6
+ status: string;
7
+ related_cards: Array<{
8
+ card_id: string;
9
+ match_type: string;
10
+ }>;
11
+ }>;
12
+ affected_cards: Array<{
13
+ card_id: string;
14
+ match_type: string;
15
+ matched_file?: string;
16
+ matched_dir?: string;
17
+ via_card?: string;
18
+ }>;
19
+ suggested_action: string | null;
20
+ }
21
+ export declare function statusQuery(pmemPath: string, options?: {
22
+ since?: string;
23
+ }): StatusResult;
24
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/core/query/status.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC/D,CAAC,CAAC;IACH,cAAc,EAAE,KAAK,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,YAAY,CA6Gf"}