chore: implement requested changes

This commit is contained in:
Ralph Khreish
2025-07-18 00:44:53 +03:00
parent b991c2b48b
commit da3cf08d6e
3 changed files with 15 additions and 78 deletions

View File

@@ -2,12 +2,8 @@
"task-master-ai": minor
---
feat: Add Kiro editor rule profile with comprehensive rule set and MCP config
Add Kiro editor rule profile support
- Add Kiro IDE integration leveraging base profile's default file mapping system
- Generate complete rule set: `kiro_rules.md`, `dev_workflow.md`, `self_improve.md`, `taskmaster.md`
- Support for `.kiro/steering/` directory structure for all rule files with `.md` extension
- Custom MCP configuration in `.kiro/settings/mcp.json` with `mcpServers` format
- Enhanced MCP format with inclusion patterns using `fileMatchPattern: "**/*"`
- Minimal lifecycle function for MCP config transformation and directory setup
- Comprehensive test coverage for Kiro profile functionality
- Add support for Kiro IDE with custom rule files and MCP configuration
- Generate rule files in `.kiro/steering/` directory with markdown format
- Include MCP server configuration with enhanced file inclusion patterns

View File

@@ -1,58 +1,6 @@
// Kiro profile for rule-transformer
import path from 'path';
import fs from 'fs';
import { createProfile } from './base-profile.js';
// Minimal lifecycle function to handle MCP config transformation
function onPostConvertRulesProfile(targetDir, assetsDir) {
// Move MCP config from .kiro/mcp.json to .kiro/settings/mcp.json and add inclusion patterns
const baseMcpConfigPath = path.join(targetDir, '.kiro', 'mcp.json');
const finalMcpConfigPath = path.join(
targetDir,
'.kiro',
'settings',
'mcp.json'
);
if (!fs.existsSync(baseMcpConfigPath)) {
return; // No MCP config to transform
}
try {
// Create settings directory
const settingsDir = path.join(targetDir, '.kiro', 'settings');
if (!fs.existsSync(settingsDir)) {
fs.mkdirSync(settingsDir, { recursive: true });
}
// Read and transform the MCP config
const mcpConfigContent = fs.readFileSync(baseMcpConfigPath, 'utf8');
const mcpConfig = JSON.parse(mcpConfigContent);
// Add inclusion patterns to each server if they don't exist
if (mcpConfig.mcpServers) {
for (const [serverName, serverConfig] of Object.entries(
mcpConfig.mcpServers
)) {
if (!serverConfig.inclusion) {
serverConfig.inclusion = {
fileMatchPattern: '**/*'
};
}
}
}
// Write to final location and remove original
fs.writeFileSync(
finalMcpConfigPath,
JSON.stringify(mcpConfig, null, '\t') + '\n'
);
fs.rmSync(baseMcpConfigPath, { force: true });
} catch (error) {
// Silently fail - not critical
}
}
// Create and export kiro profile using the base factory
export const kiroProfile = createProfile({
name: 'kiro',
@@ -62,7 +10,7 @@ export const kiroProfile = createProfile({
profileDir: '.kiro',
rulesDir: '.kiro/steering', // Kiro rules location (full path)
mcpConfig: true,
mcpConfigName: 'mcp.json',
mcpConfigName: 'settings/mcp.json', // Create directly in settings subdirectory
includeDefaultRules: true, // Include default rules to get all the standard files
targetExtension: '.md',
fileMap: {
@@ -90,6 +38,5 @@ export const kiroProfile = createProfile({
// Kiro specific terminology
{ from: /rules directory/g, to: 'steering directory' },
{ from: /cursor rules/gi, to: 'Kiro steering files' }
],
onPostConvert: onPostConvertRulesProfile
]
});

View File

@@ -49,22 +49,22 @@ describe('Kiro Integration', () => {
// Test function that simulates the createProjectStructure behavior for Kiro files
function mockCreateKiroStructure() {
// Create main .kiro directory
// This function simulates the actual kiro profile creation logic
// It explicitly calls the mocked fs methods to ensure consistency with the test environment
// Simulate directory creation calls - these will call the mocked mkdirSync
fs.mkdirSync(path.join(tempDir, '.kiro'), { recursive: true });
// Create settings directory
fs.mkdirSync(path.join(tempDir, '.kiro', 'settings'), { recursive: true });
// Create steering directory
fs.mkdirSync(path.join(tempDir, '.kiro', 'steering'), { recursive: true });
// Create MCP config file (mcp.json in settings)
// Create MCP config file at .kiro/mcp.json (not in settings subdirectory)
// This will call the mocked writeFileSync
fs.writeFileSync(
path.join(tempDir, '.kiro', 'settings', 'mcp.json'),
path.join(tempDir, '.kiro', 'mcp.json'),
JSON.stringify({ mcpServers: {} }, null, 2)
);
// Create kiro rule files in steering directory
// All these will call the mocked writeFileSync
fs.writeFileSync(
path.join(tempDir, '.kiro', 'steering', 'kiro_rules.md'),
'# Kiro Rules\n\nKiro-specific rules and instructions.'
@@ -91,12 +91,6 @@ describe('Kiro Integration', () => {
expect(fs.mkdirSync).toHaveBeenCalledWith(path.join(tempDir, '.kiro'), {
recursive: true
});
expect(fs.mkdirSync).toHaveBeenCalledWith(
path.join(tempDir, '.kiro', 'settings'),
{
recursive: true
}
);
expect(fs.mkdirSync).toHaveBeenCalledWith(
path.join(tempDir, '.kiro', 'steering'),
{
@@ -111,7 +105,7 @@ describe('Kiro Integration', () => {
// Assert
expect(fs.writeFileSync).toHaveBeenCalledWith(
path.join(tempDir, '.kiro', 'settings', 'mcp.json'),
path.join(tempDir, '.kiro', 'mcp.json'),
JSON.stringify({ mcpServers: {} }, null, 2)
);
});