@cyberismo/backend 0.0.26 → 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/dist/app.d.ts +1 -1
- package/dist/app.js +75 -3
- package/dist/app.js.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/mock.d.ts +8 -1
- package/dist/auth/mock.js +50 -2
- package/dist/auth/mock.js.map +1 -1
- package/dist/domain/project/schema.d.ts +3 -0
- package/dist/domain/project/schema.js +9 -1
- package/dist/domain/project/schema.js.map +1 -1
- package/dist/domain/project/service.d.ts +6 -0
- package/dist/domain/project/service.js +14 -1
- package/dist/domain/project/service.js.map +1 -1
- package/dist/domain/projects/index.d.ts +1 -1
- package/dist/domain/projects/index.js +66 -3
- package/dist/domain/projects/index.js.map +1 -1
- package/dist/domain/projects/schema.d.ts +22 -0
- package/dist/domain/projects/schema.js +40 -0
- package/dist/domain/projects/schema.js.map +1 -0
- package/dist/domain/projects/service.d.ts +37 -0
- package/dist/domain/projects/service.js +53 -0
- package/dist/domain/projects/service.js.map +1 -0
- package/dist/domain/resources/index.js +5 -1
- package/dist/domain/resources/index.js.map +1 -1
- package/dist/domain/resources/service.d.ts +9 -0
- package/dist/domain/resources/service.js +12 -0
- package/dist/domain/resources/service.js.map +1 -1
- package/dist/export.js +5 -11
- package/dist/export.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/main.js +1 -5
- package/dist/main.js.map +1 -1
- package/dist/middleware/zvalidator.d.ts +1 -1
- package/dist/project-registry.d.ts +8 -1
- package/dist/project-registry.js +18 -2
- package/dist/project-registry.js.map +1 -1
- package/dist/public/THIRD-PARTY.txt +1421 -1950
- package/dist/public/assets/architecture-7EHR7CIX-CHU1xuYF.js +1 -0
- package/dist/public/assets/architectureDiagram-3BPJPVTR-BfDrO6_w.js +36 -0
- package/dist/public/assets/array-BifhSqXX.js +1 -0
- package/dist/public/assets/blockDiagram-GPEHLZMM-KVU5YZg5.js +132 -0
- package/dist/public/assets/{c4Diagram-AAUBKEIU-BG8_sPEr.js → c4Diagram-AAUBKEIU-CKZoRo4y.js} +6 -6
- package/dist/public/assets/channel-DylEVeTd.js +1 -0
- package/dist/public/assets/chunk-2J33WTMH-3csjo24p.js +1 -0
- package/dist/public/assets/chunk-3OPIFGDE-BKzRNP07.js +62 -0
- package/dist/public/assets/chunk-4BX2VUAB-ClBqZOcE.js +1 -0
- package/dist/public/assets/chunk-55IACEB6-Bgi2dUOh.js +1 -0
- package/dist/public/assets/chunk-5ZQYHXKU-CECM_AkK.js +2 -0
- package/dist/public/assets/{chunk-727SXJPM-C5ihZMyl.js → chunk-727SXJPM-xJrElvZJ.js} +3 -3
- package/dist/public/assets/{chunk-AQP2D5EJ-XGOtp2xP.js → chunk-AQP2D5EJ-DlQQ44Ki.js} +2 -2
- package/dist/public/assets/chunk-BSJP7CBP-ByoKnyMP.js +1 -0
- package/dist/public/assets/chunk-CSCIHK7Q-DPeQmPB5.js +124 -0
- package/dist/public/assets/{chunk-FMBD7UC4-Da1lR6Mn.js → chunk-FMBD7UC4-Cgl-u-NC.js} +1 -1
- package/dist/public/assets/chunk-L5ZTLDWV-pkYUefHU.js +1 -0
- package/dist/public/assets/chunk-ND2GUHAM-BbBhIALU.js +1 -0
- package/dist/public/assets/chunk-NNHCCRGN-DlpIbxXb.js +159 -0
- package/dist/public/assets/chunk-NZK2D7GU-Bsg3s0FQ.js +1 -0
- package/dist/public/assets/chunk-O5CBEL6O-CLKEM0Ng.js +70 -0
- package/dist/public/assets/chunk-QZHKN3VN-DYbrfjC5.js +1 -0
- package/dist/public/assets/classDiagram-4FO5ZUOK-Dw2NhQGr.js +1 -0
- package/dist/public/assets/classDiagram-v2-Q7XG4LA2-Dw2NhQGr.js +1 -0
- package/dist/public/assets/cose-bilkent-S5V4N54A-BW2eHW0s.js +1 -0
- package/dist/public/assets/{cytoscape.esm-C8YCVR3_.js → cytoscape.esm-FqbQrHcz.js} +1 -1
- package/dist/public/assets/dagre-BM42HDAG-BWzuCoWz.js +4 -0
- package/dist/public/assets/diagram-2AECGRRQ-BO4dhTfd.js +43 -0
- package/dist/public/assets/diagram-5GNKFQAL-v25ju5Ui.js +10 -0
- package/dist/public/assets/diagram-KO2AKTUF-C-khQZwA.js +3 -0
- package/dist/public/assets/diagram-LMA3HP47-D7SSAeUZ.js +24 -0
- package/dist/public/assets/diagram-OG6HWLK6-D2CeL9Qd.js +24 -0
- package/dist/public/assets/dist-Dek0Yhn0.js +1 -0
- package/dist/public/assets/erDiagram-TEJ5UH35-CsShdaJw.js +85 -0
- package/dist/public/assets/eventmodeling-FCH6USID-C_5XBe82.js +1 -0
- package/dist/public/assets/flowDiagram-I6XJVG4X-BSiUVjsY.js +162 -0
- package/dist/public/assets/ganttDiagram-6RSMTGT7-BumhHDWI.js +292 -0
- package/dist/public/assets/gitGraph-WXDBUCRP-D4dBNuhe.js +1 -0
- package/dist/public/assets/gitGraphDiagram-PVQCEYII-BPrVPTyG.js +106 -0
- package/dist/public/assets/index-COSSLZqt.css +1 -0
- package/dist/public/assets/index-WMbgvnqh.js +487 -0
- package/dist/public/assets/info-J43DQDTF-D7lvZ6o6.js +1 -0
- package/dist/public/assets/infoDiagram-5YYISTIA-CEASd4Im.js +2 -0
- package/dist/public/assets/{ishikawaDiagram-YF4QCWOH-DWNWYxz5.js → ishikawaDiagram-YF4QCWOH-BMZVbhq1.js} +6 -6
- package/dist/public/assets/{journeyDiagram-JHISSGLW-I58P5XNg.js → journeyDiagram-JHISSGLW-B3iswT_x.js} +6 -6
- package/dist/public/assets/{kanban-definition-UN3LZRKU-CMRWbDti.js → kanban-definition-UN3LZRKU-xX5kT_P-.js} +18 -18
- package/dist/public/assets/katex-Vhh-h91d.js +257 -0
- package/dist/public/assets/line-DNZMOnJ3.js +1 -0
- package/dist/public/assets/mermaid-parser.core-DFZGVidJ.js +4 -0
- package/dist/public/assets/{mindmap-definition-RKZ34NQL-C47gCcpC.js → mindmap-definition-RKZ34NQL-C77038Zx.js} +29 -29
- package/dist/public/assets/packet-YPE3B663-AbbU2Ze4.js +1 -0
- package/dist/public/assets/path-HTXttWil.js +1 -0
- package/dist/public/assets/pie-LRSECV5Y-DN4QBmSF.js +1 -0
- package/dist/public/assets/pieDiagram-4H26LBE5-C1GhVY4H.js +30 -0
- package/dist/public/assets/{quadrantDiagram-W4KKPZXB-BY8JORvE.js → quadrantDiagram-W4KKPZXB-3v--YO6t.js} +6 -6
- package/dist/public/assets/radar-GUYGQ44K-ej308gGR.js +1 -0
- package/dist/public/assets/{requirementDiagram-4Y6WPE33-XhNBeFwj.js → requirementDiagram-4Y6WPE33-Bcj6wwJW.js} +4 -4
- package/dist/public/assets/rough.esm-CSKSodPl.js +1 -0
- package/dist/public/assets/sankeyDiagram-5OEKKPKP-BHDSc0nY.js +40 -0
- package/dist/public/assets/sequenceDiagram-3UESZ5HK-B7Huaheu.js +162 -0
- package/dist/public/assets/src-CqxF9LGw.js +1 -0
- package/dist/public/assets/stateDiagram-AJRCARHV-C1l1yZDH.js +1 -0
- package/dist/public/assets/stateDiagram-v2-BHNVJYJU-DQC9x5mr.js +1 -0
- package/dist/public/assets/{timeline-definition-PNZ67QCA-BZbaBDRH.js → timeline-definition-PNZ67QCA-CwBz01Qw.js} +16 -16
- package/dist/public/assets/treeView-BLDUP644--ooV0k8a.js +1 -0
- package/dist/public/assets/treemap-LRROVOQU-BKq-VDOX.js +1 -0
- package/dist/public/assets/vennDiagram-CIIHVFJN-DpiZAjsM.js +34 -0
- package/dist/public/assets/wardley-L42UT6IY-VU5ormp0.js +1 -0
- package/dist/public/assets/{wardleyDiagram-YWT4CUSO-CM0yrkHd.js → wardleyDiagram-YWT4CUSO-COVxB67h.js} +4 -4
- package/dist/public/assets/{xychartDiagram-2RQKCTM6-1ZAtqvyQ.js → xychartDiagram-2RQKCTM6-C7lnc5PN.js} +6 -6
- package/dist/public/index.html +15 -2
- package/package.json +8 -7
- package/src/app.ts +93 -2
- package/src/auth/index.ts +1 -1
- package/src/auth/mock.ts +53 -2
- package/src/domain/project/schema.ts +9 -1
- package/src/domain/project/service.ts +22 -1
- package/src/domain/projects/index.ts +115 -3
- package/src/domain/projects/schema.ts +42 -0
- package/src/domain/projects/service.ts +98 -0
- package/src/domain/resources/index.ts +6 -1
- package/src/domain/resources/service.ts +15 -0
- package/src/export.ts +6 -15
- package/src/index.ts +16 -4
- package/src/main.ts +1 -7
- package/src/project-registry.ts +22 -2
- package/dist/public/assets/architecture-7EHR7CIX-BhpB9ddF.js +0 -1
- package/dist/public/assets/architectureDiagram-3BPJPVTR-BQYiU_EO.js +0 -36
- package/dist/public/assets/blockDiagram-GPEHLZMM-DuyikC3X.js +0 -132
- package/dist/public/assets/channel-BxgB7fMy.js +0 -1
- package/dist/public/assets/chunk-2J33WTMH-vNq8B1aw.js +0 -1
- package/dist/public/assets/chunk-4BX2VUAB-DFDBsmSo.js +0 -1
- package/dist/public/assets/chunk-55IACEB6-DCVUQPWM.js +0 -1
- package/dist/public/assets/chunk-ND2GUHAM-ZOvpvr6K.js +0 -1
- package/dist/public/assets/chunk-QZHKN3VN-D33jzvFT.js +0 -1
- package/dist/public/assets/classDiagram-4FO5ZUOK-hWfZv7hZ.js +0 -1
- package/dist/public/assets/classDiagram-v2-Q7XG4LA2-hWfZv7hZ.js +0 -1
- package/dist/public/assets/cose-bilkent-S5V4N54A-DO4z-ix4.js +0 -1
- package/dist/public/assets/dagre-BM42HDAG-DlpRfzgA.js +0 -4
- package/dist/public/assets/diagram-2AECGRRQ-D-t_ImBP.js +0 -43
- package/dist/public/assets/diagram-5GNKFQAL-CBgUMlXz.js +0 -10
- package/dist/public/assets/diagram-KO2AKTUF-XoB2TgQt.js +0 -3
- package/dist/public/assets/diagram-LMA3HP47-D1Sbl_eS.js +0 -24
- package/dist/public/assets/diagram-OG6HWLK6-DKP4aiIY.js +0 -24
- package/dist/public/assets/erDiagram-TEJ5UH35-DYxfHOOK.js +0 -85
- package/dist/public/assets/eventmodeling-FCH6USID-cF_1Mq4g.js +0 -1
- package/dist/public/assets/flowDiagram-I6XJVG4X-BDHPsmlq.js +0 -162
- package/dist/public/assets/ganttDiagram-6RSMTGT7-bGgIvBPN.js +0 -292
- package/dist/public/assets/gitGraph-WXDBUCRP-DOFshjLy.js +0 -1
- package/dist/public/assets/gitGraphDiagram-PVQCEYII-xSwLjGd-.js +0 -106
- package/dist/public/assets/index-DGPv1qic.js +0 -1028
- package/dist/public/assets/index-DvHiopvR.css +0 -1
- package/dist/public/assets/info-J43DQDTF-BuJNK7zQ.js +0 -1
- package/dist/public/assets/infoDiagram-5YYISTIA-BanxuIib.js +0 -2
- package/dist/public/assets/katex-C4eR7coU.js +0 -257
- package/dist/public/assets/mermaid-parser.core-Dz__fM3g.js +0 -161
- package/dist/public/assets/packet-YPE3B663-Cczitw2-.js +0 -1
- package/dist/public/assets/pie-LRSECV5Y-rO-Aqx6h.js +0 -1
- package/dist/public/assets/pieDiagram-4H26LBE5-VZAxHzjD.js +0 -30
- package/dist/public/assets/radar-GUYGQ44K-SSIGuQjW.js +0 -1
- package/dist/public/assets/sankeyDiagram-5OEKKPKP-H7I2OESy.js +0 -40
- package/dist/public/assets/sequenceDiagram-3UESZ5HK-jnTLwq-X.js +0 -162
- package/dist/public/assets/stateDiagram-AJRCARHV-BKcf2bdX.js +0 -1
- package/dist/public/assets/stateDiagram-v2-BHNVJYJU-wpO0gnsG.js +0 -1
- package/dist/public/assets/treeView-BLDUP644-DkGx4HkR.js +0 -1
- package/dist/public/assets/treemap-LRROVOQU-yCyuONQh.js +0 -1
- package/dist/public/assets/vennDiagram-CIIHVFJN-nY9Pep3o.js +0 -34
- package/dist/public/assets/wardley-L42UT6IY-CXWWFUgk.js +0 -1
- package/dist/public/config.json +0 -5
package/dist/app.d.ts
CHANGED
|
@@ -19,6 +19,6 @@ import type { ProjectRegistry } from './project-registry.js';
|
|
|
19
19
|
* @param authProvider - Authentication provider
|
|
20
20
|
* @param registry - ProjectRegistry holding all project CommandManagers
|
|
21
21
|
*/
|
|
22
|
-
export declare function createApp(authProvider: AuthProvider, registry: ProjectRegistry, opts?: TreeOptions, exportMode?: boolean): Hono<{
|
|
22
|
+
export declare function createApp(authProvider: AuthProvider, registry: ProjectRegistry, opts?: TreeOptions, exportMode?: boolean, multiProjectRoot?: string): Hono<{
|
|
23
23
|
Variables: AppVars;
|
|
24
24
|
}, import("hono/types").BlankSchema, "/">;
|
package/dist/app.js
CHANGED
|
@@ -27,8 +27,10 @@ import templatesRouter from './domain/templates/index.js';
|
|
|
27
27
|
import treeRouter from './domain/tree/index.js';
|
|
28
28
|
import workflowsRouter from './domain/workflows/index.js';
|
|
29
29
|
import labelsRouter from './domain/labels/index.js';
|
|
30
|
+
import * as fs from 'node:fs/promises';
|
|
30
31
|
import { readFile } from 'node:fs/promises';
|
|
31
|
-
import
|
|
32
|
+
import os from 'node:os';
|
|
33
|
+
import path, { join } from 'node:path';
|
|
32
34
|
import resourcesRouter from './domain/resources/index.js';
|
|
33
35
|
import logicProgramsRouter from './domain/logicPrograms/index.js';
|
|
34
36
|
import { isSSGContext } from 'hono/ssg';
|
|
@@ -37,6 +39,8 @@ import projectRouter from './domain/project/index.js';
|
|
|
37
39
|
import { createMcpRouter } from './domain/mcp/index.js';
|
|
38
40
|
import { createAuthRouter } from './domain/auth/index.js';
|
|
39
41
|
import { createAuthMiddleware } from './middleware/auth.js';
|
|
42
|
+
import { MockAuthProvider, mockRoleCookieMiddleware } from './auth/mock.js';
|
|
43
|
+
import { CommandManager, scanForProjects } from '@cyberismo/data-handler';
|
|
40
44
|
import { createProjectsRouter } from './domain/projects/index.js';
|
|
41
45
|
import { simpleMcpAuthRouter } from '@hono/mcp';
|
|
42
46
|
/**
|
|
@@ -68,7 +72,7 @@ function createProjectScopedRoutes(middleware) {
|
|
|
68
72
|
* @param authProvider - Authentication provider
|
|
69
73
|
* @param registry - ProjectRegistry holding all project CommandManagers
|
|
70
74
|
*/
|
|
71
|
-
export function createApp(authProvider, registry, opts, exportMode = false) {
|
|
75
|
+
export function createApp(authProvider, registry, opts, exportMode = false, multiProjectRoot) {
|
|
72
76
|
const app = new Hono();
|
|
73
77
|
// Public — no auth middleware (MCP clients call this before they have a token)
|
|
74
78
|
// RFC 9728 resource metadata & OAuth authorization server metadata via @hono/mcp
|
|
@@ -81,13 +85,81 @@ export function createApp(authProvider, registry, opts, exportMode = false) {
|
|
|
81
85
|
}));
|
|
82
86
|
}
|
|
83
87
|
app.use(treeMiddleware(opts));
|
|
88
|
+
// Public app configuration
|
|
89
|
+
app.get('/api/config', (c) => {
|
|
90
|
+
return c.json({
|
|
91
|
+
staticMode: exportMode,
|
|
92
|
+
logoutUrl: process.env.APP_LOGOUT_URL || '',
|
|
93
|
+
presenceEnabled: process.env.APP_PRESENCE_ENABLED === 'true',
|
|
94
|
+
defaultProject: process.env.CYBERISMO_DEFAULT_PROJECT || undefined,
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
// Dev-only: let `?role=<reader|editor|admin>` set a persistent mock-role cookie
|
|
98
|
+
// so role gating can be exercised locally without code changes or a restart.
|
|
99
|
+
if (authProvider instanceof MockAuthProvider) {
|
|
100
|
+
app.use(mockRoleCookieMiddleware());
|
|
101
|
+
}
|
|
84
102
|
// Apply authentication middleware to all API and MCP routes
|
|
85
103
|
app.use('/api/*', createAuthMiddleware(authProvider));
|
|
86
104
|
app.use('/mcp', createAuthMiddleware(authProvider));
|
|
87
105
|
app.use('/mcp/*', createAuthMiddleware(authProvider));
|
|
88
106
|
// Global routes (no project-specific CommandManager needed)
|
|
89
107
|
app.route('/api/auth', createAuthRouter());
|
|
90
|
-
app.route('/api/projects', createProjectsRouter(registry));
|
|
108
|
+
app.route('/api/projects', createProjectsRouter(registry, multiProjectRoot));
|
|
109
|
+
// Test-mode reset endpoint: wipes the project dir, restores it from the
|
|
110
|
+
// golden snapshot, and rebuilds the registry in place. Used by the
|
|
111
|
+
// Playwright e2e harness to restore the project between spec files.
|
|
112
|
+
// Gated by NODE_ENV so it never ships in production.
|
|
113
|
+
if (process.env.NODE_ENV === 'test') {
|
|
114
|
+
app.post('/api/test/reset', async (c) => {
|
|
115
|
+
const projectPath = process.env.npm_config_project_path;
|
|
116
|
+
const goldenPath = process.env.CYBERISMO_GOLDEN_PATH;
|
|
117
|
+
if (!projectPath || !goldenPath) {
|
|
118
|
+
return c.json({
|
|
119
|
+
error: 'npm_config_project_path and CYBERISMO_GOLDEN_PATH are required for /api/test/reset',
|
|
120
|
+
}, 500);
|
|
121
|
+
}
|
|
122
|
+
// Defense-in-depth: refuse to operate on suspicious paths. NODE_ENV gates
|
|
123
|
+
// route registration, but a misconfigured CI shouldn't be one typo away
|
|
124
|
+
// from wiping a developer's $HOME.
|
|
125
|
+
const resolvedProject = path.resolve(projectPath);
|
|
126
|
+
if (path.dirname(resolvedProject) === resolvedProject ||
|
|
127
|
+
resolvedProject === os.homedir()) {
|
|
128
|
+
return c.json({
|
|
129
|
+
error: `Refusing to reset suspicious project path: ${resolvedProject}`,
|
|
130
|
+
}, 400);
|
|
131
|
+
}
|
|
132
|
+
await fs.rm(resolvedProject, { recursive: true, force: true });
|
|
133
|
+
await fs.cp(goldenPath, resolvedProject, { recursive: true });
|
|
134
|
+
const autocommit = process.env.CYBERISMO_AUTOCOMMIT === 'true';
|
|
135
|
+
const projects = await scanForProjects(resolvedProject);
|
|
136
|
+
if (projects.length === 0) {
|
|
137
|
+
return c.json({
|
|
138
|
+
error: `reset scan found no projects at ${resolvedProject}`,
|
|
139
|
+
}, 500);
|
|
140
|
+
}
|
|
141
|
+
const entries = [];
|
|
142
|
+
for (const project of projects) {
|
|
143
|
+
const commands = new CommandManager(project.path, { autocommit });
|
|
144
|
+
await commands.initialize();
|
|
145
|
+
entries.push({ prefix: project.prefix, commands });
|
|
146
|
+
}
|
|
147
|
+
await registry.replace(entries);
|
|
148
|
+
return c.body(null, 204);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Tenant-level SSH public key
|
|
152
|
+
app.get('/api/public-key', async (c) => {
|
|
153
|
+
if (!multiProjectRoot)
|
|
154
|
+
return c.json({ publicKey: null });
|
|
155
|
+
try {
|
|
156
|
+
const content = await readFile(join(multiProjectRoot, '.git-push', 'id_rsa.pub'), 'utf-8');
|
|
157
|
+
return c.json({ publicKey: content.trim() });
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return c.json({ publicKey: null });
|
|
161
|
+
}
|
|
162
|
+
});
|
|
91
163
|
if (exportMode) {
|
|
92
164
|
// Export mode: mount at each concrete prefix so SSG sees
|
|
93
165
|
// static routes instead of dynamic :prefix patterns it would skip.
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AACF,OAAO,EAAE,IAAI,EAA0B,MAAM,MAAM,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,kBAAkB,MAAM,gCAAgC,CAAC;AAChE,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAC1D,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,iBAAiB,MAAM,+BAA+B,CAAC;AAC9D,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAC1D,OAAO,aAAa,MAAM,2BAA2B,CAAC;AACtD,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAC1D,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,eAAe,MAAM,6BAA6B,CAAC;AAC1D,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
13
|
export type { AuthProvider } from './types.js';
|
|
14
|
-
export { MockAuthProvider } from './mock.js';
|
|
14
|
+
export { MockAuthProvider, mockRoleCookieMiddleware } from './mock.js';
|
|
15
15
|
export { KeycloakAuthProvider } from './keycloak.js';
|
|
16
16
|
export type { KeycloakConfig } from './keycloak.js';
|
package/dist/auth/index.js
CHANGED
|
@@ -10,6 +10,6 @@
|
|
|
10
10
|
You should have received a copy of the GNU Affero General Public
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
|
-
export { MockAuthProvider } from './mock.js';
|
|
13
|
+
export { MockAuthProvider, mockRoleCookieMiddleware } from './mock.js';
|
|
14
14
|
export { KeycloakAuthProvider } from './keycloak.js';
|
|
15
15
|
//# sourceMappingURL=index.js.map
|
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAGF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAGF,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/auth/mock.d.ts
CHANGED
|
@@ -10,14 +10,21 @@
|
|
|
10
10
|
You should have received a copy of the GNU Affero General Public
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
|
+
import type { MiddlewareHandler } from 'hono';
|
|
13
14
|
import type { UserInfo } from '../types.js';
|
|
14
15
|
import type { AuthProvider } from './types.js';
|
|
15
16
|
export interface MockUserConfig {
|
|
16
17
|
name?: string;
|
|
17
18
|
email?: string;
|
|
18
19
|
}
|
|
20
|
+
export declare const MOCK_ROLE_COOKIE = "mock-role";
|
|
19
21
|
export declare class MockAuthProvider implements AuthProvider {
|
|
20
22
|
private readonly userConfig;
|
|
21
23
|
constructor(config?: MockUserConfig);
|
|
22
|
-
authenticate(): Promise<UserInfo>;
|
|
24
|
+
authenticate(req: Request): Promise<UserInfo>;
|
|
23
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Dev-only middleware that turns `?role=<reader|editor|admin>` into a persistent
|
|
28
|
+
* `mock-role` cookie, and clears it on `?role=default`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function mockRoleCookieMiddleware(): MiddlewareHandler;
|
package/dist/auth/mock.js
CHANGED
|
@@ -10,19 +10,67 @@
|
|
|
10
10
|
You should have received a copy of the GNU Affero General Public
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
|
+
import { setCookie } from 'hono/cookie';
|
|
13
14
|
import { UserRole } from '../types.js';
|
|
15
|
+
export const MOCK_ROLE_COOKIE = 'mock-role';
|
|
16
|
+
const ROLE_RESET_VALUE = 'default';
|
|
17
|
+
const ROLE_ALIASES = {
|
|
18
|
+
reader: UserRole.Reader,
|
|
19
|
+
editor: UserRole.Editor,
|
|
20
|
+
admin: UserRole.Admin,
|
|
21
|
+
};
|
|
22
|
+
function parseRole(value) {
|
|
23
|
+
if (!value)
|
|
24
|
+
return null;
|
|
25
|
+
return ROLE_ALIASES[value.toLowerCase()] ?? null;
|
|
26
|
+
}
|
|
27
|
+
function readCookie(header, name) {
|
|
28
|
+
if (!header)
|
|
29
|
+
return undefined;
|
|
30
|
+
for (const part of header.split(';')) {
|
|
31
|
+
const eq = part.indexOf('=');
|
|
32
|
+
if (eq === -1)
|
|
33
|
+
continue;
|
|
34
|
+
if (part.slice(0, eq).trim() !== name)
|
|
35
|
+
continue;
|
|
36
|
+
return decodeURIComponent(part.slice(eq + 1).trim());
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
14
40
|
export class MockAuthProvider {
|
|
15
41
|
userConfig;
|
|
16
42
|
constructor(config) {
|
|
17
43
|
this.userConfig = config ?? {};
|
|
18
44
|
}
|
|
19
|
-
async authenticate() {
|
|
45
|
+
async authenticate(req) {
|
|
46
|
+
const cookieRole = parseRole(readCookie(req.headers.get('cookie'), MOCK_ROLE_COOKIE));
|
|
20
47
|
return {
|
|
21
48
|
id: 'mock-user',
|
|
22
49
|
email: this.userConfig.email ?? 'admin@cyberismo.local',
|
|
23
50
|
name: this.userConfig.name ?? 'Local Admin',
|
|
24
|
-
role: UserRole.Admin,
|
|
51
|
+
role: cookieRole ?? UserRole.Admin,
|
|
25
52
|
};
|
|
26
53
|
}
|
|
27
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Dev-only middleware that turns `?role=<reader|editor|admin>` into a persistent
|
|
57
|
+
* `mock-role` cookie, and clears it on `?role=default`.
|
|
58
|
+
*/
|
|
59
|
+
export function mockRoleCookieMiddleware() {
|
|
60
|
+
return async (c, next) => {
|
|
61
|
+
const override = new URL(c.req.url).searchParams.get('role');
|
|
62
|
+
if (override) {
|
|
63
|
+
if (override.toLowerCase() === ROLE_RESET_VALUE) {
|
|
64
|
+
setCookie(c, MOCK_ROLE_COOKIE, '', { path: '/', maxAge: 0 });
|
|
65
|
+
}
|
|
66
|
+
else if (parseRole(override)) {
|
|
67
|
+
setCookie(c, MOCK_ROLE_COOKIE, override.toLowerCase(), {
|
|
68
|
+
path: '/',
|
|
69
|
+
sameSite: 'Lax',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
await next();
|
|
74
|
+
};
|
|
75
|
+
}
|
|
28
76
|
//# sourceMappingURL=mock.js.map
|
package/dist/auth/mock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/auth/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/auth/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAGF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AASvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAC5C,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEnC,MAAM,YAAY,GAA6B;IAC7C,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;CACtB,CAAC;AAEF,SAAS,SAAS,CAAC,KAAgC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,MAAqB,EAAE,IAAY;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS;QACxB,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI;YAAE,SAAS;QAChD,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,gBAAgB;IACV,UAAU,CAAiB;IAE5C,YAAY,MAAuB;QACjC,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAY;QAC7B,MAAM,UAAU,GAAG,SAAS,CAC1B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,CACxD,CAAC;QACF,OAAO;YACL,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,uBAAuB;YACvD,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,aAAa;YAC3C,IAAI,EAAE,UAAU,IAAI,QAAQ,CAAC,KAAK;SACnC,CAAC;IACJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,gBAAgB,EAAE,CAAC;gBAChD,SAAS,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,SAAS,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE;oBACrD,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -17,6 +17,9 @@ export declare const moduleParamSchema: z.ZodObject<{
|
|
|
17
17
|
export declare const updateProjectSchema: z.ZodObject<{
|
|
18
18
|
name: z.ZodOptional<z.ZodString>;
|
|
19
19
|
cardKeyPrefix: z.ZodOptional<z.ZodString>;
|
|
20
|
+
description: z.ZodOptional<z.ZodString>;
|
|
21
|
+
category: z.ZodOptional<z.ZodString>;
|
|
22
|
+
gitRemoteUrl: z.ZodOptional<z.ZodString>;
|
|
20
23
|
}, z.core.$strip>;
|
|
21
24
|
export declare const importModuleSchema: z.ZodObject<{
|
|
22
25
|
source: z.ZodString;
|
|
@@ -17,12 +17,20 @@ export const moduleParamSchema = z.object({
|
|
|
17
17
|
export const updateProjectSchema = z.object({
|
|
18
18
|
name: z.string().optional(),
|
|
19
19
|
cardKeyPrefix: z.string().optional(),
|
|
20
|
+
description: z.string().optional(),
|
|
21
|
+
category: z.string().optional(),
|
|
22
|
+
gitRemoteUrl: z
|
|
23
|
+
.string()
|
|
24
|
+
.refine((s) => s.startsWith('https://') || s.startsWith('git@'), {
|
|
25
|
+
message: 'Git remote URL must start with https:// or git@',
|
|
26
|
+
})
|
|
27
|
+
.optional(),
|
|
20
28
|
});
|
|
21
29
|
export const importModuleSchema = z.object({
|
|
22
30
|
source: z
|
|
23
31
|
.string()
|
|
24
32
|
.min(1)
|
|
25
|
-
.refine((s) => s.startsWith('https') || s.startsWith('git@'), {
|
|
33
|
+
.refine((s) => s.startsWith('https://') || s.startsWith('git@'), {
|
|
26
34
|
message: 'Source must be a git URL (https:// or git@)',
|
|
27
35
|
}),
|
|
28
36
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/domain/project/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/domain/project/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QAC/D,OAAO,EAAE,iDAAiD;KAC3D,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QAC/D,OAAO,EAAE,6CAA6C;KACvD,CAAC;CACL,CAAC,CAAC"}
|
|
@@ -18,11 +18,17 @@ export interface ProjectModule {
|
|
|
18
18
|
export interface ProjectInfo {
|
|
19
19
|
name: string;
|
|
20
20
|
cardKeyPrefix: string;
|
|
21
|
+
description: string;
|
|
22
|
+
category: string;
|
|
21
23
|
modules: ProjectModule[];
|
|
24
|
+
gitRemoteUrl: string | null;
|
|
22
25
|
}
|
|
23
26
|
export interface ProjectUpdatePayload {
|
|
24
27
|
name?: string;
|
|
25
28
|
cardKeyPrefix?: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
category?: string;
|
|
31
|
+
gitRemoteUrl?: string;
|
|
26
32
|
}
|
|
27
33
|
export declare function getProject(commands: CommandManager): Promise<ProjectInfo>;
|
|
28
34
|
export declare function updateProject(commands: CommandManager, updates: ProjectUpdatePayload): Promise<ProjectInfo>;
|
|
@@ -30,15 +30,19 @@ export async function getProject(commands) {
|
|
|
30
30
|
const project = await commands.showCmd.showProject();
|
|
31
31
|
const modules = await commands.showCmd.showModules();
|
|
32
32
|
const moduleDetails = await Promise.all(modules.map((mod) => toModuleInfo(commands, mod.name)));
|
|
33
|
+
const gitRemoteUrl = (await commands.showCmd.showGitRemoteUrl()) ?? null;
|
|
33
34
|
return {
|
|
34
35
|
name: project.name,
|
|
35
36
|
cardKeyPrefix: project.prefix,
|
|
37
|
+
description: project.description ?? '',
|
|
38
|
+
category: project.category ?? '',
|
|
36
39
|
modules: moduleDetails,
|
|
40
|
+
gitRemoteUrl,
|
|
37
41
|
};
|
|
38
42
|
});
|
|
39
43
|
}
|
|
40
44
|
export async function updateProject(commands, updates) {
|
|
41
|
-
const { name, cardKeyPrefix } = updates;
|
|
45
|
+
const { name, cardKeyPrefix, description, category, gitRemoteUrl } = updates;
|
|
42
46
|
await commands.atomic(async () => {
|
|
43
47
|
if (cardKeyPrefix) {
|
|
44
48
|
await commands.renameCmd.rename(cardKeyPrefix);
|
|
@@ -46,7 +50,16 @@ export async function updateProject(commands, updates) {
|
|
|
46
50
|
if (name) {
|
|
47
51
|
await commands.project.configuration.setProjectName(name);
|
|
48
52
|
}
|
|
53
|
+
if (description !== undefined) {
|
|
54
|
+
await commands.project.configuration.setDescription(description);
|
|
55
|
+
}
|
|
56
|
+
if (category !== undefined) {
|
|
57
|
+
await commands.project.configuration.setCategory(category);
|
|
58
|
+
}
|
|
49
59
|
}, 'Update project settings');
|
|
60
|
+
if (gitRemoteUrl !== undefined) {
|
|
61
|
+
await commands.editCmd.setGitRemoteUrl(gitRemoteUrl);
|
|
62
|
+
}
|
|
50
63
|
return getProject(commands);
|
|
51
64
|
}
|
|
52
65
|
export async function updateModule(commands, module) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/domain/project/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/domain/project/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { Hono } from 'hono';
|
|
14
14
|
import type { ProjectRegistry } from '../../project-registry.js';
|
|
15
|
-
export declare function createProjectsRouter(registry: ProjectRegistry): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
15
|
+
export declare function createProjectsRouter(registry: ProjectRegistry, multiProjectRoot?: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
@@ -11,9 +11,12 @@
|
|
|
11
11
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
12
|
*/
|
|
13
13
|
import { Hono } from 'hono';
|
|
14
|
-
import {
|
|
14
|
+
import { zValidator } from '../../middleware/zvalidator.js';
|
|
15
|
+
import { requireRole, getCurrentUser } from '../../middleware/auth.js';
|
|
15
16
|
import { UserRole } from '../../types.js';
|
|
16
|
-
|
|
17
|
+
import { createProjectSchema, cloneProjectSchema } from './schema.js';
|
|
18
|
+
import * as projectsService from './service.js';
|
|
19
|
+
export function createProjectsRouter(registry, multiProjectRoot) {
|
|
17
20
|
const router = new Hono();
|
|
18
21
|
/**
|
|
19
22
|
* @swagger
|
|
@@ -28,7 +31,67 @@ export function createProjectsRouter(registry) {
|
|
|
28
31
|
* description: Unauthorized
|
|
29
32
|
*/
|
|
30
33
|
router.get('/', requireRole(UserRole.Reader), (c) => {
|
|
31
|
-
return c.json(
|
|
34
|
+
return c.json({
|
|
35
|
+
projects: registry.list(),
|
|
36
|
+
canCreateProjects: !!multiProjectRoot,
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* @swagger
|
|
41
|
+
* /api/projects:
|
|
42
|
+
* post:
|
|
43
|
+
* summary: Create a new project
|
|
44
|
+
* description: Creates a new project on disk, initializes git, adds default hub
|
|
45
|
+
*/
|
|
46
|
+
router.post('/', requireRole(UserRole.Editor), zValidator('json', createProjectSchema), async (c) => {
|
|
47
|
+
if (!multiProjectRoot) {
|
|
48
|
+
return c.json({ error: 'Project creation is not available in single-project mode' }, 403);
|
|
49
|
+
}
|
|
50
|
+
const params = c.req.valid('json');
|
|
51
|
+
if (registry.has(params.prefix)) {
|
|
52
|
+
return c.json({ error: `Project with prefix '${params.prefix}' already exists` }, 409);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const result = await projectsService.createProject(registry, multiProjectRoot, params, getCurrentUser(c));
|
|
56
|
+
return c.json(result, 201);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return c.json({
|
|
60
|
+
error: error instanceof Error
|
|
61
|
+
? error.message
|
|
62
|
+
: 'Failed to create project',
|
|
63
|
+
}, 500);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* @swagger
|
|
68
|
+
* /api/projects/clone:
|
|
69
|
+
* post:
|
|
70
|
+
* summary: Clone a project from a git repository
|
|
71
|
+
* description: Clones a git repo and registers discovered projects
|
|
72
|
+
*/
|
|
73
|
+
router.post('/clone', requireRole(UserRole.Editor), zValidator('json', cloneProjectSchema), async (c) => {
|
|
74
|
+
if (!multiProjectRoot) {
|
|
75
|
+
return c.json({ error: 'Project cloning is not available in single-project mode' }, 403);
|
|
76
|
+
}
|
|
77
|
+
const { url } = c.req.valid('json');
|
|
78
|
+
try {
|
|
79
|
+
const result = await projectsService.cloneProject(registry, multiProjectRoot, url);
|
|
80
|
+
if (result.projects.length === 0) {
|
|
81
|
+
return c.json({
|
|
82
|
+
error: 'All projects in the cloned repository already exist',
|
|
83
|
+
skippedDuplicates: result.skippedDuplicates,
|
|
84
|
+
}, 409);
|
|
85
|
+
}
|
|
86
|
+
return c.json(result, 201);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
return c.json({
|
|
90
|
+
error: error instanceof Error
|
|
91
|
+
? error.message
|
|
92
|
+
: 'Failed to clone repository',
|
|
93
|
+
}, 500);
|
|
94
|
+
}
|
|
32
95
|
});
|
|
33
96
|
return router;
|
|
34
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/projects/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/projects/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Cyberismo
|
|
3
|
+
Copyright © Cyberismo Ltd and contributors 2026
|
|
4
|
+
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
+
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
+
the Free Software Foundation.
|
|
7
|
+
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
+
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
+
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
+
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
+
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
export declare const createProjectSchema: z.ZodObject<{
|
|
15
|
+
name: z.ZodString;
|
|
16
|
+
prefix: z.ZodString;
|
|
17
|
+
category: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
18
|
+
description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
export declare const cloneProjectSchema: z.ZodObject<{
|
|
21
|
+
url: z.ZodString;
|
|
22
|
+
}, z.core.$strip>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Cyberismo
|
|
3
|
+
Copyright © Cyberismo Ltd and contributors 2026
|
|
4
|
+
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
+
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
+
the Free Software Foundation.
|
|
7
|
+
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
+
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
+
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
+
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
+
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { Validate } from '@cyberismo/data-handler';
|
|
15
|
+
export const createProjectSchema = z.object({
|
|
16
|
+
name: z
|
|
17
|
+
.string()
|
|
18
|
+
.min(1, 'Project name is required')
|
|
19
|
+
.refine((s) => Validate.isValidProjectName(s), {
|
|
20
|
+
message: 'Invalid project name',
|
|
21
|
+
}),
|
|
22
|
+
prefix: z
|
|
23
|
+
.string()
|
|
24
|
+
.min(3, 'Prefix must be at least 3 characters')
|
|
25
|
+
.max(10, 'Prefix must be at most 10 characters')
|
|
26
|
+
.refine((s) => Validate.validatePrefix(s), {
|
|
27
|
+
message: 'Prefix must contain only lowercase letters',
|
|
28
|
+
}),
|
|
29
|
+
category: z.string().optional().default(''),
|
|
30
|
+
description: z.string().optional().default(''),
|
|
31
|
+
});
|
|
32
|
+
export const cloneProjectSchema = z.object({
|
|
33
|
+
url: z
|
|
34
|
+
.string()
|
|
35
|
+
.min(1, 'Repository URL is required')
|
|
36
|
+
.refine((s) => s.startsWith('https://') || s.startsWith('git@'), {
|
|
37
|
+
message: 'URL must start with https:// or git@',
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/domain/projects/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;QAC7C,OAAO,EAAE,sBAAsB;KAChC,CAAC;IACJ,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,sCAAsC,CAAC;SAC9C,GAAG,CAAC,EAAE,EAAE,sCAAsC,CAAC;SAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;QACzC,OAAO,EAAE,4CAA4C;KACtD,CAAC;IACJ,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CAC/C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QAC/D,OAAO,EAAE,sCAAsC;KAChD,CAAC;CACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Cyberismo
|
|
3
|
+
Copyright © Cyberismo Ltd and contributors 2026
|
|
4
|
+
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
+
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
+
the Free Software Foundation.
|
|
7
|
+
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
+
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
+
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
+
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
+
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
+
*/
|
|
13
|
+
import type { ProjectRegistry } from '../../project-registry.js';
|
|
14
|
+
export interface CreateProjectParams {
|
|
15
|
+
name: string;
|
|
16
|
+
prefix: string;
|
|
17
|
+
category?: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface CreateProjectResult {
|
|
21
|
+
prefix: string;
|
|
22
|
+
name: string;
|
|
23
|
+
category?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function createProject(registry: ProjectRegistry, rootPath: string, params: CreateProjectParams, user?: {
|
|
27
|
+
name: string;
|
|
28
|
+
email: string;
|
|
29
|
+
} | null): Promise<CreateProjectResult>;
|
|
30
|
+
export interface CloneProjectResult {
|
|
31
|
+
projects: {
|
|
32
|
+
prefix: string;
|
|
33
|
+
name: string;
|
|
34
|
+
}[];
|
|
35
|
+
skippedDuplicates?: string[];
|
|
36
|
+
}
|
|
37
|
+
export declare function cloneProject(registry: ProjectRegistry, rootPath: string, url: string): Promise<CloneProjectResult>;
|