pmem-ai 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +40 -2
- package/dist/commands/integration.js +1 -1
- package/dist/commands/mcp.d.ts +9 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +64 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/milestone.d.ts +5 -0
- package/dist/commands/milestone.d.ts.map +1 -0
- package/dist/commands/milestone.js +197 -0
- package/dist/commands/milestone.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +87 -3
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +19 -8
- package/dist/commands/verify.js.map +1 -1
- package/dist/core/consistency.d.ts.map +1 -1
- package/dist/core/consistency.js +6 -0
- package/dist/core/consistency.js.map +1 -1
- package/dist/core/query/ask.d.ts +20 -0
- package/dist/core/query/ask.d.ts.map +1 -0
- package/dist/core/query/ask.js +256 -0
- package/dist/core/query/ask.js.map +1 -0
- package/dist/core/query/recall.d.ts +21 -0
- package/dist/core/query/recall.d.ts.map +1 -0
- package/dist/core/query/recall.js +148 -0
- package/dist/core/query/recall.js.map +1 -0
- package/dist/core/query/related.d.ts +29 -0
- package/dist/core/query/related.d.ts.map +1 -0
- package/dist/core/query/related.js +106 -0
- package/dist/core/query/related.js.map +1 -0
- package/dist/core/query/status.d.ts +24 -0
- package/dist/core/query/status.d.ts.map +1 -0
- package/dist/core/query/status.js +236 -0
- package/dist/core/query/status.js.map +1 -0
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/security.d.ts +21 -0
- package/dist/mcp/security.d.ts.map +1 -0
- package/dist/mcp/security.js +150 -0
- package/dist/mcp/security.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +177 -0
- package/dist/mcp/server.js.map +1 -0
- package/docs/dogfooding.md +98 -0
- package/docs/pmem-rt.md +137 -0
- package/package.json +3 -2
- package/skills/pmem/SKILL.md +43 -2
|
@@ -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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
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.statusQuery = statusQuery;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const child_process_1 = require("child_process");
|
|
39
|
+
const fs_1 = require("../fs");
|
|
40
|
+
const db_1 = require("../db");
|
|
41
|
+
const git_1 = require("../git");
|
|
42
|
+
const manifest_1 = require("../manifest");
|
|
43
|
+
const MATCH_PRIORITY = {
|
|
44
|
+
exact: 3,
|
|
45
|
+
directory: 2,
|
|
46
|
+
graph_neighbor: 1,
|
|
47
|
+
};
|
|
48
|
+
function statusQuery(pmemPath, options) {
|
|
49
|
+
const cwd = process.cwd();
|
|
50
|
+
const dbPath = path.join(pmemPath, 'pmem.db');
|
|
51
|
+
if (!(0, fs_1.fileExists)(pmemPath)) {
|
|
52
|
+
throw new Error('No .pmem directory found. Run `pmem init` first.');
|
|
53
|
+
}
|
|
54
|
+
const source = detectChangesFrom();
|
|
55
|
+
const changes = getChangedFiles(pmemPath, cwd, options?.since);
|
|
56
|
+
const affectedCards = new Map();
|
|
57
|
+
if ((0, fs_1.fileExists)(dbPath)) {
|
|
58
|
+
const db = (0, db_1.openDatabase)(pmemPath);
|
|
59
|
+
(0, db_1.createSchema)(db);
|
|
60
|
+
// Pass 1: Exact path matching
|
|
61
|
+
try {
|
|
62
|
+
const allPaths = db.prepare("SELECT card_id, path FROM paths").all();
|
|
63
|
+
for (const change of changes) {
|
|
64
|
+
for (const p of allPaths) {
|
|
65
|
+
if ((0, fs_1.isPathMatch)(change.path, p.path)) {
|
|
66
|
+
change.related_cards.push({ card_id: p.card_id, match_type: 'exact' });
|
|
67
|
+
upsertAffectedCard(affectedCards, {
|
|
68
|
+
card_id: p.card_id,
|
|
69
|
+
match_type: 'exact',
|
|
70
|
+
matched_file: change.path,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch { /* ignore query errors */ }
|
|
77
|
+
// Pass 2: Directory-level fuzzy matching
|
|
78
|
+
try {
|
|
79
|
+
const dirSet = new Set();
|
|
80
|
+
for (const change of changes) {
|
|
81
|
+
const dir = path.dirname(change.path);
|
|
82
|
+
if (dir && dir !== '.') {
|
|
83
|
+
dirSet.add(dir);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (const dir of dirSet) {
|
|
87
|
+
const dirPattern = dir + '/%';
|
|
88
|
+
const dirRows = db.prepare("SELECT card_id, path FROM paths WHERE path LIKE ?").all(dirPattern);
|
|
89
|
+
for (const row of dirRows) {
|
|
90
|
+
upsertAffectedCard(affectedCards, {
|
|
91
|
+
card_id: row.card_id,
|
|
92
|
+
match_type: 'directory',
|
|
93
|
+
matched_dir: dir + '/',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch { /* ignore query errors */ }
|
|
99
|
+
// Pass 3: Graph neighbor expansion (one-hop)
|
|
100
|
+
if (affectedCards.size > 0) {
|
|
101
|
+
const affectedCardIds = [...affectedCards.keys()];
|
|
102
|
+
const placeholders = affectedCardIds.map(() => '?').join(',');
|
|
103
|
+
try {
|
|
104
|
+
const edgeRows = db.prepare(`SELECT from_id, to_id FROM edges WHERE from_id IN (${placeholders}) OR to_id IN (${placeholders})`).all(...affectedCardIds, ...affectedCardIds);
|
|
105
|
+
for (const edge of edgeRows) {
|
|
106
|
+
if (affectedCards.has(edge.from_id) && !affectedCards.has(edge.to_id)) {
|
|
107
|
+
upsertAffectedCard(affectedCards, {
|
|
108
|
+
card_id: edge.to_id,
|
|
109
|
+
match_type: 'graph_neighbor',
|
|
110
|
+
via_card: edge.from_id,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
if (affectedCards.has(edge.to_id) && !affectedCards.has(edge.from_id)) {
|
|
114
|
+
upsertAffectedCard(affectedCards, {
|
|
115
|
+
card_id: edge.from_id,
|
|
116
|
+
match_type: 'graph_neighbor',
|
|
117
|
+
via_card: edge.to_id,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch { /* ignore query errors */ }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const affectedCardsList = [...affectedCards.values()];
|
|
126
|
+
return {
|
|
127
|
+
checked_at: new Date().toISOString(),
|
|
128
|
+
source,
|
|
129
|
+
changes: changes.map(c => ({
|
|
130
|
+
path: c.path,
|
|
131
|
+
status: c.status,
|
|
132
|
+
related_cards: c.related_cards,
|
|
133
|
+
})),
|
|
134
|
+
affected_cards: affectedCardsList.map(ac => {
|
|
135
|
+
const obj = { card_id: ac.card_id, match_type: ac.match_type };
|
|
136
|
+
if (ac.matched_file)
|
|
137
|
+
obj.matched_file = ac.matched_file;
|
|
138
|
+
if (ac.matched_dir)
|
|
139
|
+
obj.matched_dir = ac.matched_dir;
|
|
140
|
+
if (ac.via_card)
|
|
141
|
+
obj.via_card = ac.via_card;
|
|
142
|
+
return obj;
|
|
143
|
+
}),
|
|
144
|
+
suggested_action: affectedCards.size > 0 ? 'pmem mark-dirty --auto' : null,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function upsertAffectedCard(map, card) {
|
|
148
|
+
const existing = map.get(card.card_id);
|
|
149
|
+
if (!existing || MATCH_PRIORITY[card.match_type] > MATCH_PRIORITY[existing.match_type]) {
|
|
150
|
+
map.set(card.card_id, card);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function detectChangesFrom() {
|
|
154
|
+
try {
|
|
155
|
+
(0, child_process_1.execSync)('git rev-parse --git-dir', { stdio: 'ignore' });
|
|
156
|
+
return 'git';
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return 'mtime';
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function getChangedFiles(pmemPath, cwd, since) {
|
|
163
|
+
const changes = [];
|
|
164
|
+
const manifest = (0, manifest_1.loadManifest)(pmemPath);
|
|
165
|
+
const config = manifest ? (0, manifest_1.resolveConfig)(manifest) : null;
|
|
166
|
+
const userSkipDirs = manifest?.change_detection?.skip_dirs || [];
|
|
167
|
+
const systemSkips = [
|
|
168
|
+
'node_modules', '.git', 'dist', 'build', '.claude',
|
|
169
|
+
'.pmem/pmem.db', '.pmem/indexes', '.pmem/.lock',
|
|
170
|
+
'.pmem/skills', '.pmem/candidates', '.pmem/summaries',
|
|
171
|
+
'.pmem/.last-status'
|
|
172
|
+
];
|
|
173
|
+
const skipDirs = manifest && manifest.schema
|
|
174
|
+
? Array.from(new Set([...userSkipDirs, ...systemSkips]))
|
|
175
|
+
: ['node_modules', '.git', '.pmem', 'dist', 'build', '.claude'];
|
|
176
|
+
try {
|
|
177
|
+
const source = detectChangesFrom();
|
|
178
|
+
if (source === 'git') {
|
|
179
|
+
const output = (0, child_process_1.execSync)('git status --porcelain', { cwd, encoding: 'utf-8', timeout: 5000 });
|
|
180
|
+
for (const change of (0, git_1.parseGitStatusPorcelain)(output)) {
|
|
181
|
+
if (skipDirs.some(d => change.path.startsWith(d + '/') || change.path === d))
|
|
182
|
+
continue;
|
|
183
|
+
changes.push({ path: change.path, status: change.status || 'M', related_cards: [] });
|
|
184
|
+
}
|
|
185
|
+
return changes;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch { /* fall through to mtime */ }
|
|
189
|
+
// Mtime-based fallback
|
|
190
|
+
const lastStatusFile = path.join(cwd, '.pmem', '.last-status');
|
|
191
|
+
const lastCheck = since ? new Date(since).getTime() : ((0, fs_1.getFileMtime)(lastStatusFile) || 0);
|
|
192
|
+
const defaultScanDirs = ['src', 'lib', 'app', 'tests'];
|
|
193
|
+
const mtimeScanDirs = manifest?.change_detection?.mtime_scan_dirs || defaultScanDirs;
|
|
194
|
+
for (const dir of mtimeScanDirs) {
|
|
195
|
+
const dirPath = path.join(cwd, dir);
|
|
196
|
+
if (!(0, fs_1.fileExists)(dirPath))
|
|
197
|
+
continue;
|
|
198
|
+
scanDirMtime(dirPath, cwd, lastCheck, skipDirs, changes);
|
|
199
|
+
}
|
|
200
|
+
if (config) {
|
|
201
|
+
for (const dir of Object.values(config.type_dirs)) {
|
|
202
|
+
const dirPath = path.join(cwd, '.pmem', dir);
|
|
203
|
+
if (!(0, fs_1.fileExists)(dirPath))
|
|
204
|
+
continue;
|
|
205
|
+
scanDirMtime(dirPath, cwd, lastCheck, skipDirs, changes);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
(0, fs_1.writeFile)(lastStatusFile, new Date().toISOString());
|
|
209
|
+
return changes;
|
|
210
|
+
}
|
|
211
|
+
function scanDirMtime(dirPath, cwd, since, skipDirs, changes) {
|
|
212
|
+
const fs = require('fs');
|
|
213
|
+
try {
|
|
214
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
215
|
+
for (const entry of entries) {
|
|
216
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
217
|
+
const relPath = path.relative(cwd, fullPath);
|
|
218
|
+
if (skipDirs.some(d => relPath.startsWith(d + '/') || relPath === d))
|
|
219
|
+
continue;
|
|
220
|
+
if (entry.isDirectory()) {
|
|
221
|
+
scanDirMtime(fullPath, cwd, since, skipDirs, changes);
|
|
222
|
+
}
|
|
223
|
+
else if (entry.isFile()) {
|
|
224
|
+
try {
|
|
225
|
+
const stat = fs.statSync(fullPath);
|
|
226
|
+
if (stat.mtimeMs > since) {
|
|
227
|
+
changes.push({ path: relPath, status: 'M', related_cards: [] });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch { /* skip */ }
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch { /* skip */ }
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/core/query/status.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -22,6 +22,8 @@ const doctor_1 = require("./commands/doctor");
|
|
|
22
22
|
const rename_1 = require("./commands/rename");
|
|
23
23
|
const new_1 = require("./commands/new");
|
|
24
24
|
const sync_1 = require("./commands/sync");
|
|
25
|
+
const milestone_1 = require("./commands/milestone");
|
|
26
|
+
const mcp_1 = require("./commands/mcp");
|
|
25
27
|
const program = new commander_1.Command();
|
|
26
28
|
// Read version dynamically from package.json (single source of truth)
|
|
27
29
|
const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.resolve)(__dirname, '..', 'package.json'), 'utf-8'));
|
|
@@ -109,6 +111,7 @@ program
|
|
|
109
111
|
.option('--include-history', 'Include historical dirty flags in suggestion output')
|
|
110
112
|
.option('--accept-edges <ids>', 'Comma-separated edge IDs to accept (upgrade to explicit)')
|
|
111
113
|
.option('--reject-edges <ids>', 'Comma-separated edge IDs to reject (delete)')
|
|
114
|
+
.option('--refresh-verified <ids>', 'Comma-separated card IDs to refresh last_verified timestamps')
|
|
112
115
|
.action((options) => {
|
|
113
116
|
(0, update_1.updateCommand)(options);
|
|
114
117
|
});
|
|
@@ -120,13 +123,22 @@ program
|
|
|
120
123
|
.action((options) => {
|
|
121
124
|
(0, sync_1.syncCommand)({ summary: options.summary, next: options.next });
|
|
122
125
|
});
|
|
126
|
+
program
|
|
127
|
+
.command('milestone <version>')
|
|
128
|
+
.description('Record a release milestone in project memory')
|
|
129
|
+
.option('-m, --message <text>', 'Description of the milestone')
|
|
130
|
+
.option('--tag <name>', 'Git tag name (default: v<version>)')
|
|
131
|
+
.action((version, options) => {
|
|
132
|
+
(0, milestone_1.milestoneCommand)(version, { message: options.message, tag: options.tag });
|
|
133
|
+
});
|
|
123
134
|
program
|
|
124
135
|
.command('mark-dirty')
|
|
125
136
|
.description('Mark memory as potentially stale')
|
|
126
137
|
.option('-r, --reason <reason>', 'Reason for marking dirty', 'code_changed')
|
|
127
138
|
.option('--auto', 'Auto-detect changed files and mark related cards dirty')
|
|
139
|
+
.option('--card <id...>', 'Mark specific cards as dirty (space-separated, repeatable)')
|
|
128
140
|
.action((options) => {
|
|
129
|
-
(0, update_1.markDirtyCommand)(options.reason, { auto: options.auto });
|
|
141
|
+
(0, update_1.markDirtyCommand)(options.reason, { auto: options.auto, cardIds: options.card });
|
|
130
142
|
});
|
|
131
143
|
program
|
|
132
144
|
.command('rebuild')
|
|
@@ -264,5 +276,11 @@ program
|
|
|
264
276
|
.action((options) => {
|
|
265
277
|
(0, rename_1.renameCommand)({ find: options.find, replace: options.replace, write: options.write });
|
|
266
278
|
});
|
|
279
|
+
program
|
|
280
|
+
.command('mcp')
|
|
281
|
+
.description('Start a read-only stdio MCP server for agent tool integration')
|
|
282
|
+
.action(async () => {
|
|
283
|
+
await (0, mcp_1.mcpCommand)();
|
|
284
|
+
});
|
|
267
285
|
program.parse();
|
|
268
286
|
//# sourceMappingURL=index.js.map
|