studiograph 1.1.1 → 1.1.3

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 (147) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +307 -10
  3. package/dist/agent/orchestrator.d.ts +17 -9
  4. package/dist/agent/orchestrator.js +95 -95
  5. package/dist/agent/orchestrator.js.map +1 -1
  6. package/dist/agent/prompts/system.md +168 -0
  7. package/dist/agent/skills/bundled/enrich-entities.md +124 -0
  8. package/dist/agent/skills/bundled/gather-context.md +46 -0
  9. package/dist/agent/skills/skill-loader.d.ts +48 -0
  10. package/dist/agent/skills/skill-loader.js +166 -0
  11. package/dist/agent/skills/skill-loader.js.map +1 -0
  12. package/dist/agent/tools/graph-tools.d.ts +20 -2
  13. package/dist/agent/tools/graph-tools.js +64 -8
  14. package/dist/agent/tools/graph-tools.js.map +1 -1
  15. package/dist/agent/tools/load-skill.d.ts +42 -0
  16. package/dist/agent/tools/load-skill.js +45 -0
  17. package/dist/agent/tools/load-skill.js.map +1 -0
  18. package/dist/agent/tools/tool-loader.d.ts +25 -0
  19. package/dist/agent/tools/tool-loader.js +73 -0
  20. package/dist/agent/tools/tool-loader.js.map +1 -0
  21. package/dist/cli/commands/app.d.ts +7 -0
  22. package/dist/cli/commands/app.js +167 -0
  23. package/dist/cli/commands/app.js.map +1 -0
  24. package/dist/cli/commands/config.d.ts +13 -0
  25. package/dist/cli/commands/config.js +276 -0
  26. package/dist/cli/commands/config.js.map +1 -0
  27. package/dist/cli/commands/connector.d.ts +33 -0
  28. package/dist/cli/commands/connector.js +170 -0
  29. package/dist/cli/commands/connector.js.map +1 -0
  30. package/dist/cli/commands/deploy.d.ts +11 -0
  31. package/dist/cli/commands/deploy.js +153 -0
  32. package/dist/cli/commands/deploy.js.map +1 -0
  33. package/dist/cli/commands/index.d.ts +15 -0
  34. package/dist/cli/commands/index.js +117 -0
  35. package/dist/cli/commands/index.js.map +1 -0
  36. package/dist/cli/commands/init.js +110 -28
  37. package/dist/cli/commands/init.js.map +1 -1
  38. package/dist/cli/commands/join.js +67 -22
  39. package/dist/cli/commands/join.js.map +1 -1
  40. package/dist/cli/commands/lint.d.ts +8 -0
  41. package/dist/cli/commands/lint.js +70 -0
  42. package/dist/cli/commands/lint.js.map +1 -0
  43. package/dist/cli/commands/mcp.d.ts +27 -0
  44. package/dist/cli/commands/mcp.js +56 -0
  45. package/dist/cli/commands/mcp.js.map +1 -0
  46. package/dist/cli/commands/provision.d.ts +8 -0
  47. package/dist/cli/commands/provision.js +112 -0
  48. package/dist/cli/commands/provision.js.map +1 -0
  49. package/dist/cli/commands/r2.d.ts +2 -0
  50. package/dist/cli/commands/r2.js +186 -4
  51. package/dist/cli/commands/r2.js.map +1 -1
  52. package/dist/cli/commands/serve.js +47 -2
  53. package/dist/cli/commands/serve.js.map +1 -1
  54. package/dist/cli/commands/start.js +210 -71
  55. package/dist/cli/commands/start.js.map +1 -1
  56. package/dist/cli/commands/sync.js +4 -4
  57. package/dist/cli/commands/sync.js.map +1 -1
  58. package/dist/cli/commands/update.d.ts +8 -0
  59. package/dist/cli/commands/update.js +155 -0
  60. package/dist/cli/commands/update.js.map +1 -0
  61. package/dist/cli/index.js +83 -3
  62. package/dist/cli/index.js.map +1 -1
  63. package/dist/cli/scaffolding.d.ts +9 -0
  64. package/dist/cli/scaffolding.js +288 -0
  65. package/dist/cli/scaffolding.js.map +1 -0
  66. package/dist/core/graph.d.ts +12 -1
  67. package/dist/core/graph.js +147 -78
  68. package/dist/core/graph.js.map +1 -1
  69. package/dist/core/migration-runner.d.ts +39 -0
  70. package/dist/core/migration-runner.js +221 -0
  71. package/dist/core/migration-runner.js.map +1 -0
  72. package/dist/core/migration-types.d.ts +101 -0
  73. package/dist/core/migration-types.js +21 -0
  74. package/dist/core/migration-types.js.map +1 -0
  75. package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
  76. package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
  77. package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
  78. package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
  79. package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
  80. package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
  81. package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
  82. package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
  83. package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
  84. package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
  85. package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
  86. package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
  87. package/dist/core/migrations/index.d.ts +11 -0
  88. package/dist/core/migrations/index.js +23 -0
  89. package/dist/core/migrations/index.js.map +1 -0
  90. package/dist/core/schema-registry.d.ts +36 -0
  91. package/dist/core/schema-registry.js +161 -0
  92. package/dist/core/schema-registry.js.map +1 -0
  93. package/dist/core/types.d.ts +242 -0
  94. package/dist/core/types.js +21 -0
  95. package/dist/core/types.js.map +1 -1
  96. package/dist/core/user-config.d.ts +10 -0
  97. package/dist/core/user-config.js +8 -0
  98. package/dist/core/user-config.js.map +1 -1
  99. package/dist/core/validation.d.ts +973 -32
  100. package/dist/core/validation.js +163 -4
  101. package/dist/core/validation.js.map +1 -1
  102. package/dist/core/workspace-manager.d.ts +26 -2
  103. package/dist/core/workspace-manager.js +113 -15
  104. package/dist/core/workspace-manager.js.map +1 -1
  105. package/dist/core/workspace.d.ts +8 -7
  106. package/dist/core/workspace.js +25 -13
  107. package/dist/core/workspace.js.map +1 -1
  108. package/dist/mcp/connector-manager.d.ts +61 -0
  109. package/dist/mcp/connector-manager.js +178 -0
  110. package/dist/mcp/connector-manager.js.map +1 -0
  111. package/dist/mcp/connectors/definitions.d.ts +43 -0
  112. package/dist/mcp/connectors/definitions.js +140 -0
  113. package/dist/mcp/connectors/definitions.js.map +1 -0
  114. package/dist/mcp/server.d.ts +11 -0
  115. package/dist/mcp/server.js +28 -0
  116. package/dist/mcp/server.js.map +1 -0
  117. package/dist/mcp/tools.d.ts +14 -0
  118. package/dist/mcp/tools.js +172 -0
  119. package/dist/mcp/tools.js.map +1 -0
  120. package/dist/server/index.js +17 -4
  121. package/dist/server/index.js.map +1 -1
  122. package/dist/server/plugin-loader.d.ts +8 -0
  123. package/dist/server/plugin-loader.js +14 -0
  124. package/dist/server/plugin-loader.js.map +1 -1
  125. package/dist/server/routes/graph-api.js +1 -1
  126. package/dist/server/routes/graph-api.js.map +1 -1
  127. package/dist/server/routes/webhook.js +33 -0
  128. package/dist/server/routes/webhook.js.map +1 -1
  129. package/dist/services/github-provisioner.d.ts +1 -0
  130. package/dist/services/github-provisioner.js +11 -0
  131. package/dist/services/github-provisioner.js.map +1 -1
  132. package/dist/services/lint-service.d.ts +27 -0
  133. package/dist/services/lint-service.js +76 -0
  134. package/dist/services/lint-service.js.map +1 -0
  135. package/dist/services/markdown.d.ts +9 -0
  136. package/dist/services/markdown.js +23 -2
  137. package/dist/services/markdown.js.map +1 -1
  138. package/dist/services/memory-service.d.ts +1 -2
  139. package/dist/services/memory-service.js +6 -4
  140. package/dist/services/memory-service.js.map +1 -1
  141. package/dist/services/vector-service.d.ts +77 -0
  142. package/dist/services/vector-service.js +280 -0
  143. package/dist/services/vector-service.js.map +1 -0
  144. package/dist/utils/version-checker.d.ts +23 -0
  145. package/dist/utils/version-checker.js +116 -0
  146. package/dist/utils/version-checker.js.map +1 -0
  147. package/package.json +10 -6
