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.
- package/README.md +163 -17
- package/package.json +12 -3
- package/packages/client/dist/assets/index-81ZKe-R8.css +1 -0
- package/packages/client/dist/assets/index-DyjtzhqN.js +641 -0
- package/packages/client/dist/index.html +2 -2
- package/packages/server/dist/app.d.ts +2 -1
- package/packages/server/dist/app.d.ts.map +1 -1
- package/packages/server/dist/app.js +68 -3
- package/packages/server/dist/app.js.map +1 -1
- package/packages/server/dist/core/file-store.d.ts +8 -1
- package/packages/server/dist/core/file-store.d.ts.map +1 -1
- package/packages/server/dist/core/file-store.js +26 -3
- package/packages/server/dist/core/file-store.js.map +1 -1
- package/packages/server/dist/core/ide-skill-generator.d.ts +58 -0
- package/packages/server/dist/core/ide-skill-generator.d.ts.map +1 -0
- package/packages/server/dist/core/ide-skill-generator.js +270 -0
- package/packages/server/dist/core/ide-skill-generator.js.map +1 -0
- package/packages/server/dist/core/ide-skill-generator.test.d.ts +2 -0
- package/packages/server/dist/core/ide-skill-generator.test.d.ts.map +1 -0
- package/packages/server/dist/core/ide-skill-generator.test.js +257 -0
- package/packages/server/dist/core/ide-skill-generator.test.js.map +1 -0
- package/packages/server/dist/core/module-installer.d.ts +165 -0
- package/packages/server/dist/core/module-installer.d.ts.map +1 -0
- package/packages/server/dist/core/module-installer.js +445 -0
- package/packages/server/dist/core/module-installer.js.map +1 -0
- package/packages/server/dist/core/module-installer.test.d.ts +2 -0
- package/packages/server/dist/core/module-installer.test.d.ts.map +1 -0
- package/packages/server/dist/core/module-installer.test.js +509 -0
- package/packages/server/dist/core/module-installer.test.js.map +1 -0
- package/packages/server/dist/core/module-registry.d.ts +5 -0
- package/packages/server/dist/core/module-registry.d.ts.map +1 -0
- package/packages/server/dist/core/module-registry.js +109 -0
- package/packages/server/dist/core/module-registry.js.map +1 -0
- package/packages/server/dist/core/module-registry.test.d.ts +2 -0
- package/packages/server/dist/core/module-registry.test.d.ts.map +1 -0
- package/packages/server/dist/core/module-registry.test.js +280 -0
- package/packages/server/dist/core/module-registry.test.js.map +1 -0
- package/packages/server/dist/core/write-service.d.ts +20 -0
- package/packages/server/dist/core/write-service.d.ts.map +1 -1
- package/packages/server/dist/core/write-service.js +113 -1
- package/packages/server/dist/core/write-service.js.map +1 -1
- package/packages/server/dist/core/write-service.test.js +93 -6
- package/packages/server/dist/core/write-service.test.js.map +1 -1
- package/packages/server/dist/index.js +85 -1
- package/packages/server/dist/index.js.map +1 -1
- package/packages/server/dist/parsers/module-yaml-parser.d.ts +16 -0
- package/packages/server/dist/parsers/module-yaml-parser.d.ts.map +1 -0
- package/packages/server/dist/parsers/module-yaml-parser.js +62 -0
- package/packages/server/dist/parsers/module-yaml-parser.js.map +1 -0
- package/packages/server/dist/parsers/module-yaml-parser.test.d.ts +2 -0
- package/packages/server/dist/parsers/module-yaml-parser.test.d.ts.map +1 -0
- package/packages/server/dist/parsers/module-yaml-parser.test.js +156 -0
- package/packages/server/dist/parsers/module-yaml-parser.test.js.map +1 -0
- package/packages/server/dist/parsers/skill-parser.d.ts.map +1 -1
- package/packages/server/dist/parsers/skill-parser.js +41 -4
- package/packages/server/dist/parsers/skill-parser.js.map +1 -1
- package/packages/server/dist/parsers/skill-parser.test.js +4 -3
- package/packages/server/dist/parsers/skill-parser.test.js.map +1 -1
- package/packages/server/dist/plugins/agents-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/agents-plugin.js +60 -1
- package/packages/server/dist/plugins/agents-plugin.js.map +1 -1
- package/packages/server/dist/plugins/commands-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/commands-plugin.js +37 -10
- package/packages/server/dist/plugins/commands-plugin.js.map +1 -1
- package/packages/server/dist/plugins/datasources-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/datasources-plugin.js +101 -0
- package/packages/server/dist/plugins/datasources-plugin.js.map +1 -1
- package/packages/server/dist/plugins/modules-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/modules-plugin.js +905 -100
- package/packages/server/dist/plugins/modules-plugin.js.map +1 -1
- package/packages/server/dist/plugins/modules-plugin.test.js +1894 -3
- package/packages/server/dist/plugins/modules-plugin.test.js.map +1 -1
- package/packages/server/dist/plugins/outputs-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/outputs-plugin.js +111 -0
- package/packages/server/dist/plugins/outputs-plugin.js.map +1 -1
- package/packages/server/dist/plugins/overview-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/overview-plugin.js +35 -2
- package/packages/server/dist/plugins/overview-plugin.js.map +1 -1
- package/packages/server/dist/plugins/search-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/search-plugin.js +19 -2
- package/packages/server/dist/plugins/search-plugin.js.map +1 -1
- package/packages/server/dist/plugins/settings-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/settings-plugin.js +38 -1
- package/packages/server/dist/plugins/settings-plugin.js.map +1 -1
- package/packages/server/dist/plugins/settings-plugin.test.js +72 -0
- package/packages/server/dist/plugins/settings-plugin.test.js.map +1 -1
- package/packages/server/dist/plugins/teams-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/teams-plugin.js +6 -6
- package/packages/server/dist/plugins/teams-plugin.js.map +1 -1
- package/packages/server/dist/plugins/teams-plugin.test.js +43 -0
- package/packages/server/dist/plugins/teams-plugin.test.js.map +1 -1
- package/packages/server/dist/plugins/workflows-plugin.d.ts.map +1 -1
- package/packages/server/dist/plugins/workflows-plugin.js +14 -6
- package/packages/server/dist/plugins/workflows-plugin.js.map +1 -1
- package/packages/shared/src/config.ts +26 -0
- package/packages/shared/src/events.ts +7 -0
- package/packages/shared/src/index.ts +13 -0
- package/packages/shared/src/modules.ts +42 -0
- package/packages/shared/src/registry.ts +26 -0
- package/packages/shared/src/types.test.ts +37 -1
- package/packages/shared/src/workflows.ts +27 -0
- package/packages/client/dist/assets/index-5nXyrx_3.css +0 -1
- 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-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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
|
|
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":"
|
|
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
|
|
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
|
-
|
|
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":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AAK7B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAKhC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGxD,MAAM,cAAc,GAAG,GAAG,CAAA;AAC1B,MAAM,sBAAsB,GAAG,IAAI,CAAA;AAEnC,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,OAAO,CAAA;IACjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,OAAO,CAAA;IAClF,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,UAAU,CAAA;IACvF,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC3F,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,YAAY,CAAA;IAC1F,OAAO,OAAO,CAAA;AAChB,CAAC;AAcD,MAAM,OAAO,SAAS;IACZ,KAAK,CAAa;
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"ide-skill-generator.test.d.ts","sourceRoot":"","sources":["../../src/core/ide-skill-generator.test.ts"],"names":[],"mappings":""}
|