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,175 @@
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.ensureDir = ensureDir;
37
+ exports.writeFile = writeFile;
38
+ exports.atomicWrite = atomicWrite;
39
+ exports.readFile = readFile;
40
+ exports.listFiles = listFiles;
41
+ exports.fileExists = fileExists;
42
+ exports.removeFile = removeFile;
43
+ exports.copyFile = copyFile;
44
+ exports.acquireLock = acquireLock;
45
+ exports.releaseLock = releaseLock;
46
+ exports.isLockStale = isLockStale;
47
+ exports.breakLock = breakLock;
48
+ exports.readJson = readJson;
49
+ exports.writeJson = writeJson;
50
+ exports.getFileMtime = getFileMtime;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ function ensureDir(dirPath) {
54
+ if (!fs.existsSync(dirPath)) {
55
+ fs.mkdirSync(dirPath, { recursive: true });
56
+ }
57
+ }
58
+ function writeFile(filePath, content) {
59
+ ensureDir(path.dirname(filePath));
60
+ fs.writeFileSync(filePath, content, 'utf-8');
61
+ }
62
+ // NEW: Atomic write — write to .tmp first, then fsync + rename
63
+ function atomicWrite(filePath, content) {
64
+ ensureDir(path.dirname(filePath));
65
+ const tmpPath = filePath + '.tmp';
66
+ fs.writeFileSync(tmpPath, content, 'utf-8');
67
+ const fd = fs.openSync(tmpPath, 'r');
68
+ fs.fsyncSync(fd);
69
+ fs.closeSync(fd);
70
+ fs.renameSync(tmpPath, filePath);
71
+ }
72
+ function readFile(filePath) {
73
+ if (!fs.existsSync(filePath))
74
+ return null;
75
+ return fs.readFileSync(filePath, 'utf-8');
76
+ }
77
+ function listFiles(dirPath, pattern) {
78
+ if (!fs.existsSync(dirPath))
79
+ return [];
80
+ const results = [];
81
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
82
+ for (const entry of entries) {
83
+ const fullPath = path.join(dirPath, entry.name);
84
+ if (entry.isDirectory()) {
85
+ results.push(...listFiles(fullPath, pattern));
86
+ }
87
+ else if (pattern.test(entry.name)) {
88
+ results.push(fullPath);
89
+ }
90
+ }
91
+ return results;
92
+ }
93
+ function fileExists(filePath) {
94
+ return fs.existsSync(filePath);
95
+ }
96
+ // NEW: Remove a file (no error if not exists)
97
+ function removeFile(filePath) {
98
+ try {
99
+ fs.unlinkSync(filePath);
100
+ }
101
+ catch {
102
+ // ignore
103
+ }
104
+ }
105
+ // NEW: Copy a file
106
+ function copyFile(src, dest) {
107
+ ensureDir(path.dirname(dest));
108
+ fs.copyFileSync(src, dest);
109
+ }
110
+ // NEW: Simple file lock using mkdir (atomic operation)
111
+ function acquireLock(lockPath, timeoutMs = 3000) {
112
+ const start = Date.now();
113
+ while (Date.now() - start < timeoutMs) {
114
+ try {
115
+ fs.mkdirSync(lockPath);
116
+ return true;
117
+ }
118
+ catch {
119
+ // Lock exists, wait and retry
120
+ // Simple busy-wait (acceptable for sub-second lock timeouts)
121
+ const waitUntil = Date.now() + 50 + Math.random() * 50;
122
+ while (Date.now() < waitUntil) { /* spin */ }
123
+ }
124
+ }
125
+ return false;
126
+ }
127
+ // NEW: Release file lock
128
+ function releaseLock(lockPath) {
129
+ try {
130
+ fs.rmdirSync(lockPath);
131
+ }
132
+ catch {
133
+ // ignore
134
+ }
135
+ }
136
+ // NEW: Check if lock is stale (older than staleAfterMs)
137
+ function isLockStale(lockPath, staleAfterMs = 60000) {
138
+ try {
139
+ const stat = fs.statSync(lockPath);
140
+ return Date.now() - stat.mtimeMs > staleAfterMs;
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ // NEW: Force remove a stale lock
147
+ function breakLock(lockPath) {
148
+ releaseLock(lockPath);
149
+ }
150
+ // NEW: Read JSON file
151
+ function readJson(filePath) {
152
+ const content = readFile(filePath);
153
+ if (!content)
154
+ return null;
155
+ try {
156
+ return JSON.parse(content);
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ // NEW: Write JSON file atomically
163
+ function writeJson(filePath, data) {
164
+ atomicWrite(filePath, JSON.stringify(data, null, 2));
165
+ }
166
+ // NEW: Get file modification time (ms since epoch)
167
+ function getFileMtime(filePath) {
168
+ try {
169
+ return fs.statSync(filePath).mtimeMs;
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ }
175
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/core/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface GitStatusChange {
2
+ status: string;
3
+ path: string;
4
+ }
5
+ export declare function parseGitStatusPorcelain(output: string): GitStatusChange[];
6
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,CAkBzE"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseGitStatusPorcelain = parseGitStatusPorcelain;
4
+ function parseGitStatusPorcelain(output) {
5
+ const changes = [];
6
+ for (const rawLine of output.split('\n')) {
7
+ if (!rawLine.trim())
8
+ continue;
9
+ const status = rawLine.slice(0, 2).trim() || rawLine.slice(0, 2);
10
+ let filePath = rawLine.slice(3).trim();
11
+ if (status.includes('R')) {
12
+ const arrowIdx = filePath.indexOf(' -> ');
13
+ if (arrowIdx > 0)
14
+ filePath = filePath.slice(arrowIdx + 4);
15
+ }
16
+ changes.push({ status, path: filePath });
17
+ }
18
+ return changes;
19
+ }
20
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":";;AAKA,0DAkBC;AAlBD,SAAgB,uBAAuB,CAAC,MAAc;IACpD,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,SAAS;QAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,IAAI,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEvC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,QAAQ,GAAG,CAAC;gBAAE,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function computeHash(content: string): string;
2
+ export interface CardHashes {
3
+ fileHash: string;
4
+ frontmatterHash: string;
5
+ bodyHash: string;
6
+ }
7
+ export declare function computeCardHashes(fullContent: string, frontmatterText: string, bodyText: string): CardHashes;
8
+ export declare function tokenCount(text: string): number;
9
+ export declare function sectionCount(body: string): number;
10
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/core/hash.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAM5G;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computeHash = computeHash;
4
+ exports.computeCardHashes = computeCardHashes;
5
+ exports.tokenCount = tokenCount;
6
+ exports.sectionCount = sectionCount;
7
+ const crypto_1 = require("crypto");
8
+ function computeHash(content) {
9
+ return (0, crypto_1.createHash)('sha256').update(content, 'utf-8').digest('hex').substring(0, 16);
10
+ }
11
+ function computeCardHashes(fullContent, frontmatterText, bodyText) {
12
+ return {
13
+ fileHash: computeHash(fullContent),
14
+ frontmatterHash: computeHash(frontmatterText),
15
+ bodyHash: computeHash(bodyText),
16
+ };
17
+ }
18
+ function tokenCount(text) {
19
+ // Rough token estimation: ~4 chars per token for mixed zh/en text
20
+ return Math.ceil(text.replace(/\s+/g, ' ').length / 4);
21
+ }
22
+ function sectionCount(body) {
23
+ return (body.match(/^## /gm) || []).length;
24
+ }
25
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/core/hash.ts"],"names":[],"mappings":";;AAEA,kCAEC;AAQD,8CAMC;AAED,gCAGC;AAED,oCAEC;AA3BD,mCAAoC;AAEpC,SAAgB,WAAW,CAAC,OAAe;IACzC,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtF,CAAC;AAQD,SAAgB,iBAAiB,CAAC,WAAmB,EAAE,eAAuB,EAAE,QAAgB;IAC9F,OAAO;QACL,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC;QAClC,eAAe,EAAE,WAAW,CAAC,eAAe,CAAC;QAC7C,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,SAAgB,UAAU,CAAC,IAAY;IACrC,kEAAkE;IAClE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY;IACvC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Manifest, ManifestV03, InitMode } from '../types';
2
+ export declare function getDefaultManifest(projectName: string, initMode?: InitMode): ManifestV03;
3
+ export declare function getDefaultManifestV03(projectName: string, initMode?: InitMode): ManifestV03;
4
+ export declare function loadManifest(pmemDir: string): Manifest | null;
5
+ export declare function saveManifest(pmemDir: string, manifest: Manifest): void;
6
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAG3D,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAoB,GAAG,WAAW,CAoInG;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAoB,GAAG,WAAW,CAEtG;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAS7D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAetE"}
@@ -0,0 +1,207 @@
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.getDefaultManifest = getDefaultManifest;
37
+ exports.getDefaultManifestV03 = getDefaultManifestV03;
38
+ exports.loadManifest = loadManifest;
39
+ exports.saveManifest = saveManifest;
40
+ const yaml = __importStar(require("js-yaml"));
41
+ const fs = __importStar(require("./fs"));
42
+ function getDefaultManifest(projectName, initMode = 'minimal') {
43
+ return {
44
+ pmem: {
45
+ schema_version: '0.3',
46
+ protocol_version: '0.3',
47
+ created_by: '0.3.0',
48
+ last_migrated_by: null,
49
+ },
50
+ project: {
51
+ name: projectName,
52
+ language: 'zh-CN',
53
+ status: 'active',
54
+ },
55
+ memory_status: {
56
+ completeness: initMode === 'guided' ? 'partial' : 'incomplete',
57
+ initialized_mode: initMode,
58
+ dirty: false,
59
+ dirty_since: null,
60
+ dirty_reason: null,
61
+ },
62
+ source_of_truth: {
63
+ type: 'markdown_cards',
64
+ path: '.pmem',
65
+ card_globs: [
66
+ '.pmem/modules/**/*.md',
67
+ '.pmem/features/**/*.md',
68
+ '.pmem/decisions/**/*.md',
69
+ '.pmem/tasks/**/*.md',
70
+ '.pmem/traces/**/*.md',
71
+ '.pmem/risks/**/*.md',
72
+ ],
73
+ },
74
+ runtime: {
75
+ mode: 'sqlite',
76
+ db_path: '.pmem/pmem.db',
77
+ markdown_source: true,
78
+ },
79
+ indexes: {
80
+ primary: 'sqlite',
81
+ legacy_json: {
82
+ enabled: false,
83
+ retained: true,
84
+ path: '.pmem/indexes',
85
+ },
86
+ },
87
+ rebuild: {
88
+ strategy: 'content_hash',
89
+ hash: {
90
+ file_hash: true,
91
+ frontmatter_hash: true,
92
+ body_hash: true,
93
+ },
94
+ },
95
+ concurrency: {
96
+ mode: 'file-basic',
97
+ atomic_write: true,
98
+ lock: {
99
+ enabled: true,
100
+ path: '.pmem/.lock',
101
+ timeout: '3s',
102
+ stale_after: '60s',
103
+ on_timeout: 'abort',
104
+ },
105
+ optimistic_lock: {
106
+ enabled: false,
107
+ note: 'Deferred to SQLite runtime in v0.3',
108
+ },
109
+ },
110
+ cli: {
111
+ default_format: 'compact',
112
+ supported_formats: ['compact', 'json', 'paths', 'pack'],
113
+ default_budget: 1600,
114
+ },
115
+ embedding: {
116
+ enabled: false,
117
+ provider: 'none',
118
+ model: null,
119
+ dimension: null,
120
+ store: 'sqlite',
121
+ index: 'none',
122
+ },
123
+ serve: {
124
+ enabled: false,
125
+ mode: 'none',
126
+ experimental: {
127
+ mcp: false,
128
+ rest: false,
129
+ },
130
+ },
131
+ auto_update: {
132
+ enabled: true,
133
+ on_code_change: 'mark_dirty',
134
+ on_doc_change: 'mark_dirty',
135
+ on_memory_change: 'rebuild_indexes',
136
+ on_session_end: 'prompt',
137
+ on_git_commit: 'suggest_trace',
138
+ min_trace_interval: '30m',
139
+ max_auto_traces_per_day: 5,
140
+ ignore_patterns: [
141
+ 'node_modules/**', 'dist/**', 'build/**', '*.lock', '*.log',
142
+ ],
143
+ trace_policy: {
144
+ require_meaningful_change: true,
145
+ require_summary: true,
146
+ require_related_node: true,
147
+ },
148
+ },
149
+ card_policy: {
150
+ id_pattern: '^(project|module|feature|task|decision|trace|risk|assumption|resource|integration)\\.[a-z0-9._-]+$',
151
+ max_tokens: { module: 1200, feature: 1000, decision: 800, task: 600, trace: 1000 },
152
+ max_sections: { module: 8, feature: 8, decision: 6, task: 6 },
153
+ warn_when_related_count_gt: 12,
154
+ },
155
+ distill: {
156
+ enabled: true,
157
+ cadence: 'weekly',
158
+ max_undistilled_traces: 20,
159
+ require_confirmation: true,
160
+ suggest_card_splits: true,
161
+ },
162
+ freshness: {
163
+ default_ttl: '14d',
164
+ stale_on_related_code_change: true,
165
+ require_last_verified: true,
166
+ },
167
+ integrations: {
168
+ active: [],
169
+ },
170
+ migrations: {
171
+ applied: [],
172
+ },
173
+ };
174
+ }
175
+ function getDefaultManifestV03(projectName, initMode = 'minimal') {
176
+ return getDefaultManifest(projectName, initMode);
177
+ }
178
+ function loadManifest(pmemDir) {
179
+ const filePath = `${pmemDir}/manifest.yml`;
180
+ const content = fs.readFile(filePath);
181
+ if (!content)
182
+ return null;
183
+ try {
184
+ return yaml.load(content);
185
+ }
186
+ catch {
187
+ return null;
188
+ }
189
+ }
190
+ function saveManifest(pmemDir, manifest) {
191
+ const yamlStr = yaml.dump(manifest, {
192
+ indent: 2,
193
+ lineWidth: 120,
194
+ noRefs: true,
195
+ sortKeys: false,
196
+ });
197
+ // Use atomic write for manifest to prevent corruption
198
+ const filePath = `${pmemDir}/manifest.yml`;
199
+ const fsModule = require('./fs');
200
+ if (fsModule.atomicWrite) {
201
+ fsModule.atomicWrite(filePath, yamlStr);
202
+ }
203
+ else {
204
+ fs.writeFile(filePath, yamlStr);
205
+ }
206
+ }
207
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Simple inline YAML parser for pmem's constrained frontmatter format.
3
+ * Handles: top-level scalars, nested objects (one level), list items, inline arrays.
4
+ */
5
+ export declare function parseSimpleYaml(yaml: string): Record<string, unknown>;
6
+ export declare function parseYamlValue(val: string): string | boolean | number | string[];
7
+ export declare function parseFrontmatter(content: string): {
8
+ data: Record<string, unknown>;
9
+ body: string;
10
+ } | null;
11
+ //# sourceMappingURL=yaml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/core/yaml.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyDrE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,CAWhF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOxG"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSimpleYaml = parseSimpleYaml;
4
+ exports.parseYamlValue = parseYamlValue;
5
+ exports.parseFrontmatter = parseFrontmatter;
6
+ /**
7
+ * Simple inline YAML parser for pmem's constrained frontmatter format.
8
+ * Handles: top-level scalars, nested objects (one level), list items, inline arrays.
9
+ */
10
+ function parseSimpleYaml(yaml) {
11
+ const result = {};
12
+ const lines = yaml.split('\n');
13
+ let currentArrayKey = null;
14
+ let currentSubKey = null;
15
+ for (const line of lines) {
16
+ if (line.trim() === '')
17
+ continue;
18
+ // Sub-object key: " key: value"
19
+ const subMatch = line.match(/^ (\w[\w_]*):\s*(.*)/);
20
+ if (subMatch) {
21
+ const key = subMatch[1];
22
+ const val = subMatch[2].trim();
23
+ if (val === '') {
24
+ currentSubKey = key;
25
+ if (!result[currentArrayKey || ''])
26
+ result[currentArrayKey || ''] = {};
27
+ continue;
28
+ }
29
+ if (currentArrayKey) {
30
+ if (!result[currentArrayKey])
31
+ result[currentArrayKey] = {};
32
+ result[currentArrayKey][key] = parseYamlValue(val);
33
+ }
34
+ else {
35
+ result[key] = parseYamlValue(val);
36
+ }
37
+ continue;
38
+ }
39
+ // Array item: " - value"
40
+ const arrMatch = line.match(/^ -\s*(.*)/);
41
+ if (arrMatch) {
42
+ const val = arrMatch[1].trim();
43
+ const arrKey = currentSubKey || currentArrayKey;
44
+ if (arrKey) {
45
+ if (!result[arrKey])
46
+ result[arrKey] = [];
47
+ result[arrKey].push(val);
48
+ }
49
+ continue;
50
+ }
51
+ // Top-level key: value
52
+ const topMatch = line.match(/^(\w[\w_]*):\s*(.*)/);
53
+ if (topMatch) {
54
+ const key = topMatch[1];
55
+ const val = topMatch[2].trim();
56
+ if (val === '') {
57
+ currentArrayKey = key;
58
+ currentSubKey = null;
59
+ }
60
+ else {
61
+ result[key] = parseYamlValue(val);
62
+ currentArrayKey = null;
63
+ currentSubKey = null;
64
+ }
65
+ }
66
+ }
67
+ return result;
68
+ }
69
+ function parseYamlValue(val) {
70
+ if (val === 'true')
71
+ return true;
72
+ if (val === 'false')
73
+ return false;
74
+ if (/^\d+$/.test(val))
75
+ return parseInt(val, 10);
76
+ // Inline array: [a, b, c]
77
+ if (val.startsWith('[') && val.endsWith(']')) {
78
+ const inner = val.slice(1, -1).trim();
79
+ if (!inner)
80
+ return [];
81
+ return inner.split(',').map(s => s.trim().replace(/^"(.*)"$/, '$1')).filter(s => s.length > 0);
82
+ }
83
+ return val.replace(/^"(.*)"$/, '$1');
84
+ }
85
+ function parseFrontmatter(content) {
86
+ const match = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
87
+ if (!match)
88
+ return null;
89
+ return {
90
+ data: parseSimpleYaml(match[1]),
91
+ body: match[2] || '',
92
+ };
93
+ }
94
+ //# sourceMappingURL=yaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.js","sourceRoot":"","sources":["../../src/core/yaml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}