@@ -0,0 +1,280 @@
1
+ /**
2
+ * VectorService
3
+ *
4
+ * Manages semantic and full-text search using LanceDB.
5
+ *
6
+ * Tier 1 — FTS only (no API key required):
7
+ * All entities are indexed in LanceDB with a BM25 full-text search index on
8
+ * the `text` column. This is a significant upgrade over substring matching.
9
+ *
10
+ * Tier 2 — Hybrid semantic search (requires Voyage AI API key):
11
+ * When a voyage_api_key is configured, embeddings are generated via Voyage AI
12
+ * (voyage-3, 1024 dimensions) and stored alongside the FTS index. Searches
13
+ * use LanceDB hybrid mode (vector + FTS re-ranked).
14
+ *
15
+ * Storage: ~/.studiograph/vector/ (configurable via user.json vector_db_path)
16
+ * Last-index timestamps: ~/.studiograph/vector/last-indexed.json
17
+ */
18
+ import { join } from 'path';
19
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
20
+ import * as lancedb from '@lancedb/lancedb';
21
+ const VOYAGE_API_URL = 'https://api.voyageai.com/v1/embeddings';
22
+ const VOYAGE_MODEL = 'voyage-3';
23
+ const VECTOR_DIM = 1024;
24
+ const TABLE_NAME = 'entities';
25
+ export class VectorService {
26
+ dbPath;
27
+ voyageApiKey;
28
+ db;
29
+ table;
30
+ lastIndexedPath;
31
+ initialized = false;
32
+ constructor(dbPath, voyageApiKey) {
33
+ this.dbPath = dbPath;
34
+ this.voyageApiKey = voyageApiKey;
35
+ this.lastIndexedPath = join(dbPath, 'last-indexed.json');
36
+ }
37
+ /**
38
+ * Open/create the LanceDB table and ensure the FTS index exists.
39
+ * Call once before using the service.
40
+ */
41
+ async init() {
42
+ if (this.initialized)
43
+ return;
44
+ mkdirSync(this.dbPath, { recursive: true });
45
+ this.db = await lancedb.connect(this.dbPath);
46
+ const tableNames = await this.db.tableNames();
47
+ if (tableNames.includes(TABLE_NAME)) {
48
+ this.table = await this.db.openTable(TABLE_NAME);
49
+ }
50
+ else {
51
+ // Create table with a seed record (LanceDB infers schema from first batch)
52
+ const seed = {
53
+ id: '__seed__',
54
+ repo: '',
55
+ entity_type: '',
56
+ entity_id: '',
57
+ text: 'seed',
58
+ vector: new Array(VECTOR_DIM).fill(0),
59
+ updated_at: new Date().toISOString(),
60
+ };
61
+ this.table = await this.db.createTable(TABLE_NAME, [seed]);
62
+ // Create FTS index on text column
63
+ await this.table.createIndex('text', {
64
+ config: lancedb.Index.fts(),
65
+ });
66
+ // Delete the seed record
67
+ await this.table.delete(`id = '__seed__'`);
68
+ }
69
+ this.initialized = true;
70
+ }
71
+ /**
72
+ * Index or re-index a single entity.
73
+ * Safe to call on create, update, or as part of bulk indexing.
74
+ */
75
+ async upsert(repoName, entity) {
76
+ await this.init();
77
+ const id = `${repoName}/${entity.entityType}/${entity.id}`;
78
+ const text = buildEntityText(entity);
79
+ const vector = this.voyageApiKey
80
+ ? await this.generateEmbedding(text)
81
+ : null;
82
+ const record = {
83
+ id,
84
+ repo: repoName,
85
+ entity_type: entity.entityType,
86
+ entity_id: entity.id,
87
+ text,
88
+ // Only include vector when we actually have one — avoids LanceDB schema inference issues
89
+ vector: vector ?? new Array(VECTOR_DIM).fill(0),
90
+ updated_at: new Date().toISOString(),
91
+ };
92
+ await this.table
93
+ .mergeInsert('id')
94
+ .whenMatchedUpdateAll()
95
+ .whenNotMatchedInsertAll()
96
+ .execute([record]);
97
+ }
98
+ /**
99
+ * Bulk upsert — used by `studiograph index`. Batches Voyage API calls.
100
+ */
101
+ async upsertMany(repoName, entities) {
102
+ await this.init();
103
+ if (entities.length === 0)
104
+ return;
105
+ const texts = entities.map(e => buildEntityText(e));
106
+ // Batch embeddings (Voyage supports up to 128 per request)
107
+ let vectors = new Array(entities.length).fill(null);
108
+ if (this.voyageApiKey) {
109
+ vectors = await this.generateEmbeddingsBatch(texts);
110
+ }
111
+ const records = entities.map((entity, i) => ({
112
+ id: `${repoName}/${entity.entityType}/${entity.id}`,
113
+ repo: repoName,
114
+ entity_type: entity.entityType,
115
+ entity_id: entity.id,
116
+ text: texts[i],
117
+ vector: vectors[i] ?? new Array(VECTOR_DIM).fill(0),
118
+ updated_at: new Date().toISOString(),
119
+ }));
120
+ await this.table
121
+ .mergeInsert('id')
122
+ .whenMatchedUpdateAll()
123
+ .whenNotMatchedInsertAll()
124
+ .execute(records);
125
+ }
126
+ /**
127
+ * Remove an entity from the index.
128
+ */
129
+ async delete(repoName, entityType, entityId) {
130
+ await this.init();
131
+ const id = `${repoName}/${entityType}/${entityId}`;
132
+ await this.table.delete(`id = '${id.replace(/'/g, "''")}'`);
133
+ }
134
+ /**
135
+ * Search the index.
136
+ * Uses hybrid search (vector + FTS) when Voyage key is configured, FTS only otherwise.
137
+ */
138
+ async search(query, options = {}) {
139
+ await this.init();
140
+ const limit = options.limit ?? 10;
141
+ try {
142
+ let rows;
143
+ if (this.voyageApiKey) {
144
+ // Tier 2: hybrid search
145
+ const queryVector = await this.generateEmbedding(query);
146
+ rows = await this.table
147
+ .search(queryVector)
148
+ .limit(limit * 2) // fetch extra for re-ranking
149
+ .toArray();
150
+ }
151
+ else {
152
+ // Tier 1: FTS only
153
+ rows = await this.table
154
+ .search(query, 'text')
155
+ .limit(limit)
156
+ .toArray();
157
+ }
158
+ let results = rows
159
+ .filter((r) => r.id !== '__seed__' && r.entity_id !== '')
160
+ .map((r, i) => ({
161
+ repoName: r.repo,
162
+ entityType: r.entity_type,
163
+ entityId: r.entity_id,
164
+ score: r._distance != null ? 1 / (1 + r._distance) : 1 - i * 0.01,
165
+ }));
166
+ if (options.repos && options.repos.length > 0) {
167
+ results = results.filter(r => options.repos.includes(r.repoName));
168
+ }
169
+ return results.slice(0, limit);
170
+ }
171
+ catch {
172
+ // FTS index may not be built yet — return empty
173
+ return [];
174
+ }
175
+ }
176
+ /**
177
+ * Get the last time a repo's entities were indexed.
178
+ */
179
+ getLastIndexedTime(repoName) {
180
+ if (!existsSync(this.lastIndexedPath))
181
+ return undefined;
182
+ try {
183
+ const data = JSON.parse(readFileSync(this.lastIndexedPath, 'utf-8'));
184
+ return data[repoName];
185
+ }
186
+ catch {
187
+ return undefined;
188
+ }
189
+ }
190
+ /**
191
+ * Record the current time as the last index time for a repo.
192
+ */
193
+ setLastIndexedTime(repoName) {
194
+ mkdirSync(this.dbPath, { recursive: true });
195
+ let data = {};
196
+ if (existsSync(this.lastIndexedPath)) {
197
+ try {
198
+ data = JSON.parse(readFileSync(this.lastIndexedPath, 'utf-8'));
199
+ }
200
+ catch { /* ignore */ }
201
+ }
202
+ data[repoName] = new Date().toISOString();
203
+ writeFileSync(this.lastIndexedPath, JSON.stringify(data, null, 2) + '\n');
204
+ }
205
+ /** Whether Voyage AI embeddings are enabled (Tier 2). */
206
+ get hasEmbeddings() {
207
+ return !!this.voyageApiKey;
208
+ }
209
+ // ─── Private: Voyage AI ──────────────────────────────────────────────────────
210
+ async generateEmbedding(text) {
211
+ const results = await this.generateEmbeddingsBatch([text]);
212
+ return results[0] ?? new Array(VECTOR_DIM).fill(0);
213
+ }
214
+ async generateEmbeddingsBatch(texts) {
215
+ // Voyage supports up to 128 inputs per request
216
+ const BATCH_SIZE = 128;
217
+ const all = [];
218
+ for (let i = 0; i < texts.length; i += BATCH_SIZE) {
219
+ const batch = texts.slice(i, i + BATCH_SIZE);
220
+ const response = await fetch(VOYAGE_API_URL, {
221
+ method: 'POST',
222
+ headers: {
223
+ 'Authorization': `Bearer ${this.voyageApiKey}`,
224
+ 'Content-Type': 'application/json',
225
+ },
226
+ body: JSON.stringify({ model: VOYAGE_MODEL, input: batch }),
227
+ });
228
+ if (!response.ok) {
229
+ const body = await response.text();
230
+ throw new Error(`Voyage AI error ${response.status}: ${body}`);
231
+ }
232
+ const json = await response.json();
233
+ all.push(...json.data.map(d => d.embedding));
234
+ }
235
+ return all;
236
+ }
237
+ }
238
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
239
+ /**
240
+ * Build a text representation of an entity for FTS/embedding.
241
+ * Combines entity type, key frontmatter fields, and markdown body.
242
+ * Exported for testing.
243
+ */
244
+ export function buildEntityText(entity) {
245
+ const parts = [];
246
+ // Entity type and ID as context
247
+ parts.push(`${entity.entityType}: ${entity.data.name || entity.id}`);
248
+ // Key frontmatter fields (skip system fields and empty values)
249
+ const systemFields = new Set([
250
+ 'entity_type', 'entity_id', 'created_at', 'updated_at',
251
+ 'created_by', 'updated_by', 'visibility', 'restricted_to',
252
+ 'sensitive_fields',
253
+ ]);
254
+ for (const [key, value] of Object.entries(entity.data)) {
255
+ if (systemFields.has(key) || value == null || value === '')
256
+ continue;
257
+ if (Array.isArray(value)) {
258
+ if (value.length > 0)
259
+ parts.push(`${key}: ${value.join(', ')}`);
260
+ }
261
+ else {
262
+ parts.push(`${key}: ${String(value)}`);
263
+ }
264
+ }
265
+ // Markdown body
266
+ if (entity.document.content) {
267
+ // Strip markdown syntax for cleaner FTS/embedding input
268
+ const plainText = entity.document.content
269
+ .replace(/^#{1,6}\s+/gm, '') // headings
270
+ .replace(/\*\*(.+?)\*\*/g, '$1') // bold
271
+ .replace(/\*(.+?)\*/g, '$1') // italic
272
+ .replace(/`(.+?)`/g, '$1') // inline code
273
+ .replace(/\[\[(.+?)\]\]/g, '$1') // wikilinks
274
+ .trim();
275
+ if (plainText)
276
+ parts.push(plainText);
277
+ }
278
+ return parts.join('\n');
279
+ }
280
+ //# sourceMappingURL=vector-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-service.js","sourceRoot":"","sources":["../../src/services/vector-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Version checking utility
3
+ *
4
+ * Provides lightweight version checking that can be called by commands
5
+ * to notify users of available updates.
6
+ */
7
+ /**
8
+ * Get current CLI version from package.json
9
+ */
10
+ export declare function getCurrentVersion(): string;
11
+ /**
12
+ * Check if an update is available (non-blocking, cached)
13
+ * Returns update info or null if up-to-date or check failed
14
+ */
15
+ export declare function checkForUpdate(): Promise<{
16
+ current: string;
17
+ latest: string;
18
+ } | null>;
19
+ /**
20
+ * Print update notification to console (if update available)
21
+ * Call this in commands to notify users about updates
22
+ */
23
+ export declare function notifyUpdateAvailable(): Promise<void>;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Version checking utility
3
+ *
4
+ * Provides lightweight version checking that can be called by commands
5
+ * to notify users of available updates.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { homedir } from 'os';
10
+ import { execSync } from 'child_process';
11
+ import { fileURLToPath } from 'url';
12
+ import { dirname } from 'path';
13
+ const CACHE_PATH = join(homedir(), '.studiograph', 'version-cache.json');
14
+ const CACHE_TTL_HOURS = 24; // Check once per day
15
+ /**
16
+ * Get current CLI version from package.json
17
+ */
18
+ export function getCurrentVersion() {
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = dirname(__filename);
21
+ const pkgPath = join(__dirname, '../../package.json');
22
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
23
+ return pkg.version;
24
+ }
25
+ /**
26
+ * Fetch latest version from npm (with caching)
27
+ */
28
+ async function getLatestVersion() {
29
+ // Check cache first
30
+ if (existsSync(CACHE_PATH)) {
31
+ try {
32
+ const cache = JSON.parse(readFileSync(CACHE_PATH, 'utf-8'));
33
+ const cacheAge = Date.now() - new Date(cache.lastChecked).getTime();
34
+ const cacheAgeHours = cacheAge / (1000 * 60 * 60);
35
+ if (cacheAgeHours < CACHE_TTL_HOURS) {
36
+ return cache.latestVersion;
37
+ }
38
+ }
39
+ catch {
40
+ // Cache read failed, continue to fetch
41
+ }
42
+ }
43
+ // Fetch from npm
44
+ try {
45
+ const result = execSync('npm view studiograph version', {
46
+ encoding: 'utf-8',
47
+ stdio: 'pipe',
48
+ timeout: 5000, // 5 second timeout
49
+ });
50
+ const latest = result.trim();
51
+ // Update cache
52
+ const cacheDir = dirname(CACHE_PATH);
53
+ if (!existsSync(cacheDir)) {
54
+ mkdirSync(cacheDir, { recursive: true, mode: 0o755 });
55
+ }
56
+ const cache = {
57
+ lastChecked: new Date().toISOString(),
58
+ latestVersion: latest,
59
+ };
60
+ writeFileSync(CACHE_PATH, JSON.stringify(cache, null, 2), 'utf-8');
61
+ return latest;
62
+ }
63
+ catch {
64
+ // Network error or timeout - return null
65
+ return null;
66
+ }
67
+ }
68
+ /**
69
+ * Compare two semantic versions
70
+ * Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal
71
+ */
72
+ function compareVersions(v1, v2) {
73
+ const parts1 = v1.split('.').map(Number);
74
+ const parts2 = v2.split('.').map(Number);
75
+ for (let i = 0; i < 3; i++) {
76
+ if (parts1[i] > parts2[i])
77
+ return 1;
78
+ if (parts1[i] < parts2[i])
79
+ return -1;
80
+ }
81
+ return 0;
82
+ }
83
+ /**
84
+ * Check if an update is available (non-blocking, cached)
85
+ * Returns update info or null if up-to-date or check failed
86
+ */
87
+ export async function checkForUpdate() {
88
+ const current = getCurrentVersion();
89
+ const latest = await getLatestVersion();
90
+ if (!latest)
91
+ return null;
92
+ const comparison = compareVersions(latest, current);
93
+ if (comparison > 0) {
94
+ return { current, latest };
95
+ }
96
+ return null;
97
+ }
98
+ /**
99
+ * Print update notification to console (if update available)
100
+ * Call this in commands to notify users about updates
101
+ */
102
+ export async function notifyUpdateAvailable() {
103
+ try {
104
+ const update = await checkForUpdate();
105
+ if (update) {
106
+ console.log('');
107
+ console.log(`\x1b[33m⚠️ Update available: v${update.current} → v${update.latest}\x1b[0m`);
108
+ console.log(`\x1b[2m Run: studiograph update\x1b[0m`);
109
+ console.log('');
110
+ }
111
+ }
112
+ catch {
113
+ // Silently fail - don't block command execution
114
+ }
115
+ }
116
+ //# sourceMappingURL=version-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-checker.js","sourceRoot":"","sources":["../../src/utils/version-checker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "studiograph",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "Team-based AI agent platform with Git-backed knowledge graphs",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -12,10 +12,11 @@
12
12
  "README.md"
13
13
  ],
