@doriandev/devcc 0.1.2 → 0.3.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 +589 -389
- package/bin/devcc.mjs +50 -23
- package/dist/devcc/agents/agents.d.ts +119 -0
- package/dist/devcc/agents/agents.d.ts.map +1 -0
- package/dist/devcc/agents/agents.js +182 -0
- package/dist/devcc/agents/agents.js.map +1 -0
- package/dist/devcc/app/App.d.ts +23 -0
- package/dist/devcc/app/App.d.ts.map +1 -1
- package/dist/devcc/app/App.js +451 -19
- package/dist/devcc/app/App.js.map +1 -1
- package/dist/devcc/app/controlPlaneCommands.d.ts +14 -0
- package/dist/devcc/app/controlPlaneCommands.d.ts.map +1 -0
- package/dist/devcc/app/controlPlaneCommands.js +204 -0
- package/dist/devcc/app/controlPlaneCommands.js.map +1 -0
- package/dist/devcc/app/keymap.d.ts.map +1 -1
- package/dist/devcc/app/keymap.js +25 -3
- package/dist/devcc/app/keymap.js.map +1 -1
- package/dist/devcc/automation.d.ts +52 -0
- package/dist/devcc/automation.d.ts.map +1 -0
- package/dist/devcc/automation.js +339 -0
- package/dist/devcc/automation.js.map +1 -0
- package/dist/devcc/cli.d.ts.map +1 -1
- package/dist/devcc/cli.js +73 -3
- package/dist/devcc/cli.js.map +1 -1
- package/dist/devcc/components/Sidebar.d.ts.map +1 -1
- package/dist/devcc/components/Sidebar.js +1 -0
- package/dist/devcc/components/Sidebar.js.map +1 -1
- package/dist/devcc/components/primitives.d.ts.map +1 -1
- package/dist/devcc/components/primitives.js +3 -0
- package/dist/devcc/components/primitives.js.map +1 -1
- package/dist/devcc/core/commands.d.ts +33 -0
- package/dist/devcc/core/commands.d.ts.map +1 -1
- package/dist/devcc/core/commands.js.map +1 -1
- package/dist/devcc/core/config.d.ts +71 -3
- package/dist/devcc/core/config.d.ts.map +1 -1
- package/dist/devcc/core/config.js +189 -5
- package/dist/devcc/core/config.js.map +1 -1
- package/dist/devcc/core/state.d.ts +19 -1
- package/dist/devcc/core/state.d.ts.map +1 -1
- package/dist/devcc/core/state.js +6 -0
- package/dist/devcc/core/state.js.map +1 -1
- package/dist/devcc/environment/EnvironmentService.d.ts +58 -0
- package/dist/devcc/environment/EnvironmentService.d.ts.map +1 -0
- package/dist/devcc/environment/EnvironmentService.js +159 -0
- package/dist/devcc/environment/EnvironmentService.js.map +1 -0
- package/dist/devcc/environment/integrations.d.ts +52 -0
- package/dist/devcc/environment/integrations.d.ts.map +1 -0
- package/dist/devcc/environment/integrations.js +94 -0
- package/dist/devcc/environment/integrations.js.map +1 -0
- package/dist/devcc/environment/tools.d.ts +51 -0
- package/dist/devcc/environment/tools.d.ts.map +1 -0
- package/dist/devcc/environment/tools.js +99 -0
- package/dist/devcc/environment/tools.js.map +1 -0
- package/dist/devcc/git/GitService.d.ts +26 -0
- package/dist/devcc/git/GitService.d.ts.map +1 -1
- package/dist/devcc/git/GitService.js +71 -2
- package/dist/devcc/git/GitService.js.map +1 -1
- package/dist/devcc/git/worktrees.d.ts +88 -0
- package/dist/devcc/git/worktrees.d.ts.map +1 -0
- package/dist/devcc/git/worktrees.js +226 -0
- package/dist/devcc/git/worktrees.js.map +1 -0
- package/dist/devcc/index.d.ts +15 -3
- package/dist/devcc/index.d.ts.map +1 -1
- package/dist/devcc/index.js +14 -2
- package/dist/devcc/index.js.map +1 -1
- package/dist/devcc/init/detect.d.ts +55 -0
- package/dist/devcc/init/detect.d.ts.map +1 -0
- package/dist/devcc/init/detect.js +207 -0
- package/dist/devcc/init/detect.js.map +1 -0
- package/dist/devcc/init/prompt.d.ts +25 -0
- package/dist/devcc/init/prompt.d.ts.map +1 -0
- package/dist/devcc/init/prompt.js +156 -0
- package/dist/devcc/init/prompt.js.map +1 -0
- package/dist/devcc/platform/launch.d.ts +30 -0
- package/dist/devcc/platform/launch.d.ts.map +1 -0
- package/dist/devcc/platform/launch.js +93 -0
- package/dist/devcc/platform/launch.js.map +1 -0
- package/dist/devcc/services/ServiceManager.d.ts +10 -2
- package/dist/devcc/services/ServiceManager.d.ts.map +1 -1
- package/dist/devcc/services/ServiceManager.js +18 -4
- package/dist/devcc/services/ServiceManager.js.map +1 -1
- package/dist/devcc/services/node.d.ts +11 -0
- package/dist/devcc/services/node.d.ts.map +1 -1
- package/dist/devcc/services/node.js +20 -18
- package/dist/devcc/services/node.js.map +1 -1
- package/dist/devcc/services/ollama.d.ts +64 -5
- package/dist/devcc/services/ollama.d.ts.map +1 -1
- package/dist/devcc/services/ollama.js +118 -17
- package/dist/devcc/services/ollama.js.map +1 -1
- package/dist/devcc/services/remote.d.ts +90 -0
- package/dist/devcc/services/remote.d.ts.map +1 -0
- package/dist/devcc/services/remote.js +233 -0
- package/dist/devcc/services/remote.js.map +1 -0
- package/dist/devcc/services/types.d.ts +8 -1
- package/dist/devcc/services/types.d.ts.map +1 -1
- package/dist/devcc/services/types.js.map +1 -1
- package/dist/devcc/utils/exec.d.ts +6 -0
- package/dist/devcc/utils/exec.d.ts.map +1 -1
- package/dist/devcc/utils/exec.js +12 -2
- package/dist/devcc/utils/exec.js.map +1 -1
- package/dist/devcc/verify/verify.d.ts +107 -0
- package/dist/devcc/verify/verify.d.ts.map +1 -0
- package/dist/devcc/verify/verify.js +203 -0
- package/dist/devcc/verify/verify.js.map +1 -0
- package/dist/devcc/views/OverviewView.d.ts.map +1 -1
- package/dist/devcc/views/OverviewView.js +58 -2
- package/dist/devcc/views/OverviewView.js.map +1 -1
- package/dist/devcc/views/ServicesView.d.ts +2 -0
- package/dist/devcc/views/ServicesView.d.ts.map +1 -1
- package/dist/devcc/views/ServicesView.js +15 -0
- package/dist/devcc/views/ServicesView.js.map +1 -1
- package/dist/devcc/views/SystemView.d.ts +10 -1
- package/dist/devcc/views/SystemView.d.ts.map +1 -1
- package/dist/devcc/views/SystemView.js +127 -19
- package/dist/devcc/views/SystemView.js.map +1 -1
- package/dist/devcc/views/WorktreesView.d.ts +48 -0
- package/dist/devcc/views/WorktreesView.d.ts.map +1 -0
- package/dist/devcc/views/WorktreesView.js +235 -0
- package/dist/devcc/views/WorktreesView.js.map +1 -0
- package/package.json +1 -1
- package/src/devcc/agents/agents.ts +292 -0
- package/src/devcc/app/App.ts +529 -22
- package/src/devcc/app/controlPlaneCommands.ts +227 -0
- package/src/devcc/app/keymap.ts +25 -3
- package/src/devcc/automation.ts +409 -0
- package/src/devcc/cli.ts +77 -3
- package/src/devcc/components/Sidebar.ts +1 -0
- package/src/devcc/components/primitives.ts +3 -0
- package/src/devcc/core/commands.ts +34 -0
- package/src/devcc/core/config.ts +275 -11
- package/src/devcc/core/state.ts +25 -0
- package/src/devcc/environment/EnvironmentService.ts +215 -0
- package/src/devcc/environment/integrations.ts +133 -0
- package/src/devcc/environment/tools.ts +151 -0
- package/src/devcc/git/GitService.ts +104 -2
- package/src/devcc/git/worktrees.ts +256 -0
- package/src/devcc/index.ts +66 -2
- package/src/devcc/init/detect.ts +268 -0
- package/src/devcc/init/prompt.ts +179 -0
- package/src/devcc/platform/launch.ts +125 -0
- package/src/devcc/services/ServiceManager.ts +15 -3
- package/src/devcc/services/node.ts +17 -14
- package/src/devcc/services/ollama.ts +162 -19
- package/src/devcc/services/remote.ts +306 -0
- package/src/devcc/services/types.ts +9 -1
- package/src/devcc/utils/exec.ts +26 -2
- package/src/devcc/verify/verify.ts +316 -0
- package/src/devcc/views/OverviewView.ts +84 -2
- package/src/devcc/views/ServicesView.ts +17 -0
- package/src/devcc/views/SystemView.ts +144 -22
- package/src/devcc/views/WorktreesView.ts +270 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import type { AgentAdapter } from "../agents/agents.js"
|
|
2
|
+
import type { CommandContext, CommandDefinition } from "../core/commands.js"
|
|
3
|
+
import type { RemoteMachineConfig } from "../core/config.js"
|
|
4
|
+
import { isActive } from "../processes/ManagedProcess.js"
|
|
5
|
+
import { errorMessage } from "../utils/errors.js"
|
|
6
|
+
|
|
7
|
+
export interface ControlPlaneCommandOptions {
|
|
8
|
+
agents: readonly AgentAdapter[]
|
|
9
|
+
machines: readonly RemoteMachineConfig[]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** The directory commands act on: the selected worktree, else the project root. */
|
|
13
|
+
function targetPath(context: CommandContext): string {
|
|
14
|
+
return context.selectedWorktree()?.path ?? context.store.getState().project.rootDir
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Palette commands for worktrees, agents, verification, environment and remote
|
|
19
|
+
* machines. They resolve their target at run time (`selectedWorktree`), so
|
|
20
|
+
* "Launch Claude" from the Worktrees view acts on the highlighted worktree.
|
|
21
|
+
*/
|
|
22
|
+
export function createControlPlaneCommands(options: ControlPlaneCommandOptions): CommandDefinition[] {
|
|
23
|
+
const inRepository = (context: CommandContext) => context.store.getState().git.isRepository
|
|
24
|
+
|
|
25
|
+
const commands: CommandDefinition[] = [
|
|
26
|
+
// --- Worktrees ---------------------------------------------------------
|
|
27
|
+
{
|
|
28
|
+
id: "worktree.create",
|
|
29
|
+
title: "Worktree: create…",
|
|
30
|
+
category: "Worktree",
|
|
31
|
+
shortcut: "n",
|
|
32
|
+
keywords: ["new", "branch", "add", "git"],
|
|
33
|
+
when: inRepository,
|
|
34
|
+
execute: (context) => context.createWorktree(),
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: "worktree.remove",
|
|
38
|
+
title: "Worktree: remove the selected worktree",
|
|
39
|
+
category: "Worktree",
|
|
40
|
+
shortcut: "d",
|
|
41
|
+
keywords: ["delete", "git"],
|
|
42
|
+
when: (context) => {
|
|
43
|
+
const worktree = context.selectedWorktree()
|
|
44
|
+
return worktree !== undefined && !worktree.isMain && !worktree.isCurrent
|
|
45
|
+
},
|
|
46
|
+
execute: async (context) => {
|
|
47
|
+
const worktree = context.selectedWorktree()
|
|
48
|
+
if (worktree) await context.removeWorktree(worktree)
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: "worktree.openProject",
|
|
53
|
+
title: "Worktree: open in devcc",
|
|
54
|
+
category: "Worktree",
|
|
55
|
+
shortcut: "o",
|
|
56
|
+
keywords: ["switch", "project", "workspace"],
|
|
57
|
+
when: (context) => {
|
|
58
|
+
const worktree = context.selectedWorktree()
|
|
59
|
+
return worktree !== undefined && !worktree.isCurrent && !worktree.bare
|
|
60
|
+
},
|
|
61
|
+
execute: async (context) => {
|
|
62
|
+
const worktree = context.selectedWorktree()
|
|
63
|
+
if (worktree) await context.switchProject(worktree.path)
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: "worktree.openTerminal",
|
|
68
|
+
title: "Worktree: open terminal",
|
|
69
|
+
category: "Worktree",
|
|
70
|
+
shortcut: "t",
|
|
71
|
+
keywords: ["shell", "console"],
|
|
72
|
+
execute: (context) => context.openInTerminal(targetPath(context)),
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "worktree.openEditor",
|
|
76
|
+
title: "Worktree: open in editor",
|
|
77
|
+
category: "Worktree",
|
|
78
|
+
shortcut: "e",
|
|
79
|
+
keywords: ["ide", "code", "zed", "cursor", "webstorm"],
|
|
80
|
+
execute: (context) => context.openInEditor(targetPath(context)),
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: "worktree.list",
|
|
84
|
+
title: "Worktree: show worktrees and agents",
|
|
85
|
+
category: "Worktree",
|
|
86
|
+
keywords: ["list", "agents"],
|
|
87
|
+
when: inRepository,
|
|
88
|
+
execute: async (context) => {
|
|
89
|
+
context.navigate("worktrees")
|
|
90
|
+
await context.git.refresh()
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
// --- AI agents ---------------------------------------------------------
|
|
95
|
+
...options.agents.map((agent): CommandDefinition => ({
|
|
96
|
+
id: `agent.launch.${agent.id}`,
|
|
97
|
+
title: `AI: launch ${agent.name}`,
|
|
98
|
+
category: "AI",
|
|
99
|
+
shortcut: agent.id === "claude" ? "c" : agent.id === "codex" ? "x" : undefined,
|
|
100
|
+
keywords: ["agent", "ai", agent.id, agent.command],
|
|
101
|
+
execute: (context) => context.launchAgent(agent.id),
|
|
102
|
+
})),
|
|
103
|
+
{
|
|
104
|
+
id: "agent.stopAll",
|
|
105
|
+
title: "AI: stop all running agents",
|
|
106
|
+
category: "AI",
|
|
107
|
+
keywords: ["agent", "kill", "cancel"],
|
|
108
|
+
when: (context) => context.store.getState().agents.some((session) => isActive(session.status)),
|
|
109
|
+
confirm: { title: "Stop every running agent?", message: "Their work so far stays in the worktrees." },
|
|
110
|
+
execute: async (context) => {
|
|
111
|
+
const running = context.store.getState().agents.filter((session) => isActive(session.status))
|
|
112
|
+
await Promise.all(running.map((session) => context.agents.stop(session.id)))
|
|
113
|
+
context.notify("info", `Stopped ${running.length} agent(s)`)
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
// --- Verification ------------------------------------------------------
|
|
118
|
+
{
|
|
119
|
+
id: "verify.run",
|
|
120
|
+
title: "Project: verify (run every verification step)",
|
|
121
|
+
category: "Project",
|
|
122
|
+
shortcut: "V",
|
|
123
|
+
keywords: ["check", "ci", "test", "lint", "gate", "ship"],
|
|
124
|
+
execute: (context) => context.runVerify(),
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
// --- Environment -------------------------------------------------------
|
|
128
|
+
{
|
|
129
|
+
id: "environment.refresh",
|
|
130
|
+
title: "Environment: refresh tools, runtimes and direnv",
|
|
131
|
+
category: "Environment",
|
|
132
|
+
keywords: ["mise", "direnv", "versions", "doctor", "health"],
|
|
133
|
+
execute: async (context) => {
|
|
134
|
+
context.navigate("system")
|
|
135
|
+
const snapshot = await context.environment.refresh()
|
|
136
|
+
const problems = snapshot.tools.filter((tool) => tool.status === "error" || tool.status === "warning")
|
|
137
|
+
context.notify(
|
|
138
|
+
problems.length > 0 ? "warn" : "success",
|
|
139
|
+
problems.length > 0
|
|
140
|
+
? `Environment: ${problems.map((tool) => tool.name).join(", ")} need attention`
|
|
141
|
+
: "Environment checked",
|
|
142
|
+
)
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: "environment.direnvAllow",
|
|
147
|
+
title: "Environment: direnv allow this project's .envrc",
|
|
148
|
+
category: "Environment",
|
|
149
|
+
keywords: ["direnv", "envrc", "approve", "trust"],
|
|
150
|
+
when: (context) => {
|
|
151
|
+
const { direnv } = context.store.getState().environment
|
|
152
|
+
return direnv.installed && direnv.rcPath !== undefined && direnv.approval !== "allowed"
|
|
153
|
+
},
|
|
154
|
+
execute: async (context) => {
|
|
155
|
+
const { rcPath } = context.store.getState().environment.direnv
|
|
156
|
+
const confirmed = await context.confirm(
|
|
157
|
+
"Allow this .envrc?",
|
|
158
|
+
`direnv will run ${rcPath ?? ".envrc"} whenever a shell enters the project. Only allow files you have read.`,
|
|
159
|
+
)
|
|
160
|
+
if (!confirmed) return
|
|
161
|
+
try {
|
|
162
|
+
await context.environment.allowDirenv()
|
|
163
|
+
context.notify("success", "direnv: .envrc allowed")
|
|
164
|
+
} catch (error) {
|
|
165
|
+
context.notify("error", errorMessage(error))
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
]
|
|
170
|
+
|
|
171
|
+
// --- Project setup -------------------------------------------------------
|
|
172
|
+
const hasConfig = (context: CommandContext) => context.store.getState().project.configPath !== null
|
|
173
|
+
commands.push(
|
|
174
|
+
{
|
|
175
|
+
id: "config.starter",
|
|
176
|
+
title: "Project: set up .devcc.ts from detected scripts",
|
|
177
|
+
category: "Project",
|
|
178
|
+
keywords: ["init", "config", "setup", "starter", "generate"],
|
|
179
|
+
when: (context) => !hasConfig(context),
|
|
180
|
+
execute: (context) => context.setUpConfig("starter"),
|
|
181
|
+
},
|
|
182
|
+
...options.agents
|
|
183
|
+
.filter((agent) => agent.separatesPrompt)
|
|
184
|
+
.map((agent): CommandDefinition => ({
|
|
185
|
+
id: `config.agent.${agent.id}`,
|
|
186
|
+
title: `Project: set up .devcc.ts with ${agent.name}`,
|
|
187
|
+
category: "Project",
|
|
188
|
+
keywords: ["init", "config", "setup", "improve", "agent", agent.id],
|
|
189
|
+
execute: (context) => context.setUpConfig(agent.id),
|
|
190
|
+
})),
|
|
191
|
+
{
|
|
192
|
+
id: "config.reload",
|
|
193
|
+
title: "Project: reload .devcc.ts",
|
|
194
|
+
category: "Project",
|
|
195
|
+
keywords: ["config", "refresh", "reread"],
|
|
196
|
+
when: hasConfig,
|
|
197
|
+
execute: (context) => context.reloadConfig(),
|
|
198
|
+
},
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
// --- Remote machines -----------------------------------------------------
|
|
202
|
+
for (const machine of options.machines) {
|
|
203
|
+
commands.push({
|
|
204
|
+
id: `remote.ssh.${machine.id}`,
|
|
205
|
+
title: `Remote: SSH to ${machine.name}`,
|
|
206
|
+
category: "Remote",
|
|
207
|
+
keywords: ["ssh", "remote", "connect", machine.host],
|
|
208
|
+
execute: (context) => context.sshTo(machine.id),
|
|
209
|
+
})
|
|
210
|
+
}
|
|
211
|
+
commands.push({
|
|
212
|
+
id: "remote.refresh",
|
|
213
|
+
title: "Remote: refresh machine and Tailscale status",
|
|
214
|
+
category: "Remote",
|
|
215
|
+
keywords: ["ssh", "tailscale", "ollama", "reachability"],
|
|
216
|
+
when: (context) =>
|
|
217
|
+
context.remoteMachines().length > 0 ||
|
|
218
|
+
context.store.getState().services.some((service) => service.category === "remote"),
|
|
219
|
+
execute: async (context) => {
|
|
220
|
+
context.navigate("services")
|
|
221
|
+
await context.services.refresh()
|
|
222
|
+
context.notify("info", "Remote status refreshed")
|
|
223
|
+
},
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
return commands
|
|
227
|
+
}
|
package/src/devcc/app/keymap.ts
CHANGED
|
@@ -12,8 +12,10 @@ export const VIEW_SHORTCUTS: Readonly<Record<string, ViewId>> = {
|
|
|
12
12
|
"7": "dependencies",
|
|
13
13
|
"8": "system",
|
|
14
14
|
"9": "settings",
|
|
15
|
+
"0": "worktrees",
|
|
15
16
|
p: "processes",
|
|
16
17
|
g: "git",
|
|
18
|
+
w: "worktrees",
|
|
17
19
|
l: "logs",
|
|
18
20
|
d: "dependencies",
|
|
19
21
|
}
|
|
@@ -51,9 +53,10 @@ export const HELP_SECTIONS: HelpSection[] = [
|
|
|
51
53
|
{ keys: "Services", description: "things detected on this machine: Docker, databases, Ollama" },
|
|
52
54
|
{ keys: "Scripts", description: "package.json scripts, run through your package manager" },
|
|
53
55
|
{ keys: "Git", description: "branch, changes, commits; stage, commit, pull, push" },
|
|
56
|
+
{ keys: "Worktrees", description: "git worktrees, and the AI agents (Claude, Codex) working in them" },
|
|
54
57
|
{ keys: "Logs", description: "output of everything devcc started, per source or merged" },
|
|
55
58
|
{ keys: "Dependencies", description: "outdated packages, checked only when you ask" },
|
|
56
|
-
{ keys: "System", description: "
|
|
59
|
+
{ keys: "System", description: "environment health (tools, mise, direnv), CPU, memory, disk, host" },
|
|
57
60
|
{ keys: "Settings", description: "detection results, config issues, diagnostics history" },
|
|
58
61
|
],
|
|
59
62
|
},
|
|
@@ -61,6 +64,7 @@ export const HELP_SECTIONS: HelpSection[] = [
|
|
|
61
64
|
title: "Getting started",
|
|
62
65
|
entries: [
|
|
63
66
|
{ keys: ".devcc.ts", description: "declare processes devcc can control (see Config below)" },
|
|
67
|
+
{ keys: "/ set up", description: "“Project: set up .devcc.ts” writes a starter or asks an agent" },
|
|
64
68
|
{ keys: "ctrl+p", description: "open another project; the current one keeps running" },
|
|
65
69
|
{ keys: "/", description: "the palette lists everything the app can do" },
|
|
66
70
|
{ keys: ".devcc/devcc.log", description: "internal diagnostics, if something looks wrong" },
|
|
@@ -74,8 +78,8 @@ export const HELP_SECTIONS: HelpSection[] = [
|
|
|
74
78
|
{ keys: "← / h", description: "previous section" },
|
|
75
79
|
{ keys: "→", description: "next section" },
|
|
76
80
|
{ keys: "tab / S-tab", description: "cycle sections" },
|
|
77
|
-
{ keys: "1…9", description: "jump to a section" },
|
|
78
|
-
{ keys: "p / g / l / d", description: "processes / git / logs / dependencies" },
|
|
81
|
+
{ keys: "1…9, 0", description: "jump to a section (0 is Worktrees)" },
|
|
82
|
+
{ keys: "p / g / w / l / d", description: "processes / git / worktrees / logs / dependencies" },
|
|
79
83
|
{ keys: "enter", description: "open or activate" },
|
|
80
84
|
{ keys: "esc", description: "close overlay / back" },
|
|
81
85
|
],
|
|
@@ -109,6 +113,18 @@ export const HELP_SECTIONS: HelpSection[] = [
|
|
|
109
113
|
{ keys: "r", description: "refresh status" },
|
|
110
114
|
],
|
|
111
115
|
},
|
|
116
|
+
{
|
|
117
|
+
title: "Worktrees & agents",
|
|
118
|
+
entries: [
|
|
119
|
+
{ keys: "n", description: "new worktree (branch, base, directory)" },
|
|
120
|
+
{ keys: "d", description: "remove the worktree (confirmed, never forced)" },
|
|
121
|
+
{ keys: "o / enter", description: "open the worktree in devcc; on an agent, its logs" },
|
|
122
|
+
{ keys: "t / e", description: "open a terminal / the editor in the worktree" },
|
|
123
|
+
{ keys: "c / x", description: "launch Claude Code / Codex with a task in the worktree" },
|
|
124
|
+
{ keys: "s", description: "stop the selected agent" },
|
|
125
|
+
{ keys: "r", description: "refresh the worktree list" },
|
|
126
|
+
],
|
|
127
|
+
},
|
|
112
128
|
{
|
|
113
129
|
title: "Logs",
|
|
114
130
|
entries: [
|
|
@@ -148,6 +164,7 @@ export const HELP_SECTIONS: HelpSection[] = [
|
|
|
148
164
|
{ keys: "ctrl+p / ctrl+o", description: "open / cycle projects" },
|
|
149
165
|
{ keys: "?", description: "this help" },
|
|
150
166
|
{ keys: "R", description: "refresh everything" },
|
|
167
|
+
{ keys: "V", description: "verify the project (every verify step)" },
|
|
151
168
|
{ keys: "q / ctrl+c", description: "quit" },
|
|
152
169
|
],
|
|
153
170
|
},
|
|
@@ -162,6 +179,11 @@ export const HELP_SECTIONS: HelpSection[] = [
|
|
|
162
179
|
{ keys: "services[]", description: "extra ports to watch: id, name, port, healthPath" },
|
|
163
180
|
{ keys: "projects[]", description: "extra paths offered by the project switcher" },
|
|
164
181
|
{ keys: "refresh", description: "{ system, services, git, clock } intervals in ms" },
|
|
182
|
+
{ keys: "verify[]", description: "command ids, script names or { id, command }: devcc verify" },
|
|
183
|
+
{ keys: "agents", description: "{ claude: { command, args }, codex: {...} } overrides" },
|
|
184
|
+
{ keys: "editor / terminal", description: "{ command } or { application } for open actions" },
|
|
185
|
+
{ keys: "remoteMachines[]", description: "id, name, host (an SSH alias works), services" },
|
|
186
|
+
{ keys: "services[] ollama", description: '{ id, type: "ollama", baseUrl }: remote models' },
|
|
165
187
|
],
|
|
166
188
|
},
|
|
167
189
|
]
|