bmad-studio 0.2.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +163 -17
  2. package/package.json +12 -3
  3. package/packages/client/dist/assets/index-81ZKe-R8.css +1 -0
  4. package/packages/client/dist/assets/index-DyjtzhqN.js +641 -0
  5. package/packages/client/dist/index.html +2 -2
  6. package/packages/server/dist/app.d.ts +2 -1
  7. package/packages/server/dist/app.d.ts.map +1 -1
  8. package/packages/server/dist/app.js +68 -3
  9. package/packages/server/dist/app.js.map +1 -1
  10. package/packages/server/dist/core/file-store.d.ts +8 -1
  11. package/packages/server/dist/core/file-store.d.ts.map +1 -1
  12. package/packages/server/dist/core/file-store.js +26 -3
  13. package/packages/server/dist/core/file-store.js.map +1 -1
  14. package/packages/server/dist/core/ide-skill-generator.d.ts +58 -0
  15. package/packages/server/dist/core/ide-skill-generator.d.ts.map +1 -0
  16. package/packages/server/dist/core/ide-skill-generator.js +270 -0
  17. package/packages/server/dist/core/ide-skill-generator.js.map +1 -0
  18. package/packages/server/dist/core/ide-skill-generator.test.d.ts +2 -0
  19. package/packages/server/dist/core/ide-skill-generator.test.d.ts.map +1 -0
  20. package/packages/server/dist/core/ide-skill-generator.test.js +257 -0
  21. package/packages/server/dist/core/ide-skill-generator.test.js.map +1 -0
  22. package/packages/server/dist/core/module-installer.d.ts +165 -0
  23. package/packages/server/dist/core/module-installer.d.ts.map +1 -0
  24. package/packages/server/dist/core/module-installer.js +445 -0
  25. package/packages/server/dist/core/module-installer.js.map +1 -0
  26. package/packages/server/dist/core/module-installer.test.d.ts +2 -0
  27. package/packages/server/dist/core/module-installer.test.d.ts.map +1 -0
  28. package/packages/server/dist/core/module-installer.test.js +509 -0
  29. package/packages/server/dist/core/module-installer.test.js.map +1 -0
  30. package/packages/server/dist/core/module-registry.d.ts +5 -0
  31. package/packages/server/dist/core/module-registry.d.ts.map +1 -0
  32. package/packages/server/dist/core/module-registry.js +109 -0
  33. package/packages/server/dist/core/module-registry.js.map +1 -0
  34. package/packages/server/dist/core/module-registry.test.d.ts +2 -0
  35. package/packages/server/dist/core/module-registry.test.d.ts.map +1 -0
  36. package/packages/server/dist/core/module-registry.test.js +280 -0
  37. package/packages/server/dist/core/module-registry.test.js.map +1 -0
  38. package/packages/server/dist/core/write-service.d.ts +20 -0
  39. package/packages/server/dist/core/write-service.d.ts.map +1 -1
  40. package/packages/server/dist/core/write-service.js +113 -1
  41. package/packages/server/dist/core/write-service.js.map +1 -1
  42. package/packages/server/dist/core/write-service.test.js +93 -6
  43. package/packages/server/dist/core/write-service.test.js.map +1 -1
  44. package/packages/server/dist/index.js +85 -1
  45. package/packages/server/dist/index.js.map +1 -1
  46. package/packages/server/dist/parsers/module-yaml-parser.d.ts +16 -0
  47. package/packages/server/dist/parsers/module-yaml-parser.d.ts.map +1 -0
  48. package/packages/server/dist/parsers/module-yaml-parser.js +62 -0
  49. package/packages/server/dist/parsers/module-yaml-parser.js.map +1 -0
  50. package/packages/server/dist/parsers/module-yaml-parser.test.d.ts +2 -0
  51. package/packages/server/dist/parsers/module-yaml-parser.test.d.ts.map +1 -0
  52. package/packages/server/dist/parsers/module-yaml-parser.test.js +156 -0
  53. package/packages/server/dist/parsers/module-yaml-parser.test.js.map +1 -0
  54. package/packages/server/dist/parsers/skill-parser.d.ts.map +1 -1
  55. package/packages/server/dist/parsers/skill-parser.js +41 -4
  56. package/packages/server/dist/parsers/skill-parser.js.map +1 -1
  57. package/packages/server/dist/parsers/skill-parser.test.js +4 -3
  58. package/packages/server/dist/parsers/skill-parser.test.js.map +1 -1
  59. package/packages/server/dist/plugins/agents-plugin.d.ts.map +1 -1
  60. package/packages/server/dist/plugins/agents-plugin.js +60 -1
  61. package/packages/server/dist/plugins/agents-plugin.js.map +1 -1
  62. package/packages/server/dist/plugins/commands-plugin.d.ts.map +1 -1
  63. package/packages/server/dist/plugins/commands-plugin.js +37 -10
  64. package/packages/server/dist/plugins/commands-plugin.js.map +1 -1
  65. package/packages/server/dist/plugins/datasources-plugin.d.ts.map +1 -1
  66. package/packages/server/dist/plugins/datasources-plugin.js +101 -0
  67. package/packages/server/dist/plugins/datasources-plugin.js.map +1 -1
  68. package/packages/server/dist/plugins/modules-plugin.d.ts.map +1 -1
  69. package/packages/server/dist/plugins/modules-plugin.js +905 -100
  70. package/packages/server/dist/plugins/modules-plugin.js.map +1 -1
  71. package/packages/server/dist/plugins/modules-plugin.test.js +1894 -3
  72. package/packages/server/dist/plugins/modules-plugin.test.js.map +1 -1
  73. package/packages/server/dist/plugins/outputs-plugin.d.ts.map +1 -1
  74. package/packages/server/dist/plugins/outputs-plugin.js +111 -0
  75. package/packages/server/dist/plugins/outputs-plugin.js.map +1 -1
  76. package/packages/server/dist/plugins/overview-plugin.d.ts.map +1 -1
  77. package/packages/server/dist/plugins/overview-plugin.js +35 -2
  78. package/packages/server/dist/plugins/overview-plugin.js.map +1 -1
  79. package/packages/server/dist/plugins/search-plugin.d.ts.map +1 -1
  80. package/packages/server/dist/plugins/search-plugin.js +19 -2
  81. package/packages/server/dist/plugins/search-plugin.js.map +1 -1
  82. package/packages/server/dist/plugins/settings-plugin.d.ts.map +1 -1
  83. package/packages/server/dist/plugins/settings-plugin.js +38 -1
  84. package/packages/server/dist/plugins/settings-plugin.js.map +1 -1
  85. package/packages/server/dist/plugins/settings-plugin.test.js +72 -0
  86. package/packages/server/dist/plugins/settings-plugin.test.js.map +1 -1
  87. package/packages/server/dist/plugins/teams-plugin.d.ts.map +1 -1
  88. package/packages/server/dist/plugins/teams-plugin.js +6 -6
  89. package/packages/server/dist/plugins/teams-plugin.js.map +1 -1
  90. package/packages/server/dist/plugins/teams-plugin.test.js +43 -0
  91. package/packages/server/dist/plugins/teams-plugin.test.js.map +1 -1
  92. package/packages/server/dist/plugins/workflows-plugin.d.ts.map +1 -1
  93. package/packages/server/dist/plugins/workflows-plugin.js +14 -6
  94. package/packages/server/dist/plugins/workflows-plugin.js.map +1 -1
  95. package/packages/shared/src/config.ts +26 -0
  96. package/packages/shared/src/events.ts +7 -0
  97. package/packages/shared/src/index.ts +13 -0
  98. package/packages/shared/src/modules.ts +42 -0
  99. package/packages/shared/src/registry.ts +26 -0
  100. package/packages/shared/src/types.test.ts +37 -1
  101. package/packages/shared/src/workflows.ts +27 -0
  102. package/packages/client/dist/assets/index-5nXyrx_3.css +0 -1
  103. package/packages/client/dist/assets/index-DxN3uabX.js +0 -521
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>BMAD Studio</title>
7
- <script type="module" crossorigin src="/assets/index-DxN3uabX.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-5nXyrx_3.css">
7
+ <script type="module" crossorigin src="/assets/index-DyjtzhqN.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-81ZKe-R8.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -1,6 +1,7 @@
1
1
  import Fastify from 'fastify';
