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 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', '.clinerules'],
150
+ instructionFiles: ['.cline/clinerules.md'],
151
151
  injectionStrategy: { position: 'top', skipPatterns: ['---'] }
152
152
  },
153
153
  {
@@ -37,7 +37,7 @@
37
37
  "name": "ma-skills",
38
38
  "source": "./",
39
39
  "description": "ma-agents extension module providing enterprise SDLC personas and operational workflow skills.",
40
- "version": "3.11.0",
40
+ "version": "3.12.0",
41
41
  "author": {
42
42
  "name": "Alon Mayaffit"
43
43
  },
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ma-agents",
3
- "version": "3.11.0",
3
+ "version": "3.12.0",
4
4
  "description": "NPX tool to install skills for AI coding agents (Claude Code, Gemini, Copilot, Kilocode, Cline, Cursor, Roo Code)",
5
5
  "main": "index.js",
6
6
  "bin": {