pmem-ai 0.5.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 (99) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE +21 -0
  3. package/README.md +349 -0
  4. package/dist/commands/ask.d.ts +3 -0
  5. package/dist/commands/ask.d.ts.map +1 -0
  6. package/dist/commands/ask.js +303 -0
  7. package/dist/commands/ask.js.map +1 -0
  8. package/dist/commands/distill.d.ts +6 -0
  9. package/dist/commands/distill.d.ts.map +1 -0
  10. package/dist/commands/distill.js +425 -0
  11. package/dist/commands/distill.js.map +1 -0
  12. package/dist/commands/graph.d.ts +6 -0
  13. package/dist/commands/graph.d.ts.map +1 -0
  14. package/dist/commands/graph.js +216 -0
  15. package/dist/commands/graph.js.map +1 -0
  16. package/dist/commands/init.d.ts +5 -0
  17. package/dist/commands/init.d.ts.map +1 -0
  18. package/dist/commands/init.js +566 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/integration.d.ts +2 -0
  21. package/dist/commands/integration.d.ts.map +1 -0
  22. package/dist/commands/integration.js +216 -0
  23. package/dist/commands/integration.js.map +1 -0
  24. package/dist/commands/migrate.d.ts +6 -0
  25. package/dist/commands/migrate.d.ts.map +1 -0
  26. package/dist/commands/migrate.js +379 -0
  27. package/dist/commands/migrate.js.map +1 -0
  28. package/dist/commands/rebuild.d.ts +8 -0
  29. package/dist/commands/rebuild.d.ts.map +1 -0
  30. package/dist/commands/rebuild.js +299 -0
  31. package/dist/commands/rebuild.js.map +1 -0
  32. package/dist/commands/recall.d.ts +3 -0
  33. package/dist/commands/recall.d.ts.map +1 -0
  34. package/dist/commands/recall.js +140 -0
  35. package/dist/commands/recall.js.map +1 -0
  36. package/dist/commands/session.d.ts +3 -0
  37. package/dist/commands/session.d.ts.map +1 -0
  38. package/dist/commands/session.js +147 -0
  39. package/dist/commands/session.js.map +1 -0
  40. package/dist/commands/status.d.ts +5 -0
  41. package/dist/commands/status.d.ts.map +1 -0
  42. package/dist/commands/status.js +275 -0
  43. package/dist/commands/status.js.map +1 -0
  44. package/dist/commands/update.d.ts +14 -0
  45. package/dist/commands/update.d.ts.map +1 -0
  46. package/dist/commands/update.js +536 -0
  47. package/dist/commands/update.js.map +1 -0
  48. package/dist/commands/verify.d.ts +4 -0
  49. package/dist/commands/verify.d.ts.map +1 -0
  50. package/dist/commands/verify.js +296 -0
  51. package/dist/commands/verify.js.map +1 -0
  52. package/dist/core/db.d.ts +47 -0
  53. package/dist/core/db.d.ts.map +1 -0
  54. package/dist/core/db.js +326 -0
  55. package/dist/core/db.js.map +1 -0
  56. package/dist/core/format.d.ts +3 -0
  57. package/dist/core/format.d.ts.map +1 -0
  58. package/dist/core/format.js +221 -0
  59. package/dist/core/format.js.map +1 -0
  60. package/dist/core/fs.d.ts +16 -0
  61. package/dist/core/fs.d.ts.map +1 -0
  62. package/dist/core/fs.js +175 -0
  63. package/dist/core/fs.js.map +1 -0
  64. package/dist/core/git.d.ts +6 -0
  65. package/dist/core/git.d.ts.map +1 -0
  66. package/dist/core/git.js +20 -0
  67. package/dist/core/git.js.map +1 -0
  68. package/dist/core/hash.d.ts +10 -0
  69. package/dist/core/hash.d.ts.map +1 -0
  70. package/dist/core/hash.js +25 -0
  71. package/dist/core/hash.js.map +1 -0
  72. package/dist/core/manifest.d.ts +6 -0
  73. package/dist/core/manifest.d.ts.map +1 -0
  74. package/dist/core/manifest.js +207 -0
  75. package/dist/core/manifest.js.map +1 -0
  76. package/dist/core/yaml.d.ts +11 -0
  77. package/dist/core/yaml.d.ts.map +1 -0
  78. package/dist/core/yaml.js +94 -0
  79. package/dist/core/yaml.js.map +1 -0
  80. package/dist/index.d.ts +3 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +167 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/types.d.ts +351 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +4 -0
  87. package/dist/types.js.map +1 -0
  88. package/docs/Voorlopige projekidee.md +695 -0
  89. package/docs/handover-v0.3.md +355 -0
  90. package/docs/handover-v0.4.md +367 -0
  91. package/docs/prd.md +318 -0
  92. package/docs/project-roadmap.md +279 -0
  93. package/docs/release-checklist-v0.5.md +109 -0
  94. package/docs/v0.2 pre-design.md +182 -0
  95. package/docs/v0.2 pre-roadmap.md +270 -0
  96. package/docs/v0.3 pre-design.md +686 -0
  97. package/docs/v0.4 pre-design.md +417 -0
  98. package/docs/v0.5 pre-design.md +481 -0
  99. package/package.json +67 -0
