studiograph 1.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.
- package/README.md +18 -0
- package/dist/agent/orchestrator.d.ts +69 -0
- package/dist/agent/orchestrator.js +211 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/tools/graph-tools.d.ts +30 -0
- package/dist/agent/tools/graph-tools.js +536 -0
- package/dist/agent/tools/graph-tools.js.map +1 -0
- package/dist/auth/github.d.ts +53 -0
- package/dist/auth/github.js +180 -0
- package/dist/auth/github.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +10 -0
- package/dist/cli/commands/auth.js +63 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.js +299 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/join.d.ts +14 -0
- package/dist/cli/commands/join.js +230 -0
- package/dist/cli/commands/join.js.map +1 -0
- package/dist/cli/commands/members.d.ts +11 -0
- package/dist/cli/commands/members.js +230 -0
- package/dist/cli/commands/members.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +17 -0
- package/dist/cli/commands/serve.js +90 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.js +381 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +10 -0
- package/dist/cli/commands/sync.js +121 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/graph.d.ts +169 -0
- package/dist/core/graph.js +558 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/types.d.ts +216 -0
- package/dist/core/types.js +71 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/user-config.d.ts +31 -0
- package/dist/core/user-config.js +50 -0
- package/dist/core/user-config.js.map +1 -0
- package/dist/core/validation.d.ts +2371 -0
- package/dist/core/validation.js +432 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/core/workspace-manager.d.ts +104 -0
- package/dist/core/workspace-manager.js +432 -0
- package/dist/core/workspace-manager.js.map +1 -0
- package/dist/core/workspace.d.ts +103 -0
- package/dist/core/workspace.js +306 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/server/index.d.ts +25 -0
- package/dist/server/index.js +84 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/plugin-loader.d.ts +31 -0
- package/dist/server/plugin-loader.js +81 -0
- package/dist/server/plugin-loader.js.map +1 -0
- package/dist/server/routes/chat.d.ts +11 -0
- package/dist/server/routes/chat.js +66 -0
- package/dist/server/routes/chat.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +9 -0
- package/dist/server/routes/graph-api.js +72 -0
- package/dist/server/routes/graph-api.js.map +1 -0
- package/dist/server/routes/webhook.d.ts +14 -0
- package/dist/server/routes/webhook.js +69 -0
- package/dist/server/routes/webhook.js.map +1 -0
- package/dist/services/assets/base.d.ts +69 -0
- package/dist/services/assets/base.js +113 -0
- package/dist/services/assets/base.js.map +1 -0
- package/dist/services/assets/index.d.ts +36 -0
- package/dist/services/assets/index.js +89 -0
- package/dist/services/assets/index.js.map +1 -0
- package/dist/services/assets/local.d.ts +42 -0
- package/dist/services/assets/local.js +161 -0
- package/dist/services/assets/local.js.map +1 -0
- package/dist/services/assets/r2.d.ts +36 -0
- package/dist/services/assets/r2.js +182 -0
- package/dist/services/assets/r2.js.map +1 -0
- package/dist/services/csv-service.d.ts +36 -0
- package/dist/services/csv-service.js +143 -0
- package/dist/services/csv-service.js.map +1 -0
- package/dist/services/git.d.ts +99 -0
- package/dist/services/git.js +306 -0
- package/dist/services/git.js.map +1 -0
- package/dist/services/github-provisioner.d.ts +30 -0
- package/dist/services/github-provisioner.js +89 -0
- package/dist/services/github-provisioner.js.map +1 -0
- package/dist/services/markdown.d.ts +82 -0
- package/dist/services/markdown.js +338 -0
- package/dist/services/markdown.js.map +1 -0
- package/dist/services/memory-service.d.ts +74 -0
- package/dist/services/memory-service.js +183 -0
- package/dist/services/memory-service.js.map +1 -0
- package/dist/utils/git.d.ts +28 -0
- package/dist/utils/git.js +55 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/preflight.d.ts +44 -0
- package/dist/utils/preflight.js +95 -0
- package/dist/utils/preflight.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Manager
|
|
3
|
+
*
|
|
4
|
+
* Coordinates multiple repository graph managers.
|
|
5
|
+
* Provides cross-repo search, wikilink validation, and unified operations.
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { existsSync, readdirSync } from 'fs';
|
|
9
|
+
import { BaseGraphManager } from './graph.js';
|
|
10
|
+
import { PermissionError } from './types.js';
|
|
11
|
+
import { ENTITY_SCHEMAS } from './validation.js';
|
|
12
|
+
export class WorkspaceManager {
|
|
13
|
+
workspacePath;
|
|
14
|
+
config;
|
|
15
|
+
graphs;
|
|
16
|
+
gitUser;
|
|
17
|
+
user;
|
|
18
|
+
constructor(workspacePath, config, gitUser, user) {
|
|
19
|
+
this.workspacePath = workspacePath;
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.gitUser = gitUser;
|
|
22
|
+
this.user = user;
|
|
23
|
+
this.graphs = new Map();
|
|
24
|
+
// Initialize graph managers for all repos
|
|
25
|
+
this.initializeGraphs();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Initialize graph managers for all configured repos
|
|
29
|
+
*/
|
|
30
|
+
initializeGraphs() {
|
|
31
|
+
for (const repo of this.config.repos) {
|
|
32
|
+
const repoPath = join(this.workspacePath, repo.path);
|
|
33
|
+
if (!existsSync(repoPath)) {
|
|
34
|
+
console.warn(`Repository path does not exist: ${repoPath} (skipping)`);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
// Determine asset config
|
|
38
|
+
let assetConfig;
|
|
39
|
+
if (this.config.r2_config?.account_id && this.config.r2_config?.bucket) {
|
|
40
|
+
// Use R2 for production - map snake_case to camelCase
|
|
41
|
+
assetConfig = {
|
|
42
|
+
storage: 'r2',
|
|
43
|
+
r2Config: {
|
|
44
|
+
accountId: this.config.r2_config.account_id,
|
|
45
|
+
bucket: this.config.r2_config.bucket,
|
|
46
|
+
publicUrl: this.config.r2_config.public_url,
|
|
47
|
+
accessKeyId: this.config.r2_config.access_key_id,
|
|
48
|
+
secretAccessKey: this.config.r2_config.secret_access_key,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Use local storage for development
|
|
54
|
+
assetConfig = {
|
|
55
|
+
storage: 'local',
|
|
56
|
+
localPath: join(this.workspacePath, '.studiograph', 'assets'),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Create graph manager
|
|
60
|
+
const graph = new BaseGraphManager({
|
|
61
|
+
repoPath,
|
|
62
|
+
assetConfig,
|
|
63
|
+
gitUser: this.gitUser,
|
|
64
|
+
});
|
|
65
|
+
this.graphs.set(repo.name, graph);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if user has access to a repository
|
|
70
|
+
*/
|
|
71
|
+
canAccessRepo(repoName) {
|
|
72
|
+
const repoConfig = this.getRepoConfig(repoName);
|
|
73
|
+
if (!repoConfig) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
const userRole = this.user.role || 'guest';
|
|
77
|
+
const repoAccess = repoConfig.access || 'team';
|
|
78
|
+
// Admin users can access all repos
|
|
79
|
+
if (userRole === 'admin') {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
// Check access based on repo access level
|
|
83
|
+
switch (repoAccess) {
|
|
84
|
+
case 'public':
|
|
85
|
+
return true; // All users can access public repos
|
|
86
|
+
case 'team':
|
|
87
|
+
return userRole === 'member'; // admin already returned true above
|
|
88
|
+
case 'admin':
|
|
89
|
+
return false; // only admins can access, and they already returned true above
|
|
90
|
+
case 'restricted':
|
|
91
|
+
return false; // only admins can access, and they already returned true above
|
|
92
|
+
default:
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get graph manager for a specific repo
|
|
98
|
+
* @throws PermissionError if user lacks access to repo
|
|
99
|
+
*/
|
|
100
|
+
getGraph(repoName) {
|
|
101
|
+
if (!this.canAccessRepo(repoName)) {
|
|
102
|
+
throw new PermissionError(`Access denied to repository: ${repoName}`);
|
|
103
|
+
}
|
|
104
|
+
const graph = this.graphs.get(repoName);
|
|
105
|
+
if (!graph) {
|
|
106
|
+
throw new Error(`Repository not found: ${repoName}`);
|
|
107
|
+
}
|
|
108
|
+
return graph;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get all repository names (filtered by user access)
|
|
112
|
+
*/
|
|
113
|
+
getRepoNames() {
|
|
114
|
+
return Array.from(this.graphs.keys()).filter(repoName => this.canAccessRepo(repoName));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get repository configuration
|
|
118
|
+
*/
|
|
119
|
+
getRepoConfig(repoName) {
|
|
120
|
+
return this.config.repos.find(r => r.name === repoName);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get all repository configurations (filtered by user access)
|
|
124
|
+
*/
|
|
125
|
+
getAllRepoConfigs() {
|
|
126
|
+
return this.config.repos.filter(repo => this.canAccessRepo(repo.name));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Search across all repositories (filtered by user access)
|
|
130
|
+
*/
|
|
131
|
+
search(options) {
|
|
132
|
+
const results = [];
|
|
133
|
+
// Determine which repos to search (filter by access)
|
|
134
|
+
const requestedRepos = options.repoNames || this.getRepoNames();
|
|
135
|
+
const reposToSearch = requestedRepos.filter(repoName => this.canAccessRepo(repoName));
|
|
136
|
+
for (const repoName of reposToSearch) {
|
|
137
|
+
const graph = this.graphs.get(repoName);
|
|
138
|
+
if (!graph) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const entities = graph.search(options);
|
|
143
|
+
// Add repo name to each result
|
|
144
|
+
for (const entity of entities) {
|
|
145
|
+
results.push({
|
|
146
|
+
...entity,
|
|
147
|
+
repoName,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
console.warn(`Error searching repo ${repoName}:`, error);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Apply global limit if specified
|
|
156
|
+
if (options.limit && options.limit > 0) {
|
|
157
|
+
return results.slice(0, options.limit);
|
|
158
|
+
}
|
|
159
|
+
return results;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* List entities across all repositories (filtered by user access)
|
|
163
|
+
*/
|
|
164
|
+
list(entityType, limit) {
|
|
165
|
+
const results = [];
|
|
166
|
+
for (const [repoName, graph] of this.graphs) {
|
|
167
|
+
// Skip repos the user can't access
|
|
168
|
+
if (!this.canAccessRepo(repoName)) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const entities = graph.list(entityType);
|
|
173
|
+
for (const entity of entities) {
|
|
174
|
+
results.push({
|
|
175
|
+
...entity,
|
|
176
|
+
repoName,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
console.warn(`Error listing entities in repo ${repoName}:`, error);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Apply limit
|
|
185
|
+
if (limit && limit > 0) {
|
|
186
|
+
return results.slice(0, limit);
|
|
187
|
+
}
|
|
188
|
+
return results;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Find entity across all repositories (filtered by user access)
|
|
192
|
+
*/
|
|
193
|
+
findEntity(entityType, entityId) {
|
|
194
|
+
for (const [repoName, graph] of this.graphs) {
|
|
195
|
+
// Skip repos the user can't access
|
|
196
|
+
if (!this.canAccessRepo(repoName)) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
const entity = graph.get(entityType, entityId);
|
|
201
|
+
return {
|
|
202
|
+
...entity,
|
|
203
|
+
repoName,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// Entity not found in this repo, continue searching
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Validate wikilinks across all repositories (filtered by user access)
|
|
214
|
+
* @throws PermissionError if user lacks access to source repo
|
|
215
|
+
*/
|
|
216
|
+
validateWikilinks(repoName, entityType, entityId) {
|
|
217
|
+
const graph = this.getGraph(repoName); // Checks access
|
|
218
|
+
const entity = graph.get(entityType, entityId);
|
|
219
|
+
const valid = [];
|
|
220
|
+
const broken = [];
|
|
221
|
+
const crossRepo = [];
|
|
222
|
+
const inaccessible = [];
|
|
223
|
+
for (const link of entity.document.wikilinks) {
|
|
224
|
+
let foundInSameRepo = false;
|
|
225
|
+
let foundInOtherRepo = false;
|
|
226
|
+
// First, check in the same repo
|
|
227
|
+
// Try all entity types since wikilinks don't specify type
|
|
228
|
+
const allTypes = Object.keys(ENTITY_SCHEMAS);
|
|
229
|
+
for (const searchType of allTypes) {
|
|
230
|
+
try {
|
|
231
|
+
graph.get(searchType, link);
|
|
232
|
+
foundInSameRepo = true;
|
|
233
|
+
valid.push(link);
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Not this type, continue
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// If not found in same repo, search other repos (only accessible ones)
|
|
241
|
+
if (!foundInSameRepo) {
|
|
242
|
+
// First pass: Search accessible repos
|
|
243
|
+
for (const [otherRepoName, otherGraph] of this.graphs) {
|
|
244
|
+
if (otherRepoName === repoName) {
|
|
245
|
+
continue; // Already checked this repo
|
|
246
|
+
}
|
|
247
|
+
// Skip repos the user can't access (check them in second pass)
|
|
248
|
+
if (!this.canAccessRepo(otherRepoName)) {
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
for (const searchType of allTypes) {
|
|
252
|
+
try {
|
|
253
|
+
otherGraph.get(searchType, link);
|
|
254
|
+
crossRepo.push({ link, repo: otherRepoName });
|
|
255
|
+
foundInOtherRepo = true;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// Not this type, continue
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (foundInOtherRepo) {
|
|
263
|
+
break; // Found it, stop searching repos
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// If not found in accessible repos, check inaccessible repos
|
|
267
|
+
if (!foundInOtherRepo) {
|
|
268
|
+
let foundInInaccessibleRepo = false;
|
|
269
|
+
for (const [otherRepoName, otherGraph] of this.graphs) {
|
|
270
|
+
if (otherRepoName === repoName) {
|
|
271
|
+
continue; // Already checked this repo
|
|
272
|
+
}
|
|
273
|
+
// Only check repos the user can't access
|
|
274
|
+
if (this.canAccessRepo(otherRepoName)) {
|
|
275
|
+
continue; // Already checked in first pass
|
|
276
|
+
}
|
|
277
|
+
for (const searchType of allTypes) {
|
|
278
|
+
try {
|
|
279
|
+
otherGraph.get(searchType, link);
|
|
280
|
+
const repoConfig = this.getRepoConfig(otherRepoName);
|
|
281
|
+
inaccessible.push({
|
|
282
|
+
link,
|
|
283
|
+
repo: otherRepoName,
|
|
284
|
+
requiredAccess: repoConfig?.access || 'team',
|
|
285
|
+
});
|
|
286
|
+
foundInInaccessibleRepo = true;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// Not this type, continue
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (foundInInaccessibleRepo) {
|
|
294
|
+
break; // Found it, stop searching repos
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// Only mark as broken if not found anywhere (including inaccessible repos)
|
|
298
|
+
if (!foundInInaccessibleRepo) {
|
|
299
|
+
broken.push(link);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return { valid, broken, crossRepo, inaccessible };
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get entities related to a given entity (cross-repo, filtered by user access)
|
|
308
|
+
* @throws PermissionError if user lacks access to source repo
|
|
309
|
+
*/
|
|
310
|
+
getRelated(repoName, entityType, entityId) {
|
|
311
|
+
const graph = this.getGraph(repoName); // Checks access
|
|
312
|
+
const entity = graph.get(entityType, entityId);
|
|
313
|
+
const results = [];
|
|
314
|
+
// Search for wikilinked entities across all repos (only accessible ones)
|
|
315
|
+
for (const link of entity.document.wikilinks) {
|
|
316
|
+
for (const [searchRepoName, searchGraph] of this.graphs) {
|
|
317
|
+
// Skip repos the user can't access
|
|
318
|
+
if (!this.canAccessRepo(searchRepoName)) {
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
// Try to find entity in this repo
|
|
323
|
+
const allTypes = Object.keys(ENTITY_SCHEMAS);
|
|
324
|
+
for (const searchType of allTypes) {
|
|
325
|
+
try {
|
|
326
|
+
const linkedEntity = searchGraph.get(searchType, link);
|
|
327
|
+
results.push({
|
|
328
|
+
...linkedEntity,
|
|
329
|
+
repoName: searchRepoName,
|
|
330
|
+
});
|
|
331
|
+
break; // Found it, stop searching types
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// Not this type, continue
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
// Entity not found in this repo
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return results;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Get backlinks across all repositories (filtered by user access)
|
|
347
|
+
*/
|
|
348
|
+
getBacklinks(repoName, entityType, entityId) {
|
|
349
|
+
const results = [];
|
|
350
|
+
for (const [searchRepoName, searchGraph] of this.graphs) {
|
|
351
|
+
// Skip repos the user can't access
|
|
352
|
+
if (!this.canAccessRepo(searchRepoName)) {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
const backlinks = searchGraph.getBacklinks(entityType, entityId);
|
|
357
|
+
for (const backlink of backlinks) {
|
|
358
|
+
results.push({
|
|
359
|
+
...backlink,
|
|
360
|
+
repoName: searchRepoName,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
console.warn(`Error getting backlinks from repo ${searchRepoName}:`, error);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return results;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Get workspace summary statistics (filtered by user access)
|
|
372
|
+
*/
|
|
373
|
+
getSummary() {
|
|
374
|
+
const summary = {
|
|
375
|
+
totalRepos: 0,
|
|
376
|
+
totalEntities: 0,
|
|
377
|
+
entitiesByType: {},
|
|
378
|
+
entitiesByRepo: {},
|
|
379
|
+
};
|
|
380
|
+
for (const [repoName, graph] of this.graphs) {
|
|
381
|
+
// Skip repos the user can't access
|
|
382
|
+
if (!this.canAccessRepo(repoName)) {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
summary.totalRepos++;
|
|
386
|
+
const entities = graph.list();
|
|
387
|
+
summary.totalEntities += entities.length;
|
|
388
|
+
summary.entitiesByRepo[repoName] = entities.length;
|
|
389
|
+
for (const entity of entities) {
|
|
390
|
+
const type = entity.entityType;
|
|
391
|
+
summary.entitiesByType[type] = (summary.entitiesByType[type] || 0) + 1;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return summary;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Discover repos in workspace (find .studiograph marker files)
|
|
398
|
+
*/
|
|
399
|
+
static discoverRepos(workspacePath) {
|
|
400
|
+
const discovered = [];
|
|
401
|
+
if (!existsSync(workspacePath)) {
|
|
402
|
+
return discovered;
|
|
403
|
+
}
|
|
404
|
+
// Scan immediate subdirectories
|
|
405
|
+
const entries = readdirSync(workspacePath, { withFileTypes: true });
|
|
406
|
+
for (const entry of entries) {
|
|
407
|
+
if (!entry.isDirectory()) {
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
const entryPath = join(workspacePath, entry.name);
|
|
411
|
+
const markerPath = join(entryPath, '.studiograph');
|
|
412
|
+
// Check for .studiograph marker directory
|
|
413
|
+
if (existsSync(markerPath)) {
|
|
414
|
+
// Infer type from directory name patterns
|
|
415
|
+
let type = 'shared-resource'; // Default
|
|
416
|
+
if (entry.name.includes('project') || entry.name.match(/^[a-z]+-[a-z]+$/)) {
|
|
417
|
+
type = 'project';
|
|
418
|
+
}
|
|
419
|
+
else if (['accounting', 'hr', 'marketing', 'new-business', 'planning'].includes(entry.name)) {
|
|
420
|
+
type = 'function';
|
|
421
|
+
}
|
|
422
|
+
discovered.push({
|
|
423
|
+
name: entry.name,
|
|
424
|
+
path: entry.name,
|
|
425
|
+
type,
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return discovered;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=workspace-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-manager.js","sourceRoot":"","sources":["../../src/core/workspace-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace management for Studiograph
|
|
3
|
+
*
|
|
4
|
+
* A workspace is a directory with .studiograph/ folder
|
|
5
|
+
* Similar to how Git works with .git/
|
|
6
|
+
*/
|
|
7
|
+
import { WorkspaceConfig, RepoConfig, RepoConfigInput } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Team member definition from team/members.json
|
|
10
|
+
*/
|
|
11
|
+
export interface TeamMember {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
email: string;
|
|
15
|
+
role: 'admin' | 'member' | 'guest';
|
|
16
|
+
github_username?: string;
|
|
17
|
+
joined_at?: string;
|
|
18
|
+
active?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare class Workspace {
|
|
21
|
+
private workspacePath;
|
|
22
|
+
private configPath;
|
|
23
|
+
private jsonConfigPath;
|
|
24
|
+
private membersPath;
|
|
25
|
+
private config;
|
|
26
|
+
constructor(workspacePath?: string);
|
|
27
|
+
/**
|
|
28
|
+
* Check if current directory is a Studiograph workspace
|
|
29
|
+
* Supports both workspace.json (new) and config.yml (legacy)
|
|
30
|
+
*/
|
|
31
|
+
isWorkspace(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Initialize new workspace in current directory
|
|
34
|
+
*/
|
|
35
|
+
init(teamName: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Load workspace config
|
|
38
|
+
* Reads workspace.json (new format) or falls back to config.yml (legacy)
|
|
39
|
+
*/
|
|
40
|
+
loadConfig(): WorkspaceConfig;
|
|
41
|
+
/**
|
|
42
|
+
* Write workspace config as workspace.json
|
|
43
|
+
*/
|
|
44
|
+
writeConfig(config: WorkspaceConfig): void;
|
|
45
|
+
/**
|
|
46
|
+
* Load team members from team/members.json
|
|
47
|
+
*/
|
|
48
|
+
loadMembers(): TeamMember[];
|
|
49
|
+
/**
|
|
50
|
+
* Write team members to team/members.json
|
|
51
|
+
*/
|
|
52
|
+
writeMembers(members: TeamMember[]): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get the GitHub org stored in workspace.json
|
|
55
|
+
*/
|
|
56
|
+
getGitHubOrg(): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Set the GitHub org in workspace.json
|
|
59
|
+
*/
|
|
60
|
+
setGitHubOrg(org: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Update model configuration.
|
|
63
|
+
*
|
|
64
|
+
* Provider and model ID are written to user config (~/.studiograph/user.json)
|
|
65
|
+
* so they are personal and never committed to the shared workspace repo.
|
|
66
|
+
* The API key is also written only to user config — it is never stored in
|
|
67
|
+
* workspace.json.
|
|
68
|
+
*/
|
|
69
|
+
setModelConfig(provider: string, modelId: string, apiKey?: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Generate README content for a repo
|
|
72
|
+
*/
|
|
73
|
+
private generateRepoReadme;
|
|
74
|
+
/**
|
|
75
|
+
* Get guidance text for a repo type
|
|
76
|
+
*/
|
|
77
|
+
private getRepoTypeGuidance;
|
|
78
|
+
/**
|
|
79
|
+
* Register a new repo in the workspace
|
|
80
|
+
*/
|
|
81
|
+
registerRepo(repo: RepoConfigInput): RepoConfig;
|
|
82
|
+
/**
|
|
83
|
+
* Get all registered repos
|
|
84
|
+
*/
|
|
85
|
+
getRepos(): RepoConfig[];
|
|
86
|
+
/**
|
|
87
|
+
* Get repo by name
|
|
88
|
+
*/
|
|
89
|
+
getRepo(name: string): RepoConfig | undefined;
|
|
90
|
+
/**
|
|
91
|
+
* Get absolute path to repo
|
|
92
|
+
*/
|
|
93
|
+
getRepoPath(repoName: string): string;
|
|
94
|
+
/**
|
|
95
|
+
* Get workspace root path
|
|
96
|
+
*/
|
|
97
|
+
getWorkspacePath(): string;
|
|
98
|
+
/**
|
|
99
|
+
* Find workspace root by walking up directory tree
|
|
100
|
+
* (like git does with .git/)
|
|
101
|
+
*/
|
|
102
|
+
static findWorkspaceRoot(startPath?: string): string | null;
|
|
103
|
+
}
|