@hypercli/hq 0.3.0 → 0.4.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 +2 -1
- package/dist/commands/hq/launch.d.ts +19 -0
- package/dist/commands/hq/launch.d.ts.map +1 -0
- package/dist/commands/hq/launch.js +155 -0
- package/dist/commands/hq/launch.js.map +1 -0
- package/dist/commands/hq/relaunch.d.ts +18 -0
- package/dist/commands/hq/relaunch.d.ts.map +1 -0
- package/dist/commands/hq/relaunch.js +124 -0
- package/dist/commands/hq/relaunch.js.map +1 -0
- package/dist/commands/hq/start.d.ts.map +1 -1
- package/dist/commands/hq/start.js +10 -8
- package/dist/commands/hq/start.js.map +1 -1
- package/dist/commands/hq/stop-all.d.ts.map +1 -1
- package/dist/commands/hq/stop-all.js +2 -0
- package/dist/commands/hq/stop-all.js.map +1 -1
- package/dist/commands/hq/stop.d.ts.map +1 -1
- package/dist/commands/hq/stop.js +2 -0
- package/dist/commands/hq/stop.js.map +1 -1
- package/dist/config/schema.d.ts +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/services/claude.d.ts.map +1 -1
- package/dist/services/claude.js +1 -0
- package/dist/services/claude.js.map +1 -1
- package/dist/services/sessions.d.ts +19 -0
- package/dist/services/sessions.d.ts.map +1 -0
- package/dist/services/sessions.js +51 -0
- package/dist/services/sessions.js.map +1 -0
- package/dist/utils/banner.js +1 -1
- package/dist/utils/banner.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +2 -0
- package/dist/utils/paths.js.map +1 -1
- package/help/hq.md +6 -5
- package/oclif.manifest.json +118 -61
- package/package.json +3 -3
- package/dist/commands/hq/spawn.d.ts +0 -21
- package/dist/commands/hq/spawn.d.ts.map +0 -1
- package/dist/commands/hq/spawn.js +0 -123
- package/dist/commands/hq/spawn.js.map +0 -1
package/README.md
CHANGED
|
@@ -9,7 +9,8 @@ Included automatically with `@hypercli/cli`. Can also be installed as a standalo
|
|
|
9
9
|
## Commands
|
|
10
10
|
|
|
11
11
|
- `hyper hq start` — Start the always-on HQ control center
|
|
12
|
-
- `hyper hq
|
|
12
|
+
- `hyper hq launch [project] [path]` — Launch a Claude session for a project
|
|
13
|
+
- `hyper hq relaunch <session|project>` — Relaunch a session with --continue
|
|
13
14
|
- `hyper hq status` — Show running sessions
|
|
14
15
|
- `hyper hq list` — List available projects
|
|
15
16
|
- `hyper hq attach` — Attach to a tmux session
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BaseCommand } from "#lib/base-command";
|
|
2
|
+
export default class Launch extends BaseCommand<typeof Launch> {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
project: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
path: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
"session-name": import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
9
|
+
};
|
|
10
|
+
static strict: boolean;
|
|
11
|
+
static flags: {
|
|
12
|
+
"permission-mode": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
yolo: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
telegram: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=launch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/launch.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgBhD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW,CAAC,OAAO,MAAM,CAAC;IAC7D,OAAgB,WAAW,SAA2C;IAEtE,OAAgB,QAAQ,WAMtB;IAEF,OAAgB,IAAI;;;;MAalB;IAEF,OAAgB,MAAM,UAAS;IAE/B,OAAgB,KAAK;;;;;MAenB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuH1B"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { basename, resolve } from "node:path";
|
|
3
|
+
import * as p from "@clack/prompts";
|
|
4
|
+
import { Args, Flags } from "@oclif/core";
|
|
5
|
+
import { loadConfig } from "#config/index";
|
|
6
|
+
import { BaseCommand } from "#lib/base-command";
|
|
7
|
+
import { buildClaudeCommand } from "#services/claude";
|
|
8
|
+
import { listProjects, resolveProjectDir } from "#services/projects";
|
|
9
|
+
import { recordLaunch } from "#services/sessions";
|
|
10
|
+
import { TELEGRAM_CHANNEL_PLUGIN, getProjectTelegramEnv } from "#services/telegram";
|
|
11
|
+
import * as tmux from "#services/tmux";
|
|
12
|
+
import { sanitizeSessionName } from "#services/tmux";
|
|
13
|
+
import { log } from "#utils/log";
|
|
14
|
+
import { LOG_DIR } from "#utils/paths";
|
|
15
|
+
function formatTimestamp() {
|
|
16
|
+
const now = new Date();
|
|
17
|
+
const pad = (n) => n.toString().padStart(2, "0");
|
|
18
|
+
return `${pad(now.getMonth() + 1)}-${pad(now.getDate())}-${pad(now.getHours())}-${pad(now.getMinutes())}`;
|
|
19
|
+
}
|
|
20
|
+
export default class Launch extends BaseCommand {
|
|
21
|
+
static description = "Launch a Claude session for a project";
|
|
22
|
+
static examples = [
|
|
23
|
+
"<%= config.bin %> hq launch my-project",
|
|
24
|
+
"<%= config.bin %> hq launch my-project src/frontend",
|
|
25
|
+
"<%= config.bin %> hq launch my-project src/frontend my-session",
|
|
26
|
+
"<%= config.bin %> hq launch my-project --yolo",
|
|
27
|
+
"<%= config.bin %> hq launch",
|
|
28
|
+
];
|
|
29
|
+
static args = {
|
|
30
|
+
project: Args.string({
|
|
31
|
+
description: "Project name (under projects root) or absolute path",
|
|
32
|
+
required: false,
|
|
33
|
+
}),
|
|
34
|
+
path: Args.string({
|
|
35
|
+
description: "Relative path inside the project to use as working directory",
|
|
36
|
+
required: false,
|
|
37
|
+
}),
|
|
38
|
+
"session-name": Args.string({
|
|
39
|
+
description: "Custom session name (default: hq-<project>-MM-DD-HH-mm)",
|
|
40
|
+
required: false,
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
static strict = false;
|
|
44
|
+
static flags = {
|
|
45
|
+
...BaseCommand.baseFlags,
|
|
46
|
+
"permission-mode": Flags.string({
|
|
47
|
+
description: "Permission mode",
|
|
48
|
+
options: ["default", "acceptEdits", "plan", "bypassPermissions", "auto"],
|
|
49
|
+
}),
|
|
50
|
+
yolo: Flags.boolean({
|
|
51
|
+
description: "Skip all permission checks (sets --permission-mode bypassPermissions)",
|
|
52
|
+
default: false,
|
|
53
|
+
}),
|
|
54
|
+
telegram: Flags.boolean({
|
|
55
|
+
description: "Enable Telegram channel (enabled by default when configured)",
|
|
56
|
+
default: true,
|
|
57
|
+
allowNo: true,
|
|
58
|
+
}),
|
|
59
|
+
};
|
|
60
|
+
async run() {
|
|
61
|
+
const { args, flags, argv } = await this.parse(Launch);
|
|
62
|
+
const extraClaudeArgs = argv;
|
|
63
|
+
const config = loadConfig();
|
|
64
|
+
let projectArg = args.project;
|
|
65
|
+
// Interactive project selection if not provided
|
|
66
|
+
if (!projectArg) {
|
|
67
|
+
const projects = listProjects(config);
|
|
68
|
+
if (projects.length === 0) {
|
|
69
|
+
this.error(`No projects found in ${config.projects_root}`);
|
|
70
|
+
}
|
|
71
|
+
const selected = await p.select({
|
|
72
|
+
message: "Select a project",
|
|
73
|
+
options: projects.map((proj) => ({
|
|
74
|
+
value: proj.name,
|
|
75
|
+
label: proj.name,
|
|
76
|
+
hint: proj.path,
|
|
77
|
+
})),
|
|
78
|
+
maxItems: 15,
|
|
79
|
+
});
|
|
80
|
+
if (p.isCancel(selected)) {
|
|
81
|
+
this.error("Cancelled");
|
|
82
|
+
}
|
|
83
|
+
projectArg = selected;
|
|
84
|
+
}
|
|
85
|
+
const permissionMode = flags.yolo
|
|
86
|
+
? "bypassPermissions"
|
|
87
|
+
: (flags["permission-mode"] ?? config.claude.permission_mode);
|
|
88
|
+
const projectDir = resolveProjectDir(projectArg, config);
|
|
89
|
+
const projectName = projectArg.startsWith("/") ? basename(projectArg) : projectArg;
|
|
90
|
+
if (!existsSync(projectDir)) {
|
|
91
|
+
this.error(`Directory not found: ${projectDir}`);
|
|
92
|
+
}
|
|
93
|
+
let workDir = projectDir;
|
|
94
|
+
if (args.path) {
|
|
95
|
+
workDir = resolve(projectDir, args.path);
|
|
96
|
+
if (!existsSync(workDir)) {
|
|
97
|
+
this.error(`Path not found: ${workDir}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const sessionName = sanitizeSessionName(args["session-name"] ?? `hq-${projectName}-${formatTimestamp()}`);
|
|
101
|
+
if (tmux.sessionExists(sessionName)) {
|
|
102
|
+
log(`Session '${sessionName}' is already running. Use 'hyper hq attach ${sessionName}' to connect.`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
106
|
+
const telegramEnv = flags.telegram ? getProjectTelegramEnv(projectName, config) : null;
|
|
107
|
+
const channels = [];
|
|
108
|
+
if (telegramEnv)
|
|
109
|
+
channels.push(TELEGRAM_CHANNEL_PLUGIN);
|
|
110
|
+
const logFile = resolve(LOG_DIR, `${sessionName}.log`);
|
|
111
|
+
const command = buildClaudeCommand({
|
|
112
|
+
name: sessionName,
|
|
113
|
+
resume: false,
|
|
114
|
+
permissionMode,
|
|
115
|
+
telegramBotToken: telegramEnv?.TELEGRAM_BOT_TOKEN,
|
|
116
|
+
channels,
|
|
117
|
+
extraArgs: extraClaudeArgs,
|
|
118
|
+
});
|
|
119
|
+
log(`Launching Claude session for: ${projectName}`);
|
|
120
|
+
log(`Working directory: ${workDir}`);
|
|
121
|
+
tmux.createSession({ name: sessionName, cwd: workDir, command, logFile });
|
|
122
|
+
if (tmux.waitAndVerify(sessionName) === "dead") {
|
|
123
|
+
this.error(`Session '${sessionName}' exited immediately after starting.
|
|
124
|
+
Check the log for details: ${logFile}
|
|
125
|
+
|
|
126
|
+
Common causes:
|
|
127
|
+
- Claude CLI is not authenticated (run: claude auth login)
|
|
128
|
+
- The claude command is not found (check your PATH)
|
|
129
|
+
- Telegram plugin not installed (run: claude plugin install telegram@claude-plugins-official)`);
|
|
130
|
+
}
|
|
131
|
+
tmux.disableRemainOnExit(sessionName);
|
|
132
|
+
// Record in session history
|
|
133
|
+
recordLaunch({
|
|
134
|
+
sessionName,
|
|
135
|
+
project: projectName,
|
|
136
|
+
path: args.path,
|
|
137
|
+
projectDir,
|
|
138
|
+
workDir,
|
|
139
|
+
permissionMode,
|
|
140
|
+
yolo: flags.yolo,
|
|
141
|
+
telegram: flags.telegram,
|
|
142
|
+
launchedAt: new Date().toISOString(),
|
|
143
|
+
status: "running",
|
|
144
|
+
});
|
|
145
|
+
log("");
|
|
146
|
+
log(`Session '${sessionName}' started`);
|
|
147
|
+
log("Connect via:");
|
|
148
|
+
log(` Web: claude.ai/code → find session '${sessionName}'`);
|
|
149
|
+
log(` Terminal: hyper hq attach ${sessionName}`);
|
|
150
|
+
if (telegramEnv) {
|
|
151
|
+
log(` Telegram: Message the ${projectName} bot`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=launch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/commands/hq/launch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseCommand } from "#lib/base-command";
|
|
2
|
+
export default class Relaunch extends BaseCommand<typeof Relaunch> {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
target: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
path: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static strict: boolean;
|
|
10
|
+
static flags: {
|
|
11
|
+
"permission-mode": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
yolo: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
telegram: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=relaunch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relaunch.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/relaunch.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAehD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW,CAAC,OAAO,QAAQ,CAAC;IACjE,OAAgB,WAAW,SAAiD;IAE5E,OAAgB,QAAQ,WAKtB;IAEF,OAAgB,IAAI;;;MASlB;IAEF,OAAgB,MAAM,UAAS;IAE/B,OAAgB,KAAK;;;;;MAenB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyF1B"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { Args, Flags } from "@oclif/core";
|
|
4
|
+
import { loadConfig } from "#config/index";
|
|
5
|
+
import { BaseCommand } from "#lib/base-command";
|
|
6
|
+
import { buildClaudeCommand } from "#services/claude";
|
|
7
|
+
import { findLatestSession, findSession, recordLaunch, recordStop } from "#services/sessions";
|
|
8
|
+
import { TELEGRAM_CHANNEL_PLUGIN, getProjectTelegramEnv } from "#services/telegram";
|
|
9
|
+
import * as tmux from "#services/tmux";
|
|
10
|
+
import { sanitizeSessionName } from "#services/tmux";
|
|
11
|
+
import { log } from "#utils/log";
|
|
12
|
+
import { LOG_DIR } from "#utils/paths";
|
|
13
|
+
function formatTimestamp() {
|
|
14
|
+
const now = new Date();
|
|
15
|
+
const pad = (n) => n.toString().padStart(2, "0");
|
|
16
|
+
return `${pad(now.getMonth() + 1)}-${pad(now.getDate())}-${pad(now.getHours())}-${pad(now.getMinutes())}`;
|
|
17
|
+
}
|
|
18
|
+
export default class Relaunch extends BaseCommand {
|
|
19
|
+
static description = "Stop and relaunch a session with --continue";
|
|
20
|
+
static examples = [
|
|
21
|
+
"<%= config.bin %> hq relaunch hq-my-project-03-24-10-30",
|
|
22
|
+
"<%= config.bin %> hq relaunch my-project",
|
|
23
|
+
"<%= config.bin %> hq relaunch my-project src/frontend",
|
|
24
|
+
"<%= config.bin %> hq relaunch hq-my-project-03-24-10-30 --yolo",
|
|
25
|
+
];
|
|
26
|
+
static args = {
|
|
27
|
+
target: Args.string({
|
|
28
|
+
description: "Session name, or project name",
|
|
29
|
+
required: true,
|
|
30
|
+
}),
|
|
31
|
+
path: Args.string({
|
|
32
|
+
description: "Relative path inside the project (when target is a project name)",
|
|
33
|
+
required: false,
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
static strict = false;
|
|
37
|
+
static flags = {
|
|
38
|
+
...BaseCommand.baseFlags,
|
|
39
|
+
"permission-mode": Flags.string({
|
|
40
|
+
description: "Permission mode",
|
|
41
|
+
options: ["default", "acceptEdits", "plan", "bypassPermissions", "auto"],
|
|
42
|
+
}),
|
|
43
|
+
yolo: Flags.boolean({
|
|
44
|
+
description: "Skip all permission checks (sets --permission-mode bypassPermissions)",
|
|
45
|
+
default: false,
|
|
46
|
+
}),
|
|
47
|
+
telegram: Flags.boolean({
|
|
48
|
+
description: "Enable Telegram channel (enabled by default when configured)",
|
|
49
|
+
default: true,
|
|
50
|
+
allowNo: true,
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
async run() {
|
|
54
|
+
const { args, flags, argv } = await this.parse(Relaunch);
|
|
55
|
+
const extraClaudeArgs = argv;
|
|
56
|
+
const config = loadConfig();
|
|
57
|
+
// Try to find the session — first by exact session name, then by project+path
|
|
58
|
+
let session = findSession(args.target);
|
|
59
|
+
if (!session) {
|
|
60
|
+
session = findLatestSession(args.target, args.path);
|
|
61
|
+
}
|
|
62
|
+
if (!session) {
|
|
63
|
+
this.error(`No session found for '${args.target}'${args.path ? ` with path '${args.path}'` : ""}. Run 'hyper hq status' to see active sessions.`);
|
|
64
|
+
}
|
|
65
|
+
const { project, projectDir, workDir, sessionName: oldSessionName } = session;
|
|
66
|
+
// Stop the old session if it's still running
|
|
67
|
+
if (tmux.sessionExists(oldSessionName)) {
|
|
68
|
+
log(`Stopping session '${oldSessionName}'...`);
|
|
69
|
+
tmux.killSession(oldSessionName);
|
|
70
|
+
}
|
|
71
|
+
recordStop(oldSessionName);
|
|
72
|
+
// Build new session
|
|
73
|
+
const permissionMode = flags.yolo
|
|
74
|
+
? "bypassPermissions"
|
|
75
|
+
: (flags["permission-mode"] ?? config.claude.permission_mode);
|
|
76
|
+
const newSessionName = sanitizeSessionName(`hq-${project}-${formatTimestamp()}`);
|
|
77
|
+
if (!existsSync(workDir)) {
|
|
78
|
+
this.error(`Working directory no longer exists: ${workDir}`);
|
|
79
|
+
}
|
|
80
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
81
|
+
const telegramEnv = flags.telegram ? getProjectTelegramEnv(project, config) : null;
|
|
82
|
+
const channels = [];
|
|
83
|
+
if (telegramEnv)
|
|
84
|
+
channels.push(TELEGRAM_CHANNEL_PLUGIN);
|
|
85
|
+
const logFile = resolve(LOG_DIR, `${newSessionName}.log`);
|
|
86
|
+
const command = buildClaudeCommand({
|
|
87
|
+
name: newSessionName,
|
|
88
|
+
resume: true, // Always --continue for relaunch
|
|
89
|
+
permissionMode,
|
|
90
|
+
telegramBotToken: telegramEnv?.TELEGRAM_BOT_TOKEN,
|
|
91
|
+
channels,
|
|
92
|
+
extraArgs: extraClaudeArgs,
|
|
93
|
+
});
|
|
94
|
+
log(`Relaunching session for: ${project}`);
|
|
95
|
+
log(`Working directory: ${workDir}`);
|
|
96
|
+
tmux.createSession({ name: newSessionName, cwd: workDir, command, logFile });
|
|
97
|
+
if (tmux.waitAndVerify(newSessionName) === "dead") {
|
|
98
|
+
this.error(`Session '${newSessionName}' exited immediately after starting.
|
|
99
|
+
Check the log for details: ${logFile}`);
|
|
100
|
+
}
|
|
101
|
+
tmux.disableRemainOnExit(newSessionName);
|
|
102
|
+
recordLaunch({
|
|
103
|
+
sessionName: newSessionName,
|
|
104
|
+
project,
|
|
105
|
+
path: session.path,
|
|
106
|
+
projectDir,
|
|
107
|
+
workDir,
|
|
108
|
+
permissionMode,
|
|
109
|
+
yolo: flags.yolo,
|
|
110
|
+
telegram: flags.telegram,
|
|
111
|
+
launchedAt: new Date().toISOString(),
|
|
112
|
+
status: "running",
|
|
113
|
+
});
|
|
114
|
+
log("");
|
|
115
|
+
log(`Session '${newSessionName}' started (continuing from '${oldSessionName}')`);
|
|
116
|
+
log("Connect via:");
|
|
117
|
+
log(` Web: claude.ai/code → find session '${newSessionName}'`);
|
|
118
|
+
log(` Terminal: hyper hq attach ${newSessionName}`);
|
|
119
|
+
if (telegramEnv) {
|
|
120
|
+
log(` Telegram: Message the ${project} bot`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=relaunch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relaunch.js","sourceRoot":"","sources":["../../../src/commands/hq/relaunch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/start.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAmChD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,WAAW,CAAC,OAAO,KAAK,CAAC;IAC3D,OAAgB,WAAW,SAAiE;IAE5F,OAAgB,QAAQ,WAMtB;IAGF,OAAgB,MAAM,UAAS;IAE/B,OAAgB,KAAK;;;;;;;MAqBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAmI1B"}
|
|
@@ -4,13 +4,13 @@ import { homedir } from "node:os";
|
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
import * as p from "@clack/prompts";
|
|
6
6
|
import { Flags } from "@oclif/core";
|
|
7
|
-
import { generateHqClaudeMd, generateHqConfigSkill, } from "create-hyper-hq/setup/claude-md";
|
|
7
|
+
import { generateHqClaudeMd, generateHqConfigSkill, generateRenameSessionsSkill, } from "create-hyper-hq/setup/claude-md";
|
|
8
8
|
import { isWorkspaceTrusted, trustWorkspace } from "create-hyper-hq/setup/trust";
|
|
9
9
|
import { runConfigWizard } from "create-hyper-hq/setup/wizard";
|
|
10
10
|
import { configExists, loadConfig } from "#config/index";
|
|
11
11
|
import { BaseCommand } from "#lib/base-command";
|
|
12
12
|
import { buildClaudeCommand } from "#services/claude";
|
|
13
|
-
import {
|
|
13
|
+
import { TELEGRAM_CHANNEL_PLUGIN, getHqTelegramEnv } from "#services/telegram";
|
|
14
14
|
import * as tmux from "#services/tmux";
|
|
15
15
|
import { renderBanner } from "#utils/banner";
|
|
16
16
|
import { log } from "#utils/log";
|
|
@@ -66,7 +66,7 @@ export default class Start extends BaseCommand {
|
|
|
66
66
|
}),
|
|
67
67
|
"permission-mode": Flags.string({
|
|
68
68
|
description: "Permission mode for the Claude session",
|
|
69
|
-
options: ["default", "acceptEdits", "plan", "auto"],
|
|
69
|
+
options: ["default", "acceptEdits", "plan", "bypassPermissions", "auto"],
|
|
70
70
|
default: undefined,
|
|
71
71
|
}),
|
|
72
72
|
telegram: Flags.boolean({
|
|
@@ -80,11 +80,9 @@ export default class Start extends BaseCommand {
|
|
|
80
80
|
const extraClaudeArgs = argv;
|
|
81
81
|
const config = await ensureConfig();
|
|
82
82
|
const sessionName = flags.name ?? config.hq.name;
|
|
83
|
-
const permissionMode = flags
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
extraClaudeArgs.push("--dangerously-skip-permissions");
|
|
87
|
-
}
|
|
83
|
+
const permissionMode = flags.yolo
|
|
84
|
+
? "bypassPermissions"
|
|
85
|
+
: (flags["permission-mode"] ?? config.claude.permission_mode);
|
|
88
86
|
// Suggest global install if not on PATH
|
|
89
87
|
if (!isHyperOnPath()) {
|
|
90
88
|
p.log.warning("Hyper CLI is not installed globally. The HQ session won't be able to run hyper commands.\n" +
|
|
@@ -110,6 +108,10 @@ export default class Start extends BaseCommand {
|
|
|
110
108
|
const skillDir = resolve(hqDir, ".claude", "skills", "hq-config");
|
|
111
109
|
mkdirSync(skillDir, { recursive: true });
|
|
112
110
|
writeFileSync(resolve(skillDir, "SKILL.md"), generateHqConfigSkill(), "utf-8");
|
|
111
|
+
// Generate /hq:rename-sessions skill
|
|
112
|
+
const renameSkillDir = resolve(hqDir, ".claude", "skills", "hq-rename-sessions");
|
|
113
|
+
mkdirSync(renameSkillDir, { recursive: true });
|
|
114
|
+
writeFileSync(resolve(renameSkillDir, "SKILL.md"), generateRenameSessionsSkill(), "utf-8");
|
|
113
115
|
// Ensure workspace trust for both HQ dir and projects root
|
|
114
116
|
for (const dir of [hqDir, config.projects_root]) {
|
|
115
117
|
if (!isWorkspaceTrusted(dir)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/hq/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/hq/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-all.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/stop-all.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"stop-all.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/stop-all.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKhD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAAW,CAAC,OAAO,OAAO,CAAC;IAC/D,OAAgB,WAAW,SAAkC;IAE7D,OAAgB,QAAQ,WAAqC;IAEvD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAe1B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseCommand } from "#lib/base-command";
|
|
2
|
+
import { recordStop } from "#services/sessions";
|
|
2
3
|
import * as tmux from "#services/tmux";
|
|
3
4
|
import { log } from "#utils/log";
|
|
4
5
|
export default class StopAll extends BaseCommand {
|
|
@@ -13,6 +14,7 @@ export default class StopAll extends BaseCommand {
|
|
|
13
14
|
}
|
|
14
15
|
for (const session of sessions) {
|
|
15
16
|
tmux.killSession(session.name);
|
|
17
|
+
recordStop(session.name);
|
|
16
18
|
log(`Stopped: ${session.name}`);
|
|
17
19
|
}
|
|
18
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-all.js","sourceRoot":"","sources":["../../../src/commands/hq/stop-all.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAA2B;IAC/D,MAAM,CAAU,WAAW,GAAG,8BAA8B,CAAC;IAE7D,MAAM,CAAU,QAAQ,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7D,KAAK,CAAC,GAAG;QACR,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACnC,OAAO;QACR,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;IACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"stop-all.js","sourceRoot":"","sources":["../../../src/commands/hq/stop-all.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAA2B;IAC/D,MAAM,CAAU,WAAW,GAAG,8BAA8B,CAAC;IAE7D,MAAM,CAAU,QAAQ,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7D,KAAK,CAAC,GAAG;QACR,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACnC,OAAO;QACR,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;IACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/stop.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/stop.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKhD,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW,CAAC,OAAO,IAAI,CAAC;IACzD,OAAgB,WAAW,SAAwB;IAEnD,OAAgB,QAAQ,WAAyE;IAEjG,OAAgB,IAAI;;MAKlB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB1B"}
|
package/dist/commands/hq/stop.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Args } from "@oclif/core";
|
|
2
2
|
import { configExists, loadConfig } from "#config/index";
|
|
3
3
|
import { BaseCommand } from "#lib/base-command";
|
|
4
|
+
import { recordStop } from "#services/sessions";
|
|
4
5
|
import * as tmux from "#services/tmux";
|
|
5
6
|
import { log } from "#utils/log";
|
|
6
7
|
export default class Stop extends BaseCommand {
|
|
@@ -22,6 +23,7 @@ export default class Stop extends BaseCommand {
|
|
|
22
23
|
target = `hq-${target}`;
|
|
23
24
|
}
|
|
24
25
|
if (tmux.killSession(target)) {
|
|
26
|
+
recordStop(target);
|
|
25
27
|
log(`Stopped session: ${target}`);
|
|
26
28
|
}
|
|
27
29
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/commands/hq/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAwB;IACzD,MAAM,CAAU,WAAW,GAAG,oBAAoB,CAAC;IAEnD,MAAM,CAAU,QAAQ,GAAG,CAAC,2BAA2B,EAAE,sCAAsC,CAAC,CAAC;IAEjG,MAAM,CAAU,IAAI,GAAG;QACtB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,gEAAgE;YAC7E,QAAQ,EAAE,KAAK;SACf,CAAC;KACF,CAAC;IAEF,KAAK,CAAC,GAAG;QACR,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7D,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACpE,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,YAAY,MAAM,aAAa,CAAC,CAAC;QAC7C,CAAC;IACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/commands/hq/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAwB;IACzD,MAAM,CAAU,WAAW,GAAG,oBAAoB,CAAC;IAEnD,MAAM,CAAU,QAAQ,GAAG,CAAC,2BAA2B,EAAE,sCAAsC,CAAC,CAAC;IAEjG,MAAM,CAAU,IAAI,GAAG;QACtB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,gEAAgE;YAC7E,QAAQ,EAAE,KAAK;SACf,CAAC;KACF,CAAC;IAEF,KAAK,CAAC,GAAG;QACR,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7D,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACpE,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,MAAM,CAAC,CAAC;YACnB,GAAG,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,YAAY,MAAM,aAAa,CAAC,CAAC;QAC7C,CAAC;IACF,CAAC"}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export interface HqSessionConfig {
|
|
|
5
5
|
capacity: number;
|
|
6
6
|
}
|
|
7
7
|
export interface ClaudeConfig {
|
|
8
|
-
permission_mode?: "default" | "acceptEdits" | "plan" | "auto";
|
|
8
|
+
permission_mode?: "default" | "acceptEdits" | "plan" | "bypassPermissions" | "auto";
|
|
9
9
|
}
|
|
10
10
|
export interface TelegramConfig {
|
|
11
11
|
hq_bot_token?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,eAAe,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,eAAe,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM,CAAC;CACpF;AAED,MAAM,WAAW,cAAc;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,EAAE,EAAE,eAAe,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC1C;AAED,eAAO,MAAM,cAAc,EAAE,QAe5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAQD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAQD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAuClE"}
|
package/dist/services/claude.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAWA,wEAAwE;AACxE,SAAS,WAAW,CAAC,KAAa;IACjC,8DAA8D;IAC9D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,+EAA+E;IAC/E,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAE7C,qCAAqC;IACrC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,uBAAuB,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,qBAAqB,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IAED,qCAAqC;IACrC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAWA,wEAAwE;AACxE,SAAS,WAAW,CAAC,KAAa;IACjC,8DAA8D;IAC9D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,+EAA+E;IAC/E,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAE7C,qCAAqC;IACrC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,uBAAuB,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErB,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,qBAAqB,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IAED,qCAAqC;IACrC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface SessionRecord {
|
|
2
|
+
sessionName: string;
|
|
3
|
+
project: string;
|
|
4
|
+
path?: string;
|
|
5
|
+
projectDir: string;
|
|
6
|
+
workDir: string;
|
|
7
|
+
permissionMode?: string;
|
|
8
|
+
yolo: boolean;
|
|
9
|
+
telegram: boolean;
|
|
10
|
+
launchedAt: string;
|
|
11
|
+
status: "running" | "stopped";
|
|
12
|
+
stoppedAt?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function loadSessions(): SessionRecord[];
|
|
15
|
+
export declare function recordLaunch(record: SessionRecord): void;
|
|
16
|
+
export declare function recordStop(sessionName: string): void;
|
|
17
|
+
export declare function findSession(sessionName: string): SessionRecord | undefined;
|
|
18
|
+
export declare function findLatestSession(project: string, path?: string): SessionRecord | undefined;
|
|
19
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/services/sessions.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAO9C;AAQD,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAWxD;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CASpD;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAG1E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAK3F"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { SESSIONS_FILE } from "#utils/paths";
|
|
4
|
+
export function loadSessions() {
|
|
5
|
+
if (!existsSync(SESSIONS_FILE))
|
|
6
|
+
return [];
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(readFileSync(SESSIONS_FILE, "utf-8"));
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function saveSessions(sessions) {
|
|
15
|
+
const dir = dirname(SESSIONS_FILE);
|
|
16
|
+
mkdirSync(dir, { recursive: true });
|
|
17
|
+
writeFileSync(SESSIONS_FILE, JSON.stringify(sessions, null, 2), "utf-8");
|
|
18
|
+
}
|
|
19
|
+
export function recordLaunch(record) {
|
|
20
|
+
const sessions = loadSessions();
|
|
21
|
+
// Mark any previous session with same name as stopped
|
|
22
|
+
for (const s of sessions) {
|
|
23
|
+
if (s.sessionName === record.sessionName && s.status === "running") {
|
|
24
|
+
s.status = "stopped";
|
|
25
|
+
s.stoppedAt = new Date().toISOString();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
sessions.push(record);
|
|
29
|
+
saveSessions(sessions);
|
|
30
|
+
}
|
|
31
|
+
export function recordStop(sessionName) {
|
|
32
|
+
const sessions = loadSessions();
|
|
33
|
+
for (const s of sessions) {
|
|
34
|
+
if (s.sessionName === sessionName && s.status === "running") {
|
|
35
|
+
s.status = "stopped";
|
|
36
|
+
s.stoppedAt = new Date().toISOString();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
saveSessions(sessions);
|
|
40
|
+
}
|
|
41
|
+
export function findSession(sessionName) {
|
|
42
|
+
const sessions = loadSessions();
|
|
43
|
+
return [...sessions].reverse().find((s) => s.sessionName === sessionName);
|
|
44
|
+
}
|
|
45
|
+
export function findLatestSession(project, path) {
|
|
46
|
+
const sessions = loadSessions();
|
|
47
|
+
return [...sessions]
|
|
48
|
+
.reverse()
|
|
49
|
+
.find((s) => s.project === project && (path === undefined || s.path === path));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/services/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgB7C,MAAM,UAAU,YAAY;IAC3B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,QAAyB;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACnC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAqB;IACjD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,sDAAsD;IACtD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACpE,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxC,CAAC;IACF,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,YAAY,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7D,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxC,CAAC;IACF,CAAC;IACD,YAAY,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC9C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAa;IAC/D,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,CAAC,GAAG,QAAQ,CAAC;SAClB,OAAO,EAAE;SACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;AACjF,CAAC"}
|
package/dist/utils/banner.js
CHANGED
|
@@ -43,7 +43,7 @@ export function renderBanner(opts) {
|
|
|
43
43
|
const commands = keyValue([
|
|
44
44
|
{ key: "hyper hq web", value: "Open HQ in claude.ai/code" },
|
|
45
45
|
{ key: "hyper hq list", value: "List projects" },
|
|
46
|
-
{ key: "hyper hq
|
|
46
|
+
{ key: "hyper hq launch <project>", value: "Launch project session" },
|
|
47
47
|
{ key: "hyper hq status", value: "Show running sessions" },
|
|
48
48
|
{ key: "hyper hq attach", value: "Attach to HQ terminal" },
|
|
49
49
|
{ key: "hyper hq config", value: "Show configuration" },
|
package/dist/utils/banner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,SAAS,OAAO,CAAC,IAAY;IAC5B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IAChE,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACxC,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,yGAAyG;QACzG,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChF,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAI5B;IACA,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAE9C,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACJ,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACR,YAAY,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9F,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,SAAS,IAAI,oBAAoB,WAAW,EAAE,CAAC;IAEpE,MAAM,IAAI,GAAG,QAAQ,CAAC;QACrB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE;QAC9C,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,YAAY,SAAS,EAAE;QACtF,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE;QAC1C,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACtB,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;QACtC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE;KACvC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,QAAQ,CACxB;QACC,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,2BAA2B,EAAE;QAC3D,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;QAChD,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/paths.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,OAAO,QAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,OAAO,QAA+B,CAAC;AACpD,eAAO,MAAM,MAAM,QAA6B,CAAC;AACjD,eAAO,MAAM,aAAa,QAAmC,CAAC;AAE9D,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG5C"}
|
package/dist/utils/paths.js
CHANGED
|
@@ -2,6 +2,8 @@ import { homedir } from "node:os";
|
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
export const HQ_DATA_DIR = resolve(homedir(), ".config/hyper");
|
|
4
4
|
export const LOG_DIR = resolve(HQ_DATA_DIR, "logs");
|
|
5
|
+
export const HQ_DIR = resolve(HQ_DATA_DIR, "hq");
|
|
6
|
+
export const SESSIONS_FILE = resolve(HQ_DIR, "sessions.json");
|
|
5
7
|
export function expandHome(p) {
|
|
6
8
|
if (p.startsWith("~/"))
|
|
7
9
|
return resolve(homedir(), p.slice(2));
|
package/dist/utils/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAE9D,MAAM,UAAU,UAAU,CAAC,CAAS;IACnC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,CAAC;AACV,CAAC"}
|
package/help/hq.md
CHANGED
|
@@ -15,8 +15,9 @@ Always-on Claude Code command center. Manages persistent Claude sessions via tmu
|
|
|
15
15
|
| `hyper hq stop [session]` | Stop an HQ session |
|
|
16
16
|
| `hyper hq stop-all` | Stop all HQ-managed sessions |
|
|
17
17
|
| `hyper hq attach [session]` | Attach to an HQ tmux session |
|
|
18
|
-
| `hyper hq
|
|
19
|
-
| `hyper hq
|
|
18
|
+
| `hyper hq launch [project] [path]` | Launch a Claude session for a project |
|
|
19
|
+
| `hyper hq relaunch <session\|project>` | Relaunch a session with --continue |
|
|
20
|
+
| `hyper hq list` | List available projects |
|
|
20
21
|
| `hyper hq status` | Show running HQ sessions |
|
|
21
22
|
| `hyper hq config` | Show HQ configuration |
|
|
22
23
|
|
|
@@ -32,8 +33,8 @@ hyper hq start
|
|
|
32
33
|
# 3. Check what projects are available
|
|
33
34
|
hyper hq list
|
|
34
35
|
|
|
35
|
-
# 4.
|
|
36
|
-
hyper hq
|
|
36
|
+
# 4. Launch a Claude session for a project
|
|
37
|
+
hyper hq launch my-project
|
|
37
38
|
|
|
38
39
|
# 5. Check running sessions
|
|
39
40
|
hyper hq status
|
|
@@ -47,6 +48,6 @@ hyper hq stop-all
|
|
|
47
48
|
|
|
48
49
|
## How It Works
|
|
49
50
|
|
|
50
|
-
HQ runs a persistent Claude Code instance in a tmux session in remote-control server mode. Once started, you can connect to it from claude.ai/code, the Claude mobile app, or via Telegram. From there, you can ask HQ to
|
|
51
|
+
HQ runs a persistent Claude Code instance in a tmux session in remote-control server mode. Once started, you can connect to it from claude.ai/code, the Claude mobile app, or via Telegram. From there, you can ask HQ to launch sessions for any of your projects.
|
|
51
52
|
|
|
52
53
|
Run `hyper hq <command> --help` for details on any command.
|
package/oclif.manifest.json
CHANGED
|
@@ -85,14 +85,32 @@
|
|
|
85
85
|
"config.js"
|
|
86
86
|
]
|
|
87
87
|
},
|
|
88
|
-
"hq:
|
|
88
|
+
"hq:launch": {
|
|
89
89
|
"aliases": [],
|
|
90
|
-
"args": {
|
|
91
|
-
|
|
90
|
+
"args": {
|
|
91
|
+
"project": {
|
|
92
|
+
"description": "Project name (under projects root) or absolute path",
|
|
93
|
+
"name": "project",
|
|
94
|
+
"required": false
|
|
95
|
+
},
|
|
96
|
+
"path": {
|
|
97
|
+
"description": "Relative path inside the project to use as working directory",
|
|
98
|
+
"name": "path",
|
|
99
|
+
"required": false
|
|
100
|
+
},
|
|
101
|
+
"session-name": {
|
|
102
|
+
"description": "Custom session name (default: hq-<project>-MM-DD-HH-mm)",
|
|
103
|
+
"name": "session-name",
|
|
104
|
+
"required": false
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"description": "Launch a Claude session for a project",
|
|
92
108
|
"examples": [
|
|
93
|
-
"<%= config.bin %> hq
|
|
94
|
-
"<%= config.bin %> hq
|
|
95
|
-
"<%= config.bin %> hq
|
|
109
|
+
"<%= config.bin %> hq launch my-project",
|
|
110
|
+
"<%= config.bin %> hq launch my-project src/frontend",
|
|
111
|
+
"<%= config.bin %> hq launch my-project src/frontend my-session",
|
|
112
|
+
"<%= config.bin %> hq launch my-project --yolo",
|
|
113
|
+
"<%= config.bin %> hq launch"
|
|
96
114
|
],
|
|
97
115
|
"flags": {
|
|
98
116
|
"debug": {
|
|
@@ -102,42 +120,57 @@
|
|
|
102
120
|
"allowNo": false,
|
|
103
121
|
"type": "boolean"
|
|
104
122
|
},
|
|
105
|
-
"
|
|
106
|
-
"description": "
|
|
107
|
-
"name": "
|
|
123
|
+
"permission-mode": {
|
|
124
|
+
"description": "Permission mode",
|
|
125
|
+
"name": "permission-mode",
|
|
108
126
|
"hasDynamicHelp": false,
|
|
109
127
|
"multiple": false,
|
|
128
|
+
"options": [
|
|
129
|
+
"default",
|
|
130
|
+
"acceptEdits",
|
|
131
|
+
"plan",
|
|
132
|
+
"bypassPermissions",
|
|
133
|
+
"auto"
|
|
134
|
+
],
|
|
110
135
|
"type": "option"
|
|
111
136
|
},
|
|
112
|
-
"
|
|
113
|
-
"description": "
|
|
114
|
-
"name": "
|
|
137
|
+
"yolo": {
|
|
138
|
+
"description": "Skip all permission checks (sets --permission-mode bypassPermissions)",
|
|
139
|
+
"name": "yolo",
|
|
115
140
|
"allowNo": false,
|
|
116
141
|
"type": "boolean"
|
|
142
|
+
},
|
|
143
|
+
"telegram": {
|
|
144
|
+
"description": "Enable Telegram channel (enabled by default when configured)",
|
|
145
|
+
"name": "telegram",
|
|
146
|
+
"allowNo": true,
|
|
147
|
+
"type": "boolean"
|
|
117
148
|
}
|
|
118
149
|
},
|
|
119
150
|
"hasDynamicHelp": false,
|
|
120
151
|
"hiddenAliases": [],
|
|
121
|
-
"id": "hq:
|
|
152
|
+
"id": "hq:launch",
|
|
122
153
|
"pluginAlias": "@hypercli/hq",
|
|
123
154
|
"pluginName": "@hypercli/hq",
|
|
124
155
|
"pluginType": "core",
|
|
125
|
-
"strict":
|
|
156
|
+
"strict": false,
|
|
126
157
|
"enableJsonFlag": false,
|
|
127
158
|
"isESM": true,
|
|
128
159
|
"relativePath": [
|
|
129
160
|
"dist",
|
|
130
161
|
"commands",
|
|
131
162
|
"hq",
|
|
132
|
-
"
|
|
163
|
+
"launch.js"
|
|
133
164
|
]
|
|
134
165
|
},
|
|
135
|
-
"hq:
|
|
166
|
+
"hq:list": {
|
|
136
167
|
"aliases": [],
|
|
137
168
|
"args": {},
|
|
138
|
-
"description": "
|
|
169
|
+
"description": "List available projects and their worktrees",
|
|
139
170
|
"examples": [
|
|
140
|
-
"<%= config.bin %> hq
|
|
171
|
+
"<%= config.bin %> hq list",
|
|
172
|
+
"<%= config.bin %> hq list --json",
|
|
173
|
+
"<%= config.bin %> hq list --root /path/to/projects"
|
|
141
174
|
],
|
|
142
175
|
"flags": {
|
|
143
176
|
"debug": {
|
|
@@ -146,11 +179,24 @@
|
|
|
146
179
|
"name": "debug",
|
|
147
180
|
"allowNo": false,
|
|
148
181
|
"type": "boolean"
|
|
182
|
+
},
|
|
183
|
+
"root": {
|
|
184
|
+
"description": "Override projects root directory",
|
|
185
|
+
"name": "root",
|
|
186
|
+
"hasDynamicHelp": false,
|
|
187
|
+
"multiple": false,
|
|
188
|
+
"type": "option"
|
|
189
|
+
},
|
|
190
|
+
"json": {
|
|
191
|
+
"description": "Output as JSON",
|
|
192
|
+
"name": "json",
|
|
193
|
+
"allowNo": false,
|
|
194
|
+
"type": "boolean"
|
|
149
195
|
}
|
|
150
196
|
},
|
|
151
197
|
"hasDynamicHelp": false,
|
|
152
198
|
"hiddenAliases": [],
|
|
153
|
-
"id": "hq:
|
|
199
|
+
"id": "hq:list",
|
|
154
200
|
"pluginAlias": "@hypercli/hq",
|
|
155
201
|
"pluginName": "@hypercli/hq",
|
|
156
202
|
"pluginType": "core",
|
|
@@ -161,25 +207,29 @@
|
|
|
161
207
|
"dist",
|
|
162
208
|
"commands",
|
|
163
209
|
"hq",
|
|
164
|
-
"
|
|
210
|
+
"list.js"
|
|
165
211
|
]
|
|
166
212
|
},
|
|
167
|
-
"hq:
|
|
213
|
+
"hq:relaunch": {
|
|
168
214
|
"aliases": [],
|
|
169
215
|
"args": {
|
|
170
|
-
"
|
|
171
|
-
"description": "
|
|
172
|
-
"name": "
|
|
216
|
+
"target": {
|
|
217
|
+
"description": "Session name, or project name",
|
|
218
|
+
"name": "target",
|
|
173
219
|
"required": true
|
|
220
|
+
},
|
|
221
|
+
"path": {
|
|
222
|
+
"description": "Relative path inside the project (when target is a project name)",
|
|
223
|
+
"name": "path",
|
|
224
|
+
"required": false
|
|
174
225
|
}
|
|
175
226
|
},
|
|
176
|
-
"description": "
|
|
227
|
+
"description": "Stop and relaunch a session with --continue",
|
|
177
228
|
"examples": [
|
|
178
|
-
"<%= config.bin %> hq
|
|
179
|
-
"<%= config.bin %> hq
|
|
180
|
-
"<%= config.bin %> hq
|
|
181
|
-
"<%= config.bin %> hq
|
|
182
|
-
"<%= config.bin %> hq spawn my-project -- --dangerously-skip-permissions"
|
|
229
|
+
"<%= config.bin %> hq relaunch hq-my-project-03-24-10-30",
|
|
230
|
+
"<%= config.bin %> hq relaunch my-project",
|
|
231
|
+
"<%= config.bin %> hq relaunch my-project src/frontend",
|
|
232
|
+
"<%= config.bin %> hq relaunch hq-my-project-03-24-10-30 --yolo"
|
|
183
233
|
],
|
|
184
234
|
"flags": {
|
|
185
235
|
"debug": {
|
|
@@ -189,20 +239,6 @@
|
|
|
189
239
|
"allowNo": false,
|
|
190
240
|
"type": "boolean"
|
|
191
241
|
},
|
|
192
|
-
"worktree": {
|
|
193
|
-
"description": "Use an existing worktree (branch name)",
|
|
194
|
-
"name": "worktree",
|
|
195
|
-
"hasDynamicHelp": false,
|
|
196
|
-
"multiple": false,
|
|
197
|
-
"type": "option"
|
|
198
|
-
},
|
|
199
|
-
"new-worktree": {
|
|
200
|
-
"description": "Create a new worktree via wt switch -c",
|
|
201
|
-
"name": "new-worktree",
|
|
202
|
-
"hasDynamicHelp": false,
|
|
203
|
-
"multiple": false,
|
|
204
|
-
"type": "option"
|
|
205
|
-
},
|
|
206
242
|
"permission-mode": {
|
|
207
243
|
"description": "Permission mode",
|
|
208
244
|
"name": "permission-mode",
|
|
@@ -212,25 +248,13 @@
|
|
|
212
248
|
"default",
|
|
213
249
|
"acceptEdits",
|
|
214
250
|
"plan",
|
|
251
|
+
"bypassPermissions",
|
|
215
252
|
"auto"
|
|
216
253
|
],
|
|
217
254
|
"type": "option"
|
|
218
255
|
},
|
|
219
|
-
"name": {
|
|
220
|
-
"description": "Custom session name",
|
|
221
|
-
"name": "name",
|
|
222
|
-
"hasDynamicHelp": false,
|
|
223
|
-
"multiple": false,
|
|
224
|
-
"type": "option"
|
|
225
|
-
},
|
|
226
|
-
"resume": {
|
|
227
|
-
"description": "Resume the previous session for this project",
|
|
228
|
-
"name": "resume",
|
|
229
|
-
"allowNo": false,
|
|
230
|
-
"type": "boolean"
|
|
231
|
-
},
|
|
232
256
|
"yolo": {
|
|
233
|
-
"description": "Skip all permission checks (
|
|
257
|
+
"description": "Skip all permission checks (sets --permission-mode bypassPermissions)",
|
|
234
258
|
"name": "yolo",
|
|
235
259
|
"allowNo": false,
|
|
236
260
|
"type": "boolean"
|
|
@@ -244,7 +268,7 @@
|
|
|
244
268
|
},
|
|
245
269
|
"hasDynamicHelp": false,
|
|
246
270
|
"hiddenAliases": [],
|
|
247
|
-
"id": "hq:
|
|
271
|
+
"id": "hq:relaunch",
|
|
248
272
|
"pluginAlias": "@hypercli/hq",
|
|
249
273
|
"pluginName": "@hypercli/hq",
|
|
250
274
|
"pluginType": "core",
|
|
@@ -255,7 +279,39 @@
|
|
|
255
279
|
"dist",
|
|
256
280
|
"commands",
|
|
257
281
|
"hq",
|
|
258
|
-
"
|
|
282
|
+
"relaunch.js"
|
|
283
|
+
]
|
|
284
|
+
},
|
|
285
|
+
"hq:setup": {
|
|
286
|
+
"aliases": [],
|
|
287
|
+
"args": {},
|
|
288
|
+
"description": "Set up HQ — configure settings",
|
|
289
|
+
"examples": [
|
|
290
|
+
"<%= config.bin %> hq setup"
|
|
291
|
+
],
|
|
292
|
+
"flags": {
|
|
293
|
+
"debug": {
|
|
294
|
+
"char": "d",
|
|
295
|
+
"description": "Enable debug output",
|
|
296
|
+
"name": "debug",
|
|
297
|
+
"allowNo": false,
|
|
298
|
+
"type": "boolean"
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
"hasDynamicHelp": false,
|
|
302
|
+
"hiddenAliases": [],
|
|
303
|
+
"id": "hq:setup",
|
|
304
|
+
"pluginAlias": "@hypercli/hq",
|
|
305
|
+
"pluginName": "@hypercli/hq",
|
|
306
|
+
"pluginType": "core",
|
|
307
|
+
"strict": true,
|
|
308
|
+
"enableJsonFlag": false,
|
|
309
|
+
"isESM": true,
|
|
310
|
+
"relativePath": [
|
|
311
|
+
"dist",
|
|
312
|
+
"commands",
|
|
313
|
+
"hq",
|
|
314
|
+
"setup.js"
|
|
259
315
|
]
|
|
260
316
|
},
|
|
261
317
|
"hq:start": {
|
|
@@ -305,6 +361,7 @@
|
|
|
305
361
|
"default",
|
|
306
362
|
"acceptEdits",
|
|
307
363
|
"plan",
|
|
364
|
+
"bypassPermissions",
|
|
308
365
|
"auto"
|
|
309
366
|
],
|
|
310
367
|
"type": "option"
|
|
@@ -508,5 +565,5 @@
|
|
|
508
565
|
]
|
|
509
566
|
}
|
|
510
567
|
},
|
|
511
|
-
"version": "0.
|
|
568
|
+
"version": "0.4.0"
|
|
512
569
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hypercli/hq",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Claude Code session management for HyperDev — always-on control plane",
|
|
6
6
|
"keywords": [
|
|
@@ -74,9 +74,9 @@
|
|
|
74
74
|
},
|
|
75
75
|
"dependencies": {
|
|
76
76
|
"@clack/prompts": "^1.1.0",
|
|
77
|
-
"@hypercli/ui": "^0.
|
|
77
|
+
"@hypercli/ui": "^0.4.0",
|
|
78
78
|
"@oclif/core": "^4",
|
|
79
|
-
"create-hyper-hq": "^0.
|
|
79
|
+
"create-hyper-hq": "^0.4.0",
|
|
80
80
|
"smol-toml": "^1"
|
|
81
81
|
},
|
|
82
82
|
"devDependencies": {
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { BaseCommand } from "#lib/base-command";
|
|
2
|
-
export default class Spawn extends BaseCommand<typeof Spawn> {
|
|
3
|
-
static description: string;
|
|
4
|
-
static examples: string[];
|
|
5
|
-
static args: {
|
|
6
|
-
project: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
-
};
|
|
8
|
-
static strict: boolean;
|
|
9
|
-
static flags: {
|
|
10
|
-
worktree: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
"new-worktree": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
"permission-mode": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
-
name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
-
resume: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
-
yolo: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
-
telegram: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
17
|
-
debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
-
};
|
|
19
|
-
run(): Promise<void>;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=spawn.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/spawn.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,WAAW,CAAC,OAAO,KAAK,CAAC;IAC3D,OAAgB,WAAW,SAA8C;IAEzE,OAAgB,QAAQ,WAMtB;IAEF,OAAgB,IAAI;;MAKlB;IAGF,OAAgB,MAAM,UAAS;IAE/B,OAAgB,KAAK;;;;;;;;;MAsBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsF1B"}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
-
import { basename, resolve } from "node:path";
|
|
3
|
-
import { Args, Flags } from "@oclif/core";
|
|
4
|
-
import { loadConfig } from "#config/index";
|
|
5
|
-
import { BaseCommand } from "#lib/base-command";
|
|
6
|
-
import { buildClaudeCommand } from "#services/claude";
|
|
7
|
-
import { createWorktree, findWorktreePath, resolveProjectDir } from "#services/projects";
|
|
8
|
-
import { getProjectTelegramEnv, TELEGRAM_CHANNEL_PLUGIN } from "#services/telegram";
|
|
9
|
-
import * as tmux from "#services/tmux";
|
|
10
|
-
import { sanitizeSessionName } from "#services/tmux";
|
|
11
|
-
import { log } from "#utils/log";
|
|
12
|
-
import { LOG_DIR } from "#utils/paths";
|
|
13
|
-
export default class Spawn extends BaseCommand {
|
|
14
|
-
static description = "Spawn a new Claude session for a project";
|
|
15
|
-
static examples = [
|
|
16
|
-
"<%= config.bin %> hq spawn my-project",
|
|
17
|
-
"<%= config.bin %> hq spawn my-project --worktree feat-auth",
|
|
18
|
-
"<%= config.bin %> hq spawn my-project --new-worktree feat-login",
|
|
19
|
-
"<%= config.bin %> hq spawn /absolute/path/to/project",
|
|
20
|
-
"<%= config.bin %> hq spawn my-project -- --dangerously-skip-permissions",
|
|
21
|
-
];
|
|
22
|
-
static args = {
|
|
23
|
-
project: Args.string({
|
|
24
|
-
description: "Project name (under projects root) or absolute path",
|
|
25
|
-
required: true,
|
|
26
|
-
}),
|
|
27
|
-
};
|
|
28
|
-
// Allow extra args after -- to pass through to claude
|
|
29
|
-
static strict = false;
|
|
30
|
-
static flags = {
|
|
31
|
-
...BaseCommand.baseFlags,
|
|
32
|
-
worktree: Flags.string({ description: "Use an existing worktree (branch name)" }),
|
|
33
|
-
"new-worktree": Flags.string({ description: "Create a new worktree via wt switch -c" }),
|
|
34
|
-
"permission-mode": Flags.string({
|
|
35
|
-
description: "Permission mode",
|
|
36
|
-
options: ["default", "acceptEdits", "plan", "auto"],
|
|
37
|
-
}),
|
|
38
|
-
name: Flags.string({ description: "Custom session name" }),
|
|
39
|
-
resume: Flags.boolean({
|
|
40
|
-
description: "Resume the previous session for this project",
|
|
41
|
-
default: false,
|
|
42
|
-
}),
|
|
43
|
-
yolo: Flags.boolean({
|
|
44
|
-
description: "Skip all permission checks (alias for -- --dangerously-skip-permissions)",
|
|
45
|
-
default: false,
|
|
46
|
-
}),
|
|
47
|
-
telegram: Flags.boolean({
|
|
48
|
-
description: "Enable Telegram channel (enabled by default when configured)",
|
|
49
|
-
default: true,
|
|
50
|
-
allowNo: true,
|
|
51
|
-
}),
|
|
52
|
-
};
|
|
53
|
-
async run() {
|
|
54
|
-
const { args, flags, argv } = await this.parse(Spawn);
|
|
55
|
-
const extraClaudeArgs = argv;
|
|
56
|
-
const config = loadConfig();
|
|
57
|
-
if (flags.yolo) {
|
|
58
|
-
extraClaudeArgs.push("--dangerously-skip-permissions");
|
|
59
|
-
}
|
|
60
|
-
const projectDir = resolveProjectDir(args.project, config);
|
|
61
|
-
const projectName = args.project.startsWith("/") ? basename(args.project) : args.project;
|
|
62
|
-
if (!existsSync(projectDir)) {
|
|
63
|
-
this.error(`Directory not found: ${projectDir}`);
|
|
64
|
-
}
|
|
65
|
-
let workDir = projectDir;
|
|
66
|
-
let branchSuffix = "";
|
|
67
|
-
if (flags["new-worktree"]) {
|
|
68
|
-
log(`Creating worktree: ${flags["new-worktree"]}`);
|
|
69
|
-
workDir = createWorktree(projectDir, flags["new-worktree"]);
|
|
70
|
-
branchSuffix = `-${flags["new-worktree"].replace(/\//g, "-")}`;
|
|
71
|
-
log(`Worktree created at: ${workDir}`);
|
|
72
|
-
}
|
|
73
|
-
else if (flags.worktree) {
|
|
74
|
-
const wtPath = findWorktreePath(projectDir, flags.worktree);
|
|
75
|
-
if (!wtPath) {
|
|
76
|
-
this.error(`Worktree '${flags.worktree}' not found in ${projectDir}`);
|
|
77
|
-
}
|
|
78
|
-
workDir = wtPath;
|
|
79
|
-
branchSuffix = `-${flags.worktree.replace(/\//g, "-")}`;
|
|
80
|
-
}
|
|
81
|
-
const sessionName = sanitizeSessionName(flags.name ?? `hq-${projectName}${branchSuffix}`);
|
|
82
|
-
if (tmux.sessionExists(sessionName)) {
|
|
83
|
-
log(`Session '${sessionName}' is already running. Use 'hyper hq attach ${projectName}' to connect.`);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
mkdirSync(LOG_DIR, { recursive: true });
|
|
87
|
-
const telegramEnv = flags.telegram ? getProjectTelegramEnv(projectName, config) : null;
|
|
88
|
-
const channels = [];
|
|
89
|
-
if (telegramEnv)
|
|
90
|
-
channels.push(TELEGRAM_CHANNEL_PLUGIN);
|
|
91
|
-
const logFile = resolve(LOG_DIR, `${sessionName}.log`);
|
|
92
|
-
const command = buildClaudeCommand({
|
|
93
|
-
name: sessionName,
|
|
94
|
-
resume: flags.resume,
|
|
95
|
-
permissionMode: flags["permission-mode"] ?? config.claude.permission_mode,
|
|
96
|
-
telegramBotToken: telegramEnv?.TELEGRAM_BOT_TOKEN,
|
|
97
|
-
channels,
|
|
98
|
-
extraArgs: extraClaudeArgs,
|
|
99
|
-
});
|
|
100
|
-
log(`Spawning Claude session for: ${projectName}`);
|
|
101
|
-
log(`Working directory: ${workDir}`);
|
|
102
|
-
tmux.createSession({ name: sessionName, cwd: workDir, command, logFile });
|
|
103
|
-
if (tmux.waitAndVerify(sessionName) === "dead") {
|
|
104
|
-
this.error(`Session '${sessionName}' exited immediately after starting.
|
|
105
|
-
Check the log for details: ${logFile}
|
|
106
|
-
|
|
107
|
-
Common causes:
|
|
108
|
-
- Claude CLI is not authenticated (run: claude auth login)
|
|
109
|
-
- The claude command is not found (check your PATH)
|
|
110
|
-
- Telegram plugin not installed (run: claude plugin install telegram@claude-plugins-official)`);
|
|
111
|
-
}
|
|
112
|
-
tmux.disableRemainOnExit(sessionName);
|
|
113
|
-
log("");
|
|
114
|
-
log(`Session '${sessionName}' started`);
|
|
115
|
-
log("Connect via:");
|
|
116
|
-
log(` Web: claude.ai/code → find session '${sessionName}'`);
|
|
117
|
-
log(` Terminal: hyper hq attach ${projectName}`);
|
|
118
|
-
if (telegramEnv) {
|
|
119
|
-
log(` Telegram: Message the ${projectName} bot`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=spawn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/commands/hq/spawn.ts"],"names":[],"mappings":"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"}
|