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.
Files changed (51) hide show
  1. package/CHANGELOG.md +21 -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/update.d.ts +2 -0
  13. package/dist/commands/update.d.ts.map +1 -1
  14. package/dist/commands/update.js +87 -3
  15. package/dist/commands/update.js.map +1 -1
  16. package/dist/commands/verify.d.ts.map +1 -1
  17. package/dist/commands/verify.js +19 -8
  18. package/dist/commands/verify.js.map +1 -1
  19. package/dist/core/consistency.d.ts.map +1 -1
  20. package/dist/core/consistency.js +6 -0
  21. package/dist/core/consistency.js.map +1 -1
  22. package/dist/core/query/ask.d.ts +20 -0
  23. package/dist/core/query/ask.d.ts.map +1 -0
  24. package/dist/core/query/ask.js +256 -0
  25. package/dist/core/query/ask.js.map +1 -0
  26. package/dist/core/query/recall.d.ts +21 -0
  27. package/dist/core/query/recall.d.ts.map +1 -0
  28. package/dist/core/query/recall.js +148 -0
  29. package/dist/core/query/recall.js.map +1 -0
  30. package/dist/core/query/related.d.ts +29 -0
  31. package/dist/core/query/related.d.ts.map +1 -0
  32. package/dist/core/query/related.js +106 -0
  33. package/dist/core/query/related.js.map +1 -0
  34. package/dist/core/query/status.d.ts +24 -0
  35. package/dist/core/query/status.d.ts.map +1 -0
  36. package/dist/core/query/status.js +236 -0
  37. package/dist/core/query/status.js.map +1 -0
  38. package/dist/index.js +19 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/mcp/security.d.ts +21 -0
  41. package/dist/mcp/security.d.ts.map +1 -0
  42. package/dist/mcp/security.js +150 -0
  43. package/dist/mcp/security.js.map +1 -0
  44. package/dist/mcp/server.d.ts +2 -0
  45. package/dist/mcp/server.d.ts.map +1 -0
  46. package/dist/mcp/server.js +177 -0
  47. package/dist/mcp/server.js.map +1 -0
  48. package/docs/dogfooding.md +98 -0
  49. package/docs/pmem-rt.md +137 -0
  50. package/package.json +3 -2
  51. 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