2
2
  import type { FastifyServerOptions } from 'fastify';
3
- import type { ProjectDetectionResult } from './core/project-detector.js';
3
+ import { type ProjectDetectionResult } from './core/project-detector.js';
4
+ export declare const MAX_MODULE_UPLOAD_BYTES: number;
4
5
  type CreateAppOptions = {
5
6
  logger?: FastifyServerOptions['logger'];
6
7
  serveStatic?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAmBnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAExE,KAAK,gBAAgB,GAAG;IACtB,MAAM,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IACvC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAA;CACxC,CAAA;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,4NA0E7D"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAmBnD,OAAO,EAAiB,KAAK,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAIvF,eAAO,MAAM,uBAAuB,QAAmB,CAAA;AAEvD,KAAK,gBAAgB,GAAG;IACtB,MAAM,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IACvC,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAA;CACxC,CAAA;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,4NA6I7D"}
@@ -1,6 +1,8 @@
1
+ import path from 'node:path';
2
+ import multipart from '@fastify/multipart';
1
3
  import Fastify from 'fastify';
2
4
  import { registerStatic } from './static.js';
3
- import { registerFileStore } from './core/file-store.js';
5
+ import { registerFileStore, createFileStore } from './core/file-store.js';
4
6
  import { registerWebSocket } from './core/websocket.js';
