ma-agents 3.11.0 → 3.12.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 +4 -0
- package/lib/agents.js +1 -1
- package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +1 -1
- package/lib/bmad.js +12 -0
- package/lib/installer.js +2 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
A universal NPX tool to install AI coding agent skills. Write skills once, install them across Claude Code, Gemini, Copilot, Cline, Cursor, Kilocode, and Roo Code.
|
|
4
4
|
|
|
5
|
+
## What's New in v3.12.0
|
|
6
|
+
|
|
7
|
+
- **Cline `.clinerules` directory fix** — `.clinerules` is now correctly created as a directory (matching Cline's native structure), not as a file. This prevents ENOTDIR errors during workflow generation and ensures `.clinerules/workflows/` is always generated correctly. Legacy installs that had `.clinerules` as a file are automatically migrated on the next install or update.
|
|
8
|
+
|
|
5
9
|
## What's New in v3.11.0
|
|
6
10
|
|
|
7
11
|
- **Cline workflow generation** — when Cline is selected during install, update, or migration, ma-agents now auto-generates `.clinerules/workflows/<skill-name>.md` for every BMAD skill installed to `.cline/skills/`. Type `/` in Cline chat to browse and invoke all BMAD skills natively.
|
package/lib/agents.js
CHANGED
|
@@ -147,7 +147,7 @@ const agents = [
|
|
|
147
147
|
'references': 'docs',
|
|
148
148
|
'assets': 'templates'
|
|
149
149
|
},
|
|
150
|
-
instructionFiles: ['.cline/clinerules.md'
|
|
150
|
+
instructionFiles: ['.cline/clinerules.md'],
|
|
151
151
|
injectionStrategy: { position: 'top', skipPatterns: ['---'] }
|
|
152
152
|
},
|
|
153
153
|
{
|
package/lib/bmad.js
CHANGED
|
@@ -1384,6 +1384,18 @@ async function deployClineWorkflows(projectRoot, tools = []) {
|
|
|
1384
1384
|
const clineSkillsDir = path.join(projectRoot, '.cline', 'skills');
|
|
1385
1385
|
if (!(await fs.pathExists(clineSkillsDir))) return;
|
|
1386
1386
|
|
|
1387
|
+
// Cline expects .clinerules/ to be a directory, not a file.
|
|
1388
|
+
// Legacy installs created it as a flat file (instruction injection duplicate of
|
|
1389
|
+
// .cline/clinerules.md). Detect and remove it so ensureDir can proceed.
|
|
1390
|
+
const clinerulesPath = path.join(projectRoot, '.clinerules');
|
|
1391
|
+
if (await fs.pathExists(clinerulesPath)) {
|
|
1392
|
+
const stat = await fs.lstat(clinerulesPath);
|
|
1393
|
+
if (stat.isFile()) {
|
|
1394
|
+
await fs.remove(clinerulesPath);
|
|
1395
|
+
console.log(chalk.gray(' Removed legacy .clinerules file (content is in .cline/clinerules.md)'));
|
|
1396
|
+
}
|
|
1397
|
+
}
|
|
1398
|
+
|
|
1387
1399
|
const workflowsDir = path.join(projectRoot, '.clinerules', 'workflows');
|
|
1388
1400
|
await fs.ensureDir(workflowsDir);
|
|
1389
1401
|
|
package/lib/installer.js
CHANGED
|
@@ -65,6 +65,8 @@ function _extractMarkerBlockInner(filePath) {
|
|
|
65
65
|
function checkClinerulesDualFileDrift(projectRoot) {
|
|
66
66
|
const pathA = path.join(projectRoot, '.cline', 'clinerules.md');
|
|
67
67
|
const pathB = path.join(projectRoot, '.clinerules');
|
|
68
|
+
// .clinerules is now a directory (Cline's correct structure) — no file to drift-check.
|
|
69
|
+
if (fs.existsSync(pathB) && fs.lstatSync(pathB).isDirectory()) return;
|
|
68
70
|
const innerA = _extractMarkerBlockInner(pathA);
|
|
69
71
|
const innerB = _extractMarkerBlockInner(pathB);
|
|
70
72
|
if (innerA == null || innerB == null) return; // one (or both) absent — skip
|