gnosys 4.0.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 (188) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1387 -0
  3. package/dist/cli.d.ts +7 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +3753 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +8 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +2267 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/archive.d.ts +95 -0
  12. package/dist/lib/archive.d.ts.map +1 -0
  13. package/dist/lib/archive.js +311 -0
  14. package/dist/lib/archive.js.map +1 -0
  15. package/dist/lib/ask.d.ts +77 -0
  16. package/dist/lib/ask.d.ts.map +1 -0
  17. package/dist/lib/ask.js +316 -0
  18. package/dist/lib/ask.js.map +1 -0
  19. package/dist/lib/audit.d.ts +47 -0
  20. package/dist/lib/audit.d.ts.map +1 -0
  21. package/dist/lib/audit.js +136 -0
  22. package/dist/lib/audit.js.map +1 -0
  23. package/dist/lib/bootstrap.d.ts +56 -0
  24. package/dist/lib/bootstrap.d.ts.map +1 -0
  25. package/dist/lib/bootstrap.js +163 -0
  26. package/dist/lib/bootstrap.js.map +1 -0
  27. package/dist/lib/config.d.ts +239 -0
  28. package/dist/lib/config.d.ts.map +1 -0
  29. package/dist/lib/config.js +371 -0
  30. package/dist/lib/config.js.map +1 -0
  31. package/dist/lib/dashboard.d.ts +81 -0
  32. package/dist/lib/dashboard.d.ts.map +1 -0
  33. package/dist/lib/dashboard.js +314 -0
  34. package/dist/lib/dashboard.js.map +1 -0
  35. package/dist/lib/db.d.ts +182 -0
  36. package/dist/lib/db.d.ts.map +1 -0
  37. package/dist/lib/db.js +620 -0
  38. package/dist/lib/db.js.map +1 -0
  39. package/dist/lib/dbSearch.d.ts +65 -0
  40. package/dist/lib/dbSearch.d.ts.map +1 -0
  41. package/dist/lib/dbSearch.js +239 -0
  42. package/dist/lib/dbSearch.js.map +1 -0
  43. package/dist/lib/dbWrite.d.ts +56 -0
  44. package/dist/lib/dbWrite.d.ts.map +1 -0
  45. package/dist/lib/dbWrite.js +171 -0
  46. package/dist/lib/dbWrite.js.map +1 -0
  47. package/dist/lib/dream.d.ts +170 -0
  48. package/dist/lib/dream.d.ts.map +1 -0
  49. package/dist/lib/dream.js +706 -0
  50. package/dist/lib/dream.js.map +1 -0
  51. package/dist/lib/embeddings.d.ts +84 -0
  52. package/dist/lib/embeddings.d.ts.map +1 -0
  53. package/dist/lib/embeddings.js +226 -0
  54. package/dist/lib/embeddings.js.map +1 -0
  55. package/dist/lib/export.d.ts +92 -0
  56. package/dist/lib/export.d.ts.map +1 -0
  57. package/dist/lib/export.js +362 -0
  58. package/dist/lib/export.js.map +1 -0
  59. package/dist/lib/federated.d.ts +113 -0
  60. package/dist/lib/federated.d.ts.map +1 -0
  61. package/dist/lib/federated.js +346 -0
  62. package/dist/lib/federated.js.map +1 -0
  63. package/dist/lib/graph.d.ts +50 -0
  64. package/dist/lib/graph.d.ts.map +1 -0
  65. package/dist/lib/graph.js +118 -0
  66. package/dist/lib/graph.js.map +1 -0
  67. package/dist/lib/history.d.ts +39 -0
  68. package/dist/lib/history.d.ts.map +1 -0
  69. package/dist/lib/history.js +112 -0
  70. package/dist/lib/history.js.map +1 -0
  71. package/dist/lib/hybridSearch.d.ts +80 -0
  72. package/dist/lib/hybridSearch.d.ts.map +1 -0
  73. package/dist/lib/hybridSearch.js +296 -0
  74. package/dist/lib/hybridSearch.js.map +1 -0
  75. package/dist/lib/import.d.ts +52 -0
  76. package/dist/lib/import.d.ts.map +1 -0
  77. package/dist/lib/import.js +365 -0
  78. package/dist/lib/import.js.map +1 -0
  79. package/dist/lib/ingest.d.ts +51 -0
  80. package/dist/lib/ingest.d.ts.map +1 -0
  81. package/dist/lib/ingest.js +144 -0
  82. package/dist/lib/ingest.js.map +1 -0
  83. package/dist/lib/lensing.d.ts +35 -0
  84. package/dist/lib/lensing.d.ts.map +1 -0
  85. package/dist/lib/lensing.js +85 -0
  86. package/dist/lib/lensing.js.map +1 -0
  87. package/dist/lib/llm.d.ts +84 -0
  88. package/dist/lib/llm.d.ts.map +1 -0
  89. package/dist/lib/llm.js +386 -0
  90. package/dist/lib/llm.js.map +1 -0
  91. package/dist/lib/lock.d.ts +28 -0
  92. package/dist/lib/lock.d.ts.map +1 -0
  93. package/dist/lib/lock.js +145 -0
  94. package/dist/lib/lock.js.map +1 -0
  95. package/dist/lib/maintenance.d.ts +124 -0
  96. package/dist/lib/maintenance.d.ts.map +1 -0
  97. package/dist/lib/maintenance.js +587 -0
  98. package/dist/lib/maintenance.js.map +1 -0
  99. package/dist/lib/migrate.d.ts +19 -0
  100. package/dist/lib/migrate.d.ts.map +1 -0
  101. package/dist/lib/migrate.js +260 -0
  102. package/dist/lib/migrate.js.map +1 -0
  103. package/dist/lib/preferences.d.ts +49 -0
  104. package/dist/lib/preferences.d.ts.map +1 -0
  105. package/dist/lib/preferences.js +149 -0
  106. package/dist/lib/preferences.js.map +1 -0
  107. package/dist/lib/projectIdentity.d.ts +66 -0
  108. package/dist/lib/projectIdentity.d.ts.map +1 -0
  109. package/dist/lib/projectIdentity.js +148 -0
  110. package/dist/lib/projectIdentity.js.map +1 -0
  111. package/dist/lib/recall.d.ts +82 -0
  112. package/dist/lib/recall.d.ts.map +1 -0
  113. package/dist/lib/recall.js +289 -0
  114. package/dist/lib/recall.js.map +1 -0
  115. package/dist/lib/resolver.d.ts +116 -0
  116. package/dist/lib/resolver.d.ts.map +1 -0
  117. package/dist/lib/resolver.js +372 -0
  118. package/dist/lib/resolver.js.map +1 -0
  119. package/dist/lib/retry.d.ts +24 -0
  120. package/dist/lib/retry.d.ts.map +1 -0
  121. package/dist/lib/retry.js +60 -0
  122. package/dist/lib/retry.js.map +1 -0
  123. package/dist/lib/rulesGen.d.ts +51 -0
  124. package/dist/lib/rulesGen.d.ts.map +1 -0
  125. package/dist/lib/rulesGen.js +167 -0
  126. package/dist/lib/rulesGen.js.map +1 -0
  127. package/dist/lib/search.d.ts +51 -0
  128. package/dist/lib/search.d.ts.map +1 -0
  129. package/dist/lib/search.js +190 -0
  130. package/dist/lib/search.js.map +1 -0
  131. package/dist/lib/staticSearch.d.ts +70 -0
  132. package/dist/lib/staticSearch.d.ts.map +1 -0
  133. package/dist/lib/staticSearch.js +162 -0
  134. package/dist/lib/staticSearch.js.map +1 -0
  135. package/dist/lib/store.d.ts +79 -0
  136. package/dist/lib/store.d.ts.map +1 -0
  137. package/dist/lib/store.js +227 -0
  138. package/dist/lib/store.js.map +1 -0
  139. package/dist/lib/structuredIngest.d.ts +37 -0
  140. package/dist/lib/structuredIngest.d.ts.map +1 -0
  141. package/dist/lib/structuredIngest.js +208 -0
  142. package/dist/lib/structuredIngest.js.map +1 -0
  143. package/dist/lib/tags.d.ts +26 -0
  144. package/dist/lib/tags.d.ts.map +1 -0
  145. package/dist/lib/tags.js +109 -0
  146. package/dist/lib/tags.js.map +1 -0
  147. package/dist/lib/timeline.d.ts +34 -0
  148. package/dist/lib/timeline.d.ts.map +1 -0
  149. package/dist/lib/timeline.js +116 -0
  150. package/dist/lib/timeline.js.map +1 -0
  151. package/dist/lib/trace.d.ts +42 -0
  152. package/dist/lib/trace.d.ts.map +1 -0
  153. package/dist/lib/trace.js +338 -0
  154. package/dist/lib/trace.js.map +1 -0
  155. package/dist/lib/webIndex.d.ts +28 -0
  156. package/dist/lib/webIndex.d.ts.map +1 -0
  157. package/dist/lib/webIndex.js +208 -0
  158. package/dist/lib/webIndex.js.map +1 -0
  159. package/dist/lib/webIngest.d.ts +51 -0
  160. package/dist/lib/webIngest.d.ts.map +1 -0
  161. package/dist/lib/webIngest.js +533 -0
  162. package/dist/lib/webIngest.js.map +1 -0
  163. package/dist/lib/wikilinks.d.ts +63 -0
  164. package/dist/lib/wikilinks.d.ts.map +1 -0
  165. package/dist/lib/wikilinks.js +146 -0
  166. package/dist/lib/wikilinks.js.map +1 -0
  167. package/dist/sandbox/client.d.ts +82 -0
  168. package/dist/sandbox/client.d.ts.map +1 -0
  169. package/dist/sandbox/client.js +128 -0
  170. package/dist/sandbox/client.js.map +1 -0
  171. package/dist/sandbox/helper-template.d.ts +14 -0
  172. package/dist/sandbox/helper-template.d.ts.map +1 -0
  173. package/dist/sandbox/helper-template.js +285 -0
  174. package/dist/sandbox/helper-template.js.map +1 -0
  175. package/dist/sandbox/index.d.ts +10 -0
  176. package/dist/sandbox/index.d.ts.map +1 -0
  177. package/dist/sandbox/index.js +10 -0
  178. package/dist/sandbox/index.js.map +1 -0
  179. package/dist/sandbox/manager.d.ts +40 -0
  180. package/dist/sandbox/manager.d.ts.map +1 -0
  181. package/dist/sandbox/manager.js +220 -0
  182. package/dist/sandbox/manager.js.map +1 -0
  183. package/dist/sandbox/server.d.ts +44 -0
  184. package/dist/sandbox/server.d.ts.map +1 -0
  185. package/dist/sandbox/server.js +661 -0
  186. package/dist/sandbox/server.js.map +1 -0
  187. package/package.json +103 -0
  188. package/prompts/synthesize.md +21 -0
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Gnosys Migrate — Moves data from v1.x (Markdown + archive.db + embeddings.db)
3
+ * into the unified gnosys.db (v2.0).
4
+ *
5
+ * Safe: original .md files and old DBs are untouched.
6
+ * Reversible: delete gnosys.db to revert.
7
+ */
8
+ import path from "path";
9
+ import { GnosysDB, fnv1a } from "./db.js";
10
+ import { GnosysStore } from "./store.js";
11
+ import { GnosysArchive } from "./archive.js";
12
+ // Dynamic import for embeddings DB
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ let Database = null;
15
+ try {
16
+ Database = (await import("better-sqlite3")).default;
17
+ }
18
+ catch {
19
+ // Not available
20
+ }
21
+ /**
22
+ * Extract [[wikilinks]] from markdown content.
23
+ * Returns array of link targets (the text inside double brackets).
24
+ */
25
+ function extractWikilinks(content) {
26
+ const re = /\[\[([^\]]+)\]\]/g;
27
+ const links = [];
28
+ let match;
29
+ while ((match = re.exec(content)) !== null) {
30
+ links.push(match[1]);
31
+ }
32
+ return links;
33
+ }
34
+ /**
35
+ * Resolve a wikilink target to a memory ID using fuzzy title matching.
36
+ */
37
+ function resolveWikilink(target, titleMap) {
38
+ // Exact match on title
39
+ const lower = target.toLowerCase().replace(/\.md$/, "");
40
+ for (const [title, id] of titleMap) {
41
+ if (title.toLowerCase() === lower)
42
+ return id;
43
+ }
44
+ // Partial match
45
+ for (const [title, id] of titleMap) {
46
+ if (title.toLowerCase().includes(lower) || lower.includes(title.toLowerCase()))
47
+ return id;
48
+ }
49
+ return null;
50
+ }
51
+ /**
52
+ * Migrate all data from v1.x format into gnosys.db.
53
+ */
54
+ export async function migrate(storePath, options) {
55
+ const log = options?.verbose ? console.log : () => { };
56
+ const stats = {
57
+ memoriesMigrated: 0,
58
+ archiveMigrated: 0,
59
+ relationshipsCreated: 0,
60
+ ftsBuild: false,
61
+ };
62
+ // 1. Open/create gnosys.db
63
+ const db = new GnosysDB(storePath);
64
+ if (!db.isAvailable()) {
65
+ throw new Error("Cannot create gnosys.db — better-sqlite3 not available");
66
+ }
67
+ // 2. Read all active .md memories
68
+ const store = new GnosysStore(storePath);
69
+ await store.init();
70
+ const memories = await store.getAllMemories();
71
+ log(`Found ${memories.length} active memories to migrate`);
72
+ // Build title→ID map for wikilink resolution
73
+ const titleMap = new Map();
74
+ // 3. Insert active memories
75
+ db.transaction(() => {
76
+ for (const mem of memories) {
77
+ const tags = Array.isArray(mem.frontmatter.tags)
78
+ ? JSON.stringify(mem.frontmatter.tags)
79
+ : JSON.stringify(Object.values(mem.frontmatter.tags).flat());
80
+ const contentHash = fnv1a(mem.content);
81
+ db.insertMemory({
82
+ id: mem.frontmatter.id,
83
+ title: mem.frontmatter.title,
84
+ category: mem.frontmatter.category,
85
+ content: mem.content,
86
+ summary: null,
87
+ tags,
88
+ relevance: mem.frontmatter.relevance || "",
89
+ author: mem.frontmatter.author || "ai",
90
+ authority: mem.frontmatter.authority || "imported",
91
+ confidence: mem.frontmatter.confidence ?? 0.8,
92
+ reinforcement_count: mem.frontmatter.reinforcement_count || 0,
93
+ content_hash: contentHash,
94
+ status: mem.frontmatter.status || "active",
95
+ tier: "active",
96
+ supersedes: mem.frontmatter.supersedes || null,
97
+ superseded_by: mem.frontmatter.superseded_by || null,
98
+ last_reinforced: mem.frontmatter.last_reinforced || null,
99
+ created: mem.frontmatter.created,
100
+ modified: mem.frontmatter.modified,
101
+ embedding: null,
102
+ source_path: mem.relativePath,
103
+ project_id: null,
104
+ scope: "project",
105
+ });
106
+ titleMap.set(mem.frontmatter.title, mem.frontmatter.id);
107
+ stats.memoriesMigrated++;
108
+ }
109
+ });
110
+ log(`Migrated ${stats.memoriesMigrated} active memories`);
111
+ // 4. Migrate archive.db entries
112
+ try {
113
+ const archive = new GnosysArchive(storePath);
114
+ if (archive.isAvailable()) {
115
+ const archiveIds = archive.getAllArchivedIds();
116
+ log(`Found ${archiveIds.length} archived memories to migrate`);
117
+ db.transaction(() => {
118
+ for (const archiveId of archiveIds) {
119
+ const row = archive.getArchivedMemory(archiveId);
120
+ if (!row)
121
+ continue;
122
+ // Parse stored frontmatter
123
+ let frontmatter = {};
124
+ try {
125
+ frontmatter = JSON.parse(row.yaml_frontmatter);
126
+ }
127
+ catch {
128
+ // Use minimal fields from row
129
+ }
130
+ const contentHash = fnv1a(row.content);
131
+ db.insertMemory({
132
+ id: row.id,
133
+ title: row.title,
134
+ category: row.category,
135
+ content: row.content,
136
+ summary: null,
137
+ tags: row.tags ? JSON.stringify(row.tags.split(" ").filter(Boolean)) : "[]",
138
+ relevance: frontmatter.relevance || row.tags || "",
139
+ author: frontmatter.author || "ai",
140
+ authority: frontmatter.authority || "imported",
141
+ confidence: row.confidence ?? 0.8,
142
+ reinforcement_count: frontmatter.reinforcement_count || 0,
143
+ content_hash: contentHash,
144
+ status: "archived",
145
+ tier: "archive",
146
+ supersedes: frontmatter.supersedes || null,
147
+ superseded_by: frontmatter.superseded_by || null,
148
+ last_reinforced: row.last_reinforced || null,
149
+ created: frontmatter.created || row.archived_date,
150
+ modified: frontmatter.modified || row.archived_date,
151
+ embedding: null,
152
+ source_path: row.original_path,
153
+ project_id: null,
154
+ scope: "project",
155
+ });
156
+ titleMap.set(row.title, row.id);
157
+ stats.archiveMigrated++;
158
+ }
159
+ });
160
+ archive.close();
161
+ log(`Migrated ${stats.archiveMigrated} archived memories`);
162
+ }
163
+ }
164
+ catch {
165
+ log("No archive.db found or archive migration skipped");
166
+ }
167
+ // 5. Copy embeddings from embeddings.db
168
+ try {
169
+ const embPath = path.join(storePath, ".config", "embeddings.db");
170
+ if (Database) {
171
+ const embDb = new Database(embPath, { readonly: true });
172
+ const rows = embDb.prepare("SELECT file_path, embedding FROM embeddings").all();
173
+ let embCount = 0;
174
+ for (const row of rows) {
175
+ // file_path might be "category/file.md" — we need to find the matching memory
176
+ const matchingMemory = memories.find((m) => m.relativePath === row.file_path);
177
+ if (matchingMemory) {
178
+ db.updateEmbedding(matchingMemory.frontmatter.id, row.embedding);
179
+ embCount++;
180
+ }
181
+ }
182
+ embDb.close();
183
+ log(`Copied ${embCount} embeddings`);
184
+ }
185
+ }
186
+ catch {
187
+ log("No embeddings.db found or embedding copy skipped");
188
+ }
189
+ // 6. Build relationships from wikilinks
190
+ const today = new Date().toISOString().split("T")[0];
191
+ db.transaction(() => {
192
+ for (const mem of memories) {
193
+ const links = extractWikilinks(mem.content);
194
+ for (const link of links) {
195
+ const targetId = resolveWikilink(link, titleMap);
196
+ if (targetId && targetId !== mem.frontmatter.id) {
197
+ db.insertRelationship({
198
+ source_id: mem.frontmatter.id,
199
+ target_id: targetId,
200
+ rel_type: "references",
201
+ label: link,
202
+ confidence: 1.0,
203
+ created: today,
204
+ });
205
+ stats.relationshipsCreated++;
206
+ }
207
+ }
208
+ // Build supersedes relationships
209
+ if (mem.frontmatter.supersedes) {
210
+ const supersedesIds = mem.frontmatter.supersedes.split(",").map((s) => s.trim());
211
+ for (const sid of supersedesIds) {
212
+ if (sid) {
213
+ db.insertRelationship({
214
+ source_id: mem.frontmatter.id,
215
+ target_id: sid,
216
+ rel_type: "supersedes",
217
+ label: null,
218
+ confidence: 1.0,
219
+ created: today,
220
+ });
221
+ stats.relationshipsCreated++;
222
+ }
223
+ }
224
+ }
225
+ }
226
+ });
227
+ log(`Created ${stats.relationshipsCreated} relationships`);
228
+ // 7. Log migration in audit
229
+ db.logAudit({
230
+ timestamp: new Date().toISOString(),
231
+ operation: "migrate",
232
+ memory_id: null,
233
+ details: JSON.stringify(stats),
234
+ duration_ms: null,
235
+ trace_id: null,
236
+ });
237
+ stats.ftsBuild = true;
238
+ db.close();
239
+ return stats;
240
+ }
241
+ /**
242
+ * Format migration results for CLI output.
243
+ */
244
+ export function formatMigrationReport(stats) {
245
+ const lines = [
246
+ "╔════════════════════════════════════════╗",
247
+ "║ Gnosys Migration Complete ║",
248
+ "╚════════════════════════════════════════╝",
249
+ "",
250
+ ` Active memories migrated: ${stats.memoriesMigrated}`,
251
+ ` Archived memories migrated: ${stats.archiveMigrated}`,
252
+ ` Relationships created: ${stats.relationshipsCreated}`,
253
+ ` FTS5 index built: ${stats.ftsBuild ? "✓" : "✗"}`,
254
+ "",
255
+ " Original .md files and archive.db are untouched.",
256
+ " Delete gnosys.db to revert to v1.x format.",
257
+ ];
258
+ return lines.join("\n");
259
+ }
260
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/lib/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Gnosys Preferences — Phase 8b.
3
+ *
4
+ * User preferences stored as regular Gnosys memories in the central DB
5
+ * with scope='user' and category='preferences'. The memory system IS
6
+ * the config system.
7
+ *
8
+ * Preferences have a `key` (stored in the memory id as `pref-<key>`)
9
+ * and a `value` (stored in content). They're searchable, decayable,
10
+ * and versioned just like any other memory.
11
+ */
12
+ import { GnosysDB } from "./db.js";
13
+ export interface Preference {
14
+ key: string;
15
+ value: string;
16
+ title: string;
17
+ tags: string[];
18
+ confidence: number;
19
+ created: string;
20
+ modified: string;
21
+ }
22
+ /** Well-known preference keys used by the rules generator */
23
+ export declare const KNOWN_PREFERENCE_KEYS: readonly ["commit-convention", "code-style", "llm-provider", "agent-behavior", "testing-approach", "documentation-style", "naming-convention", "error-handling", "review-process", "deploy-workflow"];
24
+ /**
25
+ * Set a user preference. Creates or updates a memory in the central DB
26
+ * with scope='user' and category='preferences'.
27
+ */
28
+ export declare function setPreference(db: GnosysDB, key: string, value: string, opts?: {
29
+ title?: string;
30
+ tags?: string[];
31
+ confidence?: number;
32
+ }): Preference;
33
+ /**
34
+ * Get a single preference by key.
35
+ */
36
+ export declare function getPreference(db: GnosysDB, key: string): Preference | null;
37
+ /**
38
+ * Get all user preferences.
39
+ */
40
+ export declare function getAllPreferences(db: GnosysDB): Preference[];
41
+ /**
42
+ * Delete a preference by key.
43
+ */
44
+ export declare function deletePreference(db: GnosysDB, key: string): boolean;
45
+ /**
46
+ * Search preferences by keyword.
47
+ */
48
+ export declare function searchPreferences(db: GnosysDB, query: string): Preference[];
49
+ //# sourceMappingURL=preferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.d.ts","sourceRoot":"","sources":["../../src/lib/preferences.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAmB,MAAM,SAAS,CAAC;AAIpD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB,uMAWxB,CAAC;AAIX;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,UAAU,CA4CZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAK1E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,UAAU,EAAE,CAK5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAMnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAU3E"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Gnosys Preferences — Phase 8b.
3
+ *
4
+ * User preferences stored as regular Gnosys memories in the central DB
5
+ * with scope='user' and category='preferences'. The memory system IS
6
+ * the config system.
7
+ *
8
+ * Preferences have a `key` (stored in the memory id as `pref-<key>`)
9
+ * and a `value` (stored in content). They're searchable, decayable,
10
+ * and versioned just like any other memory.
11
+ */
12
+ import { fnv1a } from "./db.js";
13
+ /** Well-known preference keys used by the rules generator */
14
+ export const KNOWN_PREFERENCE_KEYS = [
15
+ "commit-convention",
16
+ "code-style",
17
+ "llm-provider",
18
+ "agent-behavior",
19
+ "testing-approach",
20
+ "documentation-style",
21
+ "naming-convention",
22
+ "error-handling",
23
+ "review-process",
24
+ "deploy-workflow",
25
+ ];
26
+ // ─── Preference CRUD ────────────────────────────────────────────────────
27
+ /**
28
+ * Set a user preference. Creates or updates a memory in the central DB
29
+ * with scope='user' and category='preferences'.
30
+ */
31
+ export function setPreference(db, key, value, opts) {
32
+ const now = new Date().toISOString().split("T")[0];
33
+ const id = `pref-${key}`;
34
+ const title = opts?.title || formatPreferenceTitle(key);
35
+ const tags = opts?.tags || [];
36
+ const confidence = opts?.confidence ?? 0.95;
37
+ // Check if it already exists
38
+ const existing = db.getMemory(id);
39
+ db.insertMemory({
40
+ id,
41
+ title,
42
+ category: "preferences",
43
+ content: `# ${title}\n\n${value}`,
44
+ summary: value.length > 200 ? value.substring(0, 200) + "..." : value,
45
+ tags: JSON.stringify(tags),
46
+ relevance: `preference ${key} user-preference ${tags.join(" ")}`,
47
+ author: "human",
48
+ authority: "declared",
49
+ confidence,
50
+ reinforcement_count: existing ? (existing.reinforcement_count + 1) : 0,
51
+ content_hash: fnv1a(value),
52
+ status: "active",
53
+ tier: "active",
54
+ supersedes: null,
55
+ superseded_by: null,
56
+ last_reinforced: existing ? now : null,
57
+ created: existing?.created || now,
58
+ modified: now,
59
+ source_path: null,
60
+ project_id: null, // user-level, not project-scoped
61
+ scope: "user",
62
+ });
63
+ return {
64
+ key,
65
+ value,
66
+ title,
67
+ tags,
68
+ confidence,
69
+ created: existing?.created || now,
70
+ modified: now,
71
+ };
72
+ }
73
+ /**
74
+ * Get a single preference by key.
75
+ */
76
+ export function getPreference(db, key) {
77
+ const id = `pref-${key}`;
78
+ const mem = db.getMemory(id);
79
+ if (!mem || mem.category !== "preferences")
80
+ return null;
81
+ return memoryToPreference(mem);
82
+ }
83
+ /**
84
+ * Get all user preferences.
85
+ */
86
+ export function getAllPreferences(db) {
87
+ const mems = db.getMemoriesByScope("user");
88
+ return mems
89
+ .filter((m) => m.category === "preferences" && m.status === "active")
90
+ .map(memoryToPreference);
91
+ }
92
+ /**
93
+ * Delete a preference by key.
94
+ */
95
+ export function deletePreference(db, key) {
96
+ const id = `pref-${key}`;
97
+ const mem = db.getMemory(id);
98
+ if (!mem || mem.category !== "preferences")
99
+ return false;
100
+ db.deleteMemory(id);
101
+ return true;
102
+ }
103
+ /**
104
+ * Search preferences by keyword.
105
+ */
106
+ export function searchPreferences(db, query) {
107
+ const results = db.searchFts(`preferences ${query}`, 20);
108
+ const prefs = [];
109
+ for (const r of results) {
110
+ if (r.id.startsWith("pref-")) {
111
+ const mem = db.getMemory(r.id);
112
+ if (mem)
113
+ prefs.push(memoryToPreference(mem));
114
+ }
115
+ }
116
+ return prefs;
117
+ }
118
+ // ─── Helpers ────────────────────────────────────────────────────────────
119
+ function memoryToPreference(mem) {
120
+ // Extract value from content (strip "# Title\n\n" prefix)
121
+ const content = mem.content;
122
+ const lines = content.split("\n");
123
+ const valueStart = lines[0].startsWith("# ") ? 2 : 0;
124
+ const value = lines.slice(valueStart).join("\n").trim();
125
+ let tags = [];
126
+ try {
127
+ const parsed = JSON.parse(mem.tags);
128
+ tags = Array.isArray(parsed) ? parsed : Object.values(parsed).flat();
129
+ }
130
+ catch {
131
+ tags = [];
132
+ }
133
+ return {
134
+ key: mem.id.replace(/^pref-/, ""),
135
+ value,
136
+ title: mem.title,
137
+ tags,
138
+ confidence: mem.confidence,
139
+ created: mem.created,
140
+ modified: mem.modified,
141
+ };
142
+ }
143
+ function formatPreferenceTitle(key) {
144
+ return key
145
+ .split("-")
146
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
147
+ .join(" ");
148
+ }
149
+ //# sourceMappingURL=preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../src/lib/preferences.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Gnosys Project Identity — v3.0 Centralized Brain.
3
+ *
4
+ * Each project has a .gnosys/gnosys.json that stores its identity:
5
+ * projectId, projectName, workingDirectory, user, agentRulesTarget, obsidianVault
6
+ *
7
+ * The central DB (~/.gnosys/gnosys.db) mirrors this in the `projects` table.
8
+ * gnosys init creates both the local identity file AND the central DB record.
9
+ */
10
+ import { GnosysDB } from "./db.js";
11
+ /** Shape of .gnosys/gnosys.json (project identity) */
12
+ export interface ProjectIdentity {
13
+ projectId: string;
14
+ projectName: string;
15
+ workingDirectory: string;
16
+ user: string;
17
+ agentRulesTarget: string | null;
18
+ obsidianVault: string | null;
19
+ createdAt: string;
20
+ schemaVersion: number;
21
+ }
22
+ /**
23
+ * Detect which agent IDE is being used.
24
+ * Returns the appropriate rules file target path.
25
+ */
26
+ export declare function detectAgentRulesTarget(projectDir: string): string | null;
27
+ /**
28
+ * Read project identity from .gnosys/gnosys.json.
29
+ * Returns null if file doesn't exist or is invalid.
30
+ */
31
+ export declare function readProjectIdentity(projectDir: string): Promise<ProjectIdentity | null>;
32
+ /**
33
+ * Write project identity to .gnosys/gnosys.json.
34
+ */
35
+ export declare function writeProjectIdentity(projectDir: string, identity: ProjectIdentity): Promise<void>;
36
+ /**
37
+ * Create a new project identity.
38
+ * Generates UUID, detects IDE, writes local file, registers in central DB.
39
+ */
40
+ export declare function createProjectIdentity(projectDir: string, opts?: {
41
+ projectName?: string;
42
+ centralDb?: GnosysDB;
43
+ }): Promise<ProjectIdentity>;
44
+ /**
45
+ * Check if the working directory has changed since last init.
46
+ * Returns the identity if a mismatch is detected (needs re-init).
47
+ */
48
+ export declare function checkDirectoryMismatch(projectDir: string): Promise<{
49
+ mismatch: boolean;
50
+ identity: ProjectIdentity | null;
51
+ currentDir: string;
52
+ }>;
53
+ /**
54
+ * Update the working directory in both local identity and central DB.
55
+ * Called when a directory move is detected.
56
+ */
57
+ export declare function updateWorkingDirectory(projectDir: string, centralDb?: GnosysDB): Promise<ProjectIdentity | null>;
58
+ /**
59
+ * Find the project identity by walking up from a directory.
60
+ * Returns the identity and project root directory if found.
61
+ */
62
+ export declare function findProjectIdentity(startDir: string): Promise<{
63
+ identity: ProjectIdentity;
64
+ projectRoot: string;
65
+ } | null>;
66
+ //# sourceMappingURL=projectIdentity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectIdentity.d.ts","sourceRoot":"","sources":["../../src/lib/projectIdentity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EAAE,QAAQ,EAAa,MAAM,SAAS,CAAC;AAE9C,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUxE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAe7F;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvG;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,QAAQ,CAAA;CAAE,GACpD,OAAO,CAAC,eAAe,CAAC,CAyC1B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAUD;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkBjC;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CAAC,CAaR"}