studiograph 1.2.0-beta.9 → 1.2.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 +13 -18
- package/dist/agent/orchestrator.d.ts +56 -0
- package/dist/agent/orchestrator.js +167 -22
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts/system.md +51 -63
- package/dist/agent/skill-loader.js +8 -0
- package/dist/agent/skill-loader.js.map +1 -1
- package/dist/agent/skills/entity-schema.md +4 -19
- package/dist/agent/skills/gather-context.md +1 -1
- package/dist/agent/tools/graph-tools.d.ts +41 -1
- package/dist/agent/tools/graph-tools.js +133 -57
- package/dist/agent/tools/graph-tools.js.map +1 -1
- package/dist/agent/tools/ops-tools.js +82 -0
- package/dist/agent/tools/ops-tools.js.map +1 -1
- package/dist/agent/tools/permission-tools.d.ts +90 -0
- package/dist/agent/tools/permission-tools.js +207 -0
- package/dist/agent/tools/permission-tools.js.map +1 -0
- package/dist/agent/tools/sync-tools.js +2 -2
- package/dist/agent/tools/sync-tools.js.map +1 -1
- package/dist/auth/github.d.ts +1 -1
- package/dist/auth/github.js +21 -13
- package/dist/auth/github.js.map +1 -1
- package/dist/cli/commands/access.d.ts +11 -0
- package/dist/cli/commands/access.js +156 -0
- package/dist/cli/commands/access.js.map +1 -0
- package/dist/cli/commands/app.js +25 -2
- package/dist/cli/commands/app.js.map +1 -1
- package/dist/cli/commands/clear.d.ts +5 -0
- package/dist/cli/commands/clear.js +36 -0
- package/dist/cli/commands/clear.js.map +1 -0
- package/dist/cli/commands/clone.js +3 -3
- package/dist/cli/commands/clone.js.map +1 -1
- package/dist/cli/commands/collection.d.ts +10 -0
- package/dist/cli/commands/collection.js +187 -0
- package/dist/cli/commands/collection.js.map +1 -0
- package/dist/cli/commands/commit.js +2 -1
- package/dist/cli/commands/commit.js.map +1 -1
- package/dist/cli/commands/config.d.ts +100 -0
- package/dist/cli/commands/config.js +1 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/deploy.js +10 -1
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/index.js +1 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.js +32 -40
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/join.d.ts +0 -6
- package/dist/cli/commands/join.js +26 -111
- package/dist/cli/commands/join.js.map +1 -1
- package/dist/cli/commands/lint.js +1 -2
- package/dist/cli/commands/lint.js.map +1 -1
- package/dist/cli/commands/mcp.js +6 -5
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/org.d.ts +10 -0
- package/dist/cli/commands/org.js +132 -0
- package/dist/cli/commands/org.js.map +1 -0
- package/dist/cli/commands/orphans.js +1 -2
- package/dist/cli/commands/orphans.js.map +1 -1
- package/dist/cli/commands/provision.js +3 -3
- package/dist/cli/commands/provision.js.map +1 -1
- package/dist/cli/commands/resolve.d.ts +8 -0
- package/dist/cli/commands/resolve.js +85 -0
- package/dist/cli/commands/resolve.js.map +1 -0
- package/dist/cli/commands/serve.js +55 -25
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/start.js +22 -205
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/sync.js +53 -8
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/team.d.ts +12 -0
- package/dist/cli/commands/team.js +185 -0
- package/dist/cli/commands/team.js.map +1 -0
- package/dist/cli/index.js +41 -34
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scaffolding.d.ts +5 -3
- package/dist/cli/scaffolding.js +191 -97
- package/dist/cli/scaffolding.js.map +1 -1
- package/dist/cli/setup-wizard.js +20 -10
- package/dist/cli/setup-wizard.js.map +1 -1
- package/dist/cli/sync-review-interactive.js +1 -1
- package/dist/cli/sync-review-interactive.js.map +1 -1
- package/dist/core/graph.d.ts +5 -10
- package/dist/core/graph.js +84 -85
- package/dist/core/graph.js.map +1 -1
- package/dist/core/migration-runner.d.ts +42 -0
- package/dist/core/migration-runner.js +232 -0
- package/dist/core/migration-runner.js.map +1 -0
- package/dist/core/migration-types.d.ts +101 -0
- package/dist/core/migration-types.js +21 -0
- package/dist/core/migration-types.js.map +1 -0
- package/dist/core/migrations/20260219-formalize-memory-location.d.ts +2 -0
- package/dist/core/migrations/20260219-formalize-memory-location.js +35 -0
- package/dist/core/migrations/20260219-formalize-memory-location.js.map +1 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.d.ts +12 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.js +65 -0
- package/dist/core/migrations/20260220-add-workspace-metadata.js.map +1 -0
- package/dist/core/migrations/20260220-add-workspace-readme.d.ts +11 -0
- package/dist/core/migrations/20260220-add-workspace-readme.js +82 -0
- package/dist/core/migrations/20260220-add-workspace-readme.js.map +1 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.d.ts +9 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js +64 -0
- package/dist/core/migrations/20260220-migrate-yaml-to-json.js.map +1 -0
- package/dist/core/migrations/index.d.ts +11 -0
- package/dist/core/migrations/index.js +23 -0
- package/dist/core/migrations/index.js.map +1 -0
- package/dist/core/types.d.ts +19 -34
- package/dist/core/types.js +3 -21
- package/dist/core/types.js.map +1 -1
- package/dist/core/user-config.d.ts +27 -0
- package/dist/core/user-config.js +51 -0
- package/dist/core/user-config.js.map +1 -1
- package/dist/core/validation.d.ts +978 -2182
- package/dist/core/validation.js +242 -397
- package/dist/core/validation.js.map +1 -1
- package/dist/core/workspace-manager.d.ts +32 -31
- package/dist/core/workspace-manager.js +171 -186
- package/dist/core/workspace-manager.js.map +1 -1
- package/dist/core/workspace.d.ts +0 -5
- package/dist/core/workspace.js +33 -101
- package/dist/core/workspace.js.map +1 -1
- package/dist/lib/lib/utils.d.ts +2 -0
- package/dist/lib/lib/utils.js +6 -0
- package/dist/lib/lib/utils.js.map +1 -0
- package/dist/mcp/tools.js +13 -13
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/chrome/chrome.css +562 -0
- package/dist/server/chrome/chrome.js +540 -0
- package/dist/server/index.js +163 -10
- package/dist/server/index.js.map +1 -1
- package/dist/server/plugin-loader.d.ts +7 -0
- package/dist/server/plugin-loader.js +9 -1
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/server/routes/chat.d.ts +3 -2
- package/dist/server/routes/chat.js +67 -16
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/git-api.d.ts +9 -0
- package/dist/server/routes/git-api.js +82 -0
- package/dist/server/routes/git-api.js.map +1 -0
- package/dist/server/routes/graph-api.d.ts +2 -2
- package/dist/server/routes/graph-api.js +267 -3
- package/dist/server/routes/graph-api.js.map +1 -1
- package/dist/server/routes/permissions-api.d.ts +9 -0
- package/dist/server/routes/permissions-api.js +176 -0
- package/dist/server/routes/permissions-api.js.map +1 -0
- package/dist/server/routes/workspace-api.d.ts +9 -0
- package/dist/server/routes/workspace-api.js +283 -0
- package/dist/server/routes/workspace-api.js.map +1 -0
- package/dist/services/assets/base.d.ts +2 -2
- package/dist/services/assets/base.js +4 -4
- package/dist/services/assets/base.js.map +1 -1
- package/dist/services/assets/index.d.ts +6 -6
- package/dist/services/assets/index.js +12 -12
- package/dist/services/assets/index.js.map +1 -1
- package/dist/services/git.d.ts +35 -0
- package/dist/services/git.js +93 -0
- package/dist/services/git.js.map +1 -1
- package/dist/services/github-provisioner.js +1 -2
- package/dist/services/github-provisioner.js.map +1 -1
- package/dist/services/github-service.d.ts +99 -0
- package/dist/services/github-service.js +310 -0
- package/dist/services/github-service.js.map +1 -0
- package/dist/services/markdown.js +4 -9
- package/dist/services/markdown.js.map +1 -1
- package/dist/services/memory-service.d.ts +4 -0
- package/dist/services/memory-service.js +13 -1
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/sync/commit.d.ts +2 -0
- package/dist/services/sync/commit.js +21 -6
- package/dist/services/sync/commit.js.map +1 -1
- package/dist/services/sync/graphrag-indexer.js +2 -2
- package/dist/services/sync/graphrag-indexer.js.map +1 -1
- package/dist/utils/git.d.ts +5 -0
- package/dist/utils/git.js +10 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/merge-resolver.d.ts +33 -8
- package/dist/utils/merge-resolver.js +157 -55
- package/dist/utils/merge-resolver.js.map +1 -1
- package/dist/utils/preflight.d.ts +1 -1
- package/dist/utils/preflight.js +1 -1
- package/dist/web/_app/env.js +1 -0
- package/dist/web/_app/immutable/assets/0.CDbX4Cwz.css +1 -0
- package/dist/web/_app/immutable/assets/2.DRHi7ABa.css +1 -0
- package/dist/web/_app/immutable/assets/3.BJy7pVXi.css +1 -0
- package/dist/web/_app/immutable/assets/4.Ad16uh9o.css +1 -0
- package/dist/web/_app/immutable/assets/5.BhKgiXd2.css +1 -0
- package/dist/web/_app/immutable/assets/6.CeHKR5ZY.css +1 -0
- package/dist/web/_app/immutable/assets/AppShell.CXdE5aqF.css +1 -0
- package/dist/web/_app/immutable/assets/ChatPanel.RFD5GGYI.css +1 -0
- package/dist/web/_app/immutable/assets/editor.CPAf2SRV.css +1 -0
- package/dist/web/_app/immutable/chunks/3_5VIr68.js +1 -0
- package/dist/web/_app/immutable/chunks/4QY4j-jX.js +1 -0
- package/dist/web/_app/immutable/chunks/B0nldqWF.js +23 -0
- package/dist/web/_app/immutable/chunks/BB_5th5W.js +3383 -0
- package/dist/web/_app/immutable/chunks/BButMJ6M.js +1 -0
- package/dist/web/_app/immutable/chunks/BiubvAUI.js +2 -0
- package/dist/web/_app/immutable/chunks/CAXuTUkp.js +1 -0
- package/dist/web/_app/immutable/chunks/CUzqHQY_.js +1 -0
- package/dist/web/_app/immutable/chunks/CYrVHOHA.js +1 -0
- package/dist/web/_app/immutable/chunks/CqkleIqs.js +1 -0
- package/dist/web/_app/immutable/chunks/DPmdIe6Y.js +1 -0
- package/dist/web/_app/immutable/chunks/Dh_H7Owr.js +18 -0
- package/dist/web/_app/immutable/chunks/DnlgZ_Tk.js +5 -0
- package/dist/web/_app/immutable/chunks/DsERsGWg.js +64 -0
- package/dist/web/_app/immutable/chunks/DtVH--hH.js +6 -0
- package/dist/web/_app/immutable/chunks/F20aIBpJ.js +1 -0
- package/dist/web/_app/immutable/chunks/PPVm8Dsz.js +1 -0
- package/dist/web/_app/immutable/chunks/WSUKABI_.js +1 -0
- package/dist/web/_app/immutable/chunks/YFT1281h.js +2 -0
- package/dist/web/_app/immutable/chunks/aosHekRC.js +1 -0
- package/dist/web/_app/immutable/chunks/fwnBoL5x.js +1 -0
- package/dist/web/_app/immutable/chunks/hHxe9oXh.js +1 -0
- package/dist/web/_app/immutable/chunks/nZKqDQ0w.js +6 -0
- package/dist/web/_app/immutable/entry/app.B6Ngvu5P.js +2 -0
- package/dist/web/_app/immutable/entry/start.NykKAKQv.js +1 -0
- package/dist/web/_app/immutable/nodes/0.DQ5KdeNU.js +1 -0
- package/dist/web/_app/immutable/nodes/1.BR6DZ9ov.js +1 -0
- package/dist/web/_app/immutable/nodes/2.COSjVZ_C.js +1 -0
- package/dist/web/_app/immutable/nodes/3.B9r1XIlO.js +1 -0
- package/dist/web/_app/immutable/nodes/4.p-c6hlFf.js +16 -0
- package/dist/web/_app/immutable/nodes/5.CPc-Bqal.js +4 -0
- package/dist/web/_app/immutable/nodes/6.jJ67YnBc.js +2 -0
- package/dist/web/_app/version.json +1 -0
- package/dist/web/index.html +43 -0
- package/package.json +21 -3
- package/dist/agent/skills/bundled/enrich-entities.md +0 -124
- package/dist/agent/skills/bundled/gather-context.md +0 -46
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace API routes
|
|
3
|
+
*
|
|
4
|
+
* Git operations: status, commit, push, pull across all repos.
|
|
5
|
+
*/
|
|
6
|
+
/** Repo names eligible for local git ops (status, commit, revert) — includes private. */
|
|
7
|
+
function getLocalRepoNames(wm) {
|
|
8
|
+
return wm.getAllRepoConfigs().map(r => r.name);
|
|
9
|
+
}
|
|
10
|
+
export async function registerWorkspaceApiRoutes(fastify, workspaceManager, gitUser) {
|
|
11
|
+
// GET /api/status — git status across all repos
|
|
12
|
+
fastify.get('/api/status', async (_req, reply) => {
|
|
13
|
+
const repoNames = getLocalRepoNames(workspaceManager);
|
|
14
|
+
const results = [];
|
|
15
|
+
for (const name of repoNames) {
|
|
16
|
+
try {
|
|
17
|
+
const graph = workspaceManager.getGraph(name);
|
|
18
|
+
const git = graph.gitService;
|
|
19
|
+
if (!git)
|
|
20
|
+
continue;
|
|
21
|
+
// Build lookups from loaded entities
|
|
22
|
+
const entities = graph.search({});
|
|
23
|
+
const nameMap = new Map();
|
|
24
|
+
const typeMap = new Map(); // entityType → entity names
|
|
25
|
+
for (const e of entities) {
|
|
26
|
+
const eName = e.data?.name ?? e.id;
|
|
27
|
+
nameMap.set(e.id, eName);
|
|
28
|
+
const eType = e.entityType ?? '';
|
|
29
|
+
if (eType) {
|
|
30
|
+
const list = typeMap.get(eType) ?? [];
|
|
31
|
+
list.push(eName);
|
|
32
|
+
typeMap.set(eType, list);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const status = await git.status();
|
|
36
|
+
if (status && status.length > 0) {
|
|
37
|
+
results.push({
|
|
38
|
+
repo: name,
|
|
39
|
+
changes: status.map((s) => {
|
|
40
|
+
const filePath = s.path ?? s;
|
|
41
|
+
const fileStatus = s.status ?? 'modified';
|
|
42
|
+
// Try direct entity ID match from path segments
|
|
43
|
+
const segments = filePath.replace(/\/$/, '').split('/').filter(Boolean);
|
|
44
|
+
for (const seg of segments) {
|
|
45
|
+
const clean = seg.replace(/\.md$/, '');
|
|
46
|
+
if (nameMap.has(clean)) {
|
|
47
|
+
return { path: filePath, status: fileStatus, entityName: nameMap.get(clean) };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Directory match: "projects/" → entity type "project", list entity names
|
|
51
|
+
if (filePath.endsWith('/') && segments.length === 1) {
|
|
52
|
+
const dirName = segments[0];
|
|
53
|
+
for (const [eType, names] of typeMap) {
|
|
54
|
+
if (dirName === eType || dirName === eType + 's' || dirName === eType + 'es') {
|
|
55
|
+
return { path: filePath, status: fileStatus, entityName: names.join(', ') };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { path: filePath, status: fileStatus };
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Skip repos without git
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return reply.send(results);
|
|
69
|
+
});
|
|
70
|
+
// POST /api/commit — commit all repos
|
|
71
|
+
fastify.post('/api/commit', async (req, reply) => {
|
|
72
|
+
const { message } = req.body ?? {};
|
|
73
|
+
const commitMessage = message || 'Update from web UI';
|
|
74
|
+
try {
|
|
75
|
+
const repoNames = getLocalRepoNames(workspaceManager);
|
|
76
|
+
const committed = [];
|
|
77
|
+
for (const name of repoNames) {
|
|
78
|
+
try {
|
|
79
|
+
const graph = workspaceManager.getGraph(name);
|
|
80
|
+
const git = graph.gitService;
|
|
81
|
+
if (!git)
|
|
82
|
+
continue;
|
|
83
|
+
const status = await git.status();
|
|
84
|
+
if (status && status.length > 0) {
|
|
85
|
+
await git.commitAll(commitMessage, gitUser);
|
|
86
|
+
committed.push(name);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Skip individual repo failures
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return reply.send({ committed });
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
return reply.status(500).send({ error: err.message });
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
// POST /api/push — push all repos (skip private)
|
|
100
|
+
fastify.post('/api/push', async (_req, reply) => {
|
|
101
|
+
try {
|
|
102
|
+
const repos = workspaceManager.getAllRepoConfigs().filter(r => !r.private);
|
|
103
|
+
const pushed = [];
|
|
104
|
+
for (const repoConfig of repos) {
|
|
105
|
+
try {
|
|
106
|
+
const graph = workspaceManager.getGraph(repoConfig.name);
|
|
107
|
+
const git = graph.gitService;
|
|
108
|
+
if (!git)
|
|
109
|
+
continue;
|
|
110
|
+
await git.push();
|
|
111
|
+
pushed.push(repoConfig.name);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Skip individual repo failures
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return reply.send({ pushed });
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return reply.status(500).send({ error: err.message });
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// POST /api/pull — pull all repos (skip private)
|
|
124
|
+
fastify.post('/api/pull', async (_req, reply) => {
|
|
125
|
+
try {
|
|
126
|
+
const repos = workspaceManager.getAllRepoConfigs().filter(r => !r.private);
|
|
127
|
+
const pulled = [];
|
|
128
|
+
for (const repoConfig of repos) {
|
|
129
|
+
try {
|
|
130
|
+
const graph = workspaceManager.getGraph(repoConfig.name);
|
|
131
|
+
const git = graph.gitService;
|
|
132
|
+
if (!git)
|
|
133
|
+
continue;
|
|
134
|
+
await git.pull();
|
|
135
|
+
pulled.push(repoConfig.name);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Skip individual repo failures
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return reply.send({ pulled });
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
return reply.status(500).send({ error: err.message });
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
// POST /api/revert — revert all uncommitted changes across all repos
|
|
148
|
+
fastify.post('/api/revert', async (_req, reply) => {
|
|
149
|
+
try {
|
|
150
|
+
const repoNames = getLocalRepoNames(workspaceManager);
|
|
151
|
+
const reverted = [];
|
|
152
|
+
for (const name of repoNames) {
|
|
153
|
+
try {
|
|
154
|
+
const graph = workspaceManager.getGraph(name);
|
|
155
|
+
const git = graph.gitService;
|
|
156
|
+
if (!git)
|
|
157
|
+
continue;
|
|
158
|
+
const status = await git.status();
|
|
159
|
+
if (status && status.length > 0) {
|
|
160
|
+
git.revertAll();
|
|
161
|
+
reverted.push(name);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Skip individual repo failures
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return reply.send({ reverted });
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
return reply.status(500).send({ error: err.message });
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// GET /api/repos/:repo/status — git status for a single repo
|
|
175
|
+
fastify.get('/api/repos/:repo/status', async (req, reply) => {
|
|
176
|
+
try {
|
|
177
|
+
const graph = workspaceManager.getGraph(req.params.repo);
|
|
178
|
+
const git = graph.gitService;
|
|
179
|
+
if (!git)
|
|
180
|
+
return reply.status(404).send({ error: 'Repo not found' });
|
|
181
|
+
const changes = await git.status();
|
|
182
|
+
const dirty = changes ? changes.length : 0;
|
|
183
|
+
let hasUpstream = false;
|
|
184
|
+
let ahead = 0;
|
|
185
|
+
let behind = 0;
|
|
186
|
+
try {
|
|
187
|
+
const ab = git.getAheadBehind();
|
|
188
|
+
ahead = ab.ahead;
|
|
189
|
+
behind = ab.behind;
|
|
190
|
+
hasUpstream = true;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// no upstream configured
|
|
194
|
+
}
|
|
195
|
+
return reply.send({ dirty, hasUpstream, ahead, behind, changes: changes || [] });
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return reply.status(404).send({ error: 'Repo not found' });
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
// POST /api/repos/:repo/publish — commit + push a single repo
|
|
202
|
+
fastify.post('/api/repos/:repo/publish', async (req, reply) => {
|
|
203
|
+
try {
|
|
204
|
+
const graph = workspaceManager.getGraph(req.params.repo);
|
|
205
|
+
const git = graph.gitService;
|
|
206
|
+
if (!git)
|
|
207
|
+
return reply.status(404).send({ error: 'Repo not found' });
|
|
208
|
+
const status = await git.status();
|
|
209
|
+
if (status && status.length > 0) {
|
|
210
|
+
const message = req.body?.message || 'Update from editor';
|
|
211
|
+
git.commitAll(message, gitUser);
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
git.push();
|
|
215
|
+
}
|
|
216
|
+
catch { /* no remote */ }
|
|
217
|
+
return reply.send({ ok: true });
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
return reply.status(500).send({ error: err.message });
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
// POST /api/repos/:repo/revert — revert uncommitted changes in a single repo
|
|
224
|
+
fastify.post('/api/repos/:repo/revert', async (req, reply) => {
|
|
225
|
+
try {
|
|
226
|
+
const graph = workspaceManager.getGraph(req.params.repo);
|
|
227
|
+
const git = graph.gitService;
|
|
228
|
+
if (!git)
|
|
229
|
+
return reply.status(404).send({ error: 'Repo not found' });
|
|
230
|
+
git.revertAll();
|
|
231
|
+
return reply.send({ ok: true });
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
return reply.status(500).send({ error: err.message });
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
// GET /api/stats — aggregate workspace stats (entities, links)
|
|
238
|
+
fastify.get('/api/stats', async (_req, reply) => {
|
|
239
|
+
const repos = workspaceManager.getAllRepoConfigs();
|
|
240
|
+
let totalEntities = 0;
|
|
241
|
+
let totalLinks = 0;
|
|
242
|
+
for (const repoConfig of repos) {
|
|
243
|
+
try {
|
|
244
|
+
const graph = workspaceManager.getGraph(repoConfig.name);
|
|
245
|
+
const entities = graph.search({}).filter((e) => !e.id.toLowerCase().startsWith('readme'));
|
|
246
|
+
totalEntities += entities.length;
|
|
247
|
+
for (const e of entities) {
|
|
248
|
+
totalLinks += (e.document?.wikilinks?.length ?? 0);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
// Skip repos that fail
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return reply.send({
|
|
256
|
+
entities: totalEntities,
|
|
257
|
+
links: totalLinks,
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
// GET /api/sync-status — ahead/behind counts for all repos (skip private)
|
|
261
|
+
fastify.get('/api/sync-status', async (_req, reply) => {
|
|
262
|
+
const repos = workspaceManager.getAllRepoConfigs().filter(r => !r.private);
|
|
263
|
+
let totalAhead = 0;
|
|
264
|
+
let totalBehind = 0;
|
|
265
|
+
for (const repoConfig of repos) {
|
|
266
|
+
try {
|
|
267
|
+
const graph = workspaceManager.getGraph(repoConfig.name);
|
|
268
|
+
const git = graph.gitService;
|
|
269
|
+
if (!git)
|
|
270
|
+
continue;
|
|
271
|
+
git.fetch();
|
|
272
|
+
const { ahead, behind } = git.getAheadBehind();
|
|
273
|
+
totalAhead += ahead;
|
|
274
|
+
totalBehind += behind;
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// Skip repos without git/remote
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return reply.send({ ahead: totalAhead, behind: totalBehind });
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=workspace-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-api.js","sourceRoot":"","sources":["../../../src/server/routes/workspace-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,8 +62,8 @@ export declare function validateFilename(filename: string): void;
|
|
|
62
62
|
/**
|
|
63
63
|
* Build asset key from components
|
|
64
64
|
*/
|
|
65
|
-
export declare function buildAssetKey(
|
|
65
|
+
export declare function buildAssetKey(entityType: string, entityId: string, filename: string, keyPrefix?: string): string;
|
|
66
66
|
/**
|
|
67
67
|
* Build asset prefix for listing
|
|
68
68
|
*/
|
|
69
|
-
export declare function buildAssetPrefix(
|
|
69
|
+
export declare function buildAssetPrefix(entityType: string, entityId: string, keyPrefix?: string): string;
|
|
@@ -101,13 +101,13 @@ export function validateFilename(filename) {
|
|
|
101
101
|
/**
|
|
102
102
|
* Build asset key from components
|
|
103
103
|
*/
|
|
104
|
-
export function buildAssetKey(
|
|
105
|
-
return `${
|
|
104
|
+
export function buildAssetKey(entityType, entityId, filename, keyPrefix) {
|
|
105
|
+
return `${keyPrefix || entityType}/${entityId}/${filename}`;
|
|
106
106
|
}
|
|
107
107
|
/**
|
|
108
108
|
* Build asset prefix for listing
|
|
109
109
|
*/
|
|
110
|
-
export function buildAssetPrefix(
|
|
111
|
-
return `${
|
|
110
|
+
export function buildAssetPrefix(entityType, entityId, keyPrefix) {
|
|
111
|
+
return `${keyPrefix || entityType}/${entityId}/`;
|
|
112
112
|
}
|
|
113
113
|
//# sourceMappingURL=base.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/services/assets/base.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/services/assets/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,25 +12,25 @@ export declare class AssetService {
|
|
|
12
12
|
/**
|
|
13
13
|
* Upload asset for an entity
|
|
14
14
|
*/
|
|
15
|
-
upload(
|
|
15
|
+
upload(entityType: string, entityId: string, filename: string, buffer: Buffer, keyPrefix?: string): Promise<AssetInfo>;
|
|
16
16
|
/**
|
|
17
17
|
* List all assets for an entity
|
|
18
18
|
*/
|
|
19
|
-
list(
|
|
19
|
+
list(entityType: string, entityId: string, keyPrefix?: string): Promise<AssetInfo[]>;
|
|
20
20
|
/**
|
|
21
21
|
* Delete a single asset
|
|
22
22
|
*/
|
|
23
|
-
delete(
|
|
23
|
+
delete(entityType: string, entityId: string, filename: string, keyPrefix?: string): Promise<void>;
|
|
24
24
|
/**
|
|
25
25
|
* Delete all assets for an entity (when entity is deleted)
|
|
26
26
|
*/
|
|
27
|
-
deleteAll(
|
|
27
|
+
deleteAll(entityType: string, entityId: string, keyPrefix?: string): Promise<number>;
|
|
28
28
|
/**
|
|
29
29
|
* Check if an asset exists
|
|
30
30
|
*/
|
|
31
|
-
exists(
|
|
31
|
+
exists(entityType: string, entityId: string, filename: string, keyPrefix?: string): Promise<boolean>;
|
|
32
32
|
/**
|
|
33
33
|
* Get asset info without downloading
|
|
34
34
|
*/
|
|
35
|
-
getInfo(
|
|
35
|
+
getInfo(entityType: string, entityId: string, filename: string, keyPrefix?: string): Promise<AssetInfo | null>;
|
|
36
36
|
}
|
|
@@ -29,7 +29,7 @@ export class AssetService {
|
|
|
29
29
|
/**
|
|
30
30
|
* Upload asset for an entity
|
|
31
31
|
*/
|
|
32
|
-
async upload(
|
|
32
|
+
async upload(entityType, entityId, filename, buffer, keyPrefix) {
|
|
33
33
|
// Validate filename
|
|
34
34
|
validateFilename(filename);
|
|
35
35
|
// Validate buffer
|
|
@@ -44,45 +44,45 @@ export class AssetService {
|
|
|
44
44
|
// Detect content type
|
|
45
45
|
const contentType = detectContentType(filename);
|
|
46
46
|
// Build storage key
|
|
47
|
-
const key = buildAssetKey(
|
|
47
|
+
const key = buildAssetKey(entityType, entityId, filename, keyPrefix);
|
|
48
48
|
// Upload via backend
|
|
49
49
|
return await this.backend.upload(key, buffer, contentType);
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
52
|
* List all assets for an entity
|
|
53
53
|
*/
|
|
54
|
-
async list(
|
|
55
|
-
const prefix = buildAssetPrefix(
|
|
54
|
+
async list(entityType, entityId, keyPrefix) {
|
|
55
|
+
const prefix = buildAssetPrefix(entityType, entityId, keyPrefix);
|
|
56
56
|
return await this.backend.list(prefix);
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* Delete a single asset
|
|
60
60
|
*/
|
|
61
|
-
async delete(
|
|
61
|
+
async delete(entityType, entityId, filename, keyPrefix) {
|
|
62
62
|
validateFilename(filename);
|
|
63
|
-
const key = buildAssetKey(
|
|
63
|
+
const key = buildAssetKey(entityType, entityId, filename, keyPrefix);
|
|
64
64
|
return await this.backend.delete(key);
|
|
65
65
|
}
|
|
66
66
|
/**
|
|
67
67
|
* Delete all assets for an entity (when entity is deleted)
|
|
68
68
|
*/
|
|
69
|
-
async deleteAll(
|
|
70
|
-
const prefix = buildAssetPrefix(
|
|
69
|
+
async deleteAll(entityType, entityId, keyPrefix) {
|
|
70
|
+
const prefix = buildAssetPrefix(entityType, entityId, keyPrefix);
|
|
71
71
|
return await this.backend.deleteAll(prefix);
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
74
|
* Check if an asset exists
|
|
75
75
|
*/
|
|
76
|
-
async exists(
|
|
76
|
+
async exists(entityType, entityId, filename, keyPrefix) {
|
|
77
77
|
validateFilename(filename);
|
|
78
|
-
const key = buildAssetKey(
|
|
78
|
+
const key = buildAssetKey(entityType, entityId, filename, keyPrefix);
|
|
79
79
|
return await this.backend.exists(key);
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
82
82
|
* Get asset info without downloading
|
|
83
83
|
*/
|
|
84
|
-
async getInfo(
|
|
85
|
-
const assets = await this.list(
|
|
84
|
+
async getInfo(entityType, entityId, filename, keyPrefix) {
|
|
85
|
+
const assets = await this.list(entityType, entityId, keyPrefix);
|
|
86
86
|
return assets.find(a => a.filename === filename) || null;
|
|
87
87
|
}
|
|
88
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/assets/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,cAAc,WAAW,CAAC;AAE1B,MAAM,OAAO,YAAY;IACf,OAAO,CAAe;IAE9B,YAAY,MAAmB;QAC7B,iCAAiC;QACjC,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,qBAAqB,CAAC;YAC5D,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/assets/index.ts"],"names":[],"mappings":"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"}
|
package/dist/services/git.d.ts
CHANGED
|
@@ -68,6 +68,41 @@ export declare class GitService {
|
|
|
68
68
|
* Check if there are uncommitted changes
|
|
69
69
|
*/
|
|
70
70
|
hasUncommittedChanges(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Fetch from the remote to update tracking refs.
|
|
73
|
+
*/
|
|
74
|
+
fetch(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Get ahead/behind counts relative to the tracking remote branch.
|
|
77
|
+
* Returns { ahead: 0, behind: 0 } if no remote is configured.
|
|
78
|
+
*/
|
|
79
|
+
getAheadBehind(): {
|
|
80
|
+
ahead: number;
|
|
81
|
+
behind: number;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Revert all uncommitted changes (staged + unstaged + untracked).
|
|
85
|
+
*/
|
|
86
|
+
revertAll(): void;
|
|
87
|
+
/**
|
|
88
|
+
* Stage all and commit with user attribution.
|
|
89
|
+
*/
|
|
90
|
+
commitAll(message: string, user: GitUser): void;
|
|
91
|
+
/**
|
|
92
|
+
* Push to remote
|
|
93
|
+
*/
|
|
94
|
+
push(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Pull from remote
|
|
97
|
+
*/
|
|
98
|
+
pull(): void;
|
|
99
|
+
/**
|
|
100
|
+
* Get status as array of { path, status } entries
|
|
101
|
+
*/
|
|
102
|
+
status(): Array<{
|
|
103
|
+
path: string;
|
|
104
|
+
status: string;
|
|
105
|
+
}>;
|
|
71
106
|
}
|
|
72
107
|
/**
|
|
73
108
|
* Transaction class for batched Git commits
|
package/dist/services/git.js
CHANGED
|
@@ -181,6 +181,99 @@ export class GitService {
|
|
|
181
181
|
status.deleted.length > 0 ||
|
|
182
182
|
status.untracked.length > 0);
|
|
183
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* Fetch from the remote to update tracking refs.
|
|
186
|
+
*/
|
|
187
|
+
fetch() {
|
|
188
|
+
try {
|
|
189
|
+
execSync('git fetch', { cwd: this.repoPath, stdio: 'pipe', timeout: 10000 });
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// No remote or network issue — silently ignore
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get ahead/behind counts relative to the tracking remote branch.
|
|
197
|
+
* Returns { ahead: 0, behind: 0 } if no remote is configured.
|
|
198
|
+
*/
|
|
199
|
+
getAheadBehind() {
|
|
200
|
+
try {
|
|
201
|
+
const output = execSync('git rev-list --left-right --count HEAD...@{upstream}', { cwd: this.repoPath, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
202
|
+
const [ahead, behind] = output.split(/\s+/).map(Number);
|
|
203
|
+
return { ahead: ahead || 0, behind: behind || 0 };
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return { ahead: 0, behind: 0 };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Revert all uncommitted changes (staged + unstaged + untracked).
|
|
211
|
+
*/
|
|
212
|
+
revertAll() {
|
|
213
|
+
try {
|
|
214
|
+
execSync('git checkout -- .', { cwd: this.repoPath, stdio: 'pipe' });
|
|
215
|
+
execSync('git clean -fd', { cwd: this.repoPath, stdio: 'pipe' });
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
throw new Error(`Failed to revert changes: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Stage all and commit with user attribution.
|
|
223
|
+
*/
|
|
224
|
+
commitAll(message, user) {
|
|
225
|
+
execSync('git add -A', { cwd: this.repoPath, stdio: 'pipe' });
|
|
226
|
+
// Check if there are actual changes staged
|
|
227
|
+
try {
|
|
228
|
+
execSync('git diff --staged --quiet', { cwd: this.repoPath, stdio: 'pipe' });
|
|
229
|
+
return; // nothing to commit
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// changes exist
|
|
233
|
+
}
|
|
234
|
+
const escapedMessage = escapeShellArg(message);
|
|
235
|
+
const authorString = `${user.name} <${user.email}>`;
|
|
236
|
+
const escapedAuthor = escapeShellArg(authorString);
|
|
237
|
+
execSync(`git commit -m ${escapedMessage} --author=${escapedAuthor}`, {
|
|
238
|
+
cwd: this.repoPath,
|
|
239
|
+
stdio: 'pipe',
|
|
240
|
+
env: {
|
|
241
|
+
...process.env,
|
|
242
|
+
GIT_COMMITTER_NAME: user.name,
|
|
243
|
+
GIT_COMMITTER_EMAIL: user.email,
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Push to remote
|
|
249
|
+
*/
|
|
250
|
+
push() {
|
|
251
|
+
execSync('git push', { cwd: this.repoPath, stdio: 'pipe' });
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Pull from remote
|
|
255
|
+
*/
|
|
256
|
+
pull() {
|
|
257
|
+
execSync('git pull', { cwd: this.repoPath, stdio: 'pipe' });
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get status as array of { path, status } entries
|
|
261
|
+
*/
|
|
262
|
+
status() {
|
|
263
|
+
try {
|
|
264
|
+
const output = execSync('git status --porcelain', {
|
|
265
|
+
cwd: this.repoPath,
|
|
266
|
+
encoding: 'utf-8',
|
|
267
|
+
});
|
|
268
|
+
return output.split('\n').filter(Boolean).map(line => ({
|
|
269
|
+
path: line.substring(3),
|
|
270
|
+
status: line.substring(0, 2).trim() || 'modified',
|
|
271
|
+
}));
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return [];
|
|
275
|
+
}
|
|
276
|
+
}
|
|
184
277
|
}
|
|
185
278
|
/**
|
|
186
279
|
* Transaction class for batched Git commits
|