@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.
Files changed (61) hide show
  1. package/README.md +2 -1
  2. package/dist/commands/hq/attach.d.ts.map +1 -1
  3. package/dist/commands/hq/attach.js +8 -3
  4. package/dist/commands/hq/attach.js.map +1 -1
  5. package/dist/commands/hq/launch.d.ts +19 -0
  6. package/dist/commands/hq/launch.d.ts.map +1 -0
  7. package/dist/commands/hq/launch.js +155 -0
  8. package/dist/commands/hq/launch.js.map +1 -0
  9. package/dist/commands/hq/relaunch.d.ts +18 -0
  10. package/dist/commands/hq/relaunch.d.ts.map +1 -0
  11. package/dist/commands/hq/relaunch.js +124 -0
  12. package/dist/commands/hq/relaunch.js.map +1 -0
  13. package/dist/commands/hq/start.d.ts.map +1 -1
  14. package/dist/commands/hq/start.js +54 -18
  15. package/dist/commands/hq/start.js.map +1 -1
  16. package/dist/commands/hq/stop-all.d.ts.map +1 -1
  17. package/dist/commands/hq/stop-all.js +2 -0
  18. package/dist/commands/hq/stop-all.js.map +1 -1
  19. package/dist/commands/hq/stop.d.ts.map +1 -1
  20. package/dist/commands/hq/stop.js +9 -3
  21. package/dist/commands/hq/stop.js.map +1 -1
  22. package/dist/commands/hq/web.d.ts +7 -0
  23. package/dist/commands/hq/web.d.ts.map +1 -0
  24. package/dist/commands/hq/web.js +45 -0
  25. package/dist/commands/hq/web.js.map +1 -0
  26. package/dist/config/schema.d.ts +1 -1
  27. package/dist/config/schema.d.ts.map +1 -1
  28. package/dist/config/setup.d.ts +4 -0
  29. package/dist/config/setup.d.ts.map +1 -0
  30. package/dist/config/setup.js +148 -0
  31. package/dist/config/setup.js.map +1 -0
  32. package/dist/services/claude.d.ts +16 -8
  33. package/dist/services/claude.d.ts.map +1 -1
  34. package/dist/services/claude.js +17 -9
  35. package/dist/services/claude.js.map +1 -1
  36. package/dist/services/sessions.d.ts +19 -0
  37. package/dist/services/sessions.d.ts.map +1 -0
  38. package/dist/services/sessions.js +51 -0
  39. package/dist/services/sessions.js.map +1 -0
  40. package/dist/services/tmux.d.ts +5 -0
  41. package/dist/services/tmux.d.ts.map +1 -1
  42. package/dist/services/tmux.js +13 -0
  43. package/dist/services/tmux.js.map +1 -1
  44. package/dist/utils/banner.d.ts.map +1 -1
  45. package/dist/utils/banner.js +2 -1
  46. package/dist/utils/banner.js.map +1 -1
  47. package/dist/utils/paths.d.ts +2 -0
  48. package/dist/utils/paths.d.ts.map +1 -1
  49. package/dist/utils/paths.js +2 -0
  50. package/dist/utils/paths.js.map +1 -1
  51. package/dist/utils/trust.d.ts +10 -0
  52. package/dist/utils/trust.d.ts.map +1 -0
  53. package/dist/utils/trust.js +41 -0
  54. package/dist/utils/trust.js.map +1 -0
  55. package/help/hq.md +6 -5
  56. package/oclif.manifest.json +153 -64
  57. package/package.json +3 -3
  58. package/dist/commands/hq/spawn.d.ts +0 -21
  59. package/dist/commands/hq/spawn.d.ts.map +0 -1
  60. package/dist/commands/hq/spawn.js +0 -124
  61. 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 spawn <project>`Spawn a Claude session for a project
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":"AAEA,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;CAc1B"}
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: hyper-hq)",
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 ?? "hyper-hq";
20
- if (!target.startsWith("hq")) {
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,kDAAkD;YAC/D,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,IAAI,UAAU,CAAC;QAExC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,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"}
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":"AAUA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAmBhD,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;CAyG1B"}
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 { getHqTelegramEnv, TELEGRAM_CHANNEL_PLUGIN } from "#services/telegram";
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 all permission checks (alias for -- --dangerously-skip-permissions)",
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["permission-mode"] ?? config.claude.permission_mode;
66
- // --yolo injects --dangerously-skip-permissions
67
- if (flags.yolo) {
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
- // Generate CLAUDE.md for the HQ session if not present
98
+ // Always regenerate CLAUDE.md content varies based on flags and detected state
83
99
  const claudeMdPath = resolve(hqDir, "CLAUDE.md");
84
- if (!existsSync(claudeMdPath)) {
85
- writeFileSync(claudeMdPath, generateHqClaudeMd(config.projects_root, sessionName), "utf-8");
86
- log("Generated CLAUDE.md for HQ session.");
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. Use 'hyper hq attach' to connect.`);
97
- return;
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":"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"}
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;AAIhD,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;CAc1B"}
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":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhD,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;CAc1B"}
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"}