@kernel.chat/kbot 1.3.1 → 2.3.1
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 +94 -0
- package/dist/agent.d.ts +9 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +576 -119
- package/dist/agent.js.map +1 -1
- package/dist/auth.d.ts +20 -35
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +224 -66
- package/dist/auth.js.map +1 -1
- package/dist/auth.test.d.ts +2 -0
- package/dist/auth.test.d.ts.map +1 -0
- package/dist/auth.test.js +89 -0
- package/dist/auth.test.js.map +1 -0
- package/dist/build-targets.d.ts +37 -0
- package/dist/build-targets.d.ts.map +1 -0
- package/dist/build-targets.js +507 -0
- package/dist/build-targets.js.map +1 -0
- package/dist/cli.js +1210 -130
- package/dist/cli.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +72 -22
- package/dist/context.js.map +1 -1
- package/dist/hooks.d.ts +27 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +145 -0
- package/dist/hooks.js.map +1 -0
- package/dist/ide/acp-server.d.ts +6 -0
- package/dist/ide/acp-server.d.ts.map +1 -0
- package/dist/ide/acp-server.js +319 -0
- package/dist/ide/acp-server.js.map +1 -0
- package/dist/ide/bridge.d.ts +128 -0
- package/dist/ide/bridge.d.ts.map +1 -0
- package/dist/ide/bridge.js +185 -0
- package/dist/ide/bridge.js.map +1 -0
- package/dist/ide/index.d.ts +5 -0
- package/dist/ide/index.d.ts.map +1 -0
- package/dist/ide/index.js +11 -0
- package/dist/ide/index.js.map +1 -0
- package/dist/ide/lsp-bridge.d.ts +27 -0
- package/dist/ide/lsp-bridge.d.ts.map +1 -0
- package/dist/ide/lsp-bridge.js +267 -0
- package/dist/ide/lsp-bridge.js.map +1 -0
- package/dist/ide/mcp-server.d.ts +7 -0
- package/dist/ide/mcp-server.d.ts.map +1 -0
- package/dist/ide/mcp-server.js +451 -0
- package/dist/ide/mcp-server.js.map +1 -0
- package/dist/learning.d.ts +179 -0
- package/dist/learning.d.ts.map +1 -0
- package/dist/learning.js +829 -0
- package/dist/learning.js.map +1 -0
- package/dist/learning.test.d.ts +2 -0
- package/dist/learning.test.d.ts.map +1 -0
- package/dist/learning.test.js +115 -0
- package/dist/learning.test.js.map +1 -0
- package/dist/matrix.d.ts +49 -0
- package/dist/matrix.d.ts.map +1 -0
- package/dist/matrix.js +302 -0
- package/dist/matrix.js.map +1 -0
- package/dist/memory.d.ts +11 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +54 -2
- package/dist/memory.js.map +1 -1
- package/dist/multimodal.d.ts +57 -0
- package/dist/multimodal.d.ts.map +1 -0
- package/dist/multimodal.js +206 -0
- package/dist/multimodal.js.map +1 -0
- package/dist/permissions.d.ts +21 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +122 -0
- package/dist/permissions.js.map +1 -0
- package/dist/planner.d.ts +54 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +298 -0
- package/dist/planner.js.map +1 -0
- package/dist/plugins.d.ts +30 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +135 -0
- package/dist/plugins.js.map +1 -0
- package/dist/sessions.d.ts +38 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +177 -0
- package/dist/sessions.js.map +1 -0
- package/dist/streaming.d.ts +88 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +317 -0
- package/dist/streaming.js.map +1 -0
- package/dist/tools/background.d.ts +2 -0
- package/dist/tools/background.d.ts.map +1 -0
- package/dist/tools/background.js +163 -0
- package/dist/tools/background.js.map +1 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +26 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/browser.js +7 -7
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/build-matrix.d.ts +2 -0
- package/dist/tools/build-matrix.d.ts.map +1 -0
- package/dist/tools/build-matrix.js +463 -0
- package/dist/tools/build-matrix.js.map +1 -0
- package/dist/tools/computer.js +5 -5
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/fetch.d.ts +2 -0
- package/dist/tools/fetch.d.ts.map +1 -0
- package/dist/tools/fetch.js +106 -0
- package/dist/tools/fetch.js.map +1 -0
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +112 -6
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/git.js +3 -3
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/github.d.ts +2 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/github.js +196 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/index.d.ts +29 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +136 -20
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/index.test.d.ts +2 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +162 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/matrix.d.ts +2 -0
- package/dist/tools/matrix.d.ts.map +1 -0
- package/dist/tools/matrix.js +79 -0
- package/dist/tools/matrix.js.map +1 -0
- package/dist/tools/mcp-client.d.ts +2 -0
- package/dist/tools/mcp-client.d.ts.map +1 -0
- package/dist/tools/mcp-client.js +295 -0
- package/dist/tools/mcp-client.js.map +1 -0
- package/dist/tools/notebook.d.ts +2 -0
- package/dist/tools/notebook.d.ts.map +1 -0
- package/dist/tools/notebook.js +207 -0
- package/dist/tools/notebook.js.map +1 -0
- package/dist/tools/openclaw.d.ts +2 -0
- package/dist/tools/openclaw.d.ts.map +1 -0
- package/dist/tools/openclaw.js +187 -0
- package/dist/tools/openclaw.js.map +1 -0
- package/dist/tools/parallel.d.ts +2 -0
- package/dist/tools/parallel.d.ts.map +1 -0
- package/dist/tools/parallel.js +60 -0
- package/dist/tools/parallel.js.map +1 -0
- package/dist/tools/sandbox.d.ts +2 -0
- package/dist/tools/sandbox.d.ts.map +1 -0
- package/dist/tools/sandbox.js +352 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +135 -28
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/subagent.d.ts +4 -0
- package/dist/tools/subagent.d.ts.map +1 -0
- package/dist/tools/subagent.js +260 -0
- package/dist/tools/subagent.js.map +1 -0
- package/dist/tools/tasks.d.ts +14 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +210 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/worktree.d.ts +2 -0
- package/dist/tools/worktree.d.ts.map +1 -0
- package/dist/tools/worktree.js +223 -0
- package/dist/tools/worktree.js.map +1 -0
- package/dist/tui.d.ts +73 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +257 -0
- package/dist/tui.js.map +1 -0
- package/dist/ui.d.ts +11 -19
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +143 -171
- package/dist/ui.js.map +1 -1
- package/dist/updater.d.ts +3 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +70 -0
- package/dist/updater.js.map +1 -0
- package/install.sh +5 -7
- package/package.json +9 -5
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// K:BOT Task/TODO Tracking — Structured progress tracking during complex work
|
|
2
|
+
//
|
|
3
|
+
// Mirrors Claude Code's TaskCreate/TaskUpdate/TaskList/TaskGet pattern.
|
|
4
|
+
// Tasks persist in memory during the session. The AI uses these to:
|
|
5
|
+
// 1. Break down complex work into trackable steps
|
|
6
|
+
// 2. Show the user progress on multi-step tasks
|
|
7
|
+
// 3. Track dependencies between tasks
|
|
8
|
+
// 4. Remember what's done and what's pending
|
|
9
|
+
import { registerTool } from './index.js';
|
|
10
|
+
const tasks = new Map();
|
|
11
|
+
let nextId = 1;
|
|
12
|
+
function formatTask(task) {
|
|
13
|
+
const statusIcon = {
|
|
14
|
+
pending: '○',
|
|
15
|
+
in_progress: '◉',
|
|
16
|
+
completed: '✓',
|
|
17
|
+
blocked: '⊘',
|
|
18
|
+
}[task.status];
|
|
19
|
+
const blocked = task.blockedBy.length > 0 ? ` (blocked by: ${task.blockedBy.join(', ')})` : '';
|
|
20
|
+
return `${statusIcon} #${task.id} [${task.status}] ${task.subject}${blocked}`;
|
|
21
|
+
}
|
|
22
|
+
export function registerTaskTools() {
|
|
23
|
+
registerTool({
|
|
24
|
+
name: 'task_create',
|
|
25
|
+
description: 'Create a task for tracking progress on complex work. Returns the task ID.',
|
|
26
|
+
parameters: {
|
|
27
|
+
subject: { type: 'string', description: 'Brief task title in imperative form (e.g., "Fix auth bug")', required: true },
|
|
28
|
+
description: { type: 'string', description: 'Detailed description of what needs to be done' },
|
|
29
|
+
activeForm: { type: 'string', description: 'Present continuous form for spinner display (e.g., "Fixing auth bug")' },
|
|
30
|
+
blockedBy: { type: 'array', description: 'Task IDs that must complete before this one can start' },
|
|
31
|
+
},
|
|
32
|
+
tier: 'free',
|
|
33
|
+
async execute(args) {
|
|
34
|
+
const id = String(nextId++);
|
|
35
|
+
const now = new Date().toISOString();
|
|
36
|
+
const task = {
|
|
37
|
+
id,
|
|
38
|
+
subject: String(args.subject),
|
|
39
|
+
description: args.description ? String(args.description) : '',
|
|
40
|
+
status: 'pending',
|
|
41
|
+
activeForm: args.activeForm ? String(args.activeForm) : undefined,
|
|
42
|
+
blockedBy: Array.isArray(args.blockedBy) ? args.blockedBy.map(String) : [],
|
|
43
|
+
blocks: [],
|
|
44
|
+
created: now,
|
|
45
|
+
updated: now,
|
|
46
|
+
};
|
|
47
|
+
// Update blocks references on blocker tasks
|
|
48
|
+
for (const blockerId of task.blockedBy) {
|
|
49
|
+
const blocker = tasks.get(blockerId);
|
|
50
|
+
if (blocker && !blocker.blocks.includes(id)) {
|
|
51
|
+
blocker.blocks.push(id);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
tasks.set(id, task);
|
|
55
|
+
return `Task #${id} created: ${task.subject}`;
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
registerTool({
|
|
59
|
+
name: 'task_update',
|
|
60
|
+
description: 'Update a task status, subject, or dependencies.',
|
|
61
|
+
parameters: {
|
|
62
|
+
id: { type: 'string', description: 'Task ID to update', required: true },
|
|
63
|
+
status: { type: 'string', description: 'New status: pending, in_progress, completed, blocked' },
|
|
64
|
+
subject: { type: 'string', description: 'Updated subject' },
|
|
65
|
+
description: { type: 'string', description: 'Updated description' },
|
|
66
|
+
addBlockedBy: { type: 'array', description: 'Task IDs to add as blockers' },
|
|
67
|
+
},
|
|
68
|
+
tier: 'free',
|
|
69
|
+
async execute(args) {
|
|
70
|
+
const id = String(args.id);
|
|
71
|
+
const task = tasks.get(id);
|
|
72
|
+
if (!task)
|
|
73
|
+
return `Error: Task #${id} not found`;
|
|
74
|
+
if (args.status) {
|
|
75
|
+
const status = String(args.status);
|
|
76
|
+
if (!['pending', 'in_progress', 'completed', 'blocked'].includes(status)) {
|
|
77
|
+
return `Error: Invalid status "${status}". Use: pending, in_progress, completed, blocked`;
|
|
78
|
+
}
|
|
79
|
+
task.status = status;
|
|
80
|
+
// If completing, auto-unblock dependent tasks
|
|
81
|
+
if (status === 'completed') {
|
|
82
|
+
for (const blockedId of task.blocks) {
|
|
83
|
+
const blocked = tasks.get(blockedId);
|
|
84
|
+
if (blocked) {
|
|
85
|
+
blocked.blockedBy = blocked.blockedBy.filter(b => b !== id);
|
|
86
|
+
if (blocked.blockedBy.length === 0 && blocked.status === 'blocked') {
|
|
87
|
+
blocked.status = 'pending';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (args.subject)
|
|
94
|
+
task.subject = String(args.subject);
|
|
95
|
+
if (args.description)
|
|
96
|
+
task.description = String(args.description);
|
|
97
|
+
if (Array.isArray(args.addBlockedBy)) {
|
|
98
|
+
for (const blockerId of args.addBlockedBy) {
|
|
99
|
+
const bid = String(blockerId);
|
|
100
|
+
if (!task.blockedBy.includes(bid)) {
|
|
101
|
+
task.blockedBy.push(bid);
|
|
102
|
+
const blocker = tasks.get(bid);
|
|
103
|
+
if (blocker && !blocker.blocks.includes(id)) {
|
|
104
|
+
blocker.blocks.push(id);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
task.updated = new Date().toISOString();
|
|
110
|
+
return formatTask(task);
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
registerTool({
|
|
114
|
+
name: 'task_list',
|
|
115
|
+
description: 'List all tasks with their status. Shows pending, in-progress, completed, and blocked tasks.',
|
|
116
|
+
parameters: {
|
|
117
|
+
status: { type: 'string', description: 'Filter by status (pending, in_progress, completed, blocked). Omit to show all.' },
|
|
118
|
+
},
|
|
119
|
+
tier: 'free',
|
|
120
|
+
async execute(args) {
|
|
121
|
+
if (tasks.size === 0)
|
|
122
|
+
return 'No tasks.';
|
|
123
|
+
let filtered = Array.from(tasks.values());
|
|
124
|
+
if (args.status) {
|
|
125
|
+
filtered = filtered.filter(t => t.status === String(args.status));
|
|
126
|
+
}
|
|
127
|
+
if (filtered.length === 0)
|
|
128
|
+
return `No ${args.status || ''} tasks.`;
|
|
129
|
+
// Group by status
|
|
130
|
+
const groups = {};
|
|
131
|
+
for (const t of filtered) {
|
|
132
|
+
if (!groups[t.status])
|
|
133
|
+
groups[t.status] = [];
|
|
134
|
+
groups[t.status].push(t);
|
|
135
|
+
}
|
|
136
|
+
const lines = [];
|
|
137
|
+
const order = ['in_progress', 'pending', 'blocked', 'completed'];
|
|
138
|
+
for (const status of order) {
|
|
139
|
+
if (groups[status]) {
|
|
140
|
+
for (const task of groups[status]) {
|
|
141
|
+
lines.push(formatTask(task));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const completed = filtered.filter(t => t.status === 'completed').length;
|
|
146
|
+
const total = filtered.length;
|
|
147
|
+
lines.push('');
|
|
148
|
+
lines.push(`${completed}/${total} completed`);
|
|
149
|
+
return lines.join('\n');
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
registerTool({
|
|
153
|
+
name: 'task_get',
|
|
154
|
+
description: 'Get full details of a specific task including description and dependencies.',
|
|
155
|
+
parameters: {
|
|
156
|
+
id: { type: 'string', description: 'Task ID', required: true },
|
|
157
|
+
},
|
|
158
|
+
tier: 'free',
|
|
159
|
+
async execute(args) {
|
|
160
|
+
const id = String(args.id);
|
|
161
|
+
const task = tasks.get(id);
|
|
162
|
+
if (!task)
|
|
163
|
+
return `Error: Task #${id} not found`;
|
|
164
|
+
const lines = [
|
|
165
|
+
`Task #${task.id}: ${task.subject}`,
|
|
166
|
+
`Status: ${task.status}`,
|
|
167
|
+
`Description: ${task.description || '(none)'}`,
|
|
168
|
+
];
|
|
169
|
+
if (task.activeForm)
|
|
170
|
+
lines.push(`Active form: ${task.activeForm}`);
|
|
171
|
+
if (task.blockedBy.length > 0)
|
|
172
|
+
lines.push(`Blocked by: ${task.blockedBy.join(', ')}`);
|
|
173
|
+
if (task.blocks.length > 0)
|
|
174
|
+
lines.push(`Blocks: ${task.blocks.join(', ')}`);
|
|
175
|
+
lines.push(`Created: ${task.created}`);
|
|
176
|
+
lines.push(`Updated: ${task.updated}`);
|
|
177
|
+
return lines.join('\n');
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
registerTool({
|
|
181
|
+
name: 'task_delete',
|
|
182
|
+
description: 'Delete a task by ID.',
|
|
183
|
+
parameters: {
|
|
184
|
+
id: { type: 'string', description: 'Task ID to delete', required: true },
|
|
185
|
+
},
|
|
186
|
+
tier: 'free',
|
|
187
|
+
async execute(args) {
|
|
188
|
+
const id = String(args.id);
|
|
189
|
+
const task = tasks.get(id);
|
|
190
|
+
if (!task)
|
|
191
|
+
return `Error: Task #${id} not found`;
|
|
192
|
+
// Clean up dependency references
|
|
193
|
+
for (const blockerId of task.blockedBy) {
|
|
194
|
+
const blocker = tasks.get(blockerId);
|
|
195
|
+
if (blocker) {
|
|
196
|
+
blocker.blocks = blocker.blocks.filter(b => b !== id);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
for (const blockedId of task.blocks) {
|
|
200
|
+
const blocked = tasks.get(blockedId);
|
|
201
|
+
if (blocked) {
|
|
202
|
+
blocked.blockedBy = blocked.blockedBy.filter(b => b !== id);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
tasks.delete(id);
|
|
206
|
+
return `Task #${id} deleted: ${task.subject}`;
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/tools/worktree.ts"],"names":[],"mappings":"AA8CA,wBAAgB,qBAAqB,IAAI,IAAI,CA0M5C"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// K:BOT Worktree — Git worktree isolation for safe experimentation
|
|
2
|
+
//
|
|
3
|
+
// Like Claude Code's EnterWorktree. Creates an isolated copy of the repo
|
|
4
|
+
// so the agent can experiment without affecting the main working tree.
|
|
5
|
+
//
|
|
6
|
+
// Flow:
|
|
7
|
+
// worktree_create — create a new worktree with a fresh branch
|
|
8
|
+
// worktree_switch — switch the session into a worktree
|
|
9
|
+
// worktree_merge — merge worktree changes back to main
|
|
10
|
+
// worktree_remove — clean up a worktree
|
|
11
|
+
// worktree_list — list active worktrees
|
|
12
|
+
import { execSync } from 'node:child_process';
|
|
13
|
+
import { existsSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { registerTool } from './index.js';
|
|
16
|
+
const worktrees = new Map();
|
|
17
|
+
let nextWorktreeId = 1;
|
|
18
|
+
/** Get the git repo root */
|
|
19
|
+
function getRepoRoot() {
|
|
20
|
+
try {
|
|
21
|
+
return execSync('git rev-parse --show-toplevel', { encoding: 'utf-8', timeout: 5000 }).trim();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Get current branch name */
|
|
28
|
+
function getCurrentBranch() {
|
|
29
|
+
try {
|
|
30
|
+
return execSync('git branch --show-current', { encoding: 'utf-8', timeout: 5000 }).trim();
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return 'main';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function registerWorktreeTools() {
|
|
37
|
+
registerTool({
|
|
38
|
+
name: 'worktree_create',
|
|
39
|
+
description: 'Create an isolated git worktree for safe experimentation. Changes in the worktree do not affect the main working tree until merged.',
|
|
40
|
+
parameters: {
|
|
41
|
+
name: { type: 'string', description: 'Name for the worktree/branch (auto-generated if omitted)' },
|
|
42
|
+
base: { type: 'string', description: 'Base branch to create from (defaults to current branch)' },
|
|
43
|
+
},
|
|
44
|
+
tier: 'free',
|
|
45
|
+
async execute(args) {
|
|
46
|
+
const repoRoot = getRepoRoot();
|
|
47
|
+
if (!repoRoot)
|
|
48
|
+
return 'Error: Not in a git repository.';
|
|
49
|
+
const id = String(nextWorktreeId++);
|
|
50
|
+
const name = args.name
|
|
51
|
+
? String(args.name)
|
|
52
|
+
: `kbot-wt-${Date.now().toString(36)}`;
|
|
53
|
+
const baseBranch = args.base ? String(args.base) : getCurrentBranch();
|
|
54
|
+
const branchName = `kbot/${name}`;
|
|
55
|
+
const worktreePath = join(repoRoot, '.kbot', 'worktrees', name);
|
|
56
|
+
try {
|
|
57
|
+
// Create the worktree with a new branch
|
|
58
|
+
execSync(`git worktree add -b "${branchName}" "${worktreePath}" "${baseBranch}"`, { encoding: 'utf-8', cwd: repoRoot, timeout: 30000 });
|
|
59
|
+
const wt = {
|
|
60
|
+
id,
|
|
61
|
+
branch: branchName,
|
|
62
|
+
path: worktreePath,
|
|
63
|
+
baseBranch,
|
|
64
|
+
createdAt: new Date().toISOString(),
|
|
65
|
+
};
|
|
66
|
+
worktrees.set(id, wt);
|
|
67
|
+
return [
|
|
68
|
+
`Worktree #${id} created`,
|
|
69
|
+
` Branch: ${branchName} (from ${baseBranch})`,
|
|
70
|
+
` Path: ${worktreePath}`,
|
|
71
|
+
'',
|
|
72
|
+
`Use \`worktree_switch\` with id="${id}" to work in this isolated copy.`,
|
|
73
|
+
'Changes here won\'t affect your main working tree.',
|
|
74
|
+
].join('\n');
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
const e = err;
|
|
78
|
+
return `Error creating worktree: ${e.stderr?.trim() || e.message}`;
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
registerTool({
|
|
83
|
+
name: 'worktree_switch',
|
|
84
|
+
description: 'Switch the current session into a worktree directory. All subsequent file operations happen in the isolated copy.',
|
|
85
|
+
parameters: {
|
|
86
|
+
id: { type: 'string', description: 'Worktree ID', required: true },
|
|
87
|
+
},
|
|
88
|
+
tier: 'free',
|
|
89
|
+
async execute(args) {
|
|
90
|
+
const id = String(args.id);
|
|
91
|
+
const wt = worktrees.get(id);
|
|
92
|
+
if (!wt)
|
|
93
|
+
return `Error: Worktree #${id} not found. Use \`worktree_list\` to see available worktrees.`;
|
|
94
|
+
if (!existsSync(wt.path)) {
|
|
95
|
+
return `Error: Worktree path no longer exists: ${wt.path}`;
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
process.chdir(wt.path);
|
|
99
|
+
return `Switched to worktree #${id}\n Branch: ${wt.branch}\n Path: ${wt.path}\n\nAll file operations now happen in this isolated copy.`;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return `Error switching to worktree: ${err instanceof Error ? err.message : String(err)}`;
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
registerTool({
|
|
107
|
+
name: 'worktree_merge',
|
|
108
|
+
description: 'Merge worktree changes back into the base branch. Switches back to the main working tree after merging.',
|
|
109
|
+
parameters: {
|
|
110
|
+
id: { type: 'string', description: 'Worktree ID', required: true },
|
|
111
|
+
message: { type: 'string', description: 'Merge commit message (auto-generated if omitted)' },
|
|
112
|
+
},
|
|
113
|
+
tier: 'free',
|
|
114
|
+
async execute(args) {
|
|
115
|
+
const id = String(args.id);
|
|
116
|
+
const wt = worktrees.get(id);
|
|
117
|
+
if (!wt)
|
|
118
|
+
return `Error: Worktree #${id} not found.`;
|
|
119
|
+
const repoRoot = getRepoRoot() || wt.path.replace(/\/.kbot\/worktrees\/.*$/, '');
|
|
120
|
+
try {
|
|
121
|
+
// Commit any uncommitted changes in the worktree
|
|
122
|
+
try {
|
|
123
|
+
execSync('git add -A && git diff --staged --quiet || git commit -m "kbot: worktree changes"', {
|
|
124
|
+
encoding: 'utf-8', cwd: wt.path, timeout: 15000,
|
|
125
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch { /* no changes to commit */ }
|
|
129
|
+
// Switch to main repo and merge
|
|
130
|
+
const commitMsg = args.message
|
|
131
|
+
? String(args.message)
|
|
132
|
+
: `Merge kbot worktree: ${wt.branch}`;
|
|
133
|
+
execSync(`git merge "${wt.branch}" -m "${commitMsg}"`, {
|
|
134
|
+
encoding: 'utf-8', cwd: repoRoot, timeout: 30000,
|
|
135
|
+
});
|
|
136
|
+
// Switch back to main repo
|
|
137
|
+
process.chdir(repoRoot);
|
|
138
|
+
return [
|
|
139
|
+
`Worktree #${id} merged into ${wt.baseBranch}`,
|
|
140
|
+
` Message: ${commitMsg}`,
|
|
141
|
+
` Switched back to: ${repoRoot}`,
|
|
142
|
+
'',
|
|
143
|
+
`Use \`worktree_remove\` to clean up, or keep it for future work.`,
|
|
144
|
+
].join('\n');
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
const e = err;
|
|
148
|
+
return `Error merging worktree: ${e.stderr?.trim() || e.message}\n\nYou may need to resolve merge conflicts manually.`;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
registerTool({
|
|
153
|
+
name: 'worktree_remove',
|
|
154
|
+
description: 'Remove a worktree and its branch. Cleans up the isolated copy.',
|
|
155
|
+
parameters: {
|
|
156
|
+
id: { type: 'string', description: 'Worktree ID', required: true },
|
|
157
|
+
force: { type: 'boolean', description: 'Force removal even with uncommitted changes' },
|
|
158
|
+
},
|
|
159
|
+
tier: 'free',
|
|
160
|
+
async execute(args) {
|
|
161
|
+
const id = String(args.id);
|
|
162
|
+
const wt = worktrees.get(id);
|
|
163
|
+
if (!wt)
|
|
164
|
+
return `Error: Worktree #${id} not found.`;
|
|
165
|
+
const repoRoot = getRepoRoot() || wt.path.replace(/\/.kbot\/worktrees\/.*$/, '');
|
|
166
|
+
const force = args.force === true ? ' --force' : '';
|
|
167
|
+
// If we're currently in the worktree, switch back
|
|
168
|
+
if (process.cwd().startsWith(wt.path)) {
|
|
169
|
+
process.chdir(repoRoot);
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
execSync(`git worktree remove "${wt.path}"${force}`, {
|
|
173
|
+
encoding: 'utf-8', cwd: repoRoot, timeout: 15000,
|
|
174
|
+
});
|
|
175
|
+
// Delete the branch too
|
|
176
|
+
try {
|
|
177
|
+
execSync(`git branch -d "${wt.branch}"`, {
|
|
178
|
+
encoding: 'utf-8', cwd: repoRoot, timeout: 5000,
|
|
179
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
catch { /* branch may already be gone */ }
|
|
183
|
+
worktrees.delete(id);
|
|
184
|
+
return `Worktree #${id} removed (branch: ${wt.branch})`;
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
const e = err;
|
|
188
|
+
return `Error removing worktree: ${e.stderr?.trim() || e.message}\nTry with force=true to override.`;
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
registerTool({
|
|
193
|
+
name: 'worktree_list',
|
|
194
|
+
description: 'List all K:BOT worktrees and git worktrees.',
|
|
195
|
+
parameters: {},
|
|
196
|
+
tier: 'free',
|
|
197
|
+
async execute() {
|
|
198
|
+
const lines = [];
|
|
199
|
+
// K:BOT managed worktrees
|
|
200
|
+
if (worktrees.size > 0) {
|
|
201
|
+
lines.push('K:BOT worktrees:');
|
|
202
|
+
for (const [id, wt] of worktrees) {
|
|
203
|
+
const exists = existsSync(wt.path) ? '✓' : '✗';
|
|
204
|
+
lines.push(` ${exists} #${id} ${wt.branch.padEnd(30)} ${wt.path}`);
|
|
205
|
+
}
|
|
206
|
+
lines.push('');
|
|
207
|
+
}
|
|
208
|
+
// All git worktrees
|
|
209
|
+
try {
|
|
210
|
+
const gitWorktrees = execSync('git worktree list', {
|
|
211
|
+
encoding: 'utf-8', timeout: 5000,
|
|
212
|
+
}).trim();
|
|
213
|
+
lines.push('Git worktrees:');
|
|
214
|
+
lines.push(gitWorktrees.split('\n').map(l => ` ${l}`).join('\n'));
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
lines.push('Not in a git repository.');
|
|
218
|
+
}
|
|
219
|
+
return lines.join('\n') || 'No worktrees.';
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/tools/worktree.ts"],"names":[],"mappings":"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"}
|
package/dist/tui.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export declare function getTermSize(): {
|
|
2
|
+
cols: number;
|
|
3
|
+
rows: number;
|
|
4
|
+
};
|
|
5
|
+
export declare function clearScreen(): void;
|
|
6
|
+
export declare function hideCursor(): void;
|
|
7
|
+
export declare function showCursor(): void;
|
|
8
|
+
/** Draw a bordered panel with title */
|
|
9
|
+
export declare function panel(title: string, content: string, opts?: {
|
|
10
|
+
width?: number;
|
|
11
|
+
color?: (text: string) => string;
|
|
12
|
+
padding?: number;
|
|
13
|
+
}): string;
|
|
14
|
+
/** Horizontal divider with optional label */
|
|
15
|
+
export declare function dividerLine(label?: string, width?: number): string;
|
|
16
|
+
export declare function progressBar(current: number, total: number, opts?: {
|
|
17
|
+
width?: number;
|
|
18
|
+
label?: string;
|
|
19
|
+
color?: (text: string) => string;
|
|
20
|
+
showPercent?: boolean;
|
|
21
|
+
showCount?: boolean;
|
|
22
|
+
}): string;
|
|
23
|
+
export interface StepProgress {
|
|
24
|
+
steps: Array<{
|
|
25
|
+
label: string;
|
|
26
|
+
status: 'pending' | 'running' | 'done' | 'failed';
|
|
27
|
+
}>;
|
|
28
|
+
currentStep: number;
|
|
29
|
+
}
|
|
30
|
+
export declare function renderStepProgress(progress: StepProgress): string;
|
|
31
|
+
export declare function splitPane(left: {
|
|
32
|
+
title: string;
|
|
33
|
+
content: string;
|
|
34
|
+
color?: (text: string) => string;
|
|
35
|
+
}, right: {
|
|
36
|
+
title: string;
|
|
37
|
+
content: string;
|
|
38
|
+
color?: (text: string) => string;
|
|
39
|
+
}): string;
|
|
40
|
+
export declare function table(headers: string[], rows: string[][], opts?: {
|
|
41
|
+
color?: (text: string) => string;
|
|
42
|
+
padding?: number;
|
|
43
|
+
}): string;
|
|
44
|
+
export interface DashboardState {
|
|
45
|
+
agent: string;
|
|
46
|
+
model: string;
|
|
47
|
+
provider: string;
|
|
48
|
+
toolsUsed: number;
|
|
49
|
+
tokensUsed: number;
|
|
50
|
+
cost: number;
|
|
51
|
+
sessionTurns: number;
|
|
52
|
+
activeSubagents: Array<{
|
|
53
|
+
id: string;
|
|
54
|
+
agent: string;
|
|
55
|
+
status: string;
|
|
56
|
+
}>;
|
|
57
|
+
recentTools: Array<{
|
|
58
|
+
name: string;
|
|
59
|
+
duration: number;
|
|
60
|
+
success: boolean;
|
|
61
|
+
}>;
|
|
62
|
+
}
|
|
63
|
+
export declare function renderDashboard(state: DashboardState): string;
|
|
64
|
+
export declare function sparkline(data: number[], opts?: {
|
|
65
|
+
color?: (text: string) => string;
|
|
66
|
+
label?: string;
|
|
67
|
+
}): string;
|
|
68
|
+
export declare function toast(message: string, type?: 'info' | 'success' | 'warn' | 'error'): void;
|
|
69
|
+
/** Truncate string with ellipsis */
|
|
70
|
+
export declare function truncate(str: string, maxWidth: number): string;
|
|
71
|
+
/** Word-wrap text to width */
|
|
72
|
+
export declare function wordWrap(text: string, width: number): string[];
|
|
73
|
+
//# sourceMappingURL=tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
|