skiller 0.4.3
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/LICENSE +21 -0
- package/README.md +989 -0
- package/dist/agents/AbstractAgent.js +92 -0
- package/dist/agents/AgentsMdAgent.js +85 -0
- package/dist/agents/AiderAgent.js +108 -0
- package/dist/agents/AmazonQCliAgent.js +103 -0
- package/dist/agents/AmpAgent.js +13 -0
- package/dist/agents/AugmentCodeAgent.js +70 -0
- package/dist/agents/ClaudeAgent.js +95 -0
- package/dist/agents/ClineAgent.js +53 -0
- package/dist/agents/CodexCliAgent.js +143 -0
- package/dist/agents/CopilotAgent.js +43 -0
- package/dist/agents/CrushAgent.js +128 -0
- package/dist/agents/CursorAgent.js +93 -0
- package/dist/agents/FirebaseAgent.js +61 -0
- package/dist/agents/FirebenderAgent.js +205 -0
- package/dist/agents/GeminiCliAgent.js +99 -0
- package/dist/agents/GooseAgent.js +58 -0
- package/dist/agents/IAgent.js +2 -0
- package/dist/agents/JulesAgent.js +14 -0
- package/dist/agents/JunieAgent.js +53 -0
- package/dist/agents/KiloCodeAgent.js +63 -0
- package/dist/agents/KiroAgent.js +50 -0
- package/dist/agents/OpenCodeAgent.js +99 -0
- package/dist/agents/OpenHandsAgent.js +56 -0
- package/dist/agents/QwenCodeAgent.js +82 -0
- package/dist/agents/RooCodeAgent.js +139 -0
- package/dist/agents/TraeAgent.js +54 -0
- package/dist/agents/WarpAgent.js +61 -0
- package/dist/agents/WindsurfAgent.js +27 -0
- package/dist/agents/ZedAgent.js +132 -0
- package/dist/agents/agent-utils.js +37 -0
- package/dist/agents/index.js +77 -0
- package/dist/cli/commands.js +136 -0
- package/dist/cli/handlers.js +221 -0
- package/dist/cli/index.js +5 -0
- package/dist/constants.js +58 -0
- package/dist/core/ConfigLoader.js +274 -0
- package/dist/core/FileSystemUtils.js +421 -0
- package/dist/core/FrontmatterParser.js +142 -0
- package/dist/core/GitignoreUtils.js +171 -0
- package/dist/core/RuleProcessor.js +60 -0
- package/dist/core/SkillsProcessor.js +528 -0
- package/dist/core/SkillsUtils.js +230 -0
- package/dist/core/UnifiedConfigLoader.js +432 -0
- package/dist/core/UnifiedConfigTypes.js +2 -0
- package/dist/core/agent-selection.js +52 -0
- package/dist/core/apply-engine.js +668 -0
- package/dist/core/config-utils.js +30 -0
- package/dist/core/hash.js +24 -0
- package/dist/core/revert-engine.js +413 -0
- package/dist/lib.js +196 -0
- package/dist/mcp/capabilities.js +65 -0
- package/dist/mcp/merge.js +39 -0
- package/dist/mcp/propagateOpenCodeMcp.js +116 -0
- package/dist/mcp/propagateOpenHandsMcp.js +169 -0
- package/dist/mcp/validate.js +17 -0
- package/dist/paths/mcp.js +120 -0
- package/dist/revert.js +186 -0
- package/dist/types.js +2 -0
- package/dist/vscode/settings.js +117 -0
- package/package.json +77 -0
package/dist/revert.js
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.allAgents = void 0;
|
|
37
|
+
exports.revertAllAgentConfigs = revertAllAgentConfigs;
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const fs_1 = require("fs");
|
|
40
|
+
const FileSystemUtils = __importStar(require("./core/FileSystemUtils"));
|
|
41
|
+
const ConfigLoader_1 = require("./core/ConfigLoader");
|
|
42
|
+
const agents_1 = require("./agents");
|
|
43
|
+
Object.defineProperty(exports, "allAgents", { enumerable: true, get: function () { return agents_1.allAgents; } });
|
|
44
|
+
const constants_1 = require("./constants");
|
|
45
|
+
const revert_engine_1 = require("./core/revert-engine");
|
|
46
|
+
const agent_selection_1 = require("./core/agent-selection");
|
|
47
|
+
const config_utils_1 = require("./core/config-utils");
|
|
48
|
+
const agents = agents_1.allAgents;
|
|
49
|
+
/**
|
|
50
|
+
* Reverts ruler configurations for selected AI agents.
|
|
51
|
+
*/
|
|
52
|
+
async function revertAllAgentConfigs(projectRoot, includedAgents, configPath, keepBackups = false, verbose = false, dryRun = false, localOnly = false) {
|
|
53
|
+
(0, constants_1.logVerbose)(`Loading configuration for revert from project root: ${projectRoot}`, verbose);
|
|
54
|
+
const config = await (0, ConfigLoader_1.loadConfig)({
|
|
55
|
+
projectRoot,
|
|
56
|
+
cliAgents: includedAgents,
|
|
57
|
+
configPath,
|
|
58
|
+
});
|
|
59
|
+
const rulerDir = await FileSystemUtils.findRulerDir(projectRoot, !localOnly);
|
|
60
|
+
if (!rulerDir) {
|
|
61
|
+
throw (0, constants_1.createRulerError)(`.ruler directory not found`, `Searched from: ${projectRoot}`);
|
|
62
|
+
}
|
|
63
|
+
(0, constants_1.logVerbose)(`Found .ruler directory at: ${rulerDir}`, verbose);
|
|
64
|
+
// Normalize per-agent config keys to agent identifiers
|
|
65
|
+
config.agentConfigs = (0, config_utils_1.mapRawAgentConfigs)(config.agentConfigs, agents);
|
|
66
|
+
// Select agents to revert (same logic as apply, but with backward compatibility for invalid agents)
|
|
67
|
+
let selected;
|
|
68
|
+
try {
|
|
69
|
+
selected = (0, agent_selection_1.resolveSelectedAgents)(config, agents);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
// For backward compatibility, revert continues with available agents if some are invalid
|
|
73
|
+
// This preserves the original behavior where invalid agents were silently ignored
|
|
74
|
+
if (error instanceof Error &&
|
|
75
|
+
error.message.includes('Invalid agent specified')) {
|
|
76
|
+
(0, constants_1.logVerbose)(`Warning: ${error.message} - continuing with valid agents only`, verbose);
|
|
77
|
+
// Fall back to the old logic without validation
|
|
78
|
+
if (config.cliAgents && config.cliAgents.length > 0) {
|
|
79
|
+
const filters = config.cliAgents.map((n) => n.toLowerCase());
|
|
80
|
+
selected = agents.filter((agent) => filters.some((f) => agent.getIdentifier() === f ||
|
|
81
|
+
agent.getName().toLowerCase().includes(f)));
|
|
82
|
+
}
|
|
83
|
+
else if (config.defaultAgents && config.defaultAgents.length > 0) {
|
|
84
|
+
const defaults = config.defaultAgents.map((n) => n.toLowerCase());
|
|
85
|
+
selected = agents.filter((agent) => {
|
|
86
|
+
const identifier = agent.getIdentifier();
|
|
87
|
+
const override = config.agentConfigs[identifier]?.enabled;
|
|
88
|
+
if (override !== undefined) {
|
|
89
|
+
return override;
|
|
90
|
+
}
|
|
91
|
+
return defaults.some((d) => identifier === d || agent.getName().toLowerCase().includes(d));
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
selected = agents.filter((agent) => config.agentConfigs[agent.getIdentifier()]?.enabled !== false);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
(0, constants_1.logVerbose)(`Selected agents: ${selected.map((a) => a.getName()).join(', ')}`, verbose);
|
|
103
|
+
// Revert configurations for each agent
|
|
104
|
+
let totalFilesProcessed = 0;
|
|
105
|
+
let totalFilesRestored = 0;
|
|
106
|
+
let totalFilesRemoved = 0;
|
|
107
|
+
let totalBackupsRemoved = 0;
|
|
108
|
+
for (const agent of selected) {
|
|
109
|
+
const prefix = (0, constants_1.actionPrefix)(dryRun);
|
|
110
|
+
console.log(`${prefix} Reverting ${agent.getName()}...`);
|
|
111
|
+
const agentConfig = config.agentConfigs[agent.getIdentifier()];
|
|
112
|
+
const result = await (0, revert_engine_1.revertAgentConfiguration)(agent, projectRoot, agentConfig, keepBackups, verbose, dryRun);
|
|
113
|
+
totalFilesProcessed += result.restored + result.removed;
|
|
114
|
+
totalFilesRestored += result.restored;
|
|
115
|
+
totalFilesRemoved += result.removed;
|
|
116
|
+
totalBackupsRemoved += result.backupsRemoved;
|
|
117
|
+
}
|
|
118
|
+
// Clean up auxiliary files and directories
|
|
119
|
+
const cleanupResult = await (0, revert_engine_1.cleanUpAuxiliaryFiles)(projectRoot, verbose, dryRun);
|
|
120
|
+
totalFilesRemoved += cleanupResult.additionalFilesRemoved;
|
|
121
|
+
// Clean .gitignore if reverting all agents
|
|
122
|
+
const gitignoreCleaned = !config.cliAgents || config.cliAgents.length === 0
|
|
123
|
+
? await cleanGitignore(projectRoot, verbose, dryRun)
|
|
124
|
+
: false;
|
|
125
|
+
// Display summary
|
|
126
|
+
const prefix = (0, constants_1.actionPrefix)(dryRun);
|
|
127
|
+
if (dryRun) {
|
|
128
|
+
console.log(`${prefix} Revert summary (dry run):`);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
console.log(`${prefix} Revert completed successfully.`);
|
|
132
|
+
}
|
|
133
|
+
console.log(` Files processed: ${totalFilesProcessed}`);
|
|
134
|
+
console.log(` Files restored from backup: ${totalFilesRestored}`);
|
|
135
|
+
console.log(` Generated files removed: ${totalFilesRemoved}`);
|
|
136
|
+
if (!keepBackups) {
|
|
137
|
+
console.log(` Backup files removed: ${totalBackupsRemoved}`);
|
|
138
|
+
}
|
|
139
|
+
if (cleanupResult.directoriesRemoved > 0) {
|
|
140
|
+
console.log(` Empty directories removed: ${cleanupResult.directoriesRemoved}`);
|
|
141
|
+
}
|
|
142
|
+
if (gitignoreCleaned) {
|
|
143
|
+
console.log(` .gitignore cleaned: yes`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Removes the ruler-managed block from .gitignore file.
|
|
148
|
+
*/
|
|
149
|
+
async function cleanGitignore(projectRoot, verbose, dryRun) {
|
|
150
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
151
|
+
try {
|
|
152
|
+
await fs_1.promises.access(gitignorePath);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
(0, constants_1.logVerbose)('No .gitignore file found', verbose);
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
const content = await fs_1.promises.readFile(gitignorePath, 'utf8');
|
|
159
|
+
const startMarker = '# START Ruler Generated Files';
|
|
160
|
+
const endMarker = '# END Ruler Generated Files';
|
|
161
|
+
const startIndex = content.indexOf(startMarker);
|
|
162
|
+
const endIndex = content.indexOf(endMarker);
|
|
163
|
+
if (startIndex === -1 || endIndex === -1) {
|
|
164
|
+
(0, constants_1.logVerbose)('No ruler-managed block found in .gitignore', verbose);
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
const prefix = (0, constants_1.actionPrefix)(dryRun);
|
|
168
|
+
if (dryRun) {
|
|
169
|
+
(0, constants_1.logVerbose)(`${prefix} Would remove ruler block from .gitignore`, verbose);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
const beforeBlock = content.substring(0, startIndex);
|
|
173
|
+
const afterBlock = content.substring(endIndex + endMarker.length);
|
|
174
|
+
let newContent = beforeBlock + afterBlock;
|
|
175
|
+
newContent = newContent.replace(/\n{3,}/g, '\n\n'); // Replace 3+ newlines with 2
|
|
176
|
+
if (newContent.trim() === '') {
|
|
177
|
+
await fs_1.promises.unlink(gitignorePath);
|
|
178
|
+
(0, constants_1.logVerbose)(`${prefix} Removed empty .gitignore file`, verbose);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
await fs_1.promises.writeFile(gitignorePath, newContent);
|
|
182
|
+
(0, constants_1.logVerbose)(`${prefix} Removed ruler block from .gitignore`, verbose);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.readVSCodeSettings = readVSCodeSettings;
|
|
37
|
+
exports.writeVSCodeSettings = writeVSCodeSettings;
|
|
38
|
+
exports.transformRulerToAugmentMcp = transformRulerToAugmentMcp;
|
|
39
|
+
exports.mergeAugmentMcpServers = mergeAugmentMcpServers;
|
|
40
|
+
exports.getVSCodeSettingsPath = getVSCodeSettingsPath;
|
|
41
|
+
const fs_1 = require("fs");
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
/**
|
|
44
|
+
* Read VSCode settings.json file
|
|
45
|
+
*/
|
|
46
|
+
async function readVSCodeSettings(settingsPath) {
|
|
47
|
+
try {
|
|
48
|
+
const content = await fs_1.promises.readFile(settingsPath, 'utf8');
|
|
49
|
+
return JSON.parse(content);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error.code === 'ENOENT') {
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Write VSCode settings.json file
|
|
60
|
+
*/
|
|
61
|
+
async function writeVSCodeSettings(settingsPath, settings) {
|
|
62
|
+
await fs_1.promises.mkdir(path.dirname(settingsPath), { recursive: true });
|
|
63
|
+
await fs_1.promises.writeFile(settingsPath, JSON.stringify(settings, null, 4));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Transform ruler MCP config to Augment MCP server array format
|
|
67
|
+
*/
|
|
68
|
+
function transformRulerToAugmentMcp(rulerMcpJson) {
|
|
69
|
+
const servers = [];
|
|
70
|
+
if (rulerMcpJson.mcpServers && typeof rulerMcpJson.mcpServers === 'object') {
|
|
71
|
+
const mcpServers = rulerMcpJson.mcpServers;
|
|
72
|
+
for (const [name, serverConfig] of Object.entries(mcpServers)) {
|
|
73
|
+
const augmentServer = {
|
|
74
|
+
name,
|
|
75
|
+
command: serverConfig.command,
|
|
76
|
+
};
|
|
77
|
+
if (serverConfig.args) {
|
|
78
|
+
augmentServer.args = serverConfig.args;
|
|
79
|
+
}
|
|
80
|
+
if (serverConfig.env) {
|
|
81
|
+
augmentServer.env = serverConfig.env;
|
|
82
|
+
}
|
|
83
|
+
servers.push(augmentServer);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return servers;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Merge MCP servers into VSCode settings using the specified strategy
|
|
90
|
+
*/
|
|
91
|
+
function mergeAugmentMcpServers(existingSettings, newServers, strategy) {
|
|
92
|
+
const result = structuredClone(existingSettings);
|
|
93
|
+
if (!result['augment.advanced']) {
|
|
94
|
+
result['augment.advanced'] = {};
|
|
95
|
+
}
|
|
96
|
+
if (strategy === 'overwrite') {
|
|
97
|
+
result['augment.advanced'].mcpServers = newServers;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const existingServers = result['augment.advanced'].mcpServers || [];
|
|
101
|
+
const existingServerMap = new Map();
|
|
102
|
+
for (const server of existingServers) {
|
|
103
|
+
existingServerMap.set(server.name, server);
|
|
104
|
+
}
|
|
105
|
+
for (const newServer of newServers) {
|
|
106
|
+
existingServerMap.set(newServer.name, newServer);
|
|
107
|
+
}
|
|
108
|
+
result['augment.advanced'].mcpServers = Array.from(existingServerMap.values());
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get the VSCode settings.json path for a project (local)
|
|
114
|
+
*/
|
|
115
|
+
function getVSCodeSettingsPath(projectRoot) {
|
|
116
|
+
return path.join(projectRoot, '.vscode', 'settings.json');
|
|
117
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "skiller",
|
|
3
|
+
"version": "0.4.3",
|
|
4
|
+
"description": "Ruler — apply the same rules to all coding agents",
|
|
5
|
+
"main": "dist/lib.js",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"lint": "eslint \"src/**/*.{ts,tsx}\"",
|
|
11
|
+
"lint:fix": "eslint \"src/**/*.{ts,tsx}\" --fix",
|
|
12
|
+
"format": "prettier --write \"src/**/*.{ts,tsx,json,md}\"",
|
|
13
|
+
"test": "jest",
|
|
14
|
+
"test:watch": "jest --watch",
|
|
15
|
+
"test:coverage": "jest --coverage",
|
|
16
|
+
"test:integration": "jest tests/e2e/ruler.integration.test.ts --verbose",
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"release": "pnpm build && pnpm changeset version"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/udecode/ruler.git"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"ai",
|
|
26
|
+
"developer-tools",
|
|
27
|
+
"copilot",
|
|
28
|
+
"codex",
|
|
29
|
+
"claude",
|
|
30
|
+
"cursor",
|
|
31
|
+
"aider",
|
|
32
|
+
"config",
|
|
33
|
+
"rules",
|
|
34
|
+
"automation"
|
|
35
|
+
],
|
|
36
|
+
"author": "Eleanor Berger",
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/udecode/ruler/issues"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"bin": {
|
|
50
|
+
"ruler": "dist/cli/index.js"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@changesets/cli": "2.27.11",
|
|
54
|
+
"@eslint/js": "^9.39.1",
|
|
55
|
+
"@types/iarna__toml": "^2.0.5",
|
|
56
|
+
"@types/jest": "^29.5.14",
|
|
57
|
+
"@types/js-yaml": "^4.0.9",
|
|
58
|
+
"@types/node": "^24.9.2",
|
|
59
|
+
"@types/yargs": "^17.0.34",
|
|
60
|
+
"@typescript-eslint/eslint-plugin": "^8.46.2",
|
|
61
|
+
"@typescript-eslint/parser": "^8.46.2",
|
|
62
|
+
"eslint": "^9.38.0",
|
|
63
|
+
"eslint-config-prettier": "^10.1.8",
|
|
64
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
65
|
+
"jest": "^29.7.0",
|
|
66
|
+
"prettier": "^3.6.2",
|
|
67
|
+
"ts-jest": "^29.4.5",
|
|
68
|
+
"typescript": "^5.9.3",
|
|
69
|
+
"typescript-eslint": "^8.46.2"
|
|
70
|
+
},
|
|
71
|
+
"dependencies": {
|
|
72
|
+
"@iarna/toml": "^2.2.5",
|
|
73
|
+
"js-yaml": "^4.1.0",
|
|
74
|
+
"yargs": "^18.0.0",
|
|
75
|
+
"zod": "^4.1.12"
|
|
76
|
+
}
|
|
77
|
+
}
|