@cyberismo/backend 0.0.23 → 0.0.25

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 (126) hide show
  1. package/dist/app.d.ts +3 -3
  2. package/dist/app.js +58 -29
  3. package/dist/app.js.map +1 -1
  4. package/dist/domain/cards/index.js +63 -1
  5. package/dist/domain/cards/index.js.map +1 -1
  6. package/dist/domain/cards/lib.js +7 -1
  7. package/dist/domain/cards/lib.js.map +1 -1
  8. package/dist/domain/cards/schema.d.ts +8 -0
  9. package/dist/domain/cards/schema.js +7 -0
  10. package/dist/domain/cards/schema.js.map +1 -1
  11. package/dist/domain/cards/service.d.ts +2 -0
  12. package/dist/domain/cards/service.js +18 -1
  13. package/dist/domain/cards/service.js.map +1 -1
  14. package/dist/domain/mcp/index.d.ts +8 -2
  15. package/dist/domain/mcp/index.js +68 -65
  16. package/dist/domain/mcp/index.js.map +1 -1
  17. package/dist/domain/project/service.js +1 -1
  18. package/dist/domain/project/service.js.map +1 -1
  19. package/dist/domain/projects/index.d.ts +15 -0
  20. package/dist/domain/projects/index.js +35 -0
  21. package/dist/domain/projects/index.js.map +1 -0
  22. package/dist/domain/resources/index.js +63 -1
  23. package/dist/domain/resources/index.js.map +1 -1
  24. package/dist/domain/resources/schema.d.ts +9 -0
  25. package/dist/domain/resources/schema.js +8 -1
  26. package/dist/domain/resources/schema.js.map +1 -1
  27. package/dist/domain/resources/service.d.ts +12 -0
  28. package/dist/domain/resources/service.js +49 -6
  29. package/dist/domain/resources/service.js.map +1 -1
  30. package/dist/export.d.ts +7 -3
  31. package/dist/export.js +32 -16
  32. package/dist/export.js.map +1 -1
  33. package/dist/index.d.ts +5 -4
  34. package/dist/index.js +4 -3
  35. package/dist/index.js.map +1 -1
  36. package/dist/main.js +41 -6
  37. package/dist/main.js.map +1 -1
  38. package/dist/middleware/auth.js +10 -0
  39. package/dist/middleware/auth.js.map +1 -1
  40. package/dist/middleware/commandManager.d.ts +12 -0
  41. package/dist/middleware/commandManager.js +33 -7
  42. package/dist/middleware/commandManager.js.map +1 -1
  43. package/dist/project-registry.d.ts +50 -0
  44. package/dist/project-registry.js +77 -0
  45. package/dist/project-registry.js.map +1 -0
  46. package/dist/public/THIRD-PARTY.txt +2899 -1974
  47. package/dist/public/assets/architecture-7EHR7CIX-BhpB9ddF.js +1 -0
  48. package/dist/public/assets/architectureDiagram-3BPJPVTR-BQYiU_EO.js +36 -0
  49. package/dist/public/assets/blockDiagram-GPEHLZMM-DuyikC3X.js +132 -0
  50. package/dist/public/assets/c4Diagram-AAUBKEIU-BG8_sPEr.js +10 -0
  51. package/dist/public/assets/channel-BxgB7fMy.js +1 -0
  52. package/dist/public/assets/chunk-2J33WTMH-vNq8B1aw.js +1 -0
  53. package/dist/public/assets/chunk-4BX2VUAB-DFDBsmSo.js +1 -0
  54. package/dist/public/assets/chunk-55IACEB6-DCVUQPWM.js +1 -0
  55. package/dist/public/assets/chunk-727SXJPM-C5ihZMyl.js +206 -0
  56. package/dist/public/assets/chunk-AQP2D5EJ-XGOtp2xP.js +231 -0
  57. package/dist/public/assets/chunk-FMBD7UC4-Da1lR6Mn.js +15 -0
  58. package/dist/public/assets/chunk-ND2GUHAM-ZOvpvr6K.js +1 -0
  59. package/dist/public/assets/chunk-QZHKN3VN-D33jzvFT.js +1 -0
  60. package/dist/public/assets/classDiagram-4FO5ZUOK-hWfZv7hZ.js +1 -0
  61. package/dist/public/assets/classDiagram-v2-Q7XG4LA2-hWfZv7hZ.js +1 -0
  62. package/dist/public/assets/cose-bilkent-S5V4N54A-DO4z-ix4.js +1 -0
  63. package/dist/public/assets/cytoscape.esm-C8YCVR3_.js +321 -0
  64. package/dist/public/assets/dagre-BM42HDAG-DlpRfzgA.js +4 -0
  65. package/dist/public/assets/dagre-Bx709z4p.js +1 -0
  66. package/dist/public/assets/diagram-2AECGRRQ-D-t_ImBP.js +43 -0
  67. package/dist/public/assets/diagram-5GNKFQAL-CBgUMlXz.js +10 -0
  68. package/dist/public/assets/diagram-KO2AKTUF-XoB2TgQt.js +3 -0
  69. package/dist/public/assets/diagram-LMA3HP47-D1Sbl_eS.js +24 -0
  70. package/dist/public/assets/diagram-OG6HWLK6-DKP4aiIY.js +24 -0
  71. package/dist/public/assets/erDiagram-TEJ5UH35-DYxfHOOK.js +85 -0
  72. package/dist/public/assets/eventmodeling-FCH6USID-cF_1Mq4g.js +1 -0
  73. package/dist/public/assets/flowDiagram-I6XJVG4X-BDHPsmlq.js +162 -0
  74. package/dist/public/assets/ganttDiagram-6RSMTGT7-bGgIvBPN.js +292 -0
  75. package/dist/public/assets/gitGraph-WXDBUCRP-DOFshjLy.js +1 -0
  76. package/dist/public/assets/gitGraphDiagram-PVQCEYII-xSwLjGd-.js +106 -0
  77. package/dist/public/assets/graphlib-B8gBHxth.js +1 -0
  78. package/dist/public/assets/index-DGPv1qic.js +1028 -0
  79. package/dist/public/assets/index-DvHiopvR.css +1 -0
  80. package/dist/public/assets/info-J43DQDTF-BuJNK7zQ.js +1 -0
  81. package/dist/public/assets/infoDiagram-5YYISTIA-BanxuIib.js +2 -0
  82. package/dist/public/assets/ishikawaDiagram-YF4QCWOH-DWNWYxz5.js +70 -0
  83. package/dist/public/assets/journeyDiagram-JHISSGLW-I58P5XNg.js +139 -0
  84. package/dist/public/assets/kanban-definition-UN3LZRKU-CMRWbDti.js +89 -0
  85. package/dist/public/assets/katex-C4eR7coU.js +257 -0
  86. package/dist/public/assets/mermaid-parser.core-Dz__fM3g.js +161 -0
  87. package/dist/public/assets/mindmap-definition-RKZ34NQL-C47gCcpC.js +96 -0
  88. package/dist/public/assets/packet-YPE3B663-Cczitw2-.js +1 -0
  89. package/dist/public/assets/pie-LRSECV5Y-rO-Aqx6h.js +1 -0
  90. package/dist/public/assets/pieDiagram-4H26LBE5-VZAxHzjD.js +30 -0
  91. package/dist/public/assets/quadrantDiagram-W4KKPZXB-BY8JORvE.js +7 -0
  92. package/dist/public/assets/radar-GUYGQ44K-SSIGuQjW.js +1 -0
  93. package/dist/public/assets/requirementDiagram-4Y6WPE33-XhNBeFwj.js +84 -0
  94. package/dist/public/assets/sankeyDiagram-5OEKKPKP-H7I2OESy.js +40 -0
  95. package/dist/public/assets/sequenceDiagram-3UESZ5HK-jnTLwq-X.js +162 -0
  96. package/dist/public/assets/stateDiagram-AJRCARHV-BKcf2bdX.js +1 -0
  97. package/dist/public/assets/stateDiagram-v2-BHNVJYJU-wpO0gnsG.js +1 -0
  98. package/dist/public/assets/timeline-definition-PNZ67QCA-BZbaBDRH.js +120 -0
  99. package/dist/public/assets/treeView-BLDUP644-DkGx4HkR.js +1 -0
  100. package/dist/public/assets/treemap-LRROVOQU-yCyuONQh.js +1 -0
  101. package/dist/public/assets/vennDiagram-CIIHVFJN-nY9Pep3o.js +34 -0
  102. package/dist/public/assets/wardley-L42UT6IY-CXWWFUgk.js +1 -0
  103. package/dist/public/assets/wardleyDiagram-YWT4CUSO-CM0yrkHd.js +78 -0
  104. package/dist/public/assets/xychartDiagram-2RQKCTM6-1ZAtqvyQ.js +7 -0
  105. package/dist/public/config.json +1 -0
  106. package/dist/public/index.html +2 -2
  107. package/package.json +11 -7
  108. package/src/app.ts +71 -31
  109. package/src/domain/cards/index.ts +73 -0
  110. package/src/domain/cards/lib.ts +8 -1
  111. package/src/domain/cards/schema.ts +9 -0
  112. package/src/domain/cards/service.ts +28 -2
  113. package/src/domain/mcp/index.ts +83 -78
  114. package/src/domain/project/service.ts +1 -1
  115. package/src/domain/projects/index.ts +39 -0
  116. package/src/domain/resources/index.ts +74 -0
  117. package/src/domain/resources/schema.ts +14 -0
  118. package/src/domain/resources/service.ts +52 -4
  119. package/src/export.ts +44 -21
  120. package/src/index.ts +6 -5
  121. package/src/main.ts +46 -6
  122. package/src/middleware/auth.ts +10 -0
  123. package/src/middleware/commandManager.ts +47 -9
  124. package/src/project-registry.ts +110 -0
  125. package/dist/public/assets/index-Cdn_jRWy.js +0 -720
  126. package/dist/public/assets/index-ypsafPwV.css +0 -1
