@hypercli/hq 0.1.1
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/LICENSE +21 -0
- package/README.md +24 -0
- package/dist/commands/hq/attach.d.ts +10 -0
- package/dist/commands/hq/attach.d.ts.map +1 -0
- package/dist/commands/hq/attach.js +29 -0
- package/dist/commands/hq/attach.js.map +1 -0
- package/dist/commands/hq/config.d.ts +12 -0
- package/dist/commands/hq/config.d.ts.map +1 -0
- package/dist/commands/hq/config.js +56 -0
- package/dist/commands/hq/config.js.map +1 -0
- package/dist/commands/hq/list.d.ts +12 -0
- package/dist/commands/hq/list.d.ts.map +1 -0
- package/dist/commands/hq/list.js +54 -0
- package/dist/commands/hq/list.js.map +1 -0
- package/dist/commands/hq/spawn.d.ts +17 -0
- package/dist/commands/hq/spawn.d.ts.map +1 -0
- package/dist/commands/hq/spawn.js +100 -0
- package/dist/commands/hq/spawn.js.map +1 -0
- package/dist/commands/hq/start.d.ts +14 -0
- package/dist/commands/hq/start.d.ts.map +1 -0
- package/dist/commands/hq/start.js +178 -0
- package/dist/commands/hq/start.js.map +1 -0
- package/dist/commands/hq/status.d.ts +11 -0
- package/dist/commands/hq/status.d.ts.map +1 -0
- package/dist/commands/hq/status.js +34 -0
- package/dist/commands/hq/status.js.map +1 -0
- package/dist/commands/hq/stop-all.d.ts +7 -0
- package/dist/commands/hq/stop-all.d.ts.map +1 -0
- package/dist/commands/hq/stop-all.js +20 -0
- package/dist/commands/hq/stop-all.js.map +1 -0
- package/dist/commands/hq/stop.d.ts +10 -0
- package/dist/commands/hq/stop.d.ts.map +1 -0
- package/dist/commands/hq/stop.js +28 -0
- package/dist/commands/hq/stop.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +59 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +25 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +17 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/setup.d.ts +3 -0
- package/dist/config/setup.d.ts.map +1 -0
- package/dist/config/setup.js +147 -0
- package/dist/config/setup.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/base-command.d.ts +17 -0
- package/dist/lib/base-command.d.ts.map +1 -0
- package/dist/lib/base-command.js +17 -0
- package/dist/lib/base-command.js.map +1 -0
- package/dist/services/claude.d.ts +11 -0
- package/dist/services/claude.d.ts.map +1 -0
- package/dist/services/claude.js +37 -0
- package/dist/services/claude.js.map +1 -0
- package/dist/services/projects.d.ts +20 -0
- package/dist/services/projects.d.ts.map +1 -0
- package/dist/services/projects.js +147 -0
- package/dist/services/projects.js.map +1 -0
- package/dist/services/telegram.d.ts +8 -0
- package/dist/services/telegram.d.ts.map +1 -0
- package/dist/services/telegram.js +26 -0
- package/dist/services/telegram.js.map +1 -0
- package/dist/services/tmux.d.ts +25 -0
- package/dist/services/tmux.d.ts.map +1 -0
- package/dist/services/tmux.js +87 -0
- package/dist/services/tmux.js.map +1 -0
- package/dist/utils/banner.d.ts +7 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +80 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/log.d.ts +2 -0
- package/dist/utils/log.d.ts.map +1 -0
- package/dist/utils/log.js +5 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/paths.d.ts +4 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +10 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/trust.d.ts +13 -0
- package/dist/utils/trust.d.ts.map +1 -0
- package/dist/utils/trust.js +29 -0
- package/dist/utils/trust.js.map +1 -0
- package/help/hq/attach.md +32 -0
- package/help/hq/config.md +50 -0
- package/help/hq/list.md +42 -0
- package/help/hq/spawn.md +47 -0
- package/help/hq/start.md +39 -0
- package/help/hq/status.md +38 -0
- package/help/hq/stop-all.md +20 -0
- package/help/hq/stop.md +31 -0
- package/help/hq.md +48 -0
- package/oclif.manifest.json +395 -0
- package/package.json +87 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import { BaseCommand } from "#lib/base-command";
|
|
3
|
+
import * as tmux from "#services/tmux";
|
|
4
|
+
export default class Status extends BaseCommand {
|
|
5
|
+
static description = "Show running HQ sessions";
|
|
6
|
+
static examples = ["<%= config.bin %> hq status", "<%= config.bin %> hq status --json"];
|
|
7
|
+
static flags = {
|
|
8
|
+
...BaseCommand.baseFlags,
|
|
9
|
+
json: Flags.boolean({ description: "Output as JSON", default: false }),
|
|
10
|
+
};
|
|
11
|
+
async run() {
|
|
12
|
+
const { flags } = await this.parse(Status);
|
|
13
|
+
const sessions = tmux.listSessions("hq");
|
|
14
|
+
if (flags.json) {
|
|
15
|
+
this.log(JSON.stringify(sessions, null, 2));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
this.log("HQ Sessions");
|
|
19
|
+
this.log("═══════════");
|
|
20
|
+
if (sessions.length === 0) {
|
|
21
|
+
this.log(" No active HQ sessions");
|
|
22
|
+
this.log("");
|
|
23
|
+
this.log(" Start one with: hyper hq start");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
for (const session of sessions) {
|
|
27
|
+
const isHq = session.name === "hyper-hq";
|
|
28
|
+
const status = session.attached ? "ATTACHED" : "ONLINE";
|
|
29
|
+
const tag = isHq ? " (HQ)" : "";
|
|
30
|
+
this.log(` ${session.name.padEnd(24)} ${status.padEnd(10)} ${session.created}${tag}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/hq/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,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,0BAA0B,CAAC;IAEzD,MAAM,CAAU,QAAQ,GAAG,CAAC,6BAA6B,EAAE,oCAAoC,CAAC,CAAC;IAEjG,MAAM,CAAU,KAAK,GAAG;QACvB,GAAG,WAAW,CAAC,SAAS;QACxB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;KACtE,CAAC;IAEF,KAAK,CAAC,GAAG;QACR,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEzC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAExB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAC7C,OAAO;QACR,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC;YACzC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC;QACxF,CAAC;IACF,CAAC"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseCommand } from "#lib/base-command";
|
|
2
|
+
import * as tmux from "#services/tmux";
|
|
3
|
+
import { log } from "#utils/log";
|
|
4
|
+
export default class StopAll extends BaseCommand {
|
|
5
|
+
static description = "Stop all HQ-managed sessions";
|
|
6
|
+
static examples = ["<%= config.bin %> hq stop-all"];
|
|
7
|
+
async run() {
|
|
8
|
+
await this.parse(StopAll);
|
|
9
|
+
const sessions = tmux.listSessions("hq");
|
|
10
|
+
if (sessions.length === 0) {
|
|
11
|
+
this.log("No HQ sessions running");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
for (const session of sessions) {
|
|
15
|
+
tmux.killSession(session.name);
|
|
16
|
+
log(`Stopped: ${session.name}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=stop-all.js.map
|
|
@@ -0,0 +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,YAAY,CAAC,IAAI,CAAC,CAAC;QAEzC,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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseCommand } from "#lib/base-command";
|
|
2
|
+
export default class Stop extends BaseCommand<typeof Stop> {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
session: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=stop.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Args } from "@oclif/core";
|
|
2
|
+
import { BaseCommand } from "#lib/base-command";
|
|
3
|
+
import * as tmux from "#services/tmux";
|
|
4
|
+
import { log } from "#utils/log";
|
|
5
|
+
export default class Stop extends BaseCommand {
|
|
6
|
+
static description = "Stop an HQ session";
|
|
7
|
+
static examples = ["<%= config.bin %> hq stop", "<%= config.bin %> hq stop my-project"];
|
|
8
|
+
static args = {
|
|
9
|
+
session: Args.string({
|
|
10
|
+
description: "Session name or project name (default: hyper-hq)",
|
|
11
|
+
required: false,
|
|
12
|
+
}),
|
|
13
|
+
};
|
|
14
|
+
async run() {
|
|
15
|
+
const { args } = await this.parse(Stop);
|
|
16
|
+
let target = args.session ?? "hyper-hq";
|
|
17
|
+
if (!target.startsWith("hq")) {
|
|
18
|
+
target = `hq-${target}`;
|
|
19
|
+
}
|
|
20
|
+
if (tmux.killSession(target)) {
|
|
21
|
+
log(`Stopped session: ${target}`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.error(`Session '${target}' not found`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +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,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,IAAI,CAAC,CAAC;QACxC,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,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,YAAY,MAAM,aAAa,CAAC,CAAC;QAC7C,CAAC;IACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5D,QAAA,MAAM,WAAW,QAA8C,CAAC;AAgChE,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,UAAU,IAAI,QAAQ,CAiCrC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { parse as parseTOML } from "smol-toml";
|
|
5
|
+
import { DEFAULT_CONFIG } from "./schema.js";
|
|
6
|
+
const CONFIG_PATH = resolve(homedir(), ".config/hyper/hq.toml");
|
|
7
|
+
function expandHome(p) {
|
|
8
|
+
if (p.startsWith("~/"))
|
|
9
|
+
return resolve(homedir(), p.slice(2));
|
|
10
|
+
return p;
|
|
11
|
+
}
|
|
12
|
+
function deepMerge(base, override) {
|
|
13
|
+
const result = { ...base };
|
|
14
|
+
for (const [key, value] of Object.entries(override)) {
|
|
15
|
+
if (value !== null &&
|
|
16
|
+
typeof value === "object" &&
|
|
17
|
+
!Array.isArray(value) &&
|
|
18
|
+
result[key] !== null &&
|
|
19
|
+
typeof result[key] === "object" &&
|
|
20
|
+
!Array.isArray(result[key])) {
|
|
21
|
+
result[key] = deepMerge(result[key], value);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
result[key] = value;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
export function configExists() {
|
|
30
|
+
return existsSync(CONFIG_PATH);
|
|
31
|
+
}
|
|
32
|
+
export function loadConfig() {
|
|
33
|
+
let fileConfig = {};
|
|
34
|
+
if (existsSync(CONFIG_PATH)) {
|
|
35
|
+
const raw = readFileSync(CONFIG_PATH, "utf-8");
|
|
36
|
+
fileConfig = parseTOML(raw);
|
|
37
|
+
}
|
|
38
|
+
const merged = deepMerge(DEFAULT_CONFIG, fileConfig);
|
|
39
|
+
// Env var overrides
|
|
40
|
+
if (process.env.HYPER_HQ_PROJECTS_ROOT) {
|
|
41
|
+
merged.projects_root = process.env.HYPER_HQ_PROJECTS_ROOT;
|
|
42
|
+
}
|
|
43
|
+
if (process.env.HYPER_HQ_BOT_TOKEN) {
|
|
44
|
+
merged.telegram = merged.telegram ?? {};
|
|
45
|
+
merged.telegram.hq_bot_token = process.env.HYPER_HQ_BOT_TOKEN;
|
|
46
|
+
}
|
|
47
|
+
// Expand paths
|
|
48
|
+
merged.projects_root = expandHome(merged.projects_root);
|
|
49
|
+
// Resolve hq.dir relative to projects_root if not absolute
|
|
50
|
+
if (merged.hq.dir.startsWith("./") || !merged.hq.dir.startsWith("/")) {
|
|
51
|
+
merged.hq.dir = resolve(merged.projects_root, merged.hq.dir);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
merged.hq.dir = expandHome(merged.hq.dir);
|
|
55
|
+
}
|
|
56
|
+
return merged;
|
|
57
|
+
}
|
|
58
|
+
export { CONFIG_PATH };
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface HqSessionConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
dir: string;
|
|
4
|
+
spawn_mode: "same-dir" | "worktree" | "session";
|
|
5
|
+
capacity: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ClaudeConfig {
|
|
8
|
+
permission_mode?: "default" | "acceptEdits" | "plan" | "auto";
|
|
9
|
+
}
|
|
10
|
+
export interface TelegramConfig {
|
|
11
|
+
hq_bot_token?: string;
|
|
12
|
+
project_bots: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
export interface ProjectOverride {
|
|
15
|
+
type?: "group";
|
|
16
|
+
}
|
|
17
|
+
export interface HqConfig {
|
|
18
|
+
projects_root: string;
|
|
19
|
+
hq: HqSessionConfig;
|
|
20
|
+
claude: ClaudeConfig;
|
|
21
|
+
telegram: TelegramConfig;
|
|
22
|
+
projects: Record<string, ProjectOverride>;
|
|
23
|
+
}
|
|
24
|
+
export declare const DEFAULT_CONFIG: HqConfig;
|
|
25
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +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;CAC9D;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,17 @@
|
|
|
1
|
+
export const DEFAULT_CONFIG = {
|
|
2
|
+
projects_root: "~/work",
|
|
3
|
+
hq: {
|
|
4
|
+
name: "hyper-hq",
|
|
5
|
+
dir: "./hyper-hq",
|
|
6
|
+
spawn_mode: "same-dir",
|
|
7
|
+
capacity: 32,
|
|
8
|
+
},
|
|
9
|
+
claude: {
|
|
10
|
+
permission_mode: "default",
|
|
11
|
+
},
|
|
12
|
+
telegram: {
|
|
13
|
+
project_bots: {},
|
|
14
|
+
},
|
|
15
|
+
projects: {},
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AA4BA,MAAM,CAAC,MAAM,cAAc,GAAa;IACvC,aAAa,EAAE,QAAQ;IACvB,EAAE,EAAE;QACH,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,YAAY;QACjB,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,EAAE;KACZ;IACD,MAAM,EAAE;QACP,eAAe,EAAE,SAAS;KAC1B;IACD,QAAQ,EAAE;QACT,YAAY,EAAE,EAAE;KAChB;IACD,QAAQ,EAAE,EAAE;CACZ,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,gBAAgB,IAAI,OAAO,CAAC,QAAQ,CAAC,CA+K1D"}
|
|
@@ -0,0 +1,147 @@
|
|
|
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 runSetupIfNeeded() {
|
|
13
|
+
if (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
|
+
p.outro("Setup complete! Starting HQ...");
|
|
145
|
+
return loadConfig();
|
|
146
|
+
}
|
|
147
|
+
//# 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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAiC,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base command class for @hypercli/hq commands
|
|
3
|
+
*
|
|
4
|
+
* Extends oclif Command directly. When @hypercli/kit is available,
|
|
5
|
+
* this can be updated to extend KitBaseCommand instead.
|
|
6
|
+
*/
|
|
7
|
+
import { Command, type Interfaces } from "@oclif/core";
|
|
8
|
+
export type BaseFlags<T extends typeof Command> = Interfaces.InferredFlags<(typeof BaseCommand)["baseFlags"] & T["flags"]>;
|
|
9
|
+
export type BaseArgs<T extends typeof Command> = Interfaces.InferredArgs<T["args"]>;
|
|
10
|
+
export declare abstract class BaseCommand<T extends typeof Command> extends Command {
|
|
11
|
+
static baseFlags: {
|
|
12
|
+
debug: Interfaces.BooleanFlag<boolean>;
|
|
13
|
+
};
|
|
14
|
+
protected flags: BaseFlags<T>;
|
|
15
|
+
protected args: BaseArgs<T>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=base-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/lib/base-command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,OAAO,OAAO,IAAI,UAAU,CAAC,aAAa,CACzE,CAAC,OAAO,WAAW,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAC9C,CAAC;AACF,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,OAAO,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAEpF,8BAAsB,WAAW,CAAC,CAAC,SAAS,OAAO,OAAO,CAAE,SAAQ,OAAO;IAC1E,OAAgB,SAAS;;MAMvB;IAEF,UAAkB,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACtC,UAAkB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;CACpC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base command class for @hypercli/hq commands
|
|
3
|
+
*
|
|
4
|
+
* Extends oclif Command directly. When @hypercli/kit is available,
|
|
5
|
+
* this can be updated to extend KitBaseCommand instead.
|
|
6
|
+
*/
|
|
7
|
+
import { Command, Flags } from "@oclif/core";
|
|
8
|
+
export class BaseCommand extends Command {
|
|
9
|
+
static baseFlags = {
|
|
10
|
+
debug: Flags.boolean({
|
|
11
|
+
char: "d",
|
|
12
|
+
description: "Enable debug output",
|
|
13
|
+
default: false,
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=base-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../src/lib/base-command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAmB,MAAM,aAAa,CAAC;AAO9D,MAAM,OAAgB,WAAsC,SAAQ,OAAO;IAC1E,MAAM,CAAU,SAAS,GAAG;QAC3B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACpB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,qBAAqB;YAClC,OAAO,EAAE,KAAK;SACd,CAAC;KACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ClaudeCommandOpts {
|
|
2
|
+
name: string;
|
|
3
|
+
spawnMode?: string;
|
|
4
|
+
capacity?: number;
|
|
5
|
+
permissionMode?: string;
|
|
6
|
+
telegramBotToken?: string;
|
|
7
|
+
telegramStateDir?: string;
|
|
8
|
+
logFile: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildClaudeCommand(opts: ClaudeCommandOpts): string;
|
|
11
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +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,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CAChB;AAQD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAuClE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Escape a value for safe inclusion in a single-quoted shell string */
|
|
2
|
+
function shellEscape(value) {
|
|
3
|
+
// Replace ' with '\'' (end quote, escaped quote, start quote)
|
|
4
|
+
return value.replace(/'/g, "'\\''");
|
|
5
|
+
}
|
|
6
|
+
export function buildClaudeCommand(opts) {
|
|
7
|
+
const parts = [];
|
|
8
|
+
// CLAUDE_CODE_OAUTH_TOKEN breaks remote-control — it must use interactive auth
|
|
9
|
+
parts.push("unset CLAUDE_CODE_OAUTH_TOKEN;");
|
|
10
|
+
// Environment variables for Telegram
|
|
11
|
+
if (opts.telegramBotToken) {
|
|
12
|
+
parts.push(`TELEGRAM_BOT_TOKEN='${shellEscape(opts.telegramBotToken)}'`);
|
|
13
|
+
if (opts.telegramStateDir) {
|
|
14
|
+
parts.push(`TELEGRAM_STATE_DIR='${shellEscape(opts.telegramStateDir)}'`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
parts.push("claude");
|
|
18
|
+
parts.push("remote-control");
|
|
19
|
+
parts.push(`--name '${shellEscape(opts.name)}'`);
|
|
20
|
+
if (opts.spawnMode) {
|
|
21
|
+
parts.push(`--spawn ${shellEscape(opts.spawnMode)}`);
|
|
22
|
+
}
|
|
23
|
+
if (opts.capacity) {
|
|
24
|
+
parts.push(`--capacity ${opts.capacity}`);
|
|
25
|
+
}
|
|
26
|
+
if (opts.permissionMode) {
|
|
27
|
+
parts.push(`--permission-mode ${shellEscape(opts.permissionMode)}`);
|
|
28
|
+
}
|
|
29
|
+
// Add Telegram channel if bot token is configured
|
|
30
|
+
if (opts.telegramBotToken) {
|
|
31
|
+
parts.push("--channels plugin:telegram@claude-plugins-official");
|
|
32
|
+
}
|
|
33
|
+
// Pipe to log file
|
|
34
|
+
parts.push(`2>&1 | tee -a '${shellEscape(opts.logFile)}'`);
|
|
35
|
+
return parts.join(" ");
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/services/claude.ts"],"names":[],"mappings":"AAUA,wEAAwE;AACxE,SAAS,WAAW,CAAC,KAAa;IACjC,8DAA8D;IAC9D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,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;QACzE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,uBAAuB,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC1E,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,qBAAqB,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,kDAAkD;IAClD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAClE,CAAC;IAED,mBAAmB;IACnB,KAAK,CAAC,IAAI,CAAC,kBAAkB,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE3D,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { HqConfig } from "../config/schema.js";
|
|
2
|
+
export interface Worktree {
|
|
3
|
+
path: string;
|
|
4
|
+
branch: string;
|
|
5
|
+
isMain: boolean;
|
|
6
|
+
isCurrent: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface Project {
|
|
9
|
+
name: string;
|
|
10
|
+
path: string;
|
|
11
|
+
isGit: boolean;
|
|
12
|
+
hasWorktrees: boolean;
|
|
13
|
+
worktrees: Worktree[];
|
|
14
|
+
}
|
|
15
|
+
export declare function listProjects(config: HqConfig): Project[];
|
|
16
|
+
export declare function findProject(name: string, config: HqConfig): Project | undefined;
|
|
17
|
+
export declare function resolveProjectDir(project: string, config: HqConfig): string;
|
|
18
|
+
export declare function createWorktree(projectDir: string, branch: string): string;
|
|
19
|
+
export declare function findWorktreePath(projectDir: string, branchOrName: string): string | undefined;
|
|
20
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/services/projects.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACtB;AA2HD,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,CAExD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAG/E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,CAG3E;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsBzE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM7F"}
|