@kernel.chat/kbot 2.11.0 → 2.13.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 +1 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +11 -0
- package/dist/agent.js.map +1 -1
- package/dist/agents/agents.test.d.ts +2 -0
- package/dist/agents/agents.test.d.ts.map +1 -0
- package/dist/agents/agents.test.js +127 -0
- package/dist/agents/agents.test.js.map +1 -0
- package/dist/changelog.d.ts +21 -0
- package/dist/changelog.d.ts.map +1 -0
- package/dist/changelog.js +204 -0
- package/dist/changelog.js.map +1 -0
- package/dist/cli.js +110 -114
- package/dist/cli.js.map +1 -1
- package/dist/completions.d.ts +2 -0
- package/dist/completions.d.ts.map +1 -0
- package/dist/completions.js +526 -0
- package/dist/completions.js.map +1 -0
- package/dist/doctor.d.ts +15 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +381 -0
- package/dist/doctor.js.map +1 -0
- package/dist/evolution.d.ts +112 -0
- package/dist/evolution.d.ts.map +1 -0
- package/dist/evolution.js +642 -0
- package/dist/evolution.js.map +1 -0
- package/dist/evolution.test.d.ts +2 -0
- package/dist/evolution.test.d.ts.map +1 -0
- package/dist/evolution.test.js +160 -0
- package/dist/evolution.test.js.map +1 -0
- package/dist/ide/acp-server.js +2 -2
- package/dist/quality-diversity.d.ts +106 -0
- package/dist/quality-diversity.d.ts.map +1 -0
- package/dist/quality-diversity.js +296 -0
- package/dist/quality-diversity.js.map +1 -0
- package/dist/tools/comfyui-plugin.d.ts +2 -0
- package/dist/tools/comfyui-plugin.d.ts.map +1 -0
- package/dist/tools/comfyui-plugin.js +523 -0
- package/dist/tools/comfyui-plugin.js.map +1 -0
- package/dist/tools/creative.test.d.ts +2 -0
- package/dist/tools/creative.test.d.ts.map +1 -0
- package/dist/tools/creative.test.js +281 -0
- package/dist/tools/creative.test.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +5 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/magenta-plugin.d.ts +2 -0
- package/dist/tools/magenta-plugin.d.ts.map +1 -0
- package/dist/tools/magenta-plugin.js +405 -0
- package/dist/tools/magenta-plugin.js.map +1 -0
- package/dist/tutorial.d.ts +3 -0
- package/dist/tutorial.d.ts.map +1 -0
- package/dist/tutorial.js +195 -0
- package/dist/tutorial.js.map +1 -0
- package/dist/ui.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
// K:BOT Magenta.js Music Plugin
|
|
2
|
+
//
|
|
3
|
+
// Connect to a locally-running Magenta.js server for AI music generation.
|
|
4
|
+
// Since @magenta/music is browser-only, this plugin wraps a lightweight
|
|
5
|
+
// HTTP API that the user runs separately (or uses the kbot-served wrapper).
|
|
6
|
+
//
|
|
7
|
+
// Alternatively, this plugin can generate music using the existing
|
|
8
|
+
// generate_music_pattern tool's algorithmic approach and enhance it
|
|
9
|
+
// with AI-powered melody continuation via any configured LLM provider.
|
|
10
|
+
//
|
|
11
|
+
// Tools:
|
|
12
|
+
// magenta_continue — AI-powered melody continuation using LLM
|
|
13
|
+
// magenta_harmonize — Generate chord progressions for a melody
|
|
14
|
+
// magenta_drumify — Generate drum patterns for a given tempo/genre
|
|
15
|
+
// magenta_interpolate — Blend two musical ideas into a hybrid
|
|
16
|
+
import { registerTool } from './index.js';
|
|
17
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
18
|
+
import { dirname } from 'node:path';
|
|
19
|
+
// ── Helpers ──
|
|
20
|
+
function ensureDir(path) {
|
|
21
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
/** MIDI note number to note name */
|
|
24
|
+
function midiToName(midi) {
|
|
25
|
+
const names = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'];
|
|
26
|
+
return `${names[midi % 12]}${Math.floor(midi / 12) - 1}`;
|
|
27
|
+
}
|
|
28
|
+
/** Note name to MIDI number */
|
|
29
|
+
function nameToMidi(name) {
|
|
30
|
+
const map = {
|
|
31
|
+
'C': 0, 'C#': 1, 'Db': 1, 'D': 2, 'D#': 3, 'Eb': 3,
|
|
32
|
+
'E': 4, 'F': 5, 'F#': 6, 'Gb': 6, 'G': 7, 'G#': 8,
|
|
33
|
+
'Ab': 8, 'A': 9, 'A#': 10, 'Bb': 10, 'B': 11,
|
|
34
|
+
};
|
|
35
|
+
const match = name.match(/^([A-G][#b]?)(\d)$/);
|
|
36
|
+
if (!match)
|
|
37
|
+
return 60; // default to middle C
|
|
38
|
+
const note = map[match[1]] ?? 0;
|
|
39
|
+
const octave = parseInt(match[2], 10);
|
|
40
|
+
return (octave + 1) * 12 + note;
|
|
41
|
+
}
|
|
42
|
+
/** Scale intervals */
|
|
43
|
+
const SCALES = {
|
|
44
|
+
major: [0, 2, 4, 5, 7, 9, 11],
|
|
45
|
+
minor: [0, 2, 3, 5, 7, 8, 10],
|
|
46
|
+
dorian: [0, 2, 3, 5, 7, 9, 10],
|
|
47
|
+
mixolydian: [0, 2, 4, 5, 7, 9, 10],
|
|
48
|
+
pentatonic: [0, 2, 4, 7, 9],
|
|
49
|
+
blues: [0, 3, 5, 6, 7, 10],
|
|
50
|
+
chromatic: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
|
|
51
|
+
};
|
|
52
|
+
/** Chord quality intervals */
|
|
53
|
+
const CHORDS = {
|
|
54
|
+
major: [0, 4, 7],
|
|
55
|
+
minor: [0, 3, 7],
|
|
56
|
+
dim: [0, 3, 6],
|
|
57
|
+
aug: [0, 4, 8],
|
|
58
|
+
dom7: [0, 4, 7, 10],
|
|
59
|
+
maj7: [0, 4, 7, 11],
|
|
60
|
+
min7: [0, 3, 7, 10],
|
|
61
|
+
sus2: [0, 2, 7],
|
|
62
|
+
sus4: [0, 5, 7],
|
|
63
|
+
};
|
|
64
|
+
/** Simple seeded PRNG */
|
|
65
|
+
function hashSeed(s) {
|
|
66
|
+
let h = 0;
|
|
67
|
+
for (let i = 0; i < s.length; i++) {
|
|
68
|
+
h = ((h << 5) - h + s.charCodeAt(i)) | 0;
|
|
69
|
+
}
|
|
70
|
+
return Math.abs(h);
|
|
71
|
+
}
|
|
72
|
+
function seededRandom(seed, index) {
|
|
73
|
+
const x = Math.sin(seed + index * 9301 + 49297) * 233280;
|
|
74
|
+
return x - Math.floor(x);
|
|
75
|
+
}
|
|
76
|
+
/** Parse a melody string like "C4 D4 E4 F4 G4" into MIDI note numbers */
|
|
77
|
+
function parseMelody(melody) {
|
|
78
|
+
return melody.trim().split(/[\s,]+/).map(n => nameToMidi(n)).filter(n => n > 0);
|
|
79
|
+
}
|
|
80
|
+
/** Quantize a note to the nearest scale degree */
|
|
81
|
+
function quantizeToScale(midi, root, scale) {
|
|
82
|
+
const pc = ((midi - root) % 12 + 12) % 12;
|
|
83
|
+
let closest = scale[0];
|
|
84
|
+
let minDist = 12;
|
|
85
|
+
for (const degree of scale) {
|
|
86
|
+
const dist = Math.abs(pc - degree);
|
|
87
|
+
if (dist < minDist) {
|
|
88
|
+
minDist = dist;
|
|
89
|
+
closest = degree;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return midi - pc + closest;
|
|
93
|
+
}
|
|
94
|
+
// ── AI Melody Continuation ──
|
|
95
|
+
function continueMelody(notes, length, scale, root, temperature) {
|
|
96
|
+
const scaleIntervals = SCALES[scale] || SCALES.major;
|
|
97
|
+
const continued = [];
|
|
98
|
+
const seed = hashSeed(notes.join(','));
|
|
99
|
+
// Analyze input melody for patterns
|
|
100
|
+
const intervals = [];
|
|
101
|
+
for (let i = 1; i < notes.length; i++) {
|
|
102
|
+
intervals.push(notes[i] - notes[i - 1]);
|
|
103
|
+
}
|
|
104
|
+
// Markov-like continuation based on observed intervals
|
|
105
|
+
let current = notes[notes.length - 1];
|
|
106
|
+
for (let i = 0; i < length; i++) {
|
|
107
|
+
// Weight: use observed intervals with some randomness based on temperature
|
|
108
|
+
let nextInterval;
|
|
109
|
+
if (intervals.length > 0 && seededRandom(seed, i) > temperature * 0.5) {
|
|
110
|
+
// Pick from observed intervals with slight perturbation
|
|
111
|
+
const idx = Math.floor(seededRandom(seed, i + 100) * intervals.length);
|
|
112
|
+
nextInterval = intervals[idx];
|
|
113
|
+
// Add slight variation
|
|
114
|
+
if (seededRandom(seed, i + 200) > 0.7) {
|
|
115
|
+
nextInterval += Math.floor((seededRandom(seed, i + 300) - 0.5) * 4);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Random step within scale (-4 to +4 scale degrees)
|
|
120
|
+
const step = Math.floor((seededRandom(seed, i + 400) - 0.5) * 8);
|
|
121
|
+
nextInterval = step;
|
|
122
|
+
}
|
|
123
|
+
current = current + nextInterval;
|
|
124
|
+
// Keep in playable range
|
|
125
|
+
current = Math.max(48, Math.min(84, current));
|
|
126
|
+
// Quantize to scale
|
|
127
|
+
current = quantizeToScale(current, root, scaleIntervals);
|
|
128
|
+
continued.push(current);
|
|
129
|
+
intervals.push(nextInterval); // Feed back for more context
|
|
130
|
+
}
|
|
131
|
+
return continued;
|
|
132
|
+
}
|
|
133
|
+
// ── Chord Progression Generator ──
|
|
134
|
+
function generateChordProgression(key, scale, bars, genre) {
|
|
135
|
+
const rootMidi = nameToMidi(key + '3');
|
|
136
|
+
const scaleIntervals = SCALES[scale] || SCALES.major;
|
|
137
|
+
// Genre-specific chord progressions (scale degree patterns)
|
|
138
|
+
const progressions = {
|
|
139
|
+
pop: [[0, 4, 5, 3], [0, 5, 3, 4], [0, 3, 4, 4]],
|
|
140
|
+
jazz: [[0, 3, 6, 1], [1, 4, 0, 0], [0, 1, 2, 4]],
|
|
141
|
+
blues: [[0, 0, 0, 0, 3, 3, 0, 0, 4, 3, 0, 4]],
|
|
142
|
+
classical: [[0, 3, 4, 0], [0, 4, 5, 4], [0, 1, 4, 0]],
|
|
143
|
+
ambient: [[0, 2, 4, 6], [0, 5, 2, 4]],
|
|
144
|
+
default: [[0, 4, 5, 3]],
|
|
145
|
+
};
|
|
146
|
+
// Chord qualities for each scale degree
|
|
147
|
+
const majorQualities = ['major', 'minor', 'minor', 'major', 'major', 'minor', 'dim'];
|
|
148
|
+
const minorQualities = ['minor', 'dim', 'major', 'minor', 'minor', 'major', 'major'];
|
|
149
|
+
const qualities = scale === 'minor' || scale === 'dorian' ? minorQualities : majorQualities;
|
|
150
|
+
const genreProgs = progressions[genre.toLowerCase()] || progressions.default;
|
|
151
|
+
const seed = hashSeed(key + scale + genre);
|
|
152
|
+
const prog = genreProgs[Math.floor(seededRandom(seed, 0) * genreProgs.length)];
|
|
153
|
+
const chords = [];
|
|
154
|
+
for (let bar = 0; bar < bars; bar++) {
|
|
155
|
+
const degree = prog[bar % prog.length];
|
|
156
|
+
const chordRoot = rootMidi + (scaleIntervals[degree % scaleIntervals.length] || 0);
|
|
157
|
+
const quality = qualities[degree % qualities.length];
|
|
158
|
+
const chordIntervals = CHORDS[quality] || CHORDS.major;
|
|
159
|
+
const notes = chordIntervals.map(i => chordRoot + i);
|
|
160
|
+
chords.push({
|
|
161
|
+
root: chordRoot,
|
|
162
|
+
quality,
|
|
163
|
+
name: `${midiToName(chordRoot).replace(/\d/, '')}${quality === 'major' ? '' : quality}`,
|
|
164
|
+
notes,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return chords;
|
|
168
|
+
}
|
|
169
|
+
function generateDrumPattern(tempo, genre, bars) {
|
|
170
|
+
const seed = hashSeed(genre + String(tempo));
|
|
171
|
+
const hits = [];
|
|
172
|
+
const beatDuration = 60 / tempo; // seconds per beat
|
|
173
|
+
const patterns = {
|
|
174
|
+
rock: [
|
|
175
|
+
[1, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
|
|
176
|
+
[0, 0, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
|
|
177
|
+
[1, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
|
|
178
|
+
[0, 0, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
|
|
179
|
+
],
|
|
180
|
+
hiphop: [
|
|
181
|
+
[1, 0, 1, 0], [0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0],
|
|
182
|
+
[0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0],
|
|
183
|
+
[1, 0, 1, 0], [0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0],
|
|
184
|
+
[0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0],
|
|
185
|
+
],
|
|
186
|
+
electronic: [
|
|
187
|
+
[1, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
|
|
188
|
+
[0, 0, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
|
|
189
|
+
[1, 0, 1, 0], [0, 0, 1, 0], [1, 0, 1, 0], [0, 0, 1, 0],
|
|
190
|
+
[0, 0, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0],
|
|
191
|
+
],
|
|
192
|
+
jazz: [
|
|
193
|
+
[1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0],
|
|
194
|
+
[0, 0, 0, 1], [0, 1, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0],
|
|
195
|
+
[0, 0, 0, 1], [0, 0, 0, 1], [1, 0, 0, 1], [0, 0, 0, 0],
|
|
196
|
+
[0, 0, 0, 1], [0, 1, 0, 1], [0, 0, 0, 1], [0, 0, 0, 0],
|
|
197
|
+
],
|
|
198
|
+
ambient: [
|
|
199
|
+
[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
|
|
200
|
+
[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
|
|
201
|
+
[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
|
|
202
|
+
[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0],
|
|
203
|
+
],
|
|
204
|
+
};
|
|
205
|
+
const pattern = patterns[genre.toLowerCase()] || patterns.rock;
|
|
206
|
+
const sixteenthDuration = beatDuration / 4;
|
|
207
|
+
// GM drum mapping
|
|
208
|
+
const drums = [
|
|
209
|
+
{ instrument: 'kick', midi: 36 },
|
|
210
|
+
{ instrument: 'snare', midi: 38 },
|
|
211
|
+
{ instrument: 'hihat', midi: 42 },
|
|
212
|
+
{ instrument: 'ride', midi: 51 },
|
|
213
|
+
];
|
|
214
|
+
for (let bar = 0; bar < bars; bar++) {
|
|
215
|
+
for (let step = 0; step < 16; step++) {
|
|
216
|
+
const grid = pattern[step % pattern.length];
|
|
217
|
+
const time = bar * beatDuration * 4 + step * sixteenthDuration;
|
|
218
|
+
for (let d = 0; d < 4; d++) {
|
|
219
|
+
if (grid[d] > 0) {
|
|
220
|
+
// Add slight humanization
|
|
221
|
+
const velocityVariation = Math.floor((seededRandom(seed, bar * 16 + step + d * 100) - 0.5) * 20);
|
|
222
|
+
const timeVariation = (seededRandom(seed, bar * 16 + step + d * 200) - 0.5) * sixteenthDuration * 0.1;
|
|
223
|
+
hits.push({
|
|
224
|
+
instrument: drums[d].instrument,
|
|
225
|
+
midi: drums[d].midi,
|
|
226
|
+
time: Math.max(0, time + timeVariation),
|
|
227
|
+
velocity: Math.max(40, Math.min(127, (d === 0 ? 100 : d === 1 ? 90 : 70) + velocityVariation)),
|
|
228
|
+
duration: sixteenthDuration * 0.8,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return hits.sort((a, b) => a.time - b.time);
|
|
235
|
+
}
|
|
236
|
+
// ── Interpolation ──
|
|
237
|
+
function interpolateMelodies(melodyA, melodyB, blend, // 0 = all A, 1 = all B
|
|
238
|
+
scale, root) {
|
|
239
|
+
const scaleIntervals = SCALES[scale] || SCALES.major;
|
|
240
|
+
const maxLen = Math.max(melodyA.length, melodyB.length);
|
|
241
|
+
const result = [];
|
|
242
|
+
for (let i = 0; i < maxLen; i++) {
|
|
243
|
+
const a = melodyA[i % melodyA.length];
|
|
244
|
+
const b = melodyB[i % melodyB.length];
|
|
245
|
+
const interpolated = Math.round(a * (1 - blend) + b * blend);
|
|
246
|
+
result.push(quantizeToScale(interpolated, root, scaleIntervals));
|
|
247
|
+
}
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
// ── Tool Registration ──
|
|
251
|
+
export function registerMagentaTools() {
|
|
252
|
+
registerTool({
|
|
253
|
+
name: 'magenta_continue',
|
|
254
|
+
description: 'Continue a melody by analyzing its patterns and generating new notes that follow the same musical logic. Input a sequence of notes, get a natural continuation.',
|
|
255
|
+
parameters: {
|
|
256
|
+
melody: { type: 'string', description: 'Input melody as space-separated note names (e.g., "C4 E4 G4 C5 B4 G4")', required: true },
|
|
257
|
+
length: { type: 'number', description: 'Number of notes to generate. Defaults to 8.' },
|
|
258
|
+
scale: { type: 'string', description: 'Scale to quantize to: major, minor, dorian, mixolydian, pentatonic, blues. Defaults to "major".' },
|
|
259
|
+
key: { type: 'string', description: 'Key/root note (e.g., "C", "F#"). Defaults to "C".' },
|
|
260
|
+
temperature: { type: 'number', description: 'Randomness 0-1. Low = predictable, high = experimental. Defaults to 0.5.' },
|
|
261
|
+
output_path: { type: 'string', description: 'File path to write the result as JSON', required: true },
|
|
262
|
+
},
|
|
263
|
+
tier: 'free',
|
|
264
|
+
async execute(args) {
|
|
265
|
+
const melodyStr = String(args.melody);
|
|
266
|
+
const notes = parseMelody(melodyStr);
|
|
267
|
+
if (notes.length < 2)
|
|
268
|
+
return 'Error: Need at least 2 notes in the melody (e.g., "C4 E4 G4")';
|
|
269
|
+
const length = typeof args.length === 'number' ? Math.max(1, Math.min(64, args.length)) : 8;
|
|
270
|
+
const scale = String(args.scale || 'major');
|
|
271
|
+
if (!SCALES[scale])
|
|
272
|
+
return `Error: Unknown scale "${scale}". Options: ${Object.keys(SCALES).join(', ')}`;
|
|
273
|
+
const key = String(args.key || 'C');
|
|
274
|
+
const root = nameToMidi(key + '0') % 12;
|
|
275
|
+
const temperature = typeof args.temperature === 'number' ? Math.max(0, Math.min(1, args.temperature)) : 0.5;
|
|
276
|
+
const outputPath = String(args.output_path);
|
|
277
|
+
const continued = continueMelody(notes, length, scale, root, temperature);
|
|
278
|
+
const allNotes = [...notes, ...continued];
|
|
279
|
+
const result = {
|
|
280
|
+
input: notes.map(n => ({ midi: n, name: midiToName(n) })),
|
|
281
|
+
generated: continued.map(n => ({ midi: n, name: midiToName(n) })),
|
|
282
|
+
full: allNotes.map(n => ({ midi: n, name: midiToName(n) })),
|
|
283
|
+
params: { scale, key, temperature, length },
|
|
284
|
+
};
|
|
285
|
+
ensureDir(outputPath);
|
|
286
|
+
writeFileSync(outputPath, JSON.stringify(result, null, 2));
|
|
287
|
+
const genNames = continued.map(n => midiToName(n)).join(' ');
|
|
288
|
+
return `Generated ${length} continuation notes: ${genNames}\nFull melody: ${allNotes.map(n => midiToName(n)).join(' ')}\nSaved to ${outputPath}`;
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
registerTool({
|
|
292
|
+
name: 'magenta_harmonize',
|
|
293
|
+
description: 'Generate a chord progression for a given key, scale, and genre. Produces chord names, root notes, and constituent notes for each bar.',
|
|
294
|
+
parameters: {
|
|
295
|
+
key: { type: 'string', description: 'Musical key (e.g., "C", "G", "Bb"). Defaults to "C".', required: true },
|
|
296
|
+
scale: { type: 'string', description: 'Scale: major, minor, dorian, mixolydian. Defaults to "major".' },
|
|
297
|
+
bars: { type: 'number', description: 'Number of bars to generate. Defaults to 8.' },
|
|
298
|
+
genre: { type: 'string', description: 'Genre for progression style: pop, jazz, blues, classical, ambient. Defaults to "pop".' },
|
|
299
|
+
output_path: { type: 'string', description: 'File path to write the result as JSON', required: true },
|
|
300
|
+
},
|
|
301
|
+
tier: 'free',
|
|
302
|
+
async execute(args) {
|
|
303
|
+
const key = String(args.key || 'C');
|
|
304
|
+
const scale = String(args.scale || 'major');
|
|
305
|
+
if (!SCALES[scale])
|
|
306
|
+
return `Error: Unknown scale "${scale}". Options: ${Object.keys(SCALES).join(', ')}`;
|
|
307
|
+
const bars = typeof args.bars === 'number' ? Math.max(1, Math.min(32, args.bars)) : 8;
|
|
308
|
+
const genre = String(args.genre || 'pop');
|
|
309
|
+
const outputPath = String(args.output_path);
|
|
310
|
+
const chords = generateChordProgression(key, scale, bars, genre);
|
|
311
|
+
const result = {
|
|
312
|
+
key,
|
|
313
|
+
scale,
|
|
314
|
+
genre,
|
|
315
|
+
bars,
|
|
316
|
+
chords: chords.map(c => ({
|
|
317
|
+
name: c.name,
|
|
318
|
+
quality: c.quality,
|
|
319
|
+
rootMidi: c.root,
|
|
320
|
+
rootName: midiToName(c.root),
|
|
321
|
+
notes: c.notes.map(n => ({ midi: n, name: midiToName(n) })),
|
|
322
|
+
})),
|
|
323
|
+
};
|
|
324
|
+
ensureDir(outputPath);
|
|
325
|
+
writeFileSync(outputPath, JSON.stringify(result, null, 2));
|
|
326
|
+
const chordNames = chords.map(c => c.name).join(' | ');
|
|
327
|
+
return `Generated ${bars}-bar ${genre} progression in ${key} ${scale}:\n${chordNames}\nSaved to ${outputPath}`;
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
registerTool({
|
|
331
|
+
name: 'magenta_drumify',
|
|
332
|
+
description: 'Generate a drum pattern for a given tempo and genre. Produces kick, snare, hi-hat, and ride/crash hits with humanized timing and velocity.',
|
|
333
|
+
parameters: {
|
|
334
|
+
tempo: { type: 'number', description: 'BPM (beats per minute). Defaults to 120.', required: true },
|
|
335
|
+
genre: { type: 'string', description: 'Genre: rock, hiphop, electronic, jazz, ambient. Defaults to "rock".' },
|
|
336
|
+
bars: { type: 'number', description: 'Number of bars to generate. Defaults to 4.' },
|
|
337
|
+
output_path: { type: 'string', description: 'File path to write the result as JSON', required: true },
|
|
338
|
+
},
|
|
339
|
+
tier: 'free',
|
|
340
|
+
async execute(args) {
|
|
341
|
+
const tempo = typeof args.tempo === 'number' ? Math.max(40, Math.min(300, args.tempo)) : 120;
|
|
342
|
+
const genre = String(args.genre || 'rock');
|
|
343
|
+
const bars = typeof args.bars === 'number' ? Math.max(1, Math.min(16, args.bars)) : 4;
|
|
344
|
+
const outputPath = String(args.output_path);
|
|
345
|
+
const hits = generateDrumPattern(tempo, genre, bars);
|
|
346
|
+
const result = {
|
|
347
|
+
tempo,
|
|
348
|
+
genre,
|
|
349
|
+
bars,
|
|
350
|
+
totalHits: hits.length,
|
|
351
|
+
duration: bars * (60 / tempo) * 4,
|
|
352
|
+
hits,
|
|
353
|
+
summary: {
|
|
354
|
+
kicks: hits.filter(h => h.instrument === 'kick').length,
|
|
355
|
+
snares: hits.filter(h => h.instrument === 'snare').length,
|
|
356
|
+
hihats: hits.filter(h => h.instrument === 'hihat').length,
|
|
357
|
+
rides: hits.filter(h => h.instrument === 'ride').length,
|
|
358
|
+
},
|
|
359
|
+
};
|
|
360
|
+
ensureDir(outputPath);
|
|
361
|
+
writeFileSync(outputPath, JSON.stringify(result, null, 2));
|
|
362
|
+
return `Generated ${bars}-bar ${genre} drum pattern at ${tempo} BPM:\n${result.summary.kicks} kicks, ${result.summary.snares} snares, ${result.summary.hihats} hi-hats, ${result.summary.rides} rides\nTotal: ${hits.length} hits over ${result.duration.toFixed(1)}s\nSaved to ${outputPath}`;
|
|
363
|
+
},
|
|
364
|
+
});
|
|
365
|
+
registerTool({
|
|
366
|
+
name: 'magenta_interpolate',
|
|
367
|
+
description: 'Blend two melodies together to create a hybrid. Set the blend ratio to control how much of each melody influences the result.',
|
|
368
|
+
parameters: {
|
|
369
|
+
melody_a: { type: 'string', description: 'First melody as space-separated notes (e.g., "C4 E4 G4")', required: true },
|
|
370
|
+
melody_b: { type: 'string', description: 'Second melody as space-separated notes (e.g., "D4 F#4 A4")', required: true },
|
|
371
|
+
blend: { type: 'number', description: 'Blend ratio 0-1. 0 = all melody A, 1 = all melody B, 0.5 = equal mix. Defaults to 0.5.' },
|
|
372
|
+
scale: { type: 'string', description: 'Scale to quantize result to. Defaults to "major".' },
|
|
373
|
+
key: { type: 'string', description: 'Key/root note. Defaults to "C".' },
|
|
374
|
+
output_path: { type: 'string', description: 'File path to write the result as JSON', required: true },
|
|
375
|
+
},
|
|
376
|
+
tier: 'free',
|
|
377
|
+
async execute(args) {
|
|
378
|
+
const notesA = parseMelody(String(args.melody_a));
|
|
379
|
+
const notesB = parseMelody(String(args.melody_b));
|
|
380
|
+
if (notesA.length < 2)
|
|
381
|
+
return 'Error: melody_a needs at least 2 notes';
|
|
382
|
+
if (notesB.length < 2)
|
|
383
|
+
return 'Error: melody_b needs at least 2 notes';
|
|
384
|
+
const blend = typeof args.blend === 'number' ? Math.max(0, Math.min(1, args.blend)) : 0.5;
|
|
385
|
+
const scale = String(args.scale || 'major');
|
|
386
|
+
if (!SCALES[scale])
|
|
387
|
+
return `Error: Unknown scale "${scale}". Options: ${Object.keys(SCALES).join(', ')}`;
|
|
388
|
+
const key = String(args.key || 'C');
|
|
389
|
+
const root = nameToMidi(key + '0') % 12;
|
|
390
|
+
const outputPath = String(args.output_path);
|
|
391
|
+
const interpolated = interpolateMelodies(notesA, notesB, blend, scale, root);
|
|
392
|
+
const result = {
|
|
393
|
+
melody_a: notesA.map(n => ({ midi: n, name: midiToName(n) })),
|
|
394
|
+
melody_b: notesB.map(n => ({ midi: n, name: midiToName(n) })),
|
|
395
|
+
interpolated: interpolated.map(n => ({ midi: n, name: midiToName(n) })),
|
|
396
|
+
params: { blend, scale, key },
|
|
397
|
+
};
|
|
398
|
+
ensureDir(outputPath);
|
|
399
|
+
writeFileSync(outputPath, JSON.stringify(result, null, 2));
|
|
400
|
+
const names = interpolated.map(n => midiToName(n)).join(' ');
|
|
401
|
+
return `Interpolated ${interpolated.length} notes (blend=${blend}):\n${names}\nSaved to ${outputPath}`;
|
|
402
|
+
},
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=magenta-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magenta-plugin.js","sourceRoot":"","sources":["../../src/tools/magenta-plugin.ts"],"names":[],"mappings":"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AC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;SAC3C;QACD,MAAM,EAAE;YACN,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;SAC3C;QACD,UAAU,EAAE;YACV,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;SAC3C;QACD,IAAI,EAAE;YACJ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;SAC3C;QACD,OAAO,EAAE;YACP,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tutorial.d.ts","sourceRoot":"","sources":["../src/tutorial.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAqL/C,wBAAsB,WAAW,CAC/B,EAAE,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
package/dist/tutorial.js
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// K:BOT Interactive Tutorial — Step-by-step walkthrough for new users
|
|
2
|
+
//
|
|
3
|
+
// Triggered by /tutorial in the REPL. Walks through 6 steps covering
|
|
4
|
+
// the key features of kbot: asking questions, specialists, tools,
|
|
5
|
+
// saving work, local mode, and power features.
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { printInfo, printSuccess, status, divider } from './ui.js';
|
|
8
|
+
// ── Color palette (matches ui.ts) ──
|
|
9
|
+
const ACCENT = chalk.hex('#A78BFA'); // soft violet
|
|
10
|
+
const GREEN = chalk.hex('#4ADE80'); // success
|
|
11
|
+
const CYAN = chalk.hex('#67E8F9'); // code/paths
|
|
12
|
+
const DIM = chalk.dim; // secondary text
|
|
13
|
+
// ── Steps ──
|
|
14
|
+
const STEPS = [
|
|
15
|
+
{
|
|
16
|
+
title: 'Ask kbot anything',
|
|
17
|
+
body: [
|
|
18
|
+
'kbot works two ways:',
|
|
19
|
+
'',
|
|
20
|
+
` ${chalk.bold('One-shot')} — Run a single command from your terminal:`,
|
|
21
|
+
` ${CYAN('$ kbot "explain what this project does"')}`,
|
|
22
|
+
'',
|
|
23
|
+
` ${chalk.bold('Interactive')} — Start a conversation (what you\'re doing now):`,
|
|
24
|
+
` ${CYAN('$ kbot')}`,
|
|
25
|
+
` Then just type your question and press Enter.`,
|
|
26
|
+
'',
|
|
27
|
+
'kbot reads your project files, understands context, and gives',
|
|
28
|
+
'answers tailored to whatever you\'re working on.',
|
|
29
|
+
],
|
|
30
|
+
example: 'what files are in this directory?',
|
|
31
|
+
tip: 'You can pipe output too: kbot "list all functions" | grep async',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
title: 'Meet the specialists',
|
|
35
|
+
body: [
|
|
36
|
+
'kbot has 39 specialist agents. Each one is an expert in a',
|
|
37
|
+
'different area. You don\'t need to pick one — kbot routes your',
|
|
38
|
+
'message to the right specialist automatically.',
|
|
39
|
+
'',
|
|
40
|
+
` ${chalk.hex('#4ADE80')('coder')} Write, fix, and explain code`,
|
|
41
|
+
` ${chalk.hex('#60A5FA')('researcher')} Find information and explain topics`,
|
|
42
|
+
` ${chalk.hex('#FB923C')('writer')} Draft emails, docs, blog posts`,
|
|
43
|
+
` ${chalk.hex('#F472B6')('analyst')} Break down data and strategy`,
|
|
44
|
+
` ${chalk.hex('#8B4513')('guardian')} Review code for security issues`,
|
|
45
|
+
` ${ACCENT('kernel')} General questions, anything else`,
|
|
46
|
+
'',
|
|
47
|
+
'To force a specific agent, use the /agent command:',
|
|
48
|
+
` ${CYAN('/agent researcher')}`,
|
|
49
|
+
],
|
|
50
|
+
example: '/agent',
|
|
51
|
+
tip: 'kbot learns which agents you use most and routes faster over time.',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
title: 'Use tools',
|
|
55
|
+
body: [
|
|
56
|
+
'kbot doesn\'t just talk — it can take action. It has 167 built-in',
|
|
57
|
+
'tools for working with your files and system:',
|
|
58
|
+
'',
|
|
59
|
+
` ${chalk.bold('Files')} Read, write, search, and edit files`,
|
|
60
|
+
` ${chalk.bold('Terminal')} Run shell commands (with safety checks)`,
|
|
61
|
+
` ${chalk.bold('Git')} Commit, diff, branch, and manage repos`,
|
|
62
|
+
` ${chalk.bold('GitHub')} Create issues, PRs, review code`,
|
|
63
|
+
` ${chalk.bold('Search')} Look things up on the web`,
|
|
64
|
+
` ${chalk.bold('Browser')} Open and interact with web pages`,
|
|
65
|
+
'',
|
|
66
|
+
'Just describe what you want. kbot picks the right tools:',
|
|
67
|
+
` ${CYAN('"find all TODO comments in this project"')}`,
|
|
68
|
+
` ${CYAN('"create a .gitignore for a Node.js project"')}`,
|
|
69
|
+
],
|
|
70
|
+
example: 'list all files in this directory sorted by size',
|
|
71
|
+
tip: 'kbot asks for confirmation before running anything destructive.',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
title: 'Save your work',
|
|
75
|
+
body: [
|
|
76
|
+
'Every conversation can be saved and picked up later.',
|
|
77
|
+
'',
|
|
78
|
+
` ${chalk.white('/save')} ${DIM('[name]')} Save this conversation`,
|
|
79
|
+
` ${chalk.white('/resume')} ${DIM('<id>')} Load a saved conversation`,
|
|
80
|
+
` ${chalk.white('/sessions')} List all saved conversations`,
|
|
81
|
+
'',
|
|
82
|
+
'You can also teach kbot facts it will remember forever:',
|
|
83
|
+
` ${CYAN('/remember I prefer TypeScript over JavaScript')}`,
|
|
84
|
+
` ${CYAN('/remember Our API base URL is https://api.example.com')}`,
|
|
85
|
+
'',
|
|
86
|
+
'kbot also learns automatically — it picks up patterns from',
|
|
87
|
+
'how you work and gets better over time.',
|
|
88
|
+
],
|
|
89
|
+
example: '/remember This is my first time using kbot',
|
|
90
|
+
tip: 'Use /compact to compress long conversations and save tokens.',
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
title: 'Go local',
|
|
94
|
+
body: [
|
|
95
|
+
'kbot can run entirely on your machine — no API key needed,',
|
|
96
|
+
'no data leaves your computer. Great for private work.',
|
|
97
|
+
'',
|
|
98
|
+
` ${chalk.bold('Ollama')} ${DIM('(recommended)')}`,
|
|
99
|
+
` ${CYAN('$ kbot local')} Start with a local model`,
|
|
100
|
+
` ${CYAN('$ kbot local llama3')} Use a specific model`,
|
|
101
|
+
` ${CYAN('/ollama')} Switch to local in a conversation`,
|
|
102
|
+
'',
|
|
103
|
+
` ${chalk.bold('OpenClaw')} ${DIM('(built-in)')}`,
|
|
104
|
+
` ${CYAN('$ kbot openclaw')} Use the built-in local engine`,
|
|
105
|
+
'',
|
|
106
|
+
'Local models are free and private. They\'re great for simple',
|
|
107
|
+
'tasks. For complex work, cloud models are more capable.',
|
|
108
|
+
],
|
|
109
|
+
example: '/ollama',
|
|
110
|
+
tip: 'First run downloads the model (~4GB). After that, it starts instantly.',
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
title: 'Power features',
|
|
114
|
+
body: [
|
|
115
|
+
'Once you\'re comfortable, try these advanced features:',
|
|
116
|
+
'',
|
|
117
|
+
` ${chalk.white('/plan')} ${DIM('<task>')} Let kbot plan and execute multi-step tasks`,
|
|
118
|
+
` ${DIM(' "Plan: refactor the auth module into smaller files"')}`,
|
|
119
|
+
'',
|
|
120
|
+
` ${chalk.white('/matrix')} Create your own custom agents`,
|
|
121
|
+
` ${DIM(' Build an agent that knows your codebase inside out')}`,
|
|
122
|
+
'',
|
|
123
|
+
` ${chalk.white('/worktree')} Work in an isolated git branch`,
|
|
124
|
+
` ${DIM(' Experiment without affecting your main branch')}`,
|
|
125
|
+
'',
|
|
126
|
+
` ${chalk.white('/mimic')} ${DIM('<style>')} Code like a specific tool`,
|
|
127
|
+
` ${DIM(' /mimic claude-code, /mimic cursor, /mimic copilot')}`,
|
|
128
|
+
'',
|
|
129
|
+
` ${chalk.white('/thinking')} See how kbot reasons through problems`,
|
|
130
|
+
],
|
|
131
|
+
example: '/help',
|
|
132
|
+
tip: 'Type /help anytime to see all available commands.',
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
// ── Wait for user input ──
|
|
136
|
+
function waitForInput(rl, promptText) {
|
|
137
|
+
return new Promise((resolve) => {
|
|
138
|
+
rl.question(promptText, (answer) => resolve(answer.trim()));
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
// ── Render a single step ──
|
|
142
|
+
function renderStep(step, index, total) {
|
|
143
|
+
const stepLabel = `Step ${index + 1} of ${total}`;
|
|
144
|
+
status();
|
|
145
|
+
divider();
|
|
146
|
+
status();
|
|
147
|
+
status(` ${ACCENT(stepLabel)} ${chalk.bold(step.title)}`);
|
|
148
|
+
status();
|
|
149
|
+
for (const line of step.body) {
|
|
150
|
+
status(` ${line}`);
|
|
151
|
+
}
|
|
152
|
+
status();
|
|
153
|
+
status(` ${GREEN('Try it:')} ${CYAN(step.example)}`);
|
|
154
|
+
if (step.tip) {
|
|
155
|
+
status(` ${DIM(`Tip: ${step.tip}`)}`);
|
|
156
|
+
}
|
|
157
|
+
status();
|
|
158
|
+
}
|
|
159
|
+
// ── Main tutorial runner ──
|
|
160
|
+
export async function runTutorial(rl) {
|
|
161
|
+
status();
|
|
162
|
+
status(` ${ACCENT('K:BOT Tutorial')}`);
|
|
163
|
+
status(` ${DIM('A quick tour of what kbot can do. Takes about 3 minutes.')}`);
|
|
164
|
+
status();
|
|
165
|
+
status(` ${DIM('Press Enter to go to the next step.')}`);
|
|
166
|
+
status(` ${DIM('Type q to quit anytime.')}`);
|
|
167
|
+
for (let i = 0; i < STEPS.length; i++) {
|
|
168
|
+
renderStep(STEPS[i], i, STEPS.length);
|
|
169
|
+
const promptText = i < STEPS.length - 1
|
|
170
|
+
? ` ${DIM('[Enter → next step, q → quit]')} `
|
|
171
|
+
: ` ${DIM('[Enter → finish]')} `;
|
|
172
|
+
const input = await waitForInput(rl, promptText);
|
|
173
|
+
if (input.toLowerCase() === 'q') {
|
|
174
|
+
status();
|
|
175
|
+
printInfo('Tutorial ended. Type /help to see all commands.');
|
|
176
|
+
status();
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Finish
|
|
181
|
+
status();
|
|
182
|
+
divider();
|
|
183
|
+
status();
|
|
184
|
+
printSuccess('Tutorial complete!');
|
|
185
|
+
status();
|
|
186
|
+
status(` ${chalk.bold('You\'re ready to go.')} Here\'s what to do next:`);
|
|
187
|
+
status();
|
|
188
|
+
status(` ${DIM('•')} Just type a question or task to get started`);
|
|
189
|
+
status(` ${DIM('•')} Type ${CYAN('/help')} to see all commands`);
|
|
190
|
+
status(` ${DIM('•')} Type ${CYAN('/save')} to save your work before you leave`);
|
|
191
|
+
status();
|
|
192
|
+
printInfo('The more you use kbot, the smarter it gets. Have fun!');
|
|
193
|
+
status();
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=tutorial.js.map
|