package/dist/export.js CHANGED
@@ -18,14 +18,14 @@ import { cp, writeFile } from 'node:fs/promises';
18
18
  import { staticFrontendDirRelative } from './utils.js';
19
19
  import { toSSG } from 'hono/ssg';
20
20
  import { findAllCards, findRelevantAttachments, } from './domain/cards/service.js';
21
- let _cardQueryPromise = null;
21
+ const _cardQueryCache = new Map();
22
22
  const OVERHEAD_CALLS = 6; // estimated number of overhead calls during export in addition to card exports
23
23
  /**
24
24
  * DO NO USE DIRECTLY. This resets the callOnce map, allowing you to redo the export.
25
25
  * Also resets the card query promise.
26
26
  */
27
27
  export function reset() {
28
- _cardQueryPromise = null;
28
+ _cardQueryCache.clear();
29
29
  }
30
30
  /**
31
31
  * Get the card query result for a given card key. Should only be called during
@@ -35,11 +35,11 @@ export function reset() {
35
35
  * @returns The card query result for the given card key.
36
36
  */
37
37
  export async function getCardQueryResult(commands, cardKey) {
38
- if (!_cardQueryPromise) {
39
- // fetch all cards
40
- _cardQueryPromise = commands.calculateCmd.runQuery('card', 'exportedSite', {});
38
+ const prefix = commands.project.configuration.cardKeyPrefix;
39
+ if (!_cardQueryCache.has(prefix)) {
40
+ _cardQueryCache.set(prefix, commands.calculateCmd.runQuery('card', 'exportedSite', {}));
41
41
  }
42
- return _cardQueryPromise.then((results) => {
42
+ return _cardQueryCache.get(prefix).then((results) => {
43
43
  if (!cardKey) {
44
44
  return results;
45
45
  }
@@ -53,35 +53,47 @@ export async function getCardQueryResult(commands, cardKey) {
53
53
  /**
54
54
  * Export the site to a given directory.
55
55
  * Note: Do not call this function in parallel.
56
- * @param commands - CommandManager instance for the project.
56
+ * @param registry - ProjectRegistry holding all project CommandManagers.
57
57
  * @param exportDir - Directory to export to.
58
58
  * @param options - Export options.
59
59
  * @param options.recursive - Whether to export cards recursively.
60
60
  * @param options.cardKey - Key of the card to export. If not provided, all cards will be exported.
61
- * @param level - Log level for the operation.
61
+ * @param options.defaultProject - Default project prefix to write into config.json.
62
62
  * @param onProgress - Optional progress callback function.
63
63
  * @returns An object containing any errors that occurred during export.
64
64
  */
65
- export async function exportSite(commands, exportDir, options, onProgress) {
65
+ export async function exportSite(registry, exportDir, options, onProgress) {
66
66
  exportDir = exportDir || 'static';
67
+ const { defaultProject, ...treeOpts } = options ?? {};
67
68
  const opts = {
68
69
  recursive: false,
69
- cardKey: undefined,
70
- ...options,
70
+ ...treeOpts,
71
71
  };
72
- const app = createApp(new MockAuthProvider(), commands, opts);
72
+ if (defaultProject && !registry.has(defaultProject)) {
73
+ throw new Error(`Default project '${defaultProject}' is not in the registry. Available: ${registry
74
+ .list()
75
+ .map((p) => p.prefix)
76
+ .join(', ')}`);
77
+ }
78
+ const app = createApp(new MockAuthProvider(), registry, opts, true);
73
79
  // copy whole frontend to the same directory
74
80
  await cp(staticFrontendDirRelative, exportDir, { recursive: true });
75
81
  // read config file and change export to true
76
82
  const config = await readFile(path.join(exportDir, 'config.json'), 'utf-8');
77
83
  const configJson = JSON.parse(config);
78
84
  configJson.staticMode = true;
85
+ if (defaultProject) {
86
+ configJson.defaultProject = defaultProject;
87
+ }
79
88
  await writeFile(path.join(exportDir, 'config.json'), JSON.stringify(configJson));
80
89
  reset();
81
- // estimate total based on the number of cards to export
82
- const cards = await findAllCards(commands, opts);
83
- const attachments = await findRelevantAttachments(commands, opts);
84
- let total = cards.length + attachments.length + OVERHEAD_CALLS;
90
+ // estimate total based on the number of cards to export across all projects
91
+ let total = OVERHEAD_CALLS;
92
+ for (const commands of registry.values()) {
93
+ const cards = await findAllCards(commands, opts);
94
+ const attachments = await findRelevantAttachments(commands, opts);
95
+ total += cards.length + attachments.length;
96
+ }
85
97
  // Actual export with progress reporting
86
98
  let done = 0;
87
99
  onProgress?.(done, total);
@@ -97,6 +109,10 @@ export async function exportSite(commands, exportDir, options, onProgress) {
97
109
  if (url.pathname.startsWith('/mcp')) {
98
110
  return false;
99
111
  }
112
+ // Skip OIDC/well-known routes — not relevant for static export
113
+ if (url.pathname.startsWith('/.well-known')) {
114
+ return false;
115
+ }
100
116
  return req;
101
117
  },
102
118
  afterResponseHook: async (response) => {
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- import type { CommandManager } from '@cyberismo/data-handler';
2
1
  import type { AuthProvider } from './auth/types.js';
2
+ import type { ProjectRegistry } from './project-registry.js';
3
3
  export { MockAuthProvider } from './auth/mock.js';
4
4
  export type { MockUserConfig } from './auth/mock.js';
5
5
  export type { AuthProvider } from './auth/types.js';
6
- export { exportSite } from './export.js';
6
+ export { exportSite, type ExportSiteOptions } from './export.js';
7
+ export { ProjectRegistry } from './project-registry.js';
7
8
  /**
8
9
  * Preview the exported site
9
10
  * @param dir - Directory to preview
@@ -13,7 +14,7 @@ export declare function previewSite(dir: string, findPort?: boolean): Promise<vo
13
14
  /**
14
15
  * Start the server
15
16
  * @param authProvider - Authentication provider
16
- * @param commands - CommandManager instance for the project
17
+ * @param registry - ProjectRegistry holding all project CommandManagers
17
18
  * @param findPort - If true, find a free port
18
19
  */
19
- export declare function startServer(authProvider: AuthProvider, commands: CommandManager, findPort?: boolean): Promise<void>;
20
+ export declare function startServer(authProvider: AuthProvider, registry: ProjectRegistry, findPort?: boolean): Promise<void>;
package/dist/index.js CHANGED
@@ -19,6 +19,7 @@ import { findFreePort } from './utils.js';
19
19
  import { createApp } from './app.js';
20
20
  export { MockAuthProvider } from './auth/mock.js';
21
21
  export { exportSite } from './export.js';
22
+ export { ProjectRegistry } from './project-registry.js';
22
23
  const DEFAULT_PORT = 3000;
23
24
  const DEFAULT_MAX_PORT = DEFAULT_PORT + 100;
24
25
  /**
@@ -44,15 +45,15 @@ export async function previewSite(dir, findPort = true) {
44
45
  /**
45
46
  * Start the server
46
47
  * @param authProvider - Authentication provider
47
- * @param commands - CommandManager instance for the project
48
+ * @param registry - ProjectRegistry holding all project CommandManagers
48
49
  * @param findPort - If true, find a free port
49
50
  */
50
- export async function startServer(authProvider, commands, findPort = true) {
51
+ export async function startServer(authProvider, registry, findPort = true) {
51
52
  let port = parseInt(process.env.PORT || DEFAULT_PORT.toString(), 10);
52
53
  if (findPort) {
53
54
  port = await findFreePort(port, DEFAULT_MAX_PORT);
54
55
  }
55
- const app = createApp(authProvider, commands);
56
+ const app = createApp(authProvider, registry);
56
57
  startApp(app, port);
57
58
  }
58
59
  function startApp(app, port) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AACF,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,gBAAgB,GAAG,YAAY,GAAG,GAAG,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,WAAoB,IAAI;IACrE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACpC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CACX,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAErE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACpD,CAAC;IACD,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,YAA0B,EAC1B,QAAwB,EACxB,WAAoB,IAAI;IAExB,IAAI,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAErE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,QAAQ,CACf,GAAkB,EAClB,IAAY;IAEZ,KAAK,CACH;QACE,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW;KAC1C,EACD,CAAC,IAAI,EAAE,EAAE;QACP,OAAO,CAAC,GAAG,CAAC,6CAA6C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/main.js CHANGED
@@ -10,11 +10,13 @@
10
10
  details. 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 { CommandManager } from '@cyberismo/data-handler';
13
+ import { scanForProjects } from '@cyberismo/data-handler';
14
14
  import { startServer } from './index.js';
15
15
  import { exportSite } from './export.js';
16
16
  import { MockAuthProvider } from './auth/mock.js';
17
17
  import { KeycloakAuthProvider } from './auth/keycloak.js';
18
+ import { ProjectRegistry } from './project-registry.js';
19
+ import { parseArgs } from 'node:util';
18
20
  import dotenv from 'dotenv';
19
21
  // Load environment variables from .env file
20
22
  dotenv.config();
@@ -39,13 +41,46 @@ function createAuthProvider() {
39
41
  console.error(`Fatal: Unrecognized AUTH_MODE "${authMode}". Must be "mock" or "idp".`);
40
42
  process.exit(1);
41
43
  }
42
- const projectPath = process.env.npm_config_project_path || '';
43
- const commands = await CommandManager.getInstance(projectPath);
44
- if (process.argv.includes('--export')) {
45
- await exportSite(commands);
44
+ const projectPath = process.env.npm_config_project_path || process.cwd();
45
+ let projects;
46
+ try {
47
+ projects = await scanForProjects(projectPath);
48
+ }
49
+ catch (error) {
50
+ console.error(error instanceof Error
51
+ ? error.message
52
+ : `Failed to scan for projects in '${projectPath}'`);
53
+ process.exit(1);
54
+ }
55
+ const { values: args } = parseArgs({
56
+ options: {
57
+ export: { type: 'boolean', default: false },
58
+ 'default-project': { type: 'string' },
59
+ },
60
+ strict: false,
61
+ });
62
+ if (args.export) {
63
+ if (projects.length === 0) {
64
+ console.error('No projects found to export.');
65
+ process.exit(1);
66
+ }
67
+ const registry = await ProjectRegistry.fromScannedProjects(projects);
68
+ await exportSite(registry, undefined, {
69
+ defaultProject: typeof args['default-project'] === 'string'
70
+ ? args['default-project']
71
+ : undefined,
72
+ });
46
73
  }
47
74
  else {
75
+ if (projects.length === 0) {
76
+ console.error(`No projects found in "${projectPath}". Cannot start the server without at least one project.`);
77
+ process.exit(1);
78
+ }
79
+ const autocommit = process.env.CYBERISMO_AUTOCOMMIT === 'true';
80
+ const registry = await ProjectRegistry.fromScannedProjects(projects, {
81
+ autocommit,
82
+ });
48
83
  const authProvider = createAuthProvider();
49
- await startServer(authProvider, commands);
84
+ await startServer(authProvider, registry);
50
85
  }
51
86
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AACF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,4CAA4C;AAC5C,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAEvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CACX,4EAA4E,CAC7E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,IAAI,gBAAgB,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAE5C,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CACX,8FAA8F,CAC/F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,KAAK,CACX,kCAAkC,QAAQ,6BAA6B,CACxE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC;AAC9D,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;AAE/D,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;IACtC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;KAAM,CAAC;IACN,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,MAAM,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,16 @@ export function createAuthMiddleware(provider) {
27
27
  c.set('user', user);
28
28
  }
29
29
  else {
30
+ // RFC 9728 §5.1: include resource_metadata in WWW-Authenticate
31
+ // only for MCP routes, where the metadata document applies.
32
+ const issuer = process.env.OIDC_ISSUER;
33
+ if (issuer && c.req.path.startsWith('/mcp')) {
34
+ const origin = new URL(issuer).origin;
35
+ const resourceUrl = `${origin}/.well-known/oauth-protected-resource/mcp`;
36
+ return c.json({ error: 'Unauthorized' }, 401, {
37
+ 'WWW-Authenticate': `Bearer resource_metadata="${resourceUrl}"`,
38
+ });
39
+ }
30
40
  return c.json({ error: 'Unauthorized' }, 401);
31
41
  }
32
42
  await next();
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAIF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAUvC,MAAM,SAAS,GAA6B;IAC1C,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAsB;IAEtB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,CAAU,EAAE,WAAqB;IACvD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,WAAqB;IAC/C,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,CAAU;IACvC,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAIF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAUvC,MAAM,SAAS,GAA6B;IAC1C,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAsB;IAEtB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,+DAA+D;YAC/D,4DAA4D;YAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;YACvC,IAAI,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;gBACtC,MAAM,WAAW,GAAG,GAAG,MAAM,2CAA2C,CAAC;gBACzE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE;oBAC5C,kBAAkB,EAAE,6BAA6B,WAAW,GAAG;iBAChE,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,CAAU,EAAE,WAAqB;IACvD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,WAAqB;IAC/C,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,CAAU;IACvC,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;AAC/B,CAAC"}
@@ -11,10 +11,22 @@
11
11
  */
12
12
  import type { MiddlewareHandler } from 'hono';
13
13
  import type { CommandManager } from '@cyberismo/data-handler';
14
+ import type { ProjectRegistry } from '../project-registry.js';
14
15
  declare module 'hono' {
15
16
  interface ContextVariableMap {
16
17
  commands: CommandManager;
17
18
  projectPath: string;
19
+ registry: ProjectRegistry;
18
20
  }
19
21
  }
20
22
  export declare const attachCommandManager: (commands: CommandManager) => MiddlewareHandler;
23
+ /**
24
+ * Middleware that resolves the project from the registry and sets the
25
+ * CommandManager on context.
26
+ *
27
+ * @param registry - Project registry to look up projects.
28
+ * @param fixedPrefix - When provided, used instead of the `:prefix` route
29
+ * param. This is needed in export/SSG mode where routes are mounted at
30
+ * concrete paths (e.g. `/api/projects/decision/...`) with no dynamic param.
31
+ */
32
+ export declare const attachProjectRegistry: (registry: ProjectRegistry, fixedPrefix?: string) => MiddlewareHandler;
@@ -10,17 +10,43 @@
10
10
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
11
11
  */
12
12
  import { getCurrentUser } from './auth.js';
13
+ /**
14
+ * Set CommandManager on context and run the next handler as the authenticated user.
15
+ */
16
+ async function runWithCommands(c, commands, next) {
17
+ const user = getCurrentUser(c);
18
+ if (!user) {
19
+ throw new Error('CommandManager expects a user');
20
+ }
21
+ c.set('commands', commands);
22
+ c.set('projectPath', commands.project.basePath);
23
+ await commands.runAsAuthor({ name: user.name, email: user.email }, () => next());
24
+ }
25
+ // TODO: Remove once MCP is made project-scoped via attachProjectRegistry
13
26
  export const attachCommandManager = (commands) => {
27
+ return (c, next) => runWithCommands(c, commands, next);
28
+ };
29
+ /**
30
+ * Middleware that resolves the project from the registry and sets the
31
+ * CommandManager on context.
32
+ *
33
+ * @param registry - Project registry to look up projects.
34
+ * @param fixedPrefix - When provided, used instead of the `:prefix` route
35
+ * param. This is needed in export/SSG mode where routes are mounted at
36
+ * concrete paths (e.g. `/api/projects/decision/...`) with no dynamic param.
37
+ */
38
+ export const attachProjectRegistry = (registry, fixedPrefix) => {
14
39
  return async (c, next) => {
15
- c.set('commands', commands);
16
- c.set('projectPath', commands.project.basePath);
17
- const user = getCurrentUser(c);
18
- if (user) {
19
- await commands.runAsAuthor({ name: user.name, email: user.email }, () => next());
40
+ c.set('registry', registry);
41
+ const prefix = c.req.param('prefix') ?? fixedPrefix;
42
+ if (!prefix) {
43
+ return c.json({ error: 'Project prefix is required' }, 400);
20
44
  }
21
- else {
22
- throw new Error('CommandManager expects a user');
45
+ const commands = registry.get(prefix);
46
+ if (!commands) {
47
+ return c.json({ error: `Project '${prefix}' not found` }, 404);
23
48
  }
49
+ return runWithCommands(c, commands, next);
24
50
  };
25
51
  };
26
52
  //# sourceMappingURL=commandManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commandManager.js","sourceRoot":"","sources":["../../src/middleware/commandManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAIF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAU3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAAwB,EACL,EAAE;IACrB,OAAO,KAAK,EAAE,CAAU,EAAE,IAAI,EAAE,EAAE;QAChC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC5B,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CACtE,IAAI,EAAE,CACP,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"commandManager.js","sourceRoot":"","sources":["../../src/middleware/commandManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAIF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAY3C;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,CAAU,EACV,QAAwB,EACxB,IAAyB;IAEzB,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IACD,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CACtE,IAAI,EAAE,CACP,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAAwB,EACL,EAAE;IACrB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAAyB,EACzB,WAAoB,EACD,EAAE;IACrB,OAAO,KAAK,EAAE,CAAU,EAAE,IAAI,EAAE,EAAE;QAChC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,MAAM,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,50 @@
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 { CommandManager, type ProjectProvider } from '@cyberismo/data-handler';
14
+ export type ProjectRegistryEntry = {
15
+ prefix: string;
16
+ commands: CommandManager;
17
+ };
18
+ export type ProjectListItem = {
19
+ prefix: string;
20
+ name: string;
21
+ category?: string;
22
+ description?: string;
23
+ };
24
+ /** Minimal project descriptor returned by scanForProjects. */
25
+ export interface ScannedProject {
26
+ path: string;
27
+ prefix: string;
28
+ name: string;
29
+ }
30
+ export declare class ProjectRegistry implements ProjectProvider {
31
+ private projects;
32
+ constructor(entries?: ProjectRegistryEntry[]);
33
+ get(prefix: string): CommandManager | undefined;
34
+ has(prefix: string): boolean;
35
+ add(prefix: string, commands: CommandManager): void;
36
+ list(): ProjectListItem[];
37
+ /** Iterate over all registered CommandManagers. */
38
+ values(): IterableIterator<CommandManager>;
39
+ first(): CommandManager | undefined;
40
+ dispose(): void;
41
+ /**
42
+ * Create a single-project registry from a CommandManager.
43
+ * Used by export mode and tests where only one project is needed.
44
+ */
45
+ static fromCommandManager(commands: CommandManager): ProjectRegistry;
46
+ /**
47
+ * Build a registry from scanned project entries, initializing each CommandManager.
48
+ */
49
+ static fromScannedProjects(projects: ScannedProject[], options?: ConstructorParameters<typeof CommandManager>[1]): Promise<ProjectRegistry>;
50
+ }
@@ -0,0 +1,77 @@
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 { CommandManager } from '@cyberismo/data-handler';
14
+ export class ProjectRegistry {
15
+ projects = new Map();
16
+ constructor(entries = []) {
17
+ for (const entry of entries) {
18
+ this.add(entry.prefix, entry.commands);
19
+ }
20
+ }
21
+ get(prefix) {
22
+ return this.projects.get(prefix);
23
+ }
24
+ has(prefix) {
25
+ return this.projects.has(prefix);
26
+ }
27
+ add(prefix, commands) {
28
+ if (this.projects.has(prefix)) {
29
+ throw new Error(`Project '${prefix}' is already registered`);
30
+ }
31
+ this.projects.set(prefix, commands);
32
+ }
33
+ list() {
34
+ return Array.from(this.projects.entries()).map(([prefix, commands]) => ({
35
+ prefix,
36
+ name: commands.project.configuration.name,
37
+ category: commands.project.configuration.category || undefined,
38
+ description: commands.project.configuration.description || undefined,
39
+ }));
40
+ }
41
+ /** Iterate over all registered CommandManagers. */
42
+ values() {
43
+ return this.projects.values();
44
+ }
45
+ first() {
46
+ const [first] = this.projects.values();
47
+ return first;
48
+ }
49
+ dispose() {
50
+ for (const commands of this.projects.values()) {
51
+ commands.project.dispose();
52
+ }
53
+ this.projects.clear();
54
+ }
55
+ /**
56
+ * Create a single-project registry from a CommandManager.
57
+ * Used by export mode and tests where only one project is needed.
58
+ */
59
+ static fromCommandManager(commands) {
60
+ return new ProjectRegistry([
61
+ { prefix: commands.project.configuration.cardKeyPrefix, commands },
62
+ ]);
63
+ }
64
+ /**
65
+ * Build a registry from scanned project entries, initializing each CommandManager.
66
+ */
67
+ static async fromScannedProjects(projects, options) {
68
+ const entries = [];
69
+ for (const project of projects) {
70
+ const commands = new CommandManager(project.path, options);
71
+ await commands.initialize();
72
+ entries.push({ prefix: project.prefix, commands });
73
+ }
74
+ return new ProjectRegistry(entries);
75
+ }
76
+ }
77
+ //# sourceMappingURL=project-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-registry.js","sourceRoot":"","sources":["../src/project-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAWE;AAEF,OAAO,EAAE,cAAc,EAAwB,MAAM,yBAAyB,CAAC;AAqB/E,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE1D,YAAY,UAAkC,EAAE;QAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,MAAc,EAAE,QAAwB;QAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,yBAAyB,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YACtE,MAAM;YACN,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI;YACzC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,IAAI,SAAS;YAC9D,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,IAAI,SAAS;SACrE,CAAC,CAAC,CAAC;IACN,CAAC;IAED,mDAAmD;IACnD,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,KAAK;QACH,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAwB;QAChD,OAAO,IAAI,eAAe,CAAC;YACzB,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,EAAE,QAAQ,EAAE;SACnE,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAC9B,QAA0B,EAC1B,OAAyD;QAEzD,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;CACF"}