@hypercli/hq 0.2.3 → 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/attach.d.ts.map +1 -1
- package/dist/commands/hq/attach.js +8 -3
- package/dist/commands/hq/attach.js.map +1 -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 +54 -18
- 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 +9 -3
- package/dist/commands/hq/stop.js.map +1 -1
- package/dist/commands/hq/web.d.ts +7 -0
- package/dist/commands/hq/web.d.ts.map +1 -0
- package/dist/commands/hq/web.js +45 -0
- package/dist/commands/hq/web.js.map +1 -0
- package/dist/config/schema.d.ts +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/setup.d.ts +4 -0
- package/dist/config/setup.d.ts.map +1 -0
- package/dist/config/setup.js +148 -0
- package/dist/config/setup.js.map +1 -0
- package/dist/services/claude.d.ts +16 -8
- package/dist/services/claude.d.ts.map +1 -1
- package/dist/services/claude.js +17 -9
- 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/services/tmux.d.ts +5 -0
- package/dist/services/tmux.d.ts.map +1 -1
- package/dist/services/tmux.js +13 -0
- package/dist/services/tmux.js.map +1 -1
- package/dist/utils/banner.d.ts.map +1 -1
- package/dist/utils/banner.js +2 -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/dist/utils/trust.d.ts +10 -0
- package/dist/utils/trust.d.ts.map +1 -0
- package/dist/utils/trust.js +41 -0
- package/dist/utils/trust.js.map +1 -0
- package/help/hq.md +6 -5
- package/oclif.manifest.json +153 -64
- 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 -124
- package/dist/commands/hq/spawn.js.map +0 -1
package/dist/commands/hq/stop.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Args } from "@oclif/core";
|
|
2
|
+
import { configExists, loadConfig } from "#config/index";
|
|
2
3
|
import { BaseCommand } from "#lib/base-command";
|
|
4
|
+
import { recordStop } from "#services/sessions";
|
|
3
5
|
import * as tmux from "#services/tmux";
|
|
4
6
|
import { log } from "#utils/log";
|
|
5
7
|
export default class Stop extends BaseCommand {
|
|
@@ -7,17 +9,21 @@ export default class Stop extends BaseCommand {
|
|
|
7
9
|
static examples = ["<%= config.bin %> hq stop", "<%= config.bin %> hq stop my-project"];
|
|
8
10
|
static args = {
|
|
9
11
|
session: Args.string({
|
|
10
|
-
description: "Session name or project name (default:
|
|
12
|
+
description: "Session name or project name (default: HQ session from config)",
|
|
11
13
|
required: false,
|
|
12
14
|
}),
|
|
13
15
|
};
|
|
14
16
|
async run() {
|
|
15
17
|
const { args } = await this.parse(Stop);
|
|
16
|
-
let target = args.session
|
|
17
|
-
if (!target
|
|
18
|
+
let target = args.session;
|
|
19
|
+
if (!target) {
|
|
20
|
+
target = configExists() ? loadConfig().hq.name : "Hyper HQ";
|
|
21
|
+
}
|
|
22
|
+
else if (!target.startsWith("hq") && !target.startsWith("Hyper")) {
|
|
18
23
|
target = `hq-${target}`;
|
|
19
24
|
}
|
|
20
25
|
if (tmux.killSession(target)) {
|
|
26
|
+
recordStop(target);
|
|
21
27
|
log(`Stopped session: ${target}`);
|
|
22
28
|
}
|
|
23
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,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,
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/web.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYhD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAW,CAAC,OAAO,GAAG,CAAC;IACvD,OAAgB,WAAW,SACsD;IAEjF,OAAgB,QAAQ,WAAgC;IAElD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiC1B"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { configExists, loadConfig } from "#config/index";
|
|
5
|
+
import { BaseCommand } from "#lib/base-command";
|
|
6
|
+
import * as tmux from "#services/tmux";
|
|
7
|
+
import { LOG_DIR } from "#utils/paths";
|
|
8
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: strip ANSI escape codes from tmux output
|
|
9
|
+
const BRIDGE_URL_RE = /https:\/\/claude\.ai\/code\?bridge=[^\s\x1b]*/g;
|
|
10
|
+
function extractBridgeUrl(text) {
|
|
11
|
+
const matches = text.match(BRIDGE_URL_RE);
|
|
12
|
+
return matches && matches.length > 0 ? matches[matches.length - 1] : null;
|
|
13
|
+
}
|
|
14
|
+
export default class Web extends BaseCommand {
|
|
15
|
+
static description = "Open the HQ session in claude.ai/code (requires /remote-control to be active)";
|
|
16
|
+
static examples = ["<%= config.bin %> hq web"];
|
|
17
|
+
async run() {
|
|
18
|
+
const sessionName = configExists() ? loadConfig().hq.name : "Hyper HQ";
|
|
19
|
+
if (!tmux.sessionExists(sessionName)) {
|
|
20
|
+
this.error(`HQ session '${sessionName}' is not running. Start it first with: hyper hq start`);
|
|
21
|
+
}
|
|
22
|
+
// Try to find the bridge URL from tmux pane content first
|
|
23
|
+
let bridgeUrl = null;
|
|
24
|
+
const paneContent = tmux.capturePane(sessionName);
|
|
25
|
+
if (paneContent) {
|
|
26
|
+
bridgeUrl = extractBridgeUrl(paneContent);
|
|
27
|
+
}
|
|
28
|
+
// Fall back to log file
|
|
29
|
+
if (!bridgeUrl) {
|
|
30
|
+
try {
|
|
31
|
+
const logFile = resolve(LOG_DIR, `${sessionName}.log`);
|
|
32
|
+
const logContent = readFileSync(logFile, "utf-8");
|
|
33
|
+
bridgeUrl = extractBridgeUrl(logContent);
|
|
34
|
+
}
|
|
35
|
+
catch { }
|
|
36
|
+
}
|
|
37
|
+
if (!bridgeUrl) {
|
|
38
|
+
this.error(`No bridge URL found. Make sure /remote-control is active in the HQ session.\n` +
|
|
39
|
+
` Attach to check: hyper hq attach`);
|
|
40
|
+
}
|
|
41
|
+
this.log(`Opening: ${bridgeUrl}`);
|
|
42
|
+
execSync(`open '${bridgeUrl}'`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/commands/hq/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,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,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,oGAAoG;AACpG,MAAM,aAAa,GAAG,gDAAgD,CAAC;AAEvE,SAAS,gBAAgB,CAAC,IAAY;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1C,OAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAuB;IACvD,MAAM,CAAU,WAAW,GAC1B,+EAA+E,CAAC;IAEjF,MAAM,CAAU,QAAQ,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExD,KAAK,CAAC,GAAG;QACR,MAAM,WAAW,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;QAEvE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,eAAe,WAAW,uDAAuD,CAAC,CAAC;QAC/F,CAAC;QAED,0DAA0D;QAC1D,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YACjB,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,WAAW,MAAM,CAAC,CAAC;gBACvD,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAClD,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACX,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CACT,+EAA+E;gBAC9E,oCAAoC,CACrC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;QAClC,QAAQ,CAAC,SAAS,SAAS,GAAG,CAAC,CAAC;IACjC,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/config/setup.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,wBAAsB,QAAQ,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6K/D;AAGD,eAAO,MAAM,gBAAgB,yBAAwB,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { chmodSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import { isWorkspaceTrusted, trustWorkspace } from "../utils/trust.js";
|
|
6
|
+
import { CONFIG_PATH, configExists, loadConfig } from "./index.js";
|
|
7
|
+
function expandHome(path) {
|
|
8
|
+
if (path.startsWith("~/"))
|
|
9
|
+
return resolve(homedir(), path.slice(2));
|
|
10
|
+
return path;
|
|
11
|
+
}
|
|
12
|
+
export async function runSetup(force = false) {
|
|
13
|
+
if (!force && configExists()) {
|
|
14
|
+
return loadConfig();
|
|
15
|
+
}
|
|
16
|
+
p.intro("Welcome to Hyper HQ — Claude Code Command Center");
|
|
17
|
+
p.note("No configuration file found.\n" + "Let's get you set up. This will only take a moment.", "First-time setup");
|
|
18
|
+
// Step 1: Projects root
|
|
19
|
+
const projectsRoot = await p.text({
|
|
20
|
+
message: "Where do your projects live?",
|
|
21
|
+
placeholder: "~/work",
|
|
22
|
+
defaultValue: "~/work",
|
|
23
|
+
validate(value) {
|
|
24
|
+
if (!value?.trim())
|
|
25
|
+
return "Please enter a path";
|
|
26
|
+
return undefined;
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
if (p.isCancel(projectsRoot)) {
|
|
30
|
+
p.cancel("Setup cancelled.");
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
const expandedRoot = expandHome(projectsRoot);
|
|
34
|
+
// Step 2: Ensure directory exists
|
|
35
|
+
if (!existsSync(expandedRoot)) {
|
|
36
|
+
const create = await p.confirm({
|
|
37
|
+
message: `Directory ${expandedRoot} doesn't exist. Create it?`,
|
|
38
|
+
initialValue: true,
|
|
39
|
+
});
|
|
40
|
+
if (p.isCancel(create) || !create) {
|
|
41
|
+
p.cancel("Setup cancelled.");
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
mkdirSync(expandedRoot, { recursive: true });
|
|
45
|
+
p.log.success(`Created ${expandedRoot}`);
|
|
46
|
+
}
|
|
47
|
+
// Step 3: HQ directory
|
|
48
|
+
const hqDir = await p.text({
|
|
49
|
+
message: "Where should the HQ session folder live?",
|
|
50
|
+
placeholder: "./hyper-hq",
|
|
51
|
+
defaultValue: "./hyper-hq",
|
|
52
|
+
validate(value) {
|
|
53
|
+
if (!value?.trim())
|
|
54
|
+
return "Please enter a path";
|
|
55
|
+
return undefined;
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
if (p.isCancel(hqDir)) {
|
|
59
|
+
p.cancel("Setup cancelled.");
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
// Resolve hq dir relative to projects root
|
|
63
|
+
const expandedHqDir = hqDir.startsWith("/") ? hqDir : resolve(expandedRoot, hqDir);
|
|
64
|
+
if (!existsSync(expandedHqDir)) {
|
|
65
|
+
mkdirSync(expandedHqDir, { recursive: true });
|
|
66
|
+
p.log.success(`Created HQ directory: ${expandedHqDir}`);
|
|
67
|
+
}
|
|
68
|
+
// Step 4: Workspace trust — auto-trust both HQ dir and projects root
|
|
69
|
+
for (const dir of [expandedHqDir, expandedRoot]) {
|
|
70
|
+
if (!isWorkspaceTrusted(dir)) {
|
|
71
|
+
trustWorkspace(dir);
|
|
72
|
+
p.log.success(`Trusted ${dir} for Claude Code.`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Step 5: Telegram
|
|
76
|
+
const useTelegram = await p.confirm({
|
|
77
|
+
message: "Do you want to enable Telegram integration?",
|
|
78
|
+
initialValue: false,
|
|
79
|
+
});
|
|
80
|
+
if (p.isCancel(useTelegram)) {
|
|
81
|
+
p.cancel("Setup cancelled.");
|
|
82
|
+
process.exit(0);
|
|
83
|
+
}
|
|
84
|
+
let hqBotToken = "";
|
|
85
|
+
if (useTelegram) {
|
|
86
|
+
p.note("1. Open Telegram and message @BotFather\n" +
|
|
87
|
+
"2. Send /newbot and follow the prompts\n" +
|
|
88
|
+
"3. Copy the token BotFather gives you", "Create a Telegram bot");
|
|
89
|
+
const token = await p.text({
|
|
90
|
+
message: "Paste your Telegram bot token:",
|
|
91
|
+
placeholder: "your-bot-token-from-botfather",
|
|
92
|
+
validate(value) {
|
|
93
|
+
if (!value?.trim())
|
|
94
|
+
return "Please enter a token";
|
|
95
|
+
if (!value?.includes(":"))
|
|
96
|
+
return "That doesn't look like a bot token (should contain a colon)";
|
|
97
|
+
return undefined;
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
if (p.isCancel(token)) {
|
|
101
|
+
p.cancel("Setup cancelled.");
|
|
102
|
+
process.exit(0);
|
|
103
|
+
}
|
|
104
|
+
hqBotToken = token;
|
|
105
|
+
}
|
|
106
|
+
// Build TOML config
|
|
107
|
+
const lines = [
|
|
108
|
+
"# Hyper HQ — Claude Code Command Center",
|
|
109
|
+
"",
|
|
110
|
+
`projects_root = "${projectsRoot}"`,
|
|
111
|
+
"",
|
|
112
|
+
"[hq]",
|
|
113
|
+
'name = "hyper-hq"',
|
|
114
|
+
`dir = "${hqDir}"`,
|
|
115
|
+
'spawn_mode = "same-dir"',
|
|
116
|
+
"capacity = 32",
|
|
117
|
+
"",
|
|
118
|
+
"[claude]",
|
|
119
|
+
'permission_mode = "default"',
|
|
120
|
+
"",
|
|
121
|
+
"[telegram]",
|
|
122
|
+
];
|
|
123
|
+
if (hqBotToken) {
|
|
124
|
+
lines.push(`hq_bot_token = "${hqBotToken}"`);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
lines.push("# Telegram is disabled. To enable later, add:");
|
|
128
|
+
lines.push('# hq_bot_token = "YOUR_BOT_TOKEN"');
|
|
129
|
+
}
|
|
130
|
+
lines.push("", "[telegram.project_bots]", "# Add dedicated bots for specific projects:", '# my-project = "BOT_TOKEN"', "", "# [projects.my-org]", '# type = "group" # Treat subfolders as separate projects', "");
|
|
131
|
+
const configContent = lines.join("\n");
|
|
132
|
+
// Write config
|
|
133
|
+
const configDir = dirname(CONFIG_PATH);
|
|
134
|
+
if (!existsSync(configDir)) {
|
|
135
|
+
mkdirSync(configDir, { recursive: true });
|
|
136
|
+
}
|
|
137
|
+
writeFileSync(CONFIG_PATH, configContent, { encoding: "utf-8", mode: 0o600 });
|
|
138
|
+
chmodSync(CONFIG_PATH, 0o600);
|
|
139
|
+
p.note(CONFIG_PATH, "Config saved to");
|
|
140
|
+
if (!useTelegram) {
|
|
141
|
+
p.log.info("Telegram is disabled. Sessions will use Remote Control only (claude.ai/code + mobile).");
|
|
142
|
+
p.log.info("You can enable Telegram later by adding a bot token to your config file.");
|
|
143
|
+
}
|
|
144
|
+
return loadConfig();
|
|
145
|
+
}
|
|
146
|
+
// Backwards compat — start.ts calls this
|
|
147
|
+
export const runSetupIfNeeded = () => runSetup(false);
|
|
148
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/config/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,19 +7,27 @@ export interface ClaudeCommandOpts {
|
|
|
7
7
|
channels?: string[];
|
|
8
8
|
/** Extra args passed through to `claude` verbatim */
|
|
9
9
|
extraArgs?: string[];
|
|
10
|
-
logFile: string;
|
|
11
10
|
}
|
|
12
11
|
/**
|
|
13
12
|
* Build the command to start an interactive Claude session.
|
|
14
13
|
*
|
|
15
|
-
*
|
|
16
|
-
* -
|
|
17
|
-
* - Remote control works (via /remote-control after launch)
|
|
18
|
-
* - Session resume works (via --resume)
|
|
19
|
-
* - Both channels and remote control coexist in the same session
|
|
14
|
+
* Architecture decision: we use `claude` (interactive mode) instead of
|
|
15
|
+
* `claude remote-control` (subcommand) because:
|
|
20
16
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
17
|
+
* - `claude remote-control` is a standalone server that accepts sessions
|
|
18
|
+
* from claude.ai/code, but it does NOT support --channels for Telegram.
|
|
19
|
+
* - `claude` (interactive) supports --channels AND the /remote-control
|
|
20
|
+
* slash command, giving us BOTH Telegram and web access in one session.
|
|
21
|
+
*
|
|
22
|
+
* Flow:
|
|
23
|
+
* 1. Start `claude --channels plugin:telegram@... --continue`
|
|
24
|
+
* 2. The CLAUDE.md instructs Claude to run `/remote-control <name>`
|
|
25
|
+
* on startup, which enables claude.ai/code access.
|
|
26
|
+
* 3. Result: one session with Telegram channels + web remote control.
|
|
27
|
+
*
|
|
28
|
+
* IMPORTANT: Do NOT pipe stdout (e.g. `| tee`). Claude interactive mode
|
|
29
|
+
* requires a TTY — piping strips it and the process dies immediately.
|
|
30
|
+
* Use tmux `pipe-pane` for logging instead (see tmux.createSession).
|
|
23
31
|
*/
|
|
24
32
|
export declare function buildClaudeCommand(opts: ClaudeCommandOpts): string;
|
|
25
33
|
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -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;
|
|
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
|
@@ -6,14 +6,23 @@ function shellEscape(value) {
|
|
|
6
6
|
/**
|
|
7
7
|
* Build the command to start an interactive Claude session.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
* -
|
|
11
|
-
* - Remote control works (via /remote-control after launch)
|
|
12
|
-
* - Session resume works (via --resume)
|
|
13
|
-
* - Both channels and remote control coexist in the same session
|
|
9
|
+
* Architecture decision: we use `claude` (interactive mode) instead of
|
|
10
|
+
* `claude remote-control` (subcommand) because:
|
|
14
11
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
12
|
+
* - `claude remote-control` is a standalone server that accepts sessions
|
|
13
|
+
* from claude.ai/code, but it does NOT support --channels for Telegram.
|
|
14
|
+
* - `claude` (interactive) supports --channels AND the /remote-control
|
|
15
|
+
* slash command, giving us BOTH Telegram and web access in one session.
|
|
16
|
+
*
|
|
17
|
+
* Flow:
|
|
18
|
+
* 1. Start `claude --channels plugin:telegram@... --continue`
|
|
19
|
+
* 2. The CLAUDE.md instructs Claude to run `/remote-control <name>`
|
|
20
|
+
* on startup, which enables claude.ai/code access.
|
|
21
|
+
* 3. Result: one session with Telegram channels + web remote control.
|
|
22
|
+
*
|
|
23
|
+
* IMPORTANT: Do NOT pipe stdout (e.g. `| tee`). Claude interactive mode
|
|
24
|
+
* requires a TTY — piping strips it and the process dies immediately.
|
|
25
|
+
* Use tmux `pipe-pane` for logging instead (see tmux.createSession).
|
|
17
26
|
*/
|
|
18
27
|
export function buildClaudeCommand(opts) {
|
|
19
28
|
const parts = [];
|
|
@@ -24,6 +33,7 @@ export function buildClaudeCommand(opts) {
|
|
|
24
33
|
parts.push(`TELEGRAM_BOT_TOKEN='${shellEscape(opts.telegramBotToken)}'`);
|
|
25
34
|
}
|
|
26
35
|
parts.push("claude");
|
|
36
|
+
parts.push("--allow-dangerously-skip-permissions");
|
|
27
37
|
if (opts.resume) {
|
|
28
38
|
parts.push("--continue");
|
|
29
39
|
}
|
|
@@ -42,8 +52,6 @@ export function buildClaudeCommand(opts) {
|
|
|
42
52
|
if (opts.extraArgs && opts.extraArgs.length > 0) {
|
|
43
53
|
parts.push(...opts.extraArgs);
|
|
44
54
|
}
|
|
45
|
-
// Pipe to log file
|
|
46
|
-
parts.push(`2>&1 | tee -a '${shellEscape(opts.logFile)}'`);
|
|
47
55
|
return parts.join(" ");
|
|
48
56
|
}
|
|
49
57
|
//# sourceMappingURL=claude.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"
|
|
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/services/tmux.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare function createSession(opts: {
|
|
|
11
11
|
name: string;
|
|
12
12
|
cwd: string;
|
|
13
13
|
command: string;
|
|
14
|
+
logFile?: string;
|
|
14
15
|
}): void;
|
|
15
16
|
/**
|
|
16
17
|
* Wait and verify a session's command is still running.
|
|
@@ -24,4 +25,8 @@ export declare function listSessions(prefix?: string): TmuxSession[];
|
|
|
24
25
|
export declare function listHqSessions(): TmuxSession[];
|
|
25
26
|
export declare function disableRemainOnExit(name: string): void;
|
|
26
27
|
export declare function attachSession(name: string): never;
|
|
28
|
+
/** Capture the full scrollback + visible content of a tmux pane */
|
|
29
|
+
export declare function capturePane(name: string): string | null;
|
|
30
|
+
/** Send keystrokes to a tmux pane (simulates typing + Enter) */
|
|
31
|
+
export declare function sendKeys(name: string, text: string): void;
|
|
27
32
|
//# sourceMappingURL=tmux.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAWD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAWD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAwBP;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,SAAS,GAAG,MAAM,CAkBhF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,YAAY,CAAC,MAAM,SAAU,GAAG,WAAW,EAAE,CAkB5D;AAED,kFAAkF;AAClF,wBAAgB,cAAc,IAAI,WAAW,EAAE,CAqB9C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAGjD;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGvD;AAED,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEzD"}
|
package/dist/services/tmux.js
CHANGED
|
@@ -33,6 +33,10 @@ export function createSession(opts) {
|
|
|
33
33
|
}
|
|
34
34
|
// Keep the pane alive after the command exits so we can detect failures
|
|
35
35
|
run(["set-option", "-t", opts.name, "remain-on-exit", "on"]);
|
|
36
|
+
// Use pipe-pane for logging — this preserves the TTY (unlike shell pipes)
|
|
37
|
+
if (opts.logFile) {
|
|
38
|
+
run(["pipe-pane", "-t", opts.name, "-o", `cat >> '${opts.logFile}'`]);
|
|
39
|
+
}
|
|
36
40
|
}
|
|
37
41
|
/**
|
|
38
42
|
* Wait and verify a session's command is still running.
|
|
@@ -106,4 +110,13 @@ export function attachSession(name) {
|
|
|
106
110
|
execFileSync("tmux", ["attach", "-t", name], { stdio: "inherit" });
|
|
107
111
|
process.exit(0);
|
|
108
112
|
}
|
|
113
|
+
/** Capture the full scrollback + visible content of a tmux pane */
|
|
114
|
+
export function capturePane(name) {
|
|
115
|
+
const result = run(["capture-pane", "-t", name, "-p", "-S", "-"]);
|
|
116
|
+
return result.ok ? result.stdout : null;
|
|
117
|
+
}
|
|
118
|
+
/** Send keystrokes to a tmux pane (simulates typing + Enter) */
|
|
119
|
+
export function sendKeys(name, text) {
|
|
120
|
+
run(["send-keys", "-t", name, text, "Enter"]);
|
|
121
|
+
}
|
|
109
122
|
//# sourceMappingURL=tmux.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAS7D,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,GAAG,CAAC,IAAc;IAC1B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACpC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;KACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,OAAO,GAAG,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAmBpD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAmBpD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAuCT"}
|
package/dist/utils/banner.js
CHANGED
|
@@ -41,8 +41,9 @@ export function renderBanner(opts) {
|
|
|
41
41
|
{ key: "Connect", value: connectValue },
|
|
42
42
|
]);
|
|
43
43
|
const commands = keyValue([
|
|
44
|
+
{ key: "hyper hq web", value: "Open HQ in claude.ai/code" },
|
|
44
45
|
{ key: "hyper hq list", value: "List projects" },
|
|
45
|
-
{ key: "hyper hq
|
|
46
|
+
{ key: "hyper hq launch <project>", value: "Launch project session" },
|
|
46
47
|
{ key: "hyper hq status", value: "Show running sessions" },
|
|
47
48
|
{ key: "hyper hq attach", value: "Attach to HQ terminal" },
|
|
48
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,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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a directory (or any ancestor) is trusted by Claude Code.
|
|
3
|
+
* Trust is stored in ~/.claude.json under projects[path].hasTrustDialogAccepted.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isWorkspaceTrusted(dir: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Trust a directory for Claude Code by setting hasTrustDialogAccepted in ~/.claude.json.
|
|
8
|
+
*/
|
|
9
|
+
export declare function trustWorkspace(dir: string): void;
|
|
10
|
+
//# sourceMappingURL=trust.d.ts.map
|