@rune-kit/rune 2.2.4 → 2.2.6
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/compiler/adapters/openclaw.js +63 -0
- package/compiler/emitter.js +10 -0
- package/docs/EXTENSION-TEMPLATE.md +18 -0
- package/docs/SKILL-TEMPLATE.md +31 -0
- package/docs/guides/index.html +84 -21
- package/docs/index.html +227 -30
- package/docs/script.js +206 -15
- package/docs/style.css +355 -59
- package/extensions/saas/PACK.md +13 -8
- package/extensions/saas/skills/billing-integration.md +82 -3
- package/package.json +1 -1
- package/skills/audit/SKILL.md +1 -0
- package/skills/ba/SKILL.md +54 -1
- package/skills/completion-gate/SKILL.md +37 -2
- package/skills/cook/SKILL.md +151 -1
- package/skills/debug/SKILL.md +48 -1
- package/skills/deploy/SKILL.md +46 -1
- package/skills/fix/SKILL.md +28 -1
- package/skills/git/SKILL.md +55 -1
- package/skills/journal/SKILL.md +51 -3
- package/skills/plan/SKILL.md +63 -4
- package/skills/preflight/SKILL.md +50 -1
- package/skills/research/SKILL.md +36 -8
- package/skills/retro/SKILL.md +314 -0
- package/skills/sentinel/SKILL.md +108 -3
- package/skills/skill-forge/SKILL.md +85 -3
- package/skills/test/SKILL.md +45 -7
|
@@ -100,6 +100,69 @@ export default {
|
|
|
100
100
|
};
|
|
101
101
|
},
|
|
102
102
|
|
|
103
|
+
/**
|
|
104
|
+
* Generate README.md for ClawHub listing page
|
|
105
|
+
*
|
|
106
|
+
* @param {object[]} skills - parsed skill objects
|
|
107
|
+
* @param {object} pluginJson - Rune's .claude-plugin/plugin.json
|
|
108
|
+
* @returns {string} markdown content
|
|
109
|
+
*/
|
|
110
|
+
generateReadme(skills, pluginJson) {
|
|
111
|
+
const version = pluginJson.version || '0.0.0';
|
|
112
|
+
const l1 = skills.filter((s) => s.layer === 'L1').map((s) => s.name);
|
|
113
|
+
const l2 = skills.filter((s) => s.layer === 'L2').map((s) => s.name);
|
|
114
|
+
const l3 = skills.filter((s) => s.layer === 'L3').map((s) => s.name);
|
|
115
|
+
|
|
116
|
+
return `# Rune
|
|
117
|
+
|
|
118
|
+
> Less skills. Deeper connections.
|
|
119
|
+
|
|
120
|
+
**${skills.length}-skill mesh** for AI coding assistants — 5-layer architecture, 200+ connections, 14 extension packs.
|
|
121
|
+
|
|
122
|
+
## Install
|
|
123
|
+
|
|
124
|
+
\`\`\`
|
|
125
|
+
clawhub install rune-kit
|
|
126
|
+
\`\`\`
|
|
127
|
+
|
|
128
|
+
Or via npm:
|
|
129
|
+
|
|
130
|
+
\`\`\`
|
|
131
|
+
npx @rune-kit/rune init
|
|
132
|
+
\`\`\`
|
|
133
|
+
|
|
134
|
+
## What is Rune?
|
|
135
|
+
|
|
136
|
+
Rune is a **mesh** — skills call each other bidirectionally, forming resilient workflows. If one skill fails, the mesh routes around it.
|
|
137
|
+
|
|
138
|
+
Use \`rune:cook\` for any code task, \`rune:team\` for parallel work, \`rune:launch\` for deploy, \`rune:rescue\` for legacy code.
|
|
139
|
+
|
|
140
|
+
## Architecture
|
|
141
|
+
|
|
142
|
+
| Layer | Role | Skills |
|
|
143
|
+
|-------|------|--------|
|
|
144
|
+
| L0 | Router | skill-router |
|
|
145
|
+
| L1 | Orchestrators | ${l1.join(', ')} |
|
|
146
|
+
| L2 | Workflow Hubs | ${l2.join(', ')} |
|
|
147
|
+
| L3 | Utilities | ${l3.join(', ')} |
|
|
148
|
+
| L4 | Extensions | 14 domain packs |
|
|
149
|
+
|
|
150
|
+
## Extension Packs (L4)
|
|
151
|
+
|
|
152
|
+
ui · backend · devops · mobile · security · trading · saas · ecommerce · ai-ml · gamedev · content · analytics · chrome-ext · zalo
|
|
153
|
+
|
|
154
|
+
## Links
|
|
155
|
+
|
|
156
|
+
- **Source**: [github.com/rune-kit/rune](https://github.com/rune-kit/rune)
|
|
157
|
+
- **Docs**: [rune-kit.github.io/rune](https://rune-kit.github.io/rune)
|
|
158
|
+
- **Guides**: [rune-kit.github.io/rune/guides](https://rune-kit.github.io/rune/guides)
|
|
159
|
+
|
|
160
|
+
## License
|
|
161
|
+
|
|
162
|
+
MIT — v${version}
|
|
163
|
+
`;
|
|
164
|
+
},
|
|
165
|
+
|
|
103
166
|
/**
|
|
104
167
|
* Generate src/index.ts entry point with register(api) pattern
|
|
105
168
|
*
|
package/compiler/emitter.js
CHANGED
|
@@ -256,6 +256,16 @@ export async function buildAll({ runeRoot, outputRoot, adapter, disabledSkills =
|
|
|
256
256
|
const entryPoint = adapter.generateEntryPoint(parsedSkills, routerContent);
|
|
257
257
|
await writeFile(path.join(srcDir, 'index.ts'), entryPoint, 'utf-8');
|
|
258
258
|
stats.files.push('src/index.ts');
|
|
259
|
+
|
|
260
|
+
// Write README.md + SKILL.md for ClawHub listing page
|
|
261
|
+
if (adapter.generateReadme) {
|
|
262
|
+
const readme = adapter.generateReadme(parsedSkills, pluginJson);
|
|
263
|
+
await writeFile(path.join(openclawRoot, 'README.md'), readme, 'utf-8');
|
|
264
|
+
stats.files.push('README.md');
|
|
265
|
+
// SKILL.md required by clawhub publish
|
|
266
|
+
await writeFile(path.join(openclawRoot, 'SKILL.md'), readme, 'utf-8');
|
|
267
|
+
stats.files.push('SKILL.md');
|
|
268
|
+
}
|
|
259
269
|
}
|
|
260
270
|
|
|
261
271
|
return stats;
|
|
@@ -77,6 +77,9 @@ Brief description.
|
|
|
77
77
|
Calls → [L3 utility]: [when/why]
|
|
78
78
|
Called By ← [L2 hub]: [when/why]
|
|
79
79
|
Called By ← [L1 orchestrator]: [when auto-detected]
|
|
80
|
+
Feeds Into → [skill]: [what artifact] → [how consumed]
|
|
81
|
+
Fed By ← [skill]: [what artifact] ← [what this pack needs]
|
|
82
|
+
Feedback Loop ↻ [skill-a] ↔ [skill-b]: [what gets refined bidirectionally]
|
|
80
83
|
```
|
|
81
84
|
|
|
82
85
|
## Tech Stack Support (if applicable)
|
|
@@ -97,11 +100,26 @@ Called By ← [L1 orchestrator]: [when auto-detected]
|
|
|
97
100
|
|---|---|---|
|
|
98
101
|
| [domain-specific failure] | HIGH/MEDIUM | [how to avoid] |
|
|
99
102
|
|
|
103
|
+
## Self-Validation
|
|
104
|
+
|
|
105
|
+
Per-skill quality checks that run before reporting "done". Domain-specific — not covered by centralized completion-gate.
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
SELF-VALIDATION (per skill):
|
|
109
|
+
skill-1:
|
|
110
|
+
- [ ] [domain-specific quality check]
|
|
111
|
+
- [ ] [output format compliance]
|
|
112
|
+
skill-2:
|
|
113
|
+
- [ ] [domain-specific quality check]
|
|
114
|
+
- [ ] [completeness check]
|
|
115
|
+
```
|
|
116
|
+
|
|
100
117
|
## Done When
|
|
101
118
|
|
|
102
119
|
- [Verifiable condition 1]
|
|
103
120
|
- [Verifiable condition 2]
|
|
104
121
|
- [Structured output emitted]
|
|
122
|
+
- Self-Validation: all per-skill checks passed
|
|
105
123
|
|
|
106
124
|
## Cost Profile
|
|
107
125
|
|
package/docs/SKILL-TEMPLATE.md
CHANGED
|
@@ -28,6 +28,22 @@ One paragraph describing the skill's role in the Rune ecosystem.
|
|
|
28
28
|
|
|
29
29
|
- `skill-name` (L1|L2): condition when called
|
|
30
30
|
|
|
31
|
+
## Data Flow
|
|
32
|
+
|
|
33
|
+
Data relationships capture how skill outputs become inputs for other skills — without direct invocation. Unlike Calls/Called By (control flow), data flow tracks artifacts that persist and get consumed asynchronously.
|
|
34
|
+
|
|
35
|
+
### Feeds Into →
|
|
36
|
+
|
|
37
|
+
- `skill-name` (L2): [what artifact] → [how it's consumed]
|
|
38
|
+
|
|
39
|
+
### Fed By ←
|
|
40
|
+
|
|
41
|
+
- `skill-name` (L2): [what artifact] ← [what this skill needs from it]
|
|
42
|
+
|
|
43
|
+
### Feedback Loops ↻
|
|
44
|
+
|
|
45
|
+
- `skill-a` ↔ `skill-b`: [what gets refined bidirectionally and why]
|
|
46
|
+
|
|
31
47
|
## Workflow
|
|
32
48
|
|
|
33
49
|
Step-by-step execution flow.
|
|
@@ -61,11 +77,26 @@ Known failure modes for this skill. Check these before declaring done.
|
|
|
61
77
|
|---|---|---|
|
|
62
78
|
| [what goes wrong] | CRITICAL/HIGH/MEDIUM/LOW | [how to avoid it] |
|
|
63
79
|
|
|
80
|
+
## Self-Validation
|
|
81
|
+
|
|
82
|
+
Domain-specific quality checks that run BEFORE this skill reports "done". These are embedded in the skill itself — not centralized like completion-gate. Each check is specific to what THIS skill produces.
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
SELF-VALIDATION (run before emitting output):
|
|
86
|
+
- [ ] [check 1 — what to verify about this skill's output]
|
|
87
|
+
- [ ] [check 2 — domain-specific quality criterion]
|
|
88
|
+
- [ ] [check 3 — format/completeness check]
|
|
89
|
+
IF ANY check fails → fix before reporting done. Do NOT defer to completion-gate.
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Why: Completion-gate validates claims generically. Self-Validation catches domain-specific quality issues that only THIS skill understands (e.g., test skill checks assertion count, plan skill checks dependency ordering, review skill checks all files were read).
|
|
93
|
+
|
|
64
94
|
## Done When
|
|
65
95
|
|
|
66
96
|
- [condition 1 — specific, verifiable]
|
|
67
97
|
- [condition 2]
|
|
68
98
|
- [condition 3 — structured report emitted]
|
|
99
|
+
- Self-Validation checklist: all checks passed
|
|
69
100
|
|
|
70
101
|
## Cost Profile
|
|
71
102
|
|
package/docs/guides/index.html
CHANGED
|
@@ -379,18 +379,38 @@
|
|
|
379
379
|
cursor: pointer; display: flex; align-items: center; justify-content: center;
|
|
380
380
|
font-size: 16px; transition: all var(--transition); flex-shrink: 0;
|
|
381
381
|
}
|
|
382
|
-
.theme-toggle:hover { border-color: var(--accent); color: var(--text-primary); }
|
|
382
|
+
.theme-toggle:hover, .lang-toggle:hover { border-color: var(--accent); color: var(--text-primary); }
|
|
383
|
+
.lang-toggle {
|
|
384
|
+
background: none; border: 1px solid var(--border); color: var(--text-secondary);
|
|
385
|
+
width: 34px; height: 34px; border-radius: var(--radius-sm);
|
|
386
|
+
cursor: pointer; display: flex; align-items: center; justify-content: center;
|
|
387
|
+
font-size: 16px; transition: all var(--transition); flex-shrink: 0;
|
|
388
|
+
}
|
|
389
|
+
/* Google Translate — hide ALL injected elements */
|
|
383
390
|
.goog-te-banner-frame { display: none !important; }
|
|
384
|
-
body { top: 0 !important; }
|
|
385
|
-
.
|
|
386
|
-
.goog-te-
|
|
387
|
-
.goog-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
391
|
+
body { top: 0 !important; position: static !important; }
|
|
392
|
+
.skiptranslate { display: none !important; height: 0 !important; overflow: hidden !important; }
|
|
393
|
+
.goog-te-spinner-pos, .goog-te-balloon-frame, #goog-gt-tt, .goog-te-ftab-frame { display: none !important; }
|
|
394
|
+
.goog-text-highlight { background: none !important; box-shadow: none !important; }
|
|
395
|
+
font[style] > font { vertical-align: unset !important; }
|
|
396
|
+
#_gt_dummy { display: none !important; visibility: hidden !important; height: 0 !important; overflow: hidden !important; }
|
|
397
|
+
/* Language dropdown */
|
|
398
|
+
.lang-dropdown { position: relative; }
|
|
399
|
+
.lang-menu {
|
|
400
|
+
position: absolute; top: calc(100% + 6px); right: 0; z-index: 100;
|
|
401
|
+
background: var(--bg-card); border: 1px solid var(--border);
|
|
402
|
+
border-radius: var(--radius-md); padding: 4px; min-width: 140px;
|
|
403
|
+
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
|
|
404
|
+
display: flex; flex-direction: column;
|
|
405
|
+
}
|
|
406
|
+
.lang-menu[hidden] { display: none; }
|
|
407
|
+
.lang-menu button {
|
|
408
|
+
background: none; border: none; color: var(--text-secondary);
|
|
409
|
+
padding: 7px 12px; font-family: var(--font-body); font-size: 13px;
|
|
410
|
+
text-align: left; cursor: pointer; border-radius: var(--radius-sm);
|
|
411
|
+
transition: all var(--transition);
|
|
392
412
|
}
|
|
393
|
-
.
|
|
413
|
+
.lang-menu button:hover { background: var(--bg-elevated); color: var(--text-primary); }
|
|
394
414
|
|
|
395
415
|
/* ─── RESPONSIVE ─── */
|
|
396
416
|
@media (max-width: 900px) {
|
|
@@ -431,9 +451,28 @@
|
|
|
431
451
|
<a href="../">Home</a>
|
|
432
452
|
<a href="./" class="active">Guides</a>
|
|
433
453
|
<a href="../#pricing">Pricing</a>
|
|
434
|
-
<div class="nav-controls">
|
|
454
|
+
<div class="nav-controls notranslate" translate="no">
|
|
435
455
|
<button class="theme-toggle" id="theme-toggle" aria-label="Toggle light/dark mode" title="Toggle theme">☾</button>
|
|
436
|
-
<div id="
|
|
456
|
+
<div class="lang-dropdown" id="lang-dropdown">
|
|
457
|
+
<button class="lang-toggle" id="lang-btn" aria-label="Translate page" title="Translate page">
|
|
458
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10A15.3 15.3 0 0 1 12 2z"/></svg>
|
|
459
|
+
</button>
|
|
460
|
+
<div class="lang-menu notranslate" id="lang-menu" translate="no" hidden>
|
|
461
|
+
<button data-lang="">English</button>
|
|
462
|
+
<button data-lang="vi">Tiếng Việt</button>
|
|
463
|
+
<button data-lang="ja">日本語</button>
|
|
464
|
+
<button data-lang="ko">한국어</button>
|
|
465
|
+
<button data-lang="zh-CN">中文(简)</button>
|
|
466
|
+
<button data-lang="zh-TW">中文(繁)</button>
|
|
467
|
+
<button data-lang="fr">Français</button>
|
|
468
|
+
<button data-lang="de">Deutsch</button>
|
|
469
|
+
<button data-lang="es">Español</button>
|
|
470
|
+
<button data-lang="pt">Português</button>
|
|
471
|
+
<button data-lang="ru">Русский</button>
|
|
472
|
+
<button data-lang="th">ไทย</button>
|
|
473
|
+
<button data-lang="id">Bahasa</button>
|
|
474
|
+
</div>
|
|
475
|
+
</div>
|
|
437
476
|
</div>
|
|
438
477
|
<a href="https://github.com/rune-kit/rune" class="btn btn-ghost btn-sm" target="_blank" rel="noopener">GitHub</a>
|
|
439
478
|
</div>
|
|
@@ -1370,18 +1409,42 @@
|
|
|
1370
1409
|
})();
|
|
1371
1410
|
</script>
|
|
1372
1411
|
|
|
1373
|
-
<!--
|
|
1412
|
+
<!-- Language Switcher (Google Translate via cookie) -->
|
|
1374
1413
|
<script>
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1414
|
+
(() => {
|
|
1415
|
+
const btn = document.getElementById('lang-btn');
|
|
1416
|
+
const menu = document.getElementById('lang-menu');
|
|
1417
|
+
const wrap = document.getElementById('lang-dropdown');
|
|
1418
|
+
|
|
1419
|
+
btn.addEventListener('click', () => {
|
|
1420
|
+
const open = !menu.hidden;
|
|
1421
|
+
menu.hidden = open;
|
|
1422
|
+
btn.setAttribute('aria-expanded', String(!open));
|
|
1423
|
+
});
|
|
1424
|
+
|
|
1425
|
+
document.addEventListener('click', (e) => {
|
|
1426
|
+
if (!wrap.contains(e.target)) menu.hidden = true;
|
|
1427
|
+
});
|
|
1428
|
+
|
|
1429
|
+
menu.addEventListener('click', (e) => {
|
|
1430
|
+
const lang = e.target.dataset.lang;
|
|
1431
|
+
if (lang === undefined) return;
|
|
1432
|
+
menu.hidden = true;
|
|
1433
|
+
if (!lang) {
|
|
1434
|
+
document.cookie = 'googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/';
|
|
1435
|
+
document.cookie = 'googtrans=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.' + location.hostname;
|
|
1436
|
+
location.reload();
|
|
1437
|
+
return;
|
|
1438
|
+
}
|
|
1439
|
+
document.cookie = 'googtrans=/en/' + lang + '; path=/';
|
|
1440
|
+
document.cookie = 'googtrans=/en/' + lang + '; path=/; domain=.' + location.hostname;
|
|
1441
|
+
location.reload();
|
|
1442
|
+
});
|
|
1443
|
+
})();
|
|
1383
1444
|
</script>
|
|
1384
1445
|
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
|
|
1446
|
+
<script>function googleTranslateElementInit() { new google.translate.TranslateElement({ pageLanguage: 'en', autoDisplay: false }, '_gt_dummy'); }</script>
|
|
1447
|
+
<div id="_gt_dummy" style="display:none"></div>
|
|
1385
1448
|
|
|
1386
1449
|
</body>
|
|
1387
1450
|
</html>
|
package/docs/index.html
CHANGED
|
@@ -26,14 +26,15 @@
|
|
|
26
26
|
<a href="#architecture">Architecture</a>
|
|
27
27
|
<a href="#workflows">Workflows</a>
|
|
28
28
|
<a href="guides/">Guides</a>
|
|
29
|
+
<a href="#mesh">Mesh</a>
|
|
29
30
|
<a href="#pricing">Pricing</a>
|
|
30
|
-
<div class="nav-controls">
|
|
31
|
+
<div class="nav-controls notranslate" translate="no">
|
|
31
32
|
<button class="theme-toggle" id="theme-toggle" aria-label="Toggle light/dark mode" title="Toggle theme">☾</button>
|
|
32
33
|
<div class="lang-dropdown" id="lang-dropdown">
|
|
33
34
|
<button class="lang-toggle" id="lang-btn" aria-label="Translate page" title="Translate page">
|
|
34
35
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M2 12h20"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10A15.3 15.3 0 0 1 12 2z"/></svg>
|
|
35
36
|
</button>
|
|
36
|
-
<div class="lang-menu" id="lang-menu" hidden>
|
|
37
|
+
<div class="lang-menu notranslate" id="lang-menu" translate="no" hidden>
|
|
37
38
|
<button data-lang="">English</button>
|
|
38
39
|
<button data-lang="vi">Tiếng Việt</button>
|
|
39
40
|
<button data-lang="ja">日本語</button>
|
|
@@ -322,6 +323,173 @@ claude plugin install rune</code></pre>
|
|
|
322
323
|
</div>
|
|
323
324
|
</section>
|
|
324
325
|
|
|
326
|
+
<!-- HOW THE MESH WORKS -->
|
|
327
|
+
<section class="section" id="mesh">
|
|
328
|
+
<div class="container">
|
|
329
|
+
<h2>How the Mesh Works</h2>
|
|
330
|
+
<p class="section-sub">Skills don't run in isolation. They call each other, forming resilient workflows that adapt when things go wrong.</p>
|
|
331
|
+
|
|
332
|
+
<!-- Mesh Diagram -->
|
|
333
|
+
<div class="mesh-diagram">
|
|
334
|
+
<div class="mesh-tier mesh-tier-free">
|
|
335
|
+
<div class="mesh-tier-header">
|
|
336
|
+
<span class="mesh-tier-badge mesh-badge-free">FREE</span>
|
|
337
|
+
<strong>Core Mesh</strong>
|
|
338
|
+
<span class="mesh-tier-stats">58 skills • 200+ connections</span>
|
|
339
|
+
</div>
|
|
340
|
+
<div class="mesh-layers">
|
|
341
|
+
<div class="mesh-layer">
|
|
342
|
+
<span class="mesh-layer-label">L0</span>
|
|
343
|
+
<div class="mesh-nodes">
|
|
344
|
+
<span class="mesh-node mesh-node-router" title="Routes every action to the right skill">skill-router</span>
|
|
345
|
+
</div>
|
|
346
|
+
</div>
|
|
347
|
+
<div class="mesh-layer">
|
|
348
|
+
<span class="mesh-layer-label">L1</span>
|
|
349
|
+
<div class="mesh-nodes">
|
|
350
|
+
<span class="mesh-node" title="Feature orchestrator — 70% of tasks flow through cook">cook</span>
|
|
351
|
+
<span class="mesh-node">team</span>
|
|
352
|
+
<span class="mesh-node">scaffold</span>
|
|
353
|
+
<span class="mesh-node">launch</span>
|
|
354
|
+
<span class="mesh-node">rescue</span>
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
<div class="mesh-layer">
|
|
358
|
+
<span class="mesh-layer-label">L2</span>
|
|
359
|
+
<div class="mesh-nodes">
|
|
360
|
+
<span class="mesh-node">plan</span>
|
|
361
|
+
<span class="mesh-node">ba</span>
|
|
362
|
+
<span class="mesh-node">debug</span>
|
|
363
|
+
<span class="mesh-node">fix</span>
|
|
364
|
+
<span class="mesh-node">test</span>
|
|
365
|
+
<span class="mesh-node">review</span>
|
|
366
|
+
<span class="mesh-node">sentinel</span>
|
|
367
|
+
<span class="mesh-node">deploy</span>
|
|
368
|
+
<span class="mesh-node mesh-node-more">+19 more</span>
|
|
369
|
+
</div>
|
|
370
|
+
</div>
|
|
371
|
+
<div class="mesh-layer">
|
|
372
|
+
<span class="mesh-layer-label">L3</span>
|
|
373
|
+
<div class="mesh-nodes">
|
|
374
|
+
<span class="mesh-node">scout</span>
|
|
375
|
+
<span class="mesh-node">research</span>
|
|
376
|
+
<span class="mesh-node">verification</span>
|
|
377
|
+
<span class="mesh-node">git</span>
|
|
378
|
+
<span class="mesh-node">docs</span>
|
|
379
|
+
<span class="mesh-node mesh-node-more">+20 more</span>
|
|
380
|
+
</div>
|
|
381
|
+
</div>
|
|
382
|
+
<div class="mesh-layer">
|
|
383
|
+
<span class="mesh-layer-label">L4</span>
|
|
384
|
+
<div class="mesh-nodes">
|
|
385
|
+
<span class="mesh-node">@rune/ui</span>
|
|
386
|
+
<span class="mesh-node">@rune/backend</span>
|
|
387
|
+
<span class="mesh-node">@rune/saas</span>
|
|
388
|
+
<span class="mesh-node">@rune/mobile</span>
|
|
389
|
+
<span class="mesh-node mesh-node-more">+10 packs</span>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
</div>
|
|
393
|
+
<div class="mesh-flow-example">
|
|
394
|
+
<span class="mesh-flow-label">Example flow:</span>
|
|
395
|
+
<code class="mesh-flow">cook → plan → test <span class="mesh-flow-fail">✗</span> → debug → fix → test <span class="mesh-flow-pass">✓</span> → review → sentinel → git</code>
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
|
|
399
|
+
<!-- Connection arrows -->
|
|
400
|
+
<div class="mesh-arrows">
|
|
401
|
+
<div class="mesh-arrow-line"></div>
|
|
402
|
+
<div class="mesh-arrow-labels">
|
|
403
|
+
<span class="mesh-arrow-label">+57 new connections</span>
|
|
404
|
+
<span class="mesh-arrow-desc">Pro skills plug into cook, team, ba, sentinel, git, research</span>
|
|
405
|
+
</div>
|
|
406
|
+
</div>
|
|
407
|
+
|
|
408
|
+
<div class="mesh-tier mesh-tier-pro">
|
|
409
|
+
<div class="mesh-tier-header">
|
|
410
|
+
<span class="mesh-tier-badge mesh-badge-pro">PRO $49</span>
|
|
411
|
+
<strong>Department Skills</strong>
|
|
412
|
+
<span class="mesh-tier-stats">+25 skills • +57 connections into core</span>
|
|
413
|
+
</div>
|
|
414
|
+
<div class="mesh-nodes mesh-nodes-grid">
|
|
415
|
+
<div class="mesh-pack">
|
|
416
|
+
<strong>Product</strong>
|
|
417
|
+
<span>PRDs, roadmaps, KPIs, release comms</span>
|
|
418
|
+
</div>
|
|
419
|
+
<div class="mesh-pack">
|
|
420
|
+
<strong>Sales</strong>
|
|
421
|
+
<span>Pipeline, outreach, account research</span>
|
|
422
|
+
</div>
|
|
423
|
+
<div class="mesh-pack">
|
|
424
|
+
<strong>Data Science</strong>
|
|
425
|
+
<span>SQL exploration, dashboards, ML eval</span>
|
|
426
|
+
</div>
|
|
427
|
+
<div class="mesh-pack">
|
|
428
|
+
<strong>Support</strong>
|
|
429
|
+
<span>Ticket triage, KB, escalation</span>
|
|
430
|
+
</div>
|
|
431
|
+
</div>
|
|
432
|
+
<p class="mesh-tier-note">Pro packs register as <code>Called By ← cook</code> — activated by the same orchestrator as core skills. No configuration needed.</p>
|
|
433
|
+
</div>
|
|
434
|
+
|
|
435
|
+
<!-- Connection arrows -->
|
|
436
|
+
<div class="mesh-arrows">
|
|
437
|
+
<div class="mesh-arrow-line mesh-arrow-line-biz"></div>
|
|
438
|
+
<div class="mesh-arrow-labels">
|
|
439
|
+
<span class="mesh-arrow-label">+54 connections + 13 cross-tier</span>
|
|
440
|
+
<span class="mesh-arrow-desc">Business calls Pro data: finance uses sales pipeline, legal uses product specs</span>
|
|
441
|
+
</div>
|
|
442
|
+
</div>
|
|
443
|
+
|
|
444
|
+
<div class="mesh-tier mesh-tier-biz">
|
|
445
|
+
<div class="mesh-tier-header">
|
|
446
|
+
<span class="mesh-tier-badge mesh-badge-biz">BUSINESS $149</span>
|
|
447
|
+
<strong>Enterprise Skills</strong>
|
|
448
|
+
<span class="mesh-tier-stats">+26 skills • includes all Pro skills</span>
|
|
449
|
+
</div>
|
|
450
|
+
<div class="mesh-nodes mesh-nodes-grid">
|
|
451
|
+
<div class="mesh-pack">
|
|
452
|
+
<strong>Finance</strong>
|
|
453
|
+
<span>Budget from <em>sales pipeline</em> + <em>product roadmap</em></span>
|
|
454
|
+
</div>
|
|
455
|
+
<div class="mesh-pack">
|
|
456
|
+
<strong>Legal</strong>
|
|
457
|
+
<span>Compliance via <em>product specs</em> + <em>support KB</em></span>
|
|
458
|
+
</div>
|
|
459
|
+
<div class="mesh-pack">
|
|
460
|
+
<strong>HR</strong>
|
|
461
|
+
<span>Recruiting, onboarding, role design</span>
|
|
462
|
+
</div>
|
|
463
|
+
<div class="mesh-pack">
|
|
464
|
+
<strong>Enterprise Search</strong>
|
|
465
|
+
<span>Cross-department knowledge from <em>support KB</em> + <em>product docs</em></span>
|
|
466
|
+
</div>
|
|
467
|
+
</div>
|
|
468
|
+
<p class="mesh-tier-note">Business includes Pro because it depends on Pro data. Finance can’t forecast without sales pipeline. Legal can’t audit without product specs. That’s why they’re bundled.</p>
|
|
469
|
+
</div>
|
|
470
|
+
</div>
|
|
471
|
+
|
|
472
|
+
<!-- Key Points -->
|
|
473
|
+
<div class="mesh-points">
|
|
474
|
+
<div class="mesh-point">
|
|
475
|
+
<div class="mesh-point-icon">◆</div>
|
|
476
|
+
<h3>Free is complete</h3>
|
|
477
|
+
<p>The full development workflow — plan, build, test, review, deploy — runs entirely on Free. You never hit a paywall while coding.</p>
|
|
478
|
+
</div>
|
|
479
|
+
<div class="mesh-point">
|
|
480
|
+
<div class="mesh-point-icon">◾</div>
|
|
481
|
+
<h3>Pro extends, not replaces</h3>
|
|
482
|
+
<p>Pro skills plug into the existing mesh via <code>cook</code> and <code>team</code>. Same orchestrator, same quality gates, new department capabilities.</p>
|
|
483
|
+
</div>
|
|
484
|
+
<div class="mesh-point">
|
|
485
|
+
<div class="mesh-point-icon">◾</div>
|
|
486
|
+
<h3>Business needs Pro</h3>
|
|
487
|
+
<p>Finance pulls from sales pipeline. Legal checks product specs. Enterprise search indexes support KB. That’s 13 cross-tier connections — and why Business includes Pro.</p>
|
|
488
|
+
</div>
|
|
489
|
+
</div>
|
|
490
|
+
</div>
|
|
491
|
+
</section>
|
|
492
|
+
|
|
325
493
|
<!-- PRICING -->
|
|
326
494
|
<section class="section section-dark" id="pricing">
|
|
327
495
|
<div class="container">
|
|
@@ -390,30 +558,43 @@ claude plugin install rune</code></pre>
|
|
|
390
558
|
<li>All future Pro packs included</li>
|
|
391
559
|
</ul>
|
|
392
560
|
<button class="btn btn-pro" style="width:100%" onclick="openPayment('rune-pro')">Get Rune Pro — $49</button>
|
|
393
|
-
<p class="pricing-note"
|
|
561
|
+
<p class="pricing-note pricing-guarantee">💰 14-Day Money-Back Guarantee — no questions asked</p>
|
|
394
562
|
</div>
|
|
395
563
|
|
|
396
564
|
<!-- BUSINESS -->
|
|
397
565
|
<div class="pricing-card pricing-biz">
|
|
398
566
|
<div class="pricing-tier">
|
|
399
|
-
<span class="pricing-badge pricing-badge-
|
|
567
|
+
<span class="pricing-badge pricing-badge-best">★ BEST VALUE</span>
|
|
400
568
|
<h3>Rune Business</h3>
|
|
401
569
|
<div class="pricing-price">$149<span class="pricing-period"> lifetime</span></div>
|
|
402
570
|
</div>
|
|
403
|
-
<p class="pricing-desc">Full department coverage
|
|
404
|
-
|
|
571
|
+
<p class="pricing-desc">Full department coverage — every business function, one purchase.</p>
|
|
572
|
+
|
|
573
|
+
<!-- What's Included breakdown -->
|
|
574
|
+
<div class="includes-breakdown">
|
|
575
|
+
<p class="includes-label">What’s Included:</p>
|
|
576
|
+
<div class="includes-box includes-box-pro">
|
|
577
|
+
<strong>Rune Pro</strong> <span class="includes-value">$49 value</span>
|
|
578
|
+
<ul>
|
|
579
|
+
<li>Product Management, Sales, Data Science, Support</li>
|
|
580
|
+
<li>Business memory layer + MCP connectors</li>
|
|
581
|
+
</ul>
|
|
582
|
+
</div>
|
|
583
|
+
<div class="includes-box includes-box-biz">
|
|
584
|
+
<strong>Rune Business</strong> <span class="includes-value">$100 value</span>
|
|
585
|
+
<ul>
|
|
586
|
+
<li>Finance Ops, Legal & Compliance, HR & Recruiting</li>
|
|
587
|
+
<li>Enterprise Search + Priority support</li>
|
|
588
|
+
</ul>
|
|
589
|
+
</div>
|
|
590
|
+
</div>
|
|
591
|
+
|
|
405
592
|
<ul class="pricing-features">
|
|
406
|
-
<li
|
|
407
|
-
<li>
|
|
408
|
-
<li>Legal & Compliance — contract review, policy drafting, audit prep</li>
|
|
409
|
-
<li>HR & Recruiting — job descriptions, candidate screening, onboarding</li>
|
|
410
|
-
<li>Enterprise Search — cross-system knowledge retrieval</li>
|
|
411
|
-
<li>Skill Forge included — build private skills (free in core, enhanced for teams)</li>
|
|
412
|
-
<li>Priority support — direct access to maintainers</li>
|
|
413
|
-
<li>All future Business packs included</li>
|
|
593
|
+
<li>All future Pro + Business packs included</li>
|
|
594
|
+
<li>Lifetime access — no subscriptions ever</li>
|
|
414
595
|
</ul>
|
|
415
596
|
<button class="btn btn-biz" style="width:100%" onclick="openPayment('rune-biz')">Get Rune Business — $149</button>
|
|
416
|
-
<p class="pricing-note"
|
|
597
|
+
<p class="pricing-note pricing-guarantee">💰 14-Day Money-Back Guarantee — no questions asked</p>
|
|
417
598
|
</div>
|
|
418
599
|
</div>
|
|
419
600
|
|
|
@@ -603,7 +784,7 @@ claude plugin install rune</code></pre>
|
|
|
603
784
|
<p class="pay-subtitle">Choose your payment method</p>
|
|
604
785
|
<div class="pay-options">
|
|
605
786
|
<button class="pay-option" onclick="showVNPayment()">
|
|
606
|
-
<
|
|
787
|
+
<img src="https://flagcdn.com/w40/vn.png" width="32" height="21" alt="VN" style="border-radius:3px" />
|
|
607
788
|
<div class="pay-option-info">
|
|
608
789
|
<strong>Vietnam</strong>
|
|
609
790
|
<span>Bank Transfer (VietQR)</span>
|
|
@@ -611,15 +792,15 @@ claude plugin install rune</code></pre>
|
|
|
611
792
|
</div>
|
|
612
793
|
<span class="pay-option-arrow">→</span>
|
|
613
794
|
</button>
|
|
614
|
-
<
|
|
795
|
+
<button class="pay-option" onclick="showIntlPayment()">
|
|
615
796
|
<span class="pay-option-flag">🌐</span>
|
|
616
797
|
<div class="pay-option-info">
|
|
617
798
|
<strong>International</strong>
|
|
618
|
-
<span>
|
|
799
|
+
<span>Card / PayPal (Polar)</span>
|
|
619
800
|
<span class="pay-option-price" id="pay-price-intl">$49 USD</span>
|
|
620
801
|
</div>
|
|
621
802
|
<span class="pay-option-arrow">→</span>
|
|
622
|
-
</
|
|
803
|
+
</button>
|
|
623
804
|
</div>
|
|
624
805
|
</div>
|
|
625
806
|
|
|
@@ -646,7 +827,7 @@ claude plugin install rune</code></pre>
|
|
|
646
827
|
<img id="pay-qr-img" alt="VietQR Payment" />
|
|
647
828
|
</div>
|
|
648
829
|
<div class="pay-details">
|
|
649
|
-
<div class="pay-detail-row"><span>Bank</span><strong>
|
|
830
|
+
<div class="pay-detail-row"><span>Bank</span><strong>TPBank</strong></div>
|
|
650
831
|
<div class="pay-detail-row"><span>Account</span><strong class="pay-mono">04162263666</strong></div>
|
|
651
832
|
<div class="pay-detail-row"><span>Amount</span><strong class="pay-mono" id="pay-detail-amount"></strong></div>
|
|
652
833
|
<div class="pay-detail-row"><span>Content</span><strong class="pay-mono" id="pay-detail-code"></strong></div>
|
|
@@ -665,6 +846,21 @@ claude plugin install rune</code></pre>
|
|
|
665
846
|
<p class="pay-hint">Check your email for the invitation to <code>rune-kit/rune-pro</code></p>
|
|
666
847
|
<button class="btn btn-primary" style="width:100%;margin-top:20px" onclick="closePayment()">Done</button>
|
|
667
848
|
</div>
|
|
849
|
+
|
|
850
|
+
<!-- Step 5: International — GitHub username + Polar checkout -->
|
|
851
|
+
<div id="pay-step-5" class="pay-step" hidden>
|
|
852
|
+
<button class="pay-close" onclick="closePayment()" aria-label="Close">×</button>
|
|
853
|
+
<button class="pay-back" onclick="showPayStep(1)" aria-label="Back">← Back</button>
|
|
854
|
+
<h3 id="pay-title-5">Get Rune Pro</h3>
|
|
855
|
+
<p class="pay-subtitle" id="pay-amount-5">$49 USD</p>
|
|
856
|
+
<label class="pay-label" for="pay-intl-github">GitHub Username</label>
|
|
857
|
+
<input type="text" id="pay-intl-github" class="pay-input" placeholder="your-github-username" autocomplete="off" spellcheck="false" />
|
|
858
|
+
<label class="pay-label" for="pay-intl-email">Email <span style="color:var(--text-muted)">(for receipt)</span></label>
|
|
859
|
+
<input type="email" id="pay-intl-email" class="pay-input" placeholder="you@example.com" />
|
|
860
|
+
<p id="pay-intl-error" class="pay-error" hidden></p>
|
|
861
|
+
<button id="pay-intl-submit" class="btn btn-pro" style="width:100%;margin-top:16px" onclick="startPolarCheckout()">Pay with Card / PayPal</button>
|
|
862
|
+
<p class="pay-hint" style="margin-top:12px">You'll be redirected to Polar's secure checkout page</p>
|
|
863
|
+
</div>
|
|
668
864
|
</div>
|
|
669
865
|
</div>
|
|
670
866
|
|
|
@@ -675,24 +871,25 @@ claude plugin install rune</code></pre>
|
|
|
675
871
|
(function initTheme() {
|
|
676
872
|
const toggle = document.getElementById('theme-toggle');
|
|
677
873
|
const stored = localStorage.getItem('rune-theme');
|
|
678
|
-
const
|
|
679
|
-
const theme = stored || (prefersDark ? 'dark' : 'dark'); // default dark
|
|
874
|
+
const theme = stored || 'light'; // default light (warm cream)
|
|
680
875
|
|
|
681
|
-
if (theme === '
|
|
682
|
-
document.documentElement.setAttribute('data-theme', '
|
|
876
|
+
if (theme === 'dark') {
|
|
877
|
+
document.documentElement.setAttribute('data-theme', 'dark');
|
|
878
|
+
toggle.innerHTML = '☾'; // moon
|
|
879
|
+
} else {
|
|
683
880
|
toggle.innerHTML = '☀'; // sun
|
|
684
881
|
}
|
|
685
882
|
|
|
686
883
|
toggle.addEventListener('click', () => {
|
|
687
|
-
const
|
|
688
|
-
if (
|
|
884
|
+
const isDark = document.documentElement.getAttribute('data-theme') === 'dark';
|
|
885
|
+
if (isDark) {
|
|
689
886
|
document.documentElement.removeAttribute('data-theme');
|
|
690
|
-
toggle.innerHTML = '☾'; // moon
|
|
691
|
-
localStorage.setItem('rune-theme', 'dark');
|
|
692
|
-
} else {
|
|
693
|
-
document.documentElement.setAttribute('data-theme', 'light');
|
|
694
887
|
toggle.innerHTML = '☀'; // sun
|
|
695
888
|
localStorage.setItem('rune-theme', 'light');
|
|
889
|
+
} else {
|
|
890
|
+
document.documentElement.setAttribute('data-theme', 'dark');
|
|
891
|
+
toggle.innerHTML = '☾'; // moon
|
|
892
|
+
localStorage.setItem('rune-theme', 'dark');
|
|
696
893
|
}
|
|
697
894
|
});
|
|
698
895
|
})();
|