@@ -0,0 +1,299 @@
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.rebuildCommand = rebuildCommand;
37
+ const path = __importStar(require("path"));
38
+ const fs_1 = require("../core/fs");
39
+ const manifest_1 = require("../core/manifest");
40
+ const db_1 = require("../core/db");
41
+ const hash_1 = require("../core/hash");
42
+ const yaml_1 = require("../core/yaml");
43
+ const PMEM_DIR = '.pmem';
44
+ function rebuildCommand(options = {}) {
45
+ const cwd = process.cwd();
46
+ const pmemPath = path.join(cwd, PMEM_DIR);
47
+ const manifest = (0, manifest_1.loadManifest)(pmemPath);
48
+ if (!manifest) {
49
+ if ((0, fs_1.fileExists)(pmemPath)) {
50
+ console.log('.pmem/manifest.yml not found. Run `pmem init` to regenerate the manifest, or restore it from backup.');
51
+ }
52
+ else {
53
+ console.log('No .pmem directory found. Run `pmem init` first.');
54
+ }
55
+ return;
56
+ }
57
+ const db = (0, db_1.openDatabase)(pmemPath);
58
+ (0, db_1.createSchema)(db);
59
+ (0, db_1.setSchemaVersion)(db, manifest.pmem.schema_version);
60
+ const isFull = options.full === true;
61
+ const isSingleCard = typeof options.card === 'string';
62
+ if (isFull) {
63
+ (0, db_1.clearAllTables)(db);
64
+ console.log('Full rebuild: cleared all tables.');
65
+ }
66
+ // Scan all .md files under .pmem/, excluding non-card files
67
+ const cardFiles = (0, fs_1.listFiles)(pmemPath, /\.md$/).filter(f => {
68
+ const rel = path.relative(pmemPath, f);
69
+ return !['index.md', 'state.md', 'next.md'].includes(rel) &&
70
+ !rel.startsWith('skills/') &&
71
+ !rel.startsWith('integrations/') &&
72
+ !rel.startsWith('summaries/') &&
73
+ !rel.startsWith('indexes/') &&
74
+ !rel.startsWith('backups/');
75
+ });
76
+ const nodes = [];
77
+ const edges = [];
78
+ let processed = 0;
79
+ let skipped = 0;
80
+ let updated = 0;
81
+ // Wrap all per-card SQLite writes in a single transaction for performance
82
+ const doRebuild = db.transaction(() => {
83
+ for (const file of cardFiles) {
84
+ const parsed = parseCard(file);
85
+ if (!parsed)
86
+ continue;
87
+ // In --card mode, skip cards that don't match the target ID
88
+ if (isSingleCard && parsed.frontmatter.id !== options.card)
89
+ continue;
90
+ const relPath = path.relative(cwd, file);
91
+ processed++;
92
+ const fm = parsed.frontmatter;
93
+ const title = extractTitle(parsed.bodyText) || fm.id;
94
+ // Build legacy graph node (always, for backward compat output)
95
+ nodes.push({
96
+ id: fm.id,
97
+ type: fm.type,
98
+ title,
99
+ status: fm.status,
100
+ file: relPath,
101
+ tags: fm.tags,
102
+ aliases: fm.aliases,
103
+ });
104
+ // Build legacy graph edges (always, for backward compat output)
105
+ collectLegacyEdges(fm, edges);
106
+ // Compute content hashes
107
+ const hashes = (0, hash_1.computeCardHashes)(parsed.fullContent, parsed.frontmatterText, parsed.bodyText);
108
+ // In --changed mode, skip cards whose hashes match what's in SQLite
109
+ if (!isFull) {
110
+ const existing = (0, db_1.getCardHash)(db, relPath);
111
+ if (existing &&
112
+ existing.file_hash === hashes.fileHash &&
113
+ existing.frontmatter_hash === hashes.frontmatterHash &&
114
+ existing.body_hash === hashes.bodyHash) {
115
+ skipped++;
116
+ continue;
117
+ }
118
+ }
119
+ updated++;
120
+ const tokCount = (0, hash_1.tokenCount)(parsed.fullContent);
121
+ const secCount = (0, hash_1.sectionCount)(parsed.bodyText);
122
+ const isCandidate = relPath.includes('/candidates/') ? 1 : 0;
123
+ // Build CardRow and upsert
124
+ const cardRow = {
125
+ id: fm.id,
126
+ type: fm.type,
127
+ title,
128
+ status: fm.status ?? null,
129
+ priority: fm.priority ?? null,
130
+ file_path: relPath,
131
+ summary: null,
132
+ schema_version: fm.schema_version ?? null,
133
+ card_version: fm.version ?? 1,
134
+ created_at: null,
135
+ updated_at: fm.updated ?? null,
136
+ last_verified_at: fm.last_verified ?? null,
137
+ file_hash: hashes.fileHash,
138
+ frontmatter_hash: hashes.frontmatterHash,
139
+ body_hash: hashes.bodyHash,
140
+ token_count: tokCount,
141
+ section_count: secCount,
142
+ is_deleted: 0,
143
+ is_candidate: isCandidate,
144
+ };
145
+ (0, db_1.upsertCard)(db, cardRow);
146
+ // Clear existing relations before re-inserting
147
+ (0, db_1.deleteCardEdges)(db, fm.id);
148
+ (0, db_1.deleteCardAliases)(db, fm.id);
149
+ (0, db_1.deleteCardTags)(db, fm.id);
150
+ (0, db_1.deleteCardPaths)(db, fm.id);
151
+ // Re-insert aliases
152
+ if (fm.aliases) {
153
+ for (const alias of fm.aliases) {
154
+ (0, db_1.insertAlias)(db, fm.id, alias);
155
+ }
156
+ }
157
+ // Re-insert tags
158
+ if (fm.tags) {
159
+ for (const tag of fm.tags) {
160
+ (0, db_1.insertTag)(db, fm.id, tag);
161
+ }
162
+ }
163
+ // Re-insert source_files as paths
164
+ if (fm.source_files) {
165
+ for (const sf of fm.source_files) {
166
+ (0, db_1.insertPath)(db, fm.id, sf, 'source_file');
167
+ }
168
+ }
169
+ const now = new Date().toISOString();
170
+ // Insert depends_on edges
171
+ if (fm.depends_on) {
172
+ for (const target of fm.depends_on) {
173
+ const edgeRow = {
174
+ from_id: fm.id,
175
+ to_id: target,
176
+ type: 'depends_on',
177
+ source: 'explicit',
178
+ confidence: 1.0,
179
+ created_at: now,
180
+ updated_at: now,
181
+ };
182
+ (0, db_1.insertEdge)(db, edgeRow);
183
+ }
184
+ }
185
+ // Insert related_to edges
186
+ if (fm.related) {
187
+ for (const target of fm.related) {
188
+ const edgeRow = {
189
+ from_id: fm.id,
190
+ to_id: target,
191
+ type: 'related_to',
192
+ source: 'explicit',
193
+ confidence: 1.0,
194
+ created_at: now,
195
+ updated_at: now,
196
+ };
197
+ (0, db_1.insertEdge)(db, edgeRow);
198
+ }
199
+ }
200
+ // Derived edges: task type with module.* related → next_step_of
201
+ if (fm.type === 'task' && fm.related) {
202
+ for (const target of fm.related) {
203
+ if (target.startsWith('module.')) {
204
+ const edgeRow = {
205
+ from_id: fm.id,
206
+ to_id: target,
207
+ type: 'next_step_of',
208
+ source: 'inferred',
209
+ confidence: 0.8,
210
+ created_at: now,
211
+ updated_at: now,
212
+ };
213
+ (0, db_1.insertEdge)(db, edgeRow);
214
+ }
215
+ }
216
+ }
217
+ }
218
+ });
219
+ // Execute all SQLite writes in a single transaction
220
+ doRebuild();
221
+ // Create FTS5 virtual table for full-text search (outside transaction)
222
+ (0, db_1.createFTS5)(db);
223
+ // Write legacy graph.json for backward compatibility
224
+ const allContent = cardFiles.map(f => (0, fs_1.readFile)(f) || '').join('');
225
+ const sourceHash = (0, hash_1.computeHash)(allContent);
226
+ const graphIndex = {
227
+ kind: 'pmem.graph_index',
228
+ pmem_version: manifest.pmem.protocol_version,
229
+ generated_at: new Date().toISOString(),
230
+ source: {
231
+ type: 'markdown_frontmatter',
232
+ glob: '.pmem/**/*.md',
233
+ source_hash: sourceHash,
234
+ },
235
+ node_count: nodes.length,
236
+ edge_count: edges.length,
237
+ nodes,
238
+ edges,
239
+ };
240
+ const indexesDir = path.join(pmemPath, 'indexes');
241
+ (0, fs_1.ensureDir)(indexesDir);
242
+ (0, fs_1.writeJson)(path.join(indexesDir, 'graph.json'), graphIndex);
243
+ // Output summary
244
+ const modeLabel = isFull
245
+ ? 'Full rebuild'
246
+ : isSingleCard
247
+ ? `Single card: ${options.card}`
248
+ : 'Incremental rebuild';
249
+ console.log(`${modeLabel}: ${processed} cards processed, ${skipped} skipped (hash match), ${updated} updated`);
250
+ console.log(`Graph: ${nodes.length} nodes, ${edges.length} edges`);
251
+ (0, db_1.closeDatabase)();
252
+ }
253
+ /**
254
+ * Parse a .md memory card file into its constituent parts.
255
+ * Reads the file once, extracts YAML frontmatter (between --- markers),
256
+ * the markdown body, and parses the frontmatter into a CardFrontmatter object.
257
+ */
258
+ function parseCard(filePath) {
259
+ const fullContent = (0, fs_1.readFile)(filePath);
260
+ if (!fullContent)
261
+ return null;
262
+ const parsed = (0, yaml_1.parseFrontmatter)(fullContent);
263
+ if (!parsed)
264
+ return null;
265
+ const frontmatter = parsed.data;
266
+ if (!frontmatter.id)
267
+ return null;
268
+ // Extract frontmatter text for hash computation
269
+ const fmMatch = fullContent.match(/^---\n([\s\S]*?)\n---/);
270
+ const frontmatterText = fmMatch ? fmMatch[1] : '';
271
+ return { fullContent, frontmatterText, bodyText: parsed.body, frontmatter };
272
+ }
273
+ /** Extract the first # heading from markdown body text as the card title. */
274
+ function extractTitle(bodyText) {
275
+ const match = bodyText.match(/^#\s+(.+)$/m);
276
+ return match ? match[1].trim() : null;
277
+ }
278
+ /** Build legacy GraphEdge entries from a card's frontmatter (for backward-compat graph.json). */
279
+ function collectLegacyEdges(fm, edges) {
280
+ if (fm.depends_on) {
281
+ for (const target of fm.depends_on) {
282
+ edges.push({ from: fm.id, to: target, type: 'depends_on' });
283
+ }
284
+ }
285
+ if (fm.related) {
286
+ for (const target of fm.related) {
287
+ edges.push({ from: fm.id, to: target, type: 'related_to' });
288
+ }
289
+ }
290
+ // Derived edge: task → module
291
+ if (fm.type === 'task' && fm.related) {
292
+ for (const target of fm.related) {
293
+ if (target.startsWith('module.')) {
294
+ edges.push({ from: fm.id, to: target, type: 'next_step_of', derived: true });
295
+ }
296
+ }
297
+ }
298
+ }
299
+ //# sourceMappingURL=rebuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../src/commands/rebuild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliFormat } from '../types';
2
+ export declare function recallCommand(budget?: number, format?: CliFormat): void;
3
+ //# sourceMappingURL=recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/commands/recall.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,SAAS,EAAW,MAAM,UAAU,CAAC;AAIjE,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAa,EAAE,MAAM,GAAE,SAAqB,GAAG,IAAI,CAwGxF"}
@@ -0,0 +1,140 @@
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.recallCommand = recallCommand;
37
+ const path = __importStar(require("path"));
38
+ const fs_1 = require("../core/fs");
39
+ const db_1 = require("../core/db");
40
+ const format_1 = require("../core/format");
41
+ const PMEM_DIR = '.pmem';
42
+ function recallCommand(budget = 2000, format = 'compact') {
43
+ const cwd = process.cwd();
44
+ const pmemPath = path.join(cwd, PMEM_DIR);
45
+ if (!(0, fs_1.fileExists)(pmemPath)) {
46
+ console.log('No .pmem directory found. Run `pmem init` first.');
47
+ return;
48
+ }
49
+ // Read hot memory files: index.md, state.md, next.md
50
+ const indexContent = (0, fs_1.readFile)(path.join(pmemPath, 'index.md'));
51
+ const stateContent = (0, fs_1.readFile)(path.join(pmemPath, 'state.md'));
52
+ const nextContent = (0, fs_1.readFile)(path.join(pmemPath, 'next.md'));
53
+ if (!indexContent) {
54
+ console.log('No .pmem/index.md found. Run `pmem init` first.');
55
+ return;
56
+ }
57
+ // Parse project info from index
58
+ const projectName = extractField(indexContent, 'Name:');
59
+ const projectStage = extractField(indexContent, 'Stage:');
60
+ const currentFocus = extractField(indexContent, 'Current Focus');
61
+ // Parse state lines
62
+ const stateLines = [];
63
+ if (stateContent) {
64
+ const lines = stateContent.split('\n');
65
+ let inSection = false;
66
+ for (const line of lines) {
67
+ if (line.startsWith('## ')) {
68
+ inSection = !line.includes('Overall Status');
69
+ }
70
+ else if (inSection && line.trim().startsWith('-')) {
71
+ stateLines.push(line.trim());
72
+ }
73
+ }
74
+ }
75
+ // Parse next step
76
+ const nextStep = nextContent
77
+ ? extractField(nextContent, '## Recommended Next Step')
78
+ : 'No next step recorded.';
79
+ // Build result
80
+ const result = {
81
+ project: projectName || 'Unknown',
82
+ stage: projectStage || undefined,
83
+ focus: currentFocus || 'No focus recorded.',
84
+ state: stateLines,
85
+ next: nextStep || 'No next step recorded.',
86
+ mustRead: [],
87
+ dirty_flags_count: 0,
88
+ recent_updates: [],
89
+ active_modules: [],
90
+ };
91
+ // Query SQLite for richer project info
92
+ try {
93
+ const db = (0, db_1.openDatabase)(pmemPath);
94
+ (0, db_1.createSchema)(db);
95
+ // Query active cards (non-deleted, non-candidate)
96
+ const activeCards = db.prepare("SELECT * FROM cards WHERE is_deleted = 0 AND is_candidate = 0").all();
97
+ // Modules for recommendations
98
+ const modules = activeCards.filter(c => c.type === 'module');
99
+ result.active_modules = modules.map(m => m.file_path);
100
+ // Build mustRead list
101
+ result.mustRead.push(path.join('.pmem', 'state.md'));
102
+ result.mustRead.push(path.join('.pmem', 'next.md'));
103
+ for (const mod of modules.slice(0, 5)) {
104
+ result.mustRead.push(mod.file_path);
105
+ }
106
+ // Query unresolved dirty flags
107
+ const dirtyFlagResult = db.prepare("SELECT COUNT(*) as count FROM dirty_flags WHERE resolved_at IS NULL").get();
108
+ result.dirty_flags_count = dirtyFlagResult.count;
109
+ // Query recent updates
110
+ const recentUpdates = db.prepare("SELECT action, summary, created_at FROM update_log ORDER BY created_at DESC LIMIT 5").all();
111
+ result.recent_updates = recentUpdates;
112
+ }
113
+ catch {
114
+ // DB may not exist yet or be uninitialized; file-based mustRead is sufficient
115
+ if (result.mustRead.length === 0) {
116
+ result.mustRead.push(path.join('.pmem', 'state.md'));
117
+ result.mustRead.push(path.join('.pmem', 'next.md'));
118
+ }
119
+ }
120
+ // Output
121
+ const output = (0, format_1.formatOutput)(result, format, budget);
122
+ console.log(output);
123
+ }
124
+ function extractField(content, fieldName) {
125
+ const lines = content.split('\n');
126
+ for (let i = 0; i < lines.length; i++) {
127
+ const line = lines[i];
128
+ if (line.includes(fieldName)) {
129
+ const val = line.split(fieldName)[1]?.trim();
130
+ if (val)
131
+ return val;
132
+ // Next line (for "## Current Focus" style)
133
+ if (i + 1 < lines.length && lines[i + 1].trim()) {
134
+ return lines[i + 1].trim();
135
+ }
136
+ }
137
+ }
138
+ return null;
139
+ }
140
+ //# sourceMappingURL=recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/commands/recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function sessionStartCommand(agentName?: string): void;
2
+ export declare function sessionEndCommand(taskSummary?: string): void;
3
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CA6C5D;AAED,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CA0E5D"}
@@ -0,0 +1,147 @@
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.sessionStartCommand = sessionStartCommand;
37
+ exports.sessionEndCommand = sessionEndCommand;
38
+ const path = __importStar(require("path"));
39
+ const fs_1 = require("../core/fs");
40
+ const db_1 = require("../core/db");
41
+ const PMEM_DIR = '.pmem';
42
+ function sessionStartCommand(agentName) {
43
+ const pmemPath = path.join(process.cwd(), PMEM_DIR);
44
+ // 1. Check .pmem/ exists
45
+ if (!(0, fs_1.fileExists)(pmemPath)) {
46
+ console.log('No .pmem directory found. Run `pmem init` first.');
47
+ return;
48
+ }
49
+ // Check DB file exists
50
+ if (!(0, fs_1.fileExists)(path.join(pmemPath, 'pmem.db'))) {
51
+ console.log('No SQLite database found. Run `pmem rebuild` first.');
52
+ return;
53
+ }
54
+ // 2. Open SQLite DB, createSchema
55
+ const db = (0, db_1.openDatabase)(pmemPath);
56
+ (0, db_1.createSchema)(db);
57
+ // 3. Check if there's already an active session
58
+ const active = (0, db_1.getActiveSession)(db);
59
+ if (active) {
60
+ console.log(`Active session already exists: ${active.id}. End it first with \`pmem session end\`.`);
61
+ (0, db_1.closeDatabase)();
62
+ return;
63
+ }
64
+ // 4. Generate session ID: "session-YYYYMMDD-HHmmss"
65
+ const now = new Date();
66
+ const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '');
67
+ const timeStr = now.toISOString().slice(11, 19).replace(/:/g, '');
68
+ const sessionId = `session-${dateStr}-${timeStr}`;
69
+ // 5. Call startSession
70
+ (0, db_1.startSession)(db, sessionId, agentName);
71
+ // 6. Print
72
+ console.log(`Session started: ${sessionId}`);
73
+ if (agentName) {
74
+ console.log(` Agent: ${agentName}`);
75
+ }
76
+ console.log(' Run `pmem session end` when done.');
77
+ // 7. closeDatabase
78
+ (0, db_1.closeDatabase)();
79
+ }
80
+ function sessionEndCommand(taskSummary) {
81
+ const pmemPath = path.join(process.cwd(), PMEM_DIR);
82
+ // 1. Check .pmem/ exists
83
+ if (!(0, fs_1.fileExists)(pmemPath)) {
84
+ console.log('No .pmem directory found. Run `pmem init` first.');
85
+ return;
86
+ }
87
+ // Check DB file exists
88
+ if (!(0, fs_1.fileExists)(path.join(pmemPath, 'pmem.db'))) {
89
+ console.log('No SQLite database found. Run `pmem rebuild` first.');
90
+ return;
91
+ }
92
+ // 2. Open DB, createSchema
93
+ const db = (0, db_1.openDatabase)(pmemPath);
94
+ (0, db_1.createSchema)(db);
95
+ // 3. Get active session
96
+ const active = (0, db_1.getActiveSession)(db);
97
+ // 4. If no active session
98
+ if (!active) {
99
+ console.log('No active session found.');
100
+ (0, db_1.closeDatabase)();
101
+ return;
102
+ }
103
+ // 5. Call endSession
104
+ (0, db_1.endSession)(db, active.id, 'completed', taskSummary);
105
+ // 6. Query session update log for summary
106
+ const logs = db.prepare("SELECT action, summary, created_at, success, affected_cards FROM update_log WHERE session_id = ? ORDER BY created_at").all(active.id);
107
+ // Count actions by type
108
+ let updateCount = 0, traceCount = 0, errorCount = 0;
109
+ const allAffected = new Set();
110
+ for (const log of logs) {
111
+ if (!log.success) {
112
+ errorCount++;
113
+ continue;
114
+ }
115
+ if (log.action === 'confirm_update')
116
+ updateCount++;
117
+ if (log.action === 'create_trace')
118
+ traceCount++;
119
+ if (log.affected_cards) {
120
+ try {
121
+ const cards = JSON.parse(log.affected_cards);
122
+ cards.forEach(c => allAffected.add(c));
123
+ }
124
+ catch { }
125
+ }
126
+ }
127
+ // Query unresolved dirty flags for this session
128
+ const dirtyFlags = db.prepare("SELECT scope, target, reason FROM dirty_flags WHERE session_id = ? AND resolved_at IS NULL").all(active.id);
129
+ // Print summary
130
+ console.log(`Session ended: ${active.id}`);
131
+ if (taskSummary)
132
+ console.log(` Summary: ${taskSummary}`);
133
+ console.log(` Actions: ${updateCount} update(s), ${traceCount} trace(s) created${errorCount > 0 ? `, ${errorCount} error(s)` : ''}`);
134
+ if (allAffected.size > 0) {
135
+ console.log(` Cards affected: ${[...allAffected].join(', ')}`);
136
+ }
137
+ if (dirtyFlags.length > 0) {
138
+ console.log(` Unresolved dirty flags: ${dirtyFlags.length}`);
139
+ for (const df of dirtyFlags) {
140
+ console.log(` [${df.scope}] ${df.target}: ${df.reason}`);
141
+ }
142
+ }
143
+ console.log(`\nRun: pmem verify`);
144
+ // 7. closeDatabase
145
+ (0, db_1.closeDatabase)();
146
+ }
147
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function statusCommand(options: {
2
+ since?: string;
3
+ format?: string;
4
+ }): void;
5
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AA0DA,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqJhF"}