5
7
  import { AppError } from './core/errors.js';
6
8
  import { overviewPlugin } from './plugins/overview-plugin.js';
@@ -16,6 +18,10 @@ import { modulesPlugin } from './plugins/modules-plugin.js';
16
18
  import { teamsPlugin } from './plugins/teams-plugin.js';
17
19
  import { commandsPlugin } from './plugins/commands-plugin.js';
18
20
  import { datasourcesPlugin } from './plugins/datasources-plugin.js';
21
+ import { detectProject } from './core/project-detector.js';
22
+ // Bump this constant if a real registry module exceeds the limit. Local-tool default —
23
+ // not security-critical. See finding #17 / spec §6.1 for the rationale.
24
+ export const MAX_MODULE_UPLOAD_BYTES = 50 * 1024 * 1024; // 50 MB
19
25
  export async function createApp(options = {}) {
20
26
  const app = Fastify({
21
27
  logger: options.logger ?? true,
@@ -43,11 +49,12 @@ export async function createApp(options = {}) {
43
49
  });
44
50
  // Project status endpoint
45
51
  const project = options.project;
52
+ const projectRoot = project?.projectRoot ?? undefined;
46
53
  const projectStatus = project
47
54
  ? {
48
55
  detected: true,
49
56
  bmadVersion: project.bmadVersion ?? undefined,
50
- projectRoot: project.projectRoot,
57
+ projectRoot,
51
58
  modules: project.modules.map((m) => m.name),
52
59
  ideDirectories: project.ideDirectories,
53
60
  }
@@ -56,9 +63,67 @@ export async function createApp(options = {}) {
56
63
  modules: [],
57
64
  ideDirectories: [],
58
65
  };
59
- app.get('/api/project', async () => projectStatus);
66
+ // Mutable project status updated on switch
67
+ let currentProjectStatus = { ...projectStatus };
68
+ let currentProjectRoot = projectRoot;
69
+ // Expose name/path fields alongside the full project status for the Sidebar project switcher
70
+ app.get('/api/project', async () => ({
71
+ ...currentProjectStatus,
72
+ name: currentProjectRoot ? path.basename(currentProjectRoot) : null,
73
+ path: currentProjectRoot ?? null,
74
+ }));
75
+ // Story 28.1: Project switch endpoint
76
+ app.post('/api/project/switch', async (request) => {
77
+ const targetPath = request.body?.path;
78
+ if (!targetPath)
79
+ throw Object.assign(new Error('Missing project path'), { statusCode: 400 });
80
+ // Validate the target is a BMAD project
81
+ const detected = detectProject(targetPath);
82
+ if (!detected)
83
+ throw Object.assign(new Error(`No BMAD project found at: ${targetPath}`), { statusCode: 404 });
84
+ // Check no writes in progress
85
+ const holder = app.fileStoreHolder;
86
+ if (holder?.current && holder.current.pendingWrites.size > 0) {
87
+ throw Object.assign(new Error('Cannot switch while file writes are in progress'), { statusCode: 409 });
88
+ }
89
+ // Teardown old store
90
+ if (holder?.current) {
91
+ await holder.current.close();
92
+ holder.current = null;
93
+ }
94
+ // Initialize new store
95
+ const newStore = await createFileStore(app, detected.projectRoot);
96
+ holder.current = newStore;
97
+ // Update mutable project status
98
+ currentProjectRoot = detected.projectRoot;
99
+ currentProjectStatus = {
100
+ detected: true,
101
+ bmadVersion: detected.bmadVersion ?? undefined,
102
+ projectRoot: detected.projectRoot,
103
+ modules: detected.modules.map((m) => m.name),
104
+ ideDirectories: detected.ideDirectories,
105
+ };
106
+ // Story 28.2: Broadcast switch event
107
+ if (app.ws) {
108
+ app.ws.broadcast({
109
+ type: 'project:switched',
110
+ projectName: path.basename(detected.projectRoot),
111
+ projectRoot: detected.projectRoot,
112
+ });
113
+ }
114
+ return {
115
+ ...currentProjectStatus,
116
+ name: path.basename(detected.projectRoot),
117
+ path: detected.projectRoot,
118
+ };
119
+ });
60
120
  // Register WebSocket support
61
121
  await registerWebSocket(app);
122
+ // Register multipart support BEFORE any plugin that uses request.file()
123
+ // (modulesPlugin's POST /api/modules/install/upload route — Story 15.4).
124
+ await app.register(multipart, {
125
+ limits: { fileSize: MAX_MODULE_UPLOAD_BYTES },
126
+ });
62
127
  // Register file store if project detected
63
128
  if (project) {
64
129
  await registerFileStore(app, project.projectRoot);
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ export type FileStoreOptions = {
13
13
  };
14
14
  export declare class FileStore {
15
15
  private index;
16
- private pendingWrites;
16
+ readonly pendingWrites: Set<string>;
17
17
  private batchedEvents;
18
18
  private batchTimer;
19
19
  private watcher;
@@ -31,9 +31,16 @@ export declare class FileStore {
31
31
  rebuild(): void;
32
32
  close(): Promise<void>;
33
33
  }
34
+ export type FileStoreHolder = {
35
+ current: FileStore | null;
36
+ };
37
+ export declare function createFileStore(app: FastifyInstance, projectRoot: string): Promise<FileStore>;
34
38
  export declare function registerFileStore(app: FastifyInstance, projectRoot: string): Promise<void>;
39
+ /** Get the active FileStore or throw 503 if unavailable (switching/no project) */
40
+ export declare function getFileStore(app: FastifyInstance): FileStore;
35
41
  declare module 'fastify' {
36
42
  interface FastifyInstance {
43
+ fileStoreHolder: FileStoreHolder;
37
44
  fileStore: FileStore;
38
45
  }
39
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/core/file-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAc9D,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,YAAY,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,IAAI,CAAA;CACpD,CAAA;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,OAAO,CAAwC;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,OAAO,CAAC,aAAa,CAAC,CAAqC;gBAE/C,OAAO,EAAE,gBAAgB;IAiB/B,UAAU;IAoBhB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,YAAY;IAcpB,gBAAgB,CAAC,QAAQ,EAAE,MAAM;IAOjC,iBAAiB,CAAC,QAAQ,EAAE,MAAM;IAIlC,QAAQ,IAAI,WAAW;IAIvB,OAAO;IAKD,KAAK;CAUZ;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBA8BhF;AAED,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,SAAS,EAAE,SAAS,CAAA;KACrB;CACF"}
1
+ {"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/core/file-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAc9D,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,YAAY,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,IAAI,CAAA;CACpD,CAAA;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAa;IAC1B,QAAQ,CAAC,aAAa,cAAoB;IAC1C,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,OAAO,CAAwC;IACvD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,OAAO,CAAC,aAAa,CAAC,CAAqC;gBAE/C,OAAO,EAAE,gBAAgB;IAiB/B,UAAU;IAoBhB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,YAAY;IAcpB,gBAAgB,CAAC,QAAQ,EAAE,MAAM;IAOjC,iBAAiB,CAAC,QAAQ,EAAE,MAAM;IAIlC,QAAQ,IAAI,WAAW;IAIvB,OAAO;IAKD,KAAK;CAUZ;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,CAAA;AAE3D,wBAAsB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAyBnG;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAmBhF;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,SAAS,CAI5D;AAED,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,eAAe;QACvB,eAAe,EAAE,eAAe,CAAA;QAChC,SAAS,EAAE,SAAS,CAAA;KACrB;CACF"}
@@ -133,7 +133,7 @@ export class FileStore {
133
133
  }
134
134
  }
135
135
  }
136
- export async function registerFileStore(app, projectRoot) {
136
+ export async function createFileStore(app, projectRoot) {
137
137
  const studioDir = path.join(projectRoot, '.bmad-studio');
138
138
  const store = new FileStore({
139
139
  projectRoot,
@@ -152,9 +152,32 @@ export async function registerFileStore(app, projectRoot) {
152
152
  },
153
153
  });
154
154
  await store.initialize();
155
- app.decorate('fileStore', store);
155
+ return store;
156
+ }
157
+ export async function registerFileStore(app, projectRoot) {
158
+ const store = await createFileStore(app, projectRoot);
159
+ const holder = { current: store };
160
+ app.decorate('fileStoreHolder', holder);
161
+ // Backwards-compat getter so 'fileStore' in app and app.fileStore still work
162
+ app.decorate('fileStore', {
163
+ getter() {
164
+ if (!holder.current)
165
+ throw Object.assign(new Error('No project loaded'), { statusCode: 503 });
166
+ return holder.current;
167
+ },
168
+ });
156
169
  app.addHook('onClose', async () => {
157
- await store.close();
170
+ if (holder.current) {
171
+ await holder.current.close();
172
+ holder.current = null;
173
+ }
158
174
  });
159
175
  }
176
+ /** Get the active FileStore or throw 503 if unavailable (switching/no project) */
177
+ export function getFileStore(app) {
178
+ const store = app.fileStoreHolder?.current;
179
+ if (!store)
180
+ throw Object.assign(new Error('No project loaded'), { statusCode: 503 });
181
+ return store;
182
+ }
160
183
  //# sourceMappingURL=file-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/core/file-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/core/file-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { ModuleManifestFile } from '@bmad-studio/shared';
2
+ import type { FileStore } from './file-store.js';
3
+ export type SupportedIde = 'claude-code' | 'antigravity';
4
+ export type GeneratedSkill = {
5
+ skillName: string;
6
+ skillDir: string;
7
+ };
8
+ export type GenerateResult = {
9
+ ok: true;
10
+ skillsByIde: Record<string, GeneratedSkill[]>;
11
+ } | {
12
+ ok: false;
13
+ error: string;
14
+ };
15
+ /**
16
+ * Generate launcher SKILL.md files for every agent / workflow / task in the
17
+ * installed module. Idempotent — calling repeatedly with no source changes
18
+ * produces byte-identical files and skips redundant writes.
19
+ *
20
+ * Reads `manifest.ides[]` to decide which IDEs to target. Unknown entries are
21
+ * silently filtered. Returns `{ ok: true, skillsByIde: {} }` (no-op) if no
22
+ * supported IDEs are configured.
23
+ *
24
+ * Story 15.6 ships INSTALL HALF ONLY. The matching `removeIdeSkillsForModule`
25
+ * lands in Story 15.7 (which also adds `WriteService.deleteDirectory`, the
26
+ * prerequisite that this story does not depend on).
27
+ */
28
+ export declare function generateIdeSkillsForModule(projectRoot: string, moduleCode: string, manifest: ModuleManifestFile, studioDir: string, fileStore: FileStore): GenerateResult;
29
+ export type RemoveResult = {
30
+ ok: true;
31
+ removedByIde: Record<string, string[]>;
32
+ } | {
33
+ ok: false;
34
+ error: string;
35
+ };
36
+ /**
37
+ * Remove IDE skill directories for a module across every IDE configured in
38
+ * `manifest.ides[]`. Uses a two-pass strategy to avoid cross-module collisions:
39
+ *
40
+ * Pass 1 — exact match: scan the live module dir to build the set of skill names
41
+ * that `generateIdeSkillsForModule` would produce. These are deleted unconditionally.
42
+ *
43
+ * Pass 2 — orphan cleanup: also remove prefix-matched dirs that were generated for
44
+ * this module but whose source entity no longer exists (e.g. an agent was manually
45
+ * deleted). A prefix match is only acted on when no OTHER installed module claims the
46
+ * same skill name — this prevents removing `bmad-agent-foo-bar-*` when the caller
47
+ * is removing module `foo` (which is a prefix of `foo-bar`).
48
+ *
49
+ * Every removed directory goes through `WriteService.deleteDirectory` so text files
50
+ * inside are snapshotted to `.bmad-studio/history/` before unlink.
51
+ *
52
+ * Returns `{ ok: true, removedByIde: { <ide>: [] } }` for any IDE whose skills
53
+ * directory does not exist (no-op, not an error).
54
+ */
55
+ export declare function removeIdeSkillsForModule(projectRoot: string, moduleCode: string, manifest: ModuleManifestFile, studioDir: string): RemoveResult;
56
+ export declare function scanEntities(dir: string, ext: string): string[];
57
+ export declare function scanEntityDirs(dir: string): string[];
58
+ //# sourceMappingURL=ide-skill-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide-skill-generator.d.ts","sourceRoot":"","sources":["../../src/core/ide-skill-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAK7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGhD,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,aAAa,CAAA;AAOxD,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAA;CAAE,GAC3D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhC;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,SAAS,GACnB,cAAc,CAiFhB;AAMD,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,GACpD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,MAAM,GAChB,YAAY,CAsEd;AAMD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAMpD"}
@@ -0,0 +1,270 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parseAgent } from '../parsers/agent-parser.js'; // TD-18 — reuse the canonical parser
4
+ import { parseWorkflow } from '../parsers/workflow-parser.js'; // TD-18
5
+ import { writeFile, deleteDirectory } from './write-service.js';
6
+ const IDE_OUTPUT_DIRS = {
7
+ 'claude-code': '.claude/skills',
8
+ antigravity: '.antigravity/skills',
9
+ };
10
+ /**
11
+ * Generate launcher SKILL.md files for every agent / workflow / task in the
12
+ * installed module. Idempotent — calling repeatedly with no source changes
13
+ * produces byte-identical files and skips redundant writes.
14
+ *
15
+ * Reads `manifest.ides[]` to decide which IDEs to target. Unknown entries are
16
+ * silently filtered. Returns `{ ok: true, skillsByIde: {} }` (no-op) if no
17
+ * supported IDEs are configured.
18
+ *
19
+ * Story 15.6 ships INSTALL HALF ONLY. The matching `removeIdeSkillsForModule`
20
+ * lands in Story 15.7 (which also adds `WriteService.deleteDirectory`, the
21
+ * prerequisite that this story does not depend on).
22
+ */
23
+ export function generateIdeSkillsForModule(projectRoot, moduleCode, manifest, studioDir, fileStore) {
24
+ const ides = (manifest.ides ?? []).filter((ide) => ide === 'claude-code' || ide === 'antigravity');
25
+ if (ides.length === 0) {
26
+ return { ok: true, skillsByIde: {} };
27
+ }
28
+ const moduleDir = path.join(projectRoot, '_bmad', moduleCode);
29
+ const agents = scanEntities(path.join(moduleDir, 'agents'), '.md');
30
+ const workflows = scanEntityDirs(path.join(moduleDir, 'workflows'));
31
+ const tasks = scanEntityDirs(path.join(moduleDir, 'tasks'));
32
+ const result = {};
33
+ for (const ide of ides) {
34
+ const ideOutputDir = path.join(projectRoot, IDE_OUTPUT_DIRS[ide]);
35
+ fs.mkdirSync(ideOutputDir, { recursive: true });
36
+ const generated = [];
37
+ // Agents
38
+ for (const agentFile of agents) {
39
+ const agentName = path.basename(agentFile, '.md');
40
+ const skillName = `bmad-agent-${moduleCode}-${agentName}`;
41
+ const skillDir = path.join(ideOutputDir, skillName);
42
+ const description = readAgentDescription(agentFile) ?? `BMAD ${agentName} agent from ${moduleCode}`;
43
+ const content = renderSkillMd({
44
+ skillName,
45
+ description,
46
+ targetType: 'agent',
47
+ targetPath: agentFile,
48
+ });
49
+ const r = writeSkillFile(skillDir, content, studioDir, fileStore);
50
+ if (!r.ok)
51
+ return r;
52
+ generated.push({ skillName, skillDir });
53
+ }
54
+ // Workflows
55
+ for (const workflowDir of workflows) {
56
+ const workflowName = path.basename(workflowDir);
57
+ const workflowFile = findWorkflowFile(workflowDir);
58
+ if (!workflowFile)
59
+ continue;
60
+ const skillName = `bmad-${moduleCode}-${workflowName}`;
61
+ const skillDir = path.join(ideOutputDir, skillName);
62
+ const description = readWorkflowDescription(workflowFile) ?? `BMAD ${workflowName} workflow from ${moduleCode}`;
63
+ const content = renderSkillMd({
64
+ skillName,
65
+ description,
66
+ targetType: 'workflow',
67
+ targetPath: workflowFile,
68
+ });
69
+ const r = writeSkillFile(skillDir, content, studioDir, fileStore);
70
+ if (!r.ok)
71
+ return r;
72
+ generated.push({ skillName, skillDir });
73
+ }
74
+ // Tasks (each task is its own directory)
75
+ for (const taskDir of tasks) {
76
+ const taskName = path.basename(taskDir);
77
+ const skillName = `bmad-${moduleCode}-${taskName}`;
78
+ const skillDir = path.join(ideOutputDir, skillName);
79
+ // Tasks have no dedicated parser — use the directory name as the description fallback.
80
+ const description = `BMAD ${taskName} task from ${moduleCode}`;
81
+ const content = renderSkillMd({
82
+ skillName,
83
+ description,
84
+ targetType: 'task',
85
+ targetPath: taskDir,
86
+ });
87
+ const r = writeSkillFile(skillDir, content, studioDir, fileStore);
88
+ if (!r.ok)
89
+ return r;
90
+ generated.push({ skillName, skillDir });
91
+ }
92
+ result[ide] = generated;
93
+ }
94
+ return { ok: true, skillsByIde: result };
95
+ }
96
+ /**
97
+ * Remove IDE skill directories for a module across every IDE configured in
98
+ * `manifest.ides[]`. Uses a two-pass strategy to avoid cross-module collisions:
99
+ *
100
+ * Pass 1 — exact match: scan the live module dir to build the set of skill names
101
+ * that `generateIdeSkillsForModule` would produce. These are deleted unconditionally.
102
+ *
103
+ * Pass 2 — orphan cleanup: also remove prefix-matched dirs that were generated for
104
+ * this module but whose source entity no longer exists (e.g. an agent was manually
105
+ * deleted). A prefix match is only acted on when no OTHER installed module claims the
106
+ * same skill name — this prevents removing `bmad-agent-foo-bar-*` when the caller
107
+ * is removing module `foo` (which is a prefix of `foo-bar`).
108
+ *
109
+ * Every removed directory goes through `WriteService.deleteDirectory` so text files
110
+ * inside are snapshotted to `.bmad-studio/history/` before unlink.
111
+ *
112
+ * Returns `{ ok: true, removedByIde: { <ide>: [] } }` for any IDE whose skills
113
+ * directory does not exist (no-op, not an error).
114
+ */
115
+ export function removeIdeSkillsForModule(projectRoot, moduleCode, manifest, studioDir) {
116
+ const ides = (manifest.ides ?? []).filter((ide) => ide === 'claude-code' || ide === 'antigravity');
117
+ // Pass 1: build the exact set of skill names this module generated by scanning
118
+ // its live directory. The module dir is guaranteed to exist when called from the
119
+ // DELETE handler (removal happens after this) and from regenerate-skills.
120
+ const moduleDir = path.join(projectRoot, '_bmad', moduleCode);
121
+ const exactNames = new Set();
122
+ for (const agentFile of scanEntities(path.join(moduleDir, 'agents'), '.md')) {
123
+ exactNames.add(`bmad-agent-${moduleCode}-${path.basename(agentFile, '.md')}`);
124
+ }
125
+ for (const workflowDir of scanEntityDirs(path.join(moduleDir, 'workflows'))) {
126
+ exactNames.add(`bmad-${moduleCode}-${path.basename(workflowDir)}`);
127
+ }
128
+ for (const taskDir of scanEntityDirs(path.join(moduleDir, 'tasks'))) {
129
+ exactNames.add(`bmad-${moduleCode}-${path.basename(taskDir)}`);
130
+ }
131
+ // Pass 2: for orphan cleanup, collect other installed module codes so we can
132
+ // skip skill dirs that belong to a module whose code starts with our prefix
133
+ // (e.g. don't delete 'bmad-agent-foo-bar-*' when removing module 'foo').
134
+ const otherModuleCodes = manifest.modules
135
+ .map((m) => m.name)
136
+ .filter((n) => n !== moduleCode);
137
+ const agentPrefix = `bmad-agent-${moduleCode}-`;
138
+ const otherPrefix = `bmad-${moduleCode}-`;
139
+ const removedByIde = {};
140
+ for (const ide of ides) {
141
+ const ideOutputDir = path.join(projectRoot, IDE_OUTPUT_DIRS[ide]);
142
+ if (!fs.existsSync(ideOutputDir)) {
143
+ removedByIde[ide] = [];
144
+ continue;
145
+ }
146
+ const removed = [];
147
+ for (const entry of fs.readdirSync(ideOutputDir, { withFileTypes: true })) {
148
+ if (!entry.isDirectory())
149
+ continue;
150
+ const name = entry.name;
151
+ const isExact = exactNames.has(name);
152
+ const isPrefixMatch = name.startsWith(agentPrefix) || name.startsWith(otherPrefix);
153
+ if (!isExact && !isPrefixMatch)
154
+ continue;
155
+ // For orphaned skills (prefix match but not in exact set), skip if another
156
+ // installed module also claims this skill name via its own prefixes.
157
+ if (!isExact) {
158
+ const claimedByOther = otherModuleCodes.some((other) => name.startsWith(`bmad-agent-${other}-`) || name.startsWith(`bmad-${other}-`));
159
+ if (claimedByOther)
160
+ continue;
161
+ }
162
+ const skillDir = path.join(ideOutputDir, name);
163
+ const r = deleteDirectory(skillDir, studioDir);
164
+ if (!r.ok)
165
+ return { ok: false, error: r.error };
166
+ removed.push(name);
167
+ }
168
+ removedByIde[ide] = removed;
169
+ }
170
+ return { ok: true, removedByIde };
171
+ }
172
+ // ─────────────────────────────────────────────────────────────────────────────
173
+ // Helpers (private)
174
+ // ─────────────────────────────────────────────────────────────────────────────
175
+ export function scanEntities(dir, ext) {
176
+ if (!fs.existsSync(dir))
177
+ return [];
178
+ return fs
179
+ .readdirSync(dir, { withFileTypes: true })
180
+ .filter((e) => e.isFile() && e.name.endsWith(ext))
181
+ .map((e) => path.join(dir, e.name));
182
+ }
183
+ export function scanEntityDirs(dir) {
184
+ if (!fs.existsSync(dir))
185
+ return [];
186
+ return fs
187
+ .readdirSync(dir, { withFileTypes: true })
188
+ .filter((e) => e.isDirectory())
189
+ .map((e) => path.join(dir, e.name));
190
+ }
191
+ function findWorkflowFile(workflowDir) {
192
+ for (const candidate of ['workflow.md', 'workflow.yaml']) {
193
+ const p = path.join(workflowDir, candidate);
194
+ if (fs.existsSync(p))
195
+ return p;
196
+ }
197
+ return null;
198
+ }
199
+ function readAgentDescription(agentFile) {
200
+ try {
201
+ // TD-18 — reuse parseAgent (handles XML <agent title=...> AND frontmatter description).
202
+ const raw = fs.readFileSync(agentFile, 'utf-8');
203
+ const result = parseAgent(agentFile, raw);
204
+ if (!result.ok)
205
+ return null;
206
+ return result.data.title || result.data.role || null;
207
+ }
208
+ catch {
209
+ return null;
210
+ }
211
+ }
212
+ function readWorkflowDescription(workflowFile) {
213
+ try {
214
+ // TD-18 — reuse parseWorkflow. It expects a workflow DIR, not a file.
215
+ const wfDir = path.dirname(workflowFile);
216
+ const result = parseWorkflow(wfDir);
217
+ if (!result.ok)
218
+ return null;
219
+ return result.data.description || null;
220
+ }
221
+ catch {
222
+ return null;
223
+ }
224
+ }
225
+ function renderSkillMd(args) {
226
+ const verbByType = {
227
+ agent: 'Load and activate the agent defined at',
228
+ workflow: 'Load and execute the workflow defined at',
229
+ task: 'Load and execute the task defined at',
230
+ };
231
+ return [
232
+ '---',
233
+ `name: ${args.skillName}`,
234
+ `description: "${args.description.replaceAll('\r', '').replaceAll('\n', ' ').replaceAll('"', '\\"')}"`,
235
+ '---',
236
+ '',
237
+ `${verbByType[args.targetType]}:`,
238
+ args.targetPath, // absolute path — see Q8 / TD
239
+ '',
240
+ 'Follow all activation / step instructions defined in the file above.',
241
+ '',
242
+ '<!-- Generated by BMAD Studio. Do not edit manually — re-run "Regenerate IDE skills" instead. -->',
243
+ '<!-- Note: this skill uses an absolute path. Moving the project will break the link; click "Regenerate IDE skills" on the module row to re-create the launchers in the new location. -->',
244
+ '',
245
+ ].join('\n');
246
+ }
247
+ function writeSkillFile(skillDir, content, studioDir, fileStore) {
248
+ fs.mkdirSync(skillDir, { recursive: true });
249
+ const filePath = path.join(skillDir, 'SKILL.md');
250
+ // Idempotent early-exit (per Story 15.6 Dev Notes): if the file already exists
251
+ // with byte-identical content, skip the write so re-runs don't pollute history.
252
+ if (fs.existsSync(filePath)) {
253
+ try {
254
+ const existing = fs.readFileSync(filePath, 'utf-8');
255
+ if (existing === content)
256
+ return { ok: true };
257
+ }
258
+ catch (err) {
259
+ return {
260
+ ok: false,
261
+ error: `Failed to read existing skill file for idempotency check: ${err instanceof Error ? err.message : String(err)}`,
262
+ };
263
+ }
264
+ }
265
+ fileStore.markPendingWrite(filePath);
266
+ const result = writeFile(filePath, content, studioDir);
267
+ fileStore.clearPendingWrite(filePath);
268
+ return result.ok ? { ok: true } : { ok: false, error: result.error };
269
+ }
270
+ //# sourceMappingURL=ide-skill-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide-skill-generator.js","sourceRoot":"","sources":["../../src/core/ide-skill-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ide-skill-generator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide-skill-generator.test.d.ts","sourceRoot":"","sources":["../../src/core/ide-skill-generator.test.ts"],"names":[],"mappings":""}