14
14
  "scripts": {
15
- "build": "tsc",
15
+ "build": "node --max-old-space-size=8192 node_modules/typescript/bin/tsc && mkdir -p dist/agent/prompts dist/agent/skills/bundled && cp src/agent/prompts/*.md dist/agent/prompts/ && cp src/agent/skills/bundled/*.md dist/agent/skills/bundled/",
16
16
  "dev": "tsc --watch",
17
17
  "test": "vitest",
18
- "lint": "eslint src --ext .ts"
18
+ "lint": "eslint src --ext .ts",
19
+ "prepublishOnly": "npm run build"
19
20
  },
20
21
  "keywords": [
21
22
  "ai",
@@ -25,22 +26,25 @@
25
26
  "markdown"
26
27
  ],
27
28
  "author": "Studiograph",
28
- "license": "MIT",
29
+ "license": "Apache-2.0",
29
30
  "dependencies": {
30
31
  "@anthropic-ai/sdk": "^0.20.0",
31
32
  "@aws-sdk/client-s3": "^3.500.0",
32
33
  "@clack/prompts": "^0.7.0",
33
- "@fastify/cors": "^9.0.1",
34
+ "@fastify/cors": "^10.1.0",
35
+ "@lancedb/lancedb": "^0.26.2",
34
36
  "@mariozechner/pi-agent-core": "latest",
35
37
  "@mariozechner/pi-ai": "latest",
38
+ "@modelcontextprotocol/sdk": "^1.26.0",
36
39
  "@octokit/rest": "^20.0.0",
37
40
  "commander": "^11.1.0",
38
41
  "csv-parse": "^5.6.0",
39
42
  "csv-stringify": "^6.6.0",
40
- "fastify": "^4.29.1",
43
+ "fastify": "^5.7.4",
41
44
  "glob": "^10.3.10",
42
45
  "gray-matter": "^4.0.3",
43
46
  "js-yaml": "^4.1.1",
47
+ "picocolors": "^1.1.1",
44
48
  "zod": "^3.22.4"
45
49
  },
46
50
  "devDependencies": {