@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/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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/attach.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../../src/commands/hq/attach.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW,CAAC,OAAO,MAAM,CAAC;IAC7D,OAAgB,WAAW,SAAkC;IAE7D,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,IAAI;;MAKlB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB1B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
2
|
import { Args } from "@oclif/core";
|
|
3
|
+
import { configExists, loadConfig } from "#config/index";
|
|
3
4
|
import { BaseCommand } from "#lib/base-command";
|
|
4
5
|
import * as tmux from "#services/tmux";
|
|
5
6
|
export default class Attach extends BaseCommand {
|
|
@@ -10,14 +11,18 @@ export default class Attach extends BaseCommand {
|
|
|
10
11
|
];
|
|
11
12
|
static args = {
|
|
12
13
|
session: Args.string({
|
|
13
|
-
description: "Session name or project name (default:
|
|
14
|
+
description: "Session name or project name (default: HQ session from config)",
|
|
14
15
|
required: false,
|
|
15
16
|
}),
|
|
16
17
|
};
|
|
17
18
|
async run() {
|
|
18
19
|
const { args } = await this.parse(Attach);
|
|
19
|
-
let target = args.session
|
|
20
|
-
if (!target
|
|
20
|
+
let target = args.session;
|
|
21
|
+
if (!target) {
|
|
22
|
+
// Use the configured HQ session name
|
|
23
|
+
target = configExists() ? loadConfig().hq.name : "Hyper HQ";
|
|
24
|
+
}
|
|
25
|
+
else if (!target.startsWith("hq") && !target.startsWith("Hyper")) {
|
|
21
26
|
target = `hq-${target}`;
|
|
22
27
|
}
|
|
23
28
|
if (!tmux.sessionExists(target)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../../src/commands/hq/attach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAA0B;IAC7D,MAAM,CAAU,WAAW,GAAG,8BAA8B,CAAC;IAE7D,MAAM,CAAU,QAAQ,GAAG;QAC1B,6BAA6B;QAC7B,wCAAwC;KACxC,CAAC;IAEF,MAAM,CAAU,IAAI,GAAG;QACtB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../../../src/commands/hq/attach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,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;AAEvC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAA0B;IAC7D,MAAM,CAAU,WAAW,GAAG,8BAA8B,CAAC;IAE7D,MAAM,CAAU,QAAQ,GAAG;QAC1B,6BAA6B;QAC7B,wCAAwC;KACxC,CAAC;IAEF,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,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,qCAAqC;YACrC,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,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,YAAY,MAAM,4DAA4D,CAAC,CAAC;QAC5F,CAAC;QAED,YAAY,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC"}
|
|
@@ -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"}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
3
4
|
import { resolve } from "node:path";
|
|
4
5
|
import * as p from "@clack/prompts";
|
|
5
6
|
import { Flags } from "@oclif/core";
|
|
6
|
-
import { generateHqClaudeMd } from "create-hyper-hq/setup/claude-md";
|
|
7
|
+
import { generateHqClaudeMd, generateHqConfigSkill, generateRenameSessionsSkill, } from "create-hyper-hq/setup/claude-md";
|
|
7
8
|
import { isWorkspaceTrusted, trustWorkspace } from "create-hyper-hq/setup/trust";
|
|
8
9
|
import { runConfigWizard } from "create-hyper-hq/setup/wizard";
|
|
9
10
|
import { configExists, loadConfig } from "#config/index";
|
|
10
11
|
import { BaseCommand } from "#lib/base-command";
|
|
11
12
|
import { buildClaudeCommand } from "#services/claude";
|
|
12
|
-
import {
|
|
13
|
+
import { TELEGRAM_CHANNEL_PLUGIN, getHqTelegramEnv } from "#services/telegram";
|
|
13
14
|
import * as tmux from "#services/tmux";
|
|
14
15
|
import { renderBanner } from "#utils/banner";
|
|
15
16
|
import { log } from "#utils/log";
|
|
16
17
|
import { LOG_DIR } from "#utils/paths";
|
|
18
|
+
const TELEGRAM_ENV_FILE = resolve(homedir(), ".claude", "channels", "telegram", ".env");
|
|
19
|
+
const TELEGRAM_ACCESS_FILE = resolve(homedir(), ".claude", "channels", "telegram", "access.json");
|
|
17
20
|
function isHyperOnPath() {
|
|
18
21
|
const result = spawnSync("which", ["hyper"], { encoding: "utf-8" });
|
|
19
22
|
return result.status === 0;
|
|
@@ -24,6 +27,21 @@ async function ensureConfig() {
|
|
|
24
27
|
await runConfigWizard();
|
|
25
28
|
return loadConfig();
|
|
26
29
|
}
|
|
30
|
+
function detectTelegramState() {
|
|
31
|
+
if (!existsSync(TELEGRAM_ENV_FILE))
|
|
32
|
+
return "not-configured";
|
|
33
|
+
if (!existsSync(TELEGRAM_ACCESS_FILE))
|
|
34
|
+
return "configured-unpaired";
|
|
35
|
+
try {
|
|
36
|
+
const access = JSON.parse(readFileSync(TELEGRAM_ACCESS_FILE, "utf-8"));
|
|
37
|
+
const hasUsers = (access.allowFrom ?? []).length > 0;
|
|
38
|
+
const hasGroups = Object.keys(access.groups ?? {}).length > 0;
|
|
39
|
+
return hasUsers || hasGroups ? "paired" : "configured-unpaired";
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return "configured-unpaired";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
27
45
|
export default class Start extends BaseCommand {
|
|
28
46
|
static description = "Start the HQ session — always-on Claude Code command center";
|
|
29
47
|
static examples = [
|
|
@@ -43,12 +61,12 @@ export default class Start extends BaseCommand {
|
|
|
43
61
|
default: false,
|
|
44
62
|
}),
|
|
45
63
|
yolo: Flags.boolean({
|
|
46
|
-
description: "Skip
|
|
64
|
+
description: "Skip permission checks — HQ runs autonomously on startup",
|
|
47
65
|
default: false,
|
|
48
66
|
}),
|
|
49
67
|
"permission-mode": Flags.string({
|
|
50
68
|
description: "Permission mode for the Claude session",
|
|
51
|
-
options: ["default", "acceptEdits", "plan", "auto"],
|
|
69
|
+
options: ["default", "acceptEdits", "plan", "bypassPermissions", "auto"],
|
|
52
70
|
default: undefined,
|
|
53
71
|
}),
|
|
54
72
|
telegram: Flags.boolean({
|
|
@@ -62,11 +80,9 @@ export default class Start extends BaseCommand {
|
|
|
62
80
|
const extraClaudeArgs = argv;
|
|
63
81
|
const config = await ensureConfig();
|
|
64
82
|
const sessionName = flags.name ?? config.hq.name;
|
|
65
|
-
const permissionMode = flags
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
extraClaudeArgs.push("--dangerously-skip-permissions");
|
|
69
|
-
}
|
|
83
|
+
const permissionMode = flags.yolo
|
|
84
|
+
? "bypassPermissions"
|
|
85
|
+
: (flags["permission-mode"] ?? config.claude.permission_mode);
|
|
70
86
|
// Suggest global install if not on PATH
|
|
71
87
|
if (!isHyperOnPath()) {
|
|
72
88
|
p.log.warning("Hyper CLI is not installed globally. The HQ session won't be able to run hyper commands.\n" +
|
|
@@ -79,12 +95,23 @@ export default class Start extends BaseCommand {
|
|
|
79
95
|
mkdirSync(hqDir, { recursive: true });
|
|
80
96
|
log(`Created HQ directory: ${hqDir}`);
|
|
81
97
|
}
|
|
82
|
-
//
|
|
98
|
+
// Always regenerate CLAUDE.md — content varies based on flags and detected state
|
|
83
99
|
const claudeMdPath = resolve(hqDir, "CLAUDE.md");
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
100
|
+
const telegramState = detectTelegramState();
|
|
101
|
+
writeFileSync(claudeMdPath, generateHqClaudeMd({
|
|
102
|
+
projectsRoot: config.projects_root,
|
|
103
|
+
sessionName,
|
|
104
|
+
autonomous: flags.yolo,
|
|
105
|
+
telegramState,
|
|
106
|
+
}), "utf-8");
|
|
107
|
+
// Generate /hq:config skill
|
|
108
|
+
const skillDir = resolve(hqDir, ".claude", "skills", "hq-config");
|
|
109
|
+
mkdirSync(skillDir, { recursive: true });
|
|
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");
|
|
88
115
|
// Ensure workspace trust for both HQ dir and projects root
|
|
89
116
|
for (const dir of [hqDir, config.projects_root]) {
|
|
90
117
|
if (!isWorkspaceTrusted(dir)) {
|
|
@@ -93,8 +120,8 @@ export default class Start extends BaseCommand {
|
|
|
93
120
|
}
|
|
94
121
|
}
|
|
95
122
|
if (tmux.sessionExists(sessionName)) {
|
|
96
|
-
log(`Session '${sessionName}' is already running.
|
|
97
|
-
|
|
123
|
+
log(`Session '${sessionName}' is already running. Attaching...`);
|
|
124
|
+
tmux.attachSession(sessionName);
|
|
98
125
|
}
|
|
99
126
|
mkdirSync(LOG_DIR, { recursive: true });
|
|
100
127
|
// Enable Telegram channel if configured and not explicitly disabled
|
|
@@ -110,11 +137,10 @@ export default class Start extends BaseCommand {
|
|
|
110
137
|
telegramBotToken: telegramEnv?.TELEGRAM_BOT_TOKEN,
|
|
111
138
|
channels,
|
|
112
139
|
extraArgs: extraClaudeArgs,
|
|
113
|
-
logFile,
|
|
114
140
|
});
|
|
115
141
|
const cwd = hqDir;
|
|
116
142
|
log(`Starting HQ session: ${sessionName}`);
|
|
117
|
-
tmux.createSession({ name: sessionName, cwd, command });
|
|
143
|
+
tmux.createSession({ name: sessionName, cwd, command, logFile });
|
|
118
144
|
// Verify the session actually survived startup
|
|
119
145
|
if (tmux.waitAndVerify(sessionName) === "dead") {
|
|
120
146
|
let lastError = "";
|
|
@@ -138,8 +164,18 @@ Common causes:
|
|
|
138
164
|
}
|
|
139
165
|
// Session survived — disable remain-on-exit so panes clean up normally
|
|
140
166
|
tmux.disableRemainOnExit(sessionName);
|
|
167
|
+
// Enable remote control before the startup prompt — /remote-control is a
|
|
168
|
+
// Claude Code slash command that Claude can't invoke programmatically.
|
|
169
|
+
tmux.sendKeys(sessionName, `/remote-control ${sessionName}`);
|
|
170
|
+
// Send initial prompt so Claude reads CLAUDE.md and runs startup steps
|
|
171
|
+
tmux.sendKeys(sessionName, "you are online, follow your On Startup instructions");
|
|
141
172
|
// Show welcome banner
|
|
142
173
|
this.log(renderBanner({ config, sessionName, logFile }));
|
|
174
|
+
this.log("Attaching to HQ session. To detach without stopping: Ctrl+B, then D\n");
|
|
175
|
+
// Auto-attach so the user lands inside the Claude session.
|
|
176
|
+
// Claude's CLAUDE.md has startup instructions tailored to the
|
|
177
|
+
// current state (Telegram pairing, --yolo mode, etc.)
|
|
178
|
+
tmux.attachSession(sessionName);
|
|
143
179
|
}
|
|
144
180
|
}
|
|
145
181
|
//# sourceMappingURL=start.js.map
|
|
@@ -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,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":"
|
|
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"}
|