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.
Files changed (101) hide show
  1. package/README.md +18 -0
  2. package/dist/agent/orchestrator.d.ts +69 -0
  3. package/dist/agent/orchestrator.js +211 -0
  4. package/dist/agent/orchestrator.js.map +1 -0
  5. package/dist/agent/tools/graph-tools.d.ts +30 -0
  6. package/dist/agent/tools/graph-tools.js +536 -0
  7. package/dist/agent/tools/graph-tools.js.map +1 -0
  8. package/dist/auth/github.d.ts +53 -0
  9. package/dist/auth/github.js +180 -0
  10. package/dist/auth/github.js.map +1 -0
  11. package/dist/cli/commands/auth.d.ts +10 -0
  12. package/dist/cli/commands/auth.js +63 -0
  13. package/dist/cli/commands/auth.js.map +1 -0
  14. package/dist/cli/commands/init.d.ts +7 -0
  15. package/dist/cli/commands/init.js +299 -0
  16. package/dist/cli/commands/init.js.map +1 -0
  17. package/dist/cli/commands/join.d.ts +14 -0
  18. package/dist/cli/commands/join.js +230 -0
  19. package/dist/cli/commands/join.js.map +1 -0
  20. package/dist/cli/commands/members.d.ts +11 -0
  21. package/dist/cli/commands/members.js +230 -0
  22. package/dist/cli/commands/members.js.map +1 -0
  23. package/dist/cli/commands/serve.d.ts +17 -0
  24. package/dist/cli/commands/serve.js +90 -0
  25. package/dist/cli/commands/serve.js.map +1 -0
  26. package/dist/cli/commands/start.d.ts +7 -0
  27. package/dist/cli/commands/start.js +381 -0
  28. package/dist/cli/commands/start.js.map +1 -0
  29. package/dist/cli/commands/sync.d.ts +10 -0
  30. package/dist/cli/commands/sync.js +121 -0
  31. package/dist/cli/commands/sync.js.map +1 -0
  32. package/dist/cli/index.d.ts +7 -0
  33. package/dist/cli/index.js +31 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/core/graph.d.ts +169 -0
  36. package/dist/core/graph.js +558 -0
  37. package/dist/core/graph.js.map +1 -0
  38. package/dist/core/types.d.ts +216 -0
  39. package/dist/core/types.js +71 -0
  40. package/dist/core/types.js.map +1 -0
  41. package/dist/core/user-config.d.ts +31 -0
  42. package/dist/core/user-config.js +50 -0
  43. package/dist/core/user-config.js.map +1 -0
  44. package/dist/core/validation.d.ts +2371 -0
  45. package/dist/core/validation.js +432 -0
  46. package/dist/core/validation.js.map +1 -0
  47. package/dist/core/workspace-manager.d.ts +104 -0
  48. package/dist/core/workspace-manager.js +432 -0
  49. package/dist/core/workspace-manager.js.map +1 -0
  50. package/dist/core/workspace.d.ts +103 -0
  51. package/dist/core/workspace.js +306 -0
  52. package/dist/core/workspace.js.map +1 -0
  53. package/dist/server/index.d.ts +25 -0
  54. package/dist/server/index.js +84 -0
  55. package/dist/server/index.js.map +1 -0
  56. package/dist/server/plugin-loader.d.ts +31 -0
  57. package/dist/server/plugin-loader.js +81 -0
  58. package/dist/server/plugin-loader.js.map +1 -0
  59. package/dist/server/routes/chat.d.ts +11 -0
  60. package/dist/server/routes/chat.js +66 -0
  61. package/dist/server/routes/chat.js.map +1 -0
  62. package/dist/server/routes/graph-api.d.ts +9 -0
  63. package/dist/server/routes/graph-api.js +72 -0
  64. package/dist/server/routes/graph-api.js.map +1 -0
  65. package/dist/server/routes/webhook.d.ts +14 -0
  66. package/dist/server/routes/webhook.js +69 -0
  67. package/dist/server/routes/webhook.js.map +1 -0
  68. package/dist/services/assets/base.d.ts +69 -0
  69. package/dist/services/assets/base.js +113 -0
  70. package/dist/services/assets/base.js.map +1 -0
  71. package/dist/services/assets/index.d.ts +36 -0
  72. package/dist/services/assets/index.js +89 -0
  73. package/dist/services/assets/index.js.map +1 -0
  74. package/dist/services/assets/local.d.ts +42 -0
  75. package/dist/services/assets/local.js +161 -0
  76. package/dist/services/assets/local.js.map +1 -0
  77. package/dist/services/assets/r2.d.ts +36 -0
  78. package/dist/services/assets/r2.js +182 -0
  79. package/dist/services/assets/r2.js.map +1 -0
  80. package/dist/services/csv-service.d.ts +36 -0
  81. package/dist/services/csv-service.js +143 -0
  82. package/dist/services/csv-service.js.map +1 -0
  83. package/dist/services/git.d.ts +99 -0
  84. package/dist/services/git.js +306 -0
  85. package/dist/services/git.js.map +1 -0
  86. package/dist/services/github-provisioner.d.ts +30 -0
  87. package/dist/services/github-provisioner.js +89 -0
  88. package/dist/services/github-provisioner.js.map +1 -0
  89. package/dist/services/markdown.d.ts +82 -0
  90. package/dist/services/markdown.js +338 -0
  91. package/dist/services/markdown.js.map +1 -0
  92. package/dist/services/memory-service.d.ts +74 -0
  93. package/dist/services/memory-service.js +183 -0
  94. package/dist/services/memory-service.js.map +1 -0
  95. package/dist/utils/git.d.ts +28 -0
  96. package/dist/utils/git.js +55 -0
  97. package/dist/utils/git.js.map +1 -0
  98. package/dist/utils/preflight.d.ts +44 -0
  99. package/dist/utils/preflight.js +95 -0
  100. package/dist/utils/preflight.js.map +1 -0
  101. 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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAA4D,MAAM,YAAY,CAAC;AACxG,OAAO,EAAqC,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,EAAc,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAW7D,MAAM,OAAO,gBAAgB;IACnB,aAAa,CAAS;IACtB,MAAM,CAAkB;IACxB,MAAM,CAAgC;IACtC,OAAO,CAAU;IACjB,IAAI,CAAO;IAEnB,YAAY,aAAqB,EAAE,MAAuB,EAAE,OAAgB,EAAE,IAAU;QACtF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QAExB,0CAA0C;QAC1C,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAErD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,mCAAmC,QAAQ,aAAa,CAAC,CAAC;gBACvE,SAAS;YACX,CAAC;YAED,yBAAyB;YACzB,IAAI,WAAoC,CAAC;YAEzC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;gBACvE,sDAAsD;gBACtD,WAAW,GAAG;oBACZ,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE;wBACR,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAW;wBAC5C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAO;wBACrC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAW;wBAC5C,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAc;wBACjD,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAkB;qBAC1D;iBACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,WAAW,GAAG;oBACZ,OAAO,EAAE,OAAO;oBAChB,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,QAAQ,CAAC;iBAC9D,CAAC;YACJ,CAAC;YAED,uBAAuB;YACvB,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC;gBACjC,QAAQ;gBACR,WAAW;gBACX,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,QAAgB;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC;QAC3C,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC;QAE/C,mCAAmC;QACnC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0CAA0C;QAC1C,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,CAAC,oCAAoC;YACnD,KAAK,MAAM;gBACT,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,oCAAoC;YACpE,KAAK,OAAO;gBACV,OAAO,KAAK,CAAC,CAAC,+DAA+D;YAC/E,KAAK,YAAY;gBACf,OAAO,KAAK,CAAC,CAAC,+DAA+D;YAC/E;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,QAAgB;QACvB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,eAAe,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzF,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAA+B;QACpC,MAAM,OAAO,GAA0B,EAAE,CAAC;QAE1C,qDAAqD;QACrD,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAChE,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEtF,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAEvC,+BAA+B;gBAC/B,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;oBAC9B,OAAO,CAAC,IAAI,CAAC;wBACX,GAAG,MAAM;wBACT,QAAQ;qBACT,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,wBAAwB,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,UAAuB,EAAE,KAAc;QAC1C,MAAM,OAAO,GAA0B,EAAE,CAAC;QAE1C,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAExC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;oBAC9B,OAAO,CAAC,IAAI,CAAC;wBACX,GAAG,MAAM;wBACT,QAAQ;qBACT,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,kCAAkC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,cAAc;QACd,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,UAAsB,EAAE,QAAgB;QACjD,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC/C,OAAO;oBACL,GAAG,MAAM;oBACT,QAAQ;iBACT,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,QAAgB,EAAE,UAAsB,EAAE,QAAgB;QAM1E,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,SAAS,GAA0C,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAkE,EAAE,CAAC;QAEvF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,eAAe,GAAG,KAAK,CAAC;YAC5B,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAE7B,gCAAgC;YAChC,0DAA0D;YAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAiB,CAAC;YAE7D,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACH,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBAC5B,eAAe,GAAG,IAAI,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjB,MAAM;gBACR,CAAC;gBAAC,MAAM,CAAC;oBACP,0BAA0B;gBAC5B,CAAC;YACH,CAAC;YAED,uEAAuE;YACvE,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,sCAAsC;gBACtC,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACtD,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;wBAC/B,SAAS,CAAC,4BAA4B;oBACxC,CAAC;oBAED,+DAA+D;oBAC/D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;wBACvC,SAAS;oBACX,CAAC;oBAED,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;wBAClC,IAAI,CAAC;4BACH,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;4BACjC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;4BAC9C,gBAAgB,GAAG,IAAI,CAAC;4BACxB,MAAM;wBACR,CAAC;wBAAC,MAAM,CAAC;4BACP,0BAA0B;wBAC5B,CAAC;oBACH,CAAC;oBAED,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAM,CAAC,iCAAiC;oBAC1C,CAAC;gBACH,CAAC;gBAED,6DAA6D;gBAC7D,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,IAAI,uBAAuB,GAAG,KAAK,CAAC;oBAEpC,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBACtD,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;4BAC/B,SAAS,CAAC,4BAA4B;wBACxC,CAAC;wBAED,yCAAyC;wBACzC,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;4BACtC,SAAS,CAAC,gCAAgC;wBAC5C,CAAC;wBAED,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;4BAClC,IAAI,CAAC;gCACH,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gCACjC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;gCACrD,YAAY,CAAC,IAAI,CAAC;oCAChB,IAAI;oCACJ,IAAI,EAAE,aAAa;oCACnB,cAAc,EAAE,UAAU,EAAE,MAAM,IAAI,MAAM;iCAC7C,CAAC,CAAC;gCACH,uBAAuB,GAAG,IAAI,CAAC;gCAC/B,MAAM;4BACR,CAAC;4BAAC,MAAM,CAAC;gCACP,0BAA0B;4BAC5B,CAAC;wBACH,CAAC;wBAED,IAAI,uBAAuB,EAAE,CAAC;4BAC5B,MAAM,CAAC,iCAAiC;wBAC1C,CAAC;oBACH,CAAC;oBAED,2EAA2E;oBAC3E,IAAI,CAAC,uBAAuB,EAAE,CAAC;wBAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,QAAgB,EAAE,UAAsB,EAAE,QAAgB;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,OAAO,GAA0B,EAAE,CAAC;QAE1C,yEAAyE;QACzE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC7C,KAAK,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxD,mCAAmC;gBACnC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;oBACxC,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,kCAAkC;oBAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAiB,CAAC;oBAE7D,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;wBAClC,IAAI,CAAC;4BACH,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;4BACvD,OAAO,CAAC,IAAI,CAAC;gCACX,GAAG,YAAY;gCACf,QAAQ,EAAE,cAAc;6BACzB,CAAC,CAAC;4BACH,MAAM,CAAC,iCAAiC;wBAC1C,CAAC;wBAAC,MAAM,CAAC;4BACP,0BAA0B;wBAC5B,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,QAAgB,EAAE,UAAsB,EAAE,QAAgB;QACrE,MAAM,OAAO,GAA0B,EAAE,CAAC;QAE1C,KAAK,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACxD,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAEjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC;wBACX,GAAG,QAAQ;wBACX,QAAQ,EAAE,cAAc;qBACzB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,qCAAqC,cAAc,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,UAAU;QAMR,MAAM,OAAO,GAAG;YACd,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,EAA4B;YAC5C,cAAc,EAAE,EAA4B;SAC7C,CAAC;QAEF,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,CAAC,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC;YACzC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;YAEnD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;gBAC/B,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,aAAqB;QACxC,MAAM,UAAU,GAAwD,EAAE,CAAC;QAE3E,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,gCAAgC;QAChC,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAEnD,0CAA0C;YAC1C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,0CAA0C;gBAC1C,IAAI,IAAI,GAAG,iBAAiB,CAAC,CAAC,UAAU;gBAExC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAC1E,IAAI,GAAG,SAAS,CAAC;gBACnB,CAAC;qBAAM,IACL,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAClF,CAAC;oBACD,IAAI,GAAG,UAAU,CAAC;gBACpB,CAAC;gBAED,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
@@ -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
+ }