@diottodev/runic 1.0.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/LICENSE +21 -0
- package/README.md +219 -0
- package/dist/index.js +96 -0
- package/package.json +73 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 mcp-skills-server contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# Runic
|
|
2
|
+
|
|
3
|
+
> 91 AI & Dev skills for Claude Code, Cursor, Windsurf, VS Code, and JetBrains.
|
|
4
|
+
> Install in seconds via MCP or as a native IDE plugin.
|
|
5
|
+
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](https://www.npmjs.com/package/@diottodev/runic)
|
|
8
|
+
[](.)
|
|
9
|
+
[](.)
|
|
10
|
+
[](https://github.com/Diottodev/runic)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
Runic supports two distribution channels: **MCP protocol** (recommended — works in all 5 IDEs with zero config) and **native IDE plugin** (VS Code Marketplace / JetBrains Marketplace).
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
### via MCP
|
|
21
|
+
|
|
22
|
+
MCP (Model Context Protocol) is a standard supported by all major AI-enabled IDEs. One config, five IDEs.
|
|
23
|
+
|
|
24
|
+
#### Claude Code
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
claude mcp add --npm @diottodev/runic
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
#### Cursor
|
|
31
|
+
|
|
32
|
+
Add to `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global):
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"runic": {
|
|
38
|
+
"command": "npx",
|
|
39
|
+
"args": ["-y", "@diottodev/runic"]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Restart Cursor after saving.
|
|
46
|
+
|
|
47
|
+
#### Windsurf
|
|
48
|
+
|
|
49
|
+
Add to `~/.codeium/windsurf/mcp_config.json`:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"runic": {
|
|
55
|
+
"command": "npx",
|
|
56
|
+
"args": ["-y", "@diottodev/runic"]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Or open Windsurf → Settings → Cascade → MCP Servers.
|
|
63
|
+
|
|
64
|
+
#### VS Code
|
|
65
|
+
|
|
66
|
+
Add to `.vscode/mcp.json`:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"servers": {
|
|
71
|
+
"runic": {
|
|
72
|
+
"type": "stdio",
|
|
73
|
+
"command": "npx",
|
|
74
|
+
"args": ["-y", "@diottodev/runic"]
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Requires VS Code with Copilot, Continue, or another MCP-compatible extension.
|
|
81
|
+
|
|
82
|
+
#### JetBrains
|
|
83
|
+
|
|
84
|
+
Add to `~/.config/JetBrains/mcp.json`:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"servers": {
|
|
89
|
+
"runic": {
|
|
90
|
+
"command": "npx",
|
|
91
|
+
"args": ["-y", "@diottodev/runic"]
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Or open Settings → Tools → AI Assistant → MCP Servers. Requires JetBrains AI Assistant 2024+.
|
|
98
|
+
|
|
99
|
+
> **Requirement:** Node.js ≥ 18 — run `node --version` to verify.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### via Plugin
|
|
104
|
+
|
|
105
|
+
Install Runic as a native IDE extension — no JSON config needed.
|
|
106
|
+
|
|
107
|
+
#### VS Code / Cursor
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# VS Code
|
|
111
|
+
code --install-extension runic.skills
|
|
112
|
+
|
|
113
|
+
# Cursor
|
|
114
|
+
cursor --install-extension runic.skills
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Or search **"Runic Skills"** in the Extensions panel (`Ctrl+Shift+X`).
|
|
118
|
+
|
|
119
|
+
#### JetBrains
|
|
120
|
+
|
|
121
|
+
Open any JetBrains IDE (IntelliJ IDEA, WebStorm, PyCharm, GoLand...) →
|
|
122
|
+
**Settings → Plugins → Marketplace** → search **"Runic"** → Install → Restart.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## How it Works
|
|
127
|
+
|
|
128
|
+
### MCP distribution
|
|
129
|
+
|
|
130
|
+
The `runic` npm package exposes a [Model Context Protocol](https://modelcontextprotocol.io) server. When the IDE starts a session, it spawns `npx @diottodev/runic` as a child process via stdio. The server registers all 91 skills as MCP tools — the IDE's AI can then invoke them by name or the IDE can trigger them proactively based on context.
|
|
131
|
+
|
|
132
|
+
**To publish / update on npm:**
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
npm run build
|
|
136
|
+
npm publish
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### VS Code / Cursor plugin distribution
|
|
140
|
+
|
|
141
|
+
The extension (`packages/vscode-extension/`) wraps the MCP server and registers VS Code commands and context menu entries. Skills are accessible via the Command Palette (`Ctrl+Shift+P → Runic: ...`) and activate automatically via `onLanguage` / `onFileSystem` triggers.
|
|
142
|
+
|
|
143
|
+
**To build and publish:**
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
cd packages/vscode-extension
|
|
147
|
+
npm install
|
|
148
|
+
npx vsce package # builds runic-skills-x.x.x.vsix
|
|
149
|
+
npx vsce publish # requires PAT from marketplace.visualstudio.com
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### JetBrains plugin distribution
|
|
153
|
+
|
|
154
|
+
The plugin (`packages/jetbrains-plugin/`) is a Kotlin/Gradle project using the [IntelliJ Platform Plugin SDK](https://plugins.jetbrains.com/docs/intellij/). It integrates with the JetBrains AI Assistant extension point and registers Runic skills as inline actions and tool window entries.
|
|
155
|
+
|
|
156
|
+
**To build and publish:**
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
cd packages/jetbrains-plugin
|
|
160
|
+
./gradlew buildPlugin # outputs build/distributions/runic-*.zip
|
|
161
|
+
./gradlew publishPlugin # requires PUBLISH_TOKEN env var from plugins.jetbrains.com
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Domains & Skills
|
|
167
|
+
|
|
168
|
+
| Domain | Skills | Description |
|
|
169
|
+
|--------|--------|-------------|
|
|
170
|
+
| `engineering/` | 37 | Core AI & dev tools — review, debug, test, LLM ops, agents |
|
|
171
|
+
| `engineering-team/` | 38 | Team skills — security, cloud, fullstack, QA, DevOps |
|
|
172
|
+
| `ai-research/` | 2 | Model evaluation & benchmarks |
|
|
173
|
+
| `ai-security/` | 1 | Prompt injection & hardening |
|
|
174
|
+
| `research/` | 8 | Academic & market research |
|
|
175
|
+
| `research-ops/` | 5 | Clinical, market, product & R&D ops |
|
|
176
|
+
|
|
177
|
+
### Engineering highlights
|
|
178
|
+
|
|
179
|
+
`code-review` · `debug-error` · `explain-code` · `generate-tests` · `git-commit` · `refactor` · `write-docs` · `llm-cost-optimizer` · `prompt-engineering` · `agent-designer` · `rag-architect` · `mcp-server-builder` · `karpathy-coder` · `chaos-engineering` · `ship-gate` · `slo-architect` · `docker-development` · `kubernetes-operator` · `terraform-patterns`
|
|
180
|
+
|
|
181
|
+
### Security highlights
|
|
182
|
+
|
|
183
|
+
`ai-security` · `cloud-security` · `red-team` · `security-pen-testing` · `threat-detection` · `prompt-injection` · `senior-secops` · `incident-response`
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Project Structure
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
runic/
|
|
191
|
+
├── engineering/ # 37 core AI & dev skills
|
|
192
|
+
├── engineering-team/ # 38 team role skills + security
|
|
193
|
+
├── ai-research/ # 2 model evaluation skills
|
|
194
|
+
├── ai-security/ # 1 AI security skill
|
|
195
|
+
├── research/ # 8 research skills
|
|
196
|
+
├── research-ops/ # 5 research ops skills
|
|
197
|
+
│
|
|
198
|
+
├── packages/
|
|
199
|
+
│ ├── vscode-extension/ # VS Code / Cursor native plugin
|
|
200
|
+
│ └── jetbrains-plugin/ # JetBrains IDE native plugin
|
|
201
|
+
│
|
|
202
|
+
├── web/ # Landing page (React + Vite + Tailwind)
|
|
203
|
+
│
|
|
204
|
+
├── CLAUDE.md # Navigation & roadmap
|
|
205
|
+
├── SKILL-AUTHORING-STANDARD.md # 10-Pattern Framework
|
|
206
|
+
├── CONVENTIONS.md
|
|
207
|
+
├── CONTRIBUTING.md
|
|
208
|
+
└── CHANGELOG.md
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Contributing
|
|
214
|
+
|
|
215
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md). AI and Dev skills only. PRs target `dev`.
|
|
216
|
+
|
|
217
|
+
## License
|
|
218
|
+
|
|
219
|
+
MIT — [Diottodev](https://github.com/Diottodev/runic)
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { readFileSync, readdirSync, statSync, existsSync } from 'fs';
|
|
5
|
+
import { join, dirname } from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const ROOT = join(__dirname, '..');
|
|
10
|
+
const DOMAINS = [
|
|
11
|
+
'engineering',
|
|
12
|
+
'engineering-team',
|
|
13
|
+
'ai-research',
|
|
14
|
+
'ai-security',
|
|
15
|
+
'research',
|
|
16
|
+
'research-ops',
|
|
17
|
+
];
|
|
18
|
+
function parseFrontmatter(raw) {
|
|
19
|
+
const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/m);
|
|
20
|
+
if (!match)
|
|
21
|
+
return { body: raw };
|
|
22
|
+
const meta = {};
|
|
23
|
+
for (const line of match[1].split('\n')) {
|
|
24
|
+
const colon = line.indexOf(':');
|
|
25
|
+
if (colon === -1)
|
|
26
|
+
continue;
|
|
27
|
+
const key = line.slice(0, colon).trim();
|
|
28
|
+
const val = line.slice(colon + 1).trim().replace(/^["']|["']$/g, '');
|
|
29
|
+
meta[key] = val;
|
|
30
|
+
}
|
|
31
|
+
return { name: meta['name'], description: meta['description'], body: match[2].trim() };
|
|
32
|
+
}
|
|
33
|
+
function findSkillFiles(dir) {
|
|
34
|
+
if (!existsSync(dir))
|
|
35
|
+
return [];
|
|
36
|
+
const results = [];
|
|
37
|
+
for (const entry of readdirSync(dir)) {
|
|
38
|
+
const full = join(dir, entry);
|
|
39
|
+
if (statSync(full).isDirectory()) {
|
|
40
|
+
const skill = join(full, 'SKILL.md');
|
|
41
|
+
if (existsSync(skill))
|
|
42
|
+
results.push(skill);
|
|
43
|
+
else
|
|
44
|
+
results.push(...findSkillFiles(full));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return results;
|
|
48
|
+
}
|
|
49
|
+
function loadSkills() {
|
|
50
|
+
const skills = [];
|
|
51
|
+
const seen = new Set();
|
|
52
|
+
for (const domain of DOMAINS) {
|
|
53
|
+
const domainDir = join(ROOT, domain);
|
|
54
|
+
for (const file of findSkillFiles(domainDir)) {
|
|
55
|
+
const raw = readFileSync(file, 'utf8');
|
|
56
|
+
const { name, description, body } = parseFrontmatter(raw);
|
|
57
|
+
if (!name || !description || !body || seen.has(name))
|
|
58
|
+
continue;
|
|
59
|
+
seen.add(name);
|
|
60
|
+
skills.push({ name, description, content: body, domain });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return skills;
|
|
64
|
+
}
|
|
65
|
+
async function main() {
|
|
66
|
+
const skills = loadSkills();
|
|
67
|
+
const server = new McpServer({
|
|
68
|
+
name: 'runic',
|
|
69
|
+
version: '1.0.0',
|
|
70
|
+
});
|
|
71
|
+
for (const skill of skills) {
|
|
72
|
+
server.tool(skill.name, skill.description, { context: z.string().optional().describe('Additional context from the user') }, async ({ context }) => ({
|
|
73
|
+
content: [{
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: context
|
|
76
|
+
? `${skill.content}\n\n---\nUser context: ${context}`
|
|
77
|
+
: skill.content,
|
|
78
|
+
}],
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
// List all skills tool
|
|
82
|
+
server.tool('runic-list', 'List all available Runic skills with their names, domains, and descriptions.', {}, async () => ({
|
|
83
|
+
content: [{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: skills
|
|
86
|
+
.map(s => `**${s.name}** (${s.domain})\n${s.description}`)
|
|
87
|
+
.join('\n\n'),
|
|
88
|
+
}],
|
|
89
|
+
}));
|
|
90
|
+
const transport = new StdioServerTransport();
|
|
91
|
+
await server.connect(transport);
|
|
92
|
+
}
|
|
93
|
+
main().catch(err => {
|
|
94
|
+
process.stderr.write(`runic: ${err.message}\n`);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@diottodev/runic",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "91 AI & Dev skills for Claude Code, Cursor, Windsurf, VS Code, and JetBrains — install via MCP or as a native IDE plugin.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"runic": "./dist/index.js",
|
|
9
|
+
"@diottodev/runic": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc && shx chmod +x dist/index.js",
|
|
18
|
+
"prepare": "npm run build",
|
|
19
|
+
"dev": "tsx watch src/index.ts",
|
|
20
|
+
"start": "node dist/index.js",
|
|
21
|
+
"lint": "eslint src --ext .ts",
|
|
22
|
+
"test": "vitest run"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"mcp",
|
|
26
|
+
"mcp-server",
|
|
27
|
+
"runic",
|
|
28
|
+
"claude-code",
|
|
29
|
+
"cursor",
|
|
30
|
+
"windsurf",
|
|
31
|
+
"vscode",
|
|
32
|
+
"jetbrains",
|
|
33
|
+
"ide-plugin",
|
|
34
|
+
"vscode-extension",
|
|
35
|
+
"ai",
|
|
36
|
+
"ai-skills",
|
|
37
|
+
"code-review",
|
|
38
|
+
"developer-tools",
|
|
39
|
+
"llm",
|
|
40
|
+
"model-context-protocol",
|
|
41
|
+
"prompt-engineering",
|
|
42
|
+
"debug",
|
|
43
|
+
"test-generation",
|
|
44
|
+
"skills-library"
|
|
45
|
+
],
|
|
46
|
+
"homepage": "https://github.com/Diottodev/runic",
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/Diottodev/runic.git"
|
|
50
|
+
},
|
|
51
|
+
"bugs": {
|
|
52
|
+
"url": "https://github.com/Diottodev/runic/issues"
|
|
53
|
+
},
|
|
54
|
+
"author": "Diottodev",
|
|
55
|
+
"license": "MIT",
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
61
|
+
"zod": "^3.23.8"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@types/node": "^20.14.0",
|
|
65
|
+
"shx": "^0.3.4",
|
|
66
|
+
"tsx": "^4.15.0",
|
|
67
|
+
"typescript": "^5.5.0",
|
|
68
|
+
"vitest": "^1.6.0"
|
|
69
|
+
},
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=18"
|
|
72
|
+
}
|
|
73
|
+
}
|