@marcopeg/hal 1.0.32 → 1.0.34
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 +19 -44
- package/dist/bot/commands/loader.d.ts +1 -0
- package/dist/bot/commands/loader.d.ts.map +1 -1
- package/dist/bot/commands/loader.js +7 -0
- package/dist/bot/commands/loader.js.map +1 -1
- package/dist/bot/commands/message.d.ts.map +1 -1
- package/dist/bot/commands/message.js +1 -0
- package/dist/bot/commands/message.js.map +1 -1
- package/dist/bot/commands/npm/exec.d.ts +15 -0
- package/dist/bot/commands/npm/exec.d.ts.map +1 -0
- package/dist/bot/commands/npm/exec.js +66 -0
- package/dist/bot/commands/npm/exec.js.map +1 -0
- package/dist/bot/commands/npm/format.d.ts +11 -0
- package/dist/bot/commands/npm/format.d.ts.map +1 -0
- package/dist/bot/commands/npm/format.js +40 -0
- package/dist/bot/commands/npm/format.js.map +1 -0
- package/dist/bot/commands/npm/index.d.ts +5 -0
- package/dist/bot/commands/npm/index.d.ts.map +1 -0
- package/dist/bot/commands/npm/index.js +126 -0
- package/dist/bot/commands/npm/index.js.map +1 -0
- package/dist/bot/commands/npm/scripts.d.ts +18 -0
- package/dist/bot/commands/npm/scripts.d.ts.map +1 -0
- package/dist/bot/commands/npm/scripts.js +66 -0
- package/dist/bot/commands/npm/scripts.js.map +1 -0
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +6 -0
- package/dist/bot.js.map +1 -1
- package/dist/cli.js +207 -19
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +40 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +46 -2
- package/dist/config.js.map +1 -1
- package/dist/engine/adapters/copilot.d.ts.map +1 -1
- package/dist/engine/adapters/copilot.js +35 -1
- package/dist/engine/adapters/copilot.js.map +1 -1
- package/dist/wizard/analyzer.d.ts +17 -0
- package/dist/wizard/analyzer.d.ts.map +1 -0
- package/dist/wizard/analyzer.js +173 -0
- package/dist/wizard/analyzer.js.map +1 -0
- package/dist/wizard/config-builder.d.ts +15 -0
- package/dist/wizard/config-builder.d.ts.map +1 -0
- package/dist/wizard/config-builder.js +199 -0
- package/dist/wizard/config-builder.js.map +1 -0
- package/dist/wizard/confirm-and-write.d.ts +7 -0
- package/dist/wizard/confirm-and-write.d.ts.map +1 -0
- package/dist/wizard/confirm-and-write.js +135 -0
- package/dist/wizard/confirm-and-write.js.map +1 -0
- package/dist/wizard/engine-discovery.d.ts +8 -0
- package/dist/wizard/engine-discovery.d.ts.map +1 -0
- package/dist/wizard/engine-discovery.js +55 -0
- package/dist/wizard/engine-discovery.js.map +1 -0
- package/dist/wizard/index.d.ts +14 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +116 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/wizard/runner.d.ts +16 -0
- package/dist/wizard/runner.d.ts.map +1 -0
- package/dist/wizard/runner.js +47 -0
- package/dist/wizard/runner.js.map +1 -0
- package/dist/wizard/steps/additional-users.d.ts +3 -0
- package/dist/wizard/steps/additional-users.d.ts.map +1 -0
- package/dist/wizard/steps/additional-users.js +57 -0
- package/dist/wizard/steps/additional-users.js.map +1 -0
- package/dist/wizard/steps/bot-token.d.ts +3 -0
- package/dist/wizard/steps/bot-token.d.ts.map +1 -0
- package/dist/wizard/steps/bot-token.js +130 -0
- package/dist/wizard/steps/bot-token.js.map +1 -0
- package/dist/wizard/steps/cwd.d.ts +3 -0
- package/dist/wizard/steps/cwd.d.ts.map +1 -0
- package/dist/wizard/steps/cwd.js +80 -0
- package/dist/wizard/steps/cwd.js.map +1 -0
- package/dist/wizard/steps/engine.d.ts +3 -0
- package/dist/wizard/steps/engine.d.ts.map +1 -0
- package/dist/wizard/steps/engine.js +118 -0
- package/dist/wizard/steps/engine.js.map +1 -0
- package/dist/wizard/steps/index.d.ts +5 -0
- package/dist/wizard/steps/index.d.ts.map +1 -0
- package/dist/wizard/steps/index.js +15 -0
- package/dist/wizard/steps/index.js.map +1 -0
- package/dist/wizard/steps/model.d.ts +3 -0
- package/dist/wizard/steps/model.d.ts.map +1 -0
- package/dist/wizard/steps/model.js +88 -0
- package/dist/wizard/steps/model.js.map +1 -0
- package/dist/wizard/steps/project-name.d.ts +3 -0
- package/dist/wizard/steps/project-name.d.ts.map +1 -0
- package/dist/wizard/steps/project-name.js +59 -0
- package/dist/wizard/steps/project-name.js.map +1 -0
- package/dist/wizard/steps/session.d.ts +3 -0
- package/dist/wizard/steps/session.d.ts.map +1 -0
- package/dist/wizard/steps/session.js +81 -0
- package/dist/wizard/steps/session.js.map +1 -0
- package/dist/wizard/steps/user-id.d.ts +3 -0
- package/dist/wizard/steps/user-id.d.ts.map +1 -0
- package/dist/wizard/steps/user-id.js +155 -0
- package/dist/wizard/steps/user-id.js.map +1 -0
- package/dist/wizard/types.d.ts +108 -0
- package/dist/wizard/types.d.ts.map +1 -0
- package/dist/wizard/types.js +2 -0
- package/dist/wizard/types.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { text } from "@clack/prompts";
|
|
3
|
+
import { guardCancel } from "../runner.js";
|
|
4
|
+
export const projectNameStep = {
|
|
5
|
+
id: "project-name",
|
|
6
|
+
label: "Project name",
|
|
7
|
+
isConfigured(ctx) {
|
|
8
|
+
if (ctx.reset)
|
|
9
|
+
return false;
|
|
10
|
+
const key = ctx.currentProjectKey ?? ctx.results.projectKey;
|
|
11
|
+
if (!key)
|
|
12
|
+
return false;
|
|
13
|
+
const edited = ctx.results.projectEdits?.[key]?.name;
|
|
14
|
+
if (typeof edited === "string" && edited.trim() !== "")
|
|
15
|
+
return true;
|
|
16
|
+
const existing = ctx.existingConfig?.projects?.[key]?.name;
|
|
17
|
+
return typeof existing === "string" && existing.trim() !== "";
|
|
18
|
+
},
|
|
19
|
+
shouldSkip(ctx) {
|
|
20
|
+
const oneProject = (ctx.targetProjectKeys?.length ?? 1) <= 1;
|
|
21
|
+
return (oneProject &&
|
|
22
|
+
typeof ctx.prefill.name === "string" &&
|
|
23
|
+
ctx.prefill.name.trim() !== "");
|
|
24
|
+
},
|
|
25
|
+
run: async (ctx) => {
|
|
26
|
+
const key = ctx.currentProjectKey ?? ctx.results.projectKey ?? "prj1";
|
|
27
|
+
if (!ctx.results.projectEdits)
|
|
28
|
+
ctx.results.projectEdits = {};
|
|
29
|
+
ctx.results.projectEdits[key] ??= {};
|
|
30
|
+
// Pre-fill: apply silently (single-project only)
|
|
31
|
+
if ((ctx.targetProjectKeys?.length ?? 1) <= 1 && ctx.prefill.name) {
|
|
32
|
+
const pre = ctx.prefill.name.trim();
|
|
33
|
+
if (pre) {
|
|
34
|
+
ctx.results.projectEdits[key].name = pre;
|
|
35
|
+
ctx.results.projectName = pre;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const cwd = ctx.results.projectEdits?.[key]?.cwd ??
|
|
40
|
+
ctx.existingConfig?.projects?.[key]?.cwd ??
|
|
41
|
+
".";
|
|
42
|
+
const defaultName = cwd === "." || cwd === "./"
|
|
43
|
+
? basename(ctx.cwd)
|
|
44
|
+
: basename(String(cwd)
|
|
45
|
+
.replace(/\/+$/g, "")
|
|
46
|
+
.replace(/^\.\/+/, ""));
|
|
47
|
+
const answer = await text({
|
|
48
|
+
message: `Project name (default: ${defaultName}):`,
|
|
49
|
+
placeholder: defaultName,
|
|
50
|
+
});
|
|
51
|
+
guardCancel(answer);
|
|
52
|
+
const name = typeof answer === "string" ? answer.trim() : "";
|
|
53
|
+
ctx.results.projectEdits[key].name = name === "" ? defaultName : name;
|
|
54
|
+
if (key === ctx.results.projectKey) {
|
|
55
|
+
ctx.results.projectName = ctx.results.projectEdits[key].name;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=project-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-name.js","sourceRoot":"","sources":["../../../src/wizard/steps/project-name.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/wizard/steps/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA8B,UAAU,EAAE,MAAM,aAAa,CAAC;AAU1E,eAAO,MAAM,WAAW,EAAE,UAsEzB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { select } from "@clack/prompts";
|
|
2
|
+
import { guardCancel } from "../runner.js";
|
|
3
|
+
function parseSessionMode(raw) {
|
|
4
|
+
if (raw === "true")
|
|
5
|
+
return true;
|
|
6
|
+
if (raw === "false")
|
|
7
|
+
return false;
|
|
8
|
+
if (raw === "shared")
|
|
9
|
+
return "shared";
|
|
10
|
+
if (raw === "user")
|
|
11
|
+
return "user";
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
export const sessionStep = {
|
|
15
|
+
id: "session",
|
|
16
|
+
label: "Session behavior",
|
|
17
|
+
isConfigured(ctx) {
|
|
18
|
+
// Session does not block boot: default behavior is used when unset.
|
|
19
|
+
// Only prompt when explicitly resetting.
|
|
20
|
+
if (!ctx.reset)
|
|
21
|
+
return true;
|
|
22
|
+
const globalSession = ctx.existingConfig?.globals?.engine?.session;
|
|
23
|
+
const projects = ctx.existingConfig?.projects ?? {};
|
|
24
|
+
const projectSession = Object.values(projects).some((p) => p.engine?.session !== undefined);
|
|
25
|
+
return globalSession !== undefined || projectSession;
|
|
26
|
+
},
|
|
27
|
+
shouldSkip(ctx) {
|
|
28
|
+
if (!ctx.prefill.session)
|
|
29
|
+
return false;
|
|
30
|
+
return parseSessionMode(ctx.prefill.session) !== null;
|
|
31
|
+
},
|
|
32
|
+
run: async (ctx) => {
|
|
33
|
+
// Pre-fill: apply silently
|
|
34
|
+
if (ctx.prefill.session) {
|
|
35
|
+
const mode = parseSessionMode(ctx.prefill.session);
|
|
36
|
+
if (mode !== null) {
|
|
37
|
+
ctx.results.session = mode;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const engine = ctx.results.engine ?? "";
|
|
42
|
+
// Single clear session picker with only supported options
|
|
43
|
+
const options = [
|
|
44
|
+
{
|
|
45
|
+
value: "default",
|
|
46
|
+
label: "default — engine default session mechanism",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
value: "disabled",
|
|
50
|
+
label: "disabled — each message is anonymous (no resume/continue)",
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
if (engine === "claude") {
|
|
54
|
+
options.push({
|
|
55
|
+
value: "shared",
|
|
56
|
+
label: "shared — all users share the same session (--continue)",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (engine === "codex" || engine === "cursor") {
|
|
60
|
+
options.push({
|
|
61
|
+
value: "user",
|
|
62
|
+
label: "user — each user has their own session (engine-supported)",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const picked = await select({
|
|
66
|
+
message: "How should the session work?",
|
|
67
|
+
options,
|
|
68
|
+
});
|
|
69
|
+
guardCancel(picked);
|
|
70
|
+
const v = picked;
|
|
71
|
+
if (v === "disabled")
|
|
72
|
+
ctx.results.session = false;
|
|
73
|
+
else if (v === "shared")
|
|
74
|
+
ctx.results.session = "shared";
|
|
75
|
+
else if (v === "user")
|
|
76
|
+
ctx.results.session = "user";
|
|
77
|
+
else
|
|
78
|
+
ctx.results.session = true;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/wizard/steps/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-id.d.ts","sourceRoot":"","sources":["../../../src/wizard/steps/user-id.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAiB,UAAU,EAAE,MAAM,aAAa,CAAC;AAgG7D,eAAO,MAAM,UAAU,EAAE,UAoExB,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { confirm, text } from "@clack/prompts";
|
|
4
|
+
import { parse as parseEnv } from "dotenv";
|
|
5
|
+
import { resolveCustomEnvPaths } from "../../config.js";
|
|
6
|
+
import { guardCancel } from "../runner.js";
|
|
7
|
+
const TELEGRAM_USER_ID_MAX = 0xfffffffff;
|
|
8
|
+
const HELP_URL = "https://github.com/marcopeg/hal/blob/main/docs/telegram/README.md";
|
|
9
|
+
/** Placeholder pattern — e.g. "${SOME_VAR}" */
|
|
10
|
+
const PLACEHOLDER_RE = /^\$\{[^}]+\}$/;
|
|
11
|
+
function isPlaceholder(value) {
|
|
12
|
+
return typeof value === "string" && PLACEHOLDER_RE.test(value.trim());
|
|
13
|
+
}
|
|
14
|
+
function placeholderVar(value) {
|
|
15
|
+
if (!isPlaceholder(value))
|
|
16
|
+
return null;
|
|
17
|
+
const s = value.trim();
|
|
18
|
+
return s.slice(2, -1).trim() || null;
|
|
19
|
+
}
|
|
20
|
+
function parseUserId(raw) {
|
|
21
|
+
const str = raw.trim();
|
|
22
|
+
const num = Number(str);
|
|
23
|
+
if (!Number.isFinite(num) || !Number.isInteger(num))
|
|
24
|
+
return null;
|
|
25
|
+
if (num < 1 || num > TELEGRAM_USER_ID_MAX)
|
|
26
|
+
return null;
|
|
27
|
+
return num;
|
|
28
|
+
}
|
|
29
|
+
function loadEnvFromConfigDir(configDir) {
|
|
30
|
+
const out = {};
|
|
31
|
+
for (const file of [join(configDir, ".env"), join(configDir, ".env.local")]) {
|
|
32
|
+
if (!existsSync(file))
|
|
33
|
+
continue;
|
|
34
|
+
try {
|
|
35
|
+
const parsed = parseEnv(readFileSync(file, "utf-8"));
|
|
36
|
+
Object.assign(out, parsed);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// ignore
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
function loadEnvForConfig(configDir, parsed) {
|
|
45
|
+
if (parsed && typeof parsed.env === "string" && parsed.env.trim() !== "") {
|
|
46
|
+
const { mainPath, localPath } = resolveCustomEnvPaths(configDir, parsed.env);
|
|
47
|
+
const out = {};
|
|
48
|
+
for (const file of [mainPath, localPath]) {
|
|
49
|
+
if (!existsSync(file))
|
|
50
|
+
continue;
|
|
51
|
+
try {
|
|
52
|
+
const parsedEnv = parseEnv(readFileSync(file, "utf-8"));
|
|
53
|
+
Object.assign(out, parsedEnv);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// ignore
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
return loadEnvFromConfigDir(configDir);
|
|
62
|
+
}
|
|
63
|
+
function hasResolvableId(ids, env) {
|
|
64
|
+
if (!ids || ids.length === 0)
|
|
65
|
+
return false;
|
|
66
|
+
return ids.some((id) => {
|
|
67
|
+
if (typeof id === "number")
|
|
68
|
+
return id > 0;
|
|
69
|
+
if (typeof id !== "string")
|
|
70
|
+
return false;
|
|
71
|
+
const trimmed = id.trim();
|
|
72
|
+
// Raw numeric string
|
|
73
|
+
if (!PLACEHOLDER_RE.test(trimmed))
|
|
74
|
+
return parseUserId(trimmed) !== null;
|
|
75
|
+
// Placeholder: resolve via process env or .env/.env.local (or custom env path)
|
|
76
|
+
const varName = placeholderVar(trimmed);
|
|
77
|
+
if (!varName)
|
|
78
|
+
return false;
|
|
79
|
+
const raw = (process.env[varName] ?? env[varName]) || "";
|
|
80
|
+
return parseUserId(raw) !== null;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function hasRealId(ids) {
|
|
84
|
+
if (!ids || ids.length === 0)
|
|
85
|
+
return false;
|
|
86
|
+
return ids.some((id) => {
|
|
87
|
+
if (typeof id === "number")
|
|
88
|
+
return id > 0;
|
|
89
|
+
if (typeof id === "string")
|
|
90
|
+
return parseUserId(id) !== null;
|
|
91
|
+
return false;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export const userIdStep = {
|
|
95
|
+
id: "user-id",
|
|
96
|
+
label: "Your Telegram user ID",
|
|
97
|
+
isConfigured(ctx) {
|
|
98
|
+
const env = loadEnvForConfig(ctx.cwd, ctx.existingConfig);
|
|
99
|
+
const globalIds = ctx.existingConfig?.globals?.access?.allowedUserIds;
|
|
100
|
+
const projects = ctx.existingConfig?.projects ?? {};
|
|
101
|
+
const projectIds = Object.values(projects).flatMap((p) => p.access?.allowedUserIds ?? []);
|
|
102
|
+
return (hasResolvableId(globalIds, env) ||
|
|
103
|
+
hasResolvableId(projectIds, env) ||
|
|
104
|
+
// Back-compat: treat raw numeric strings/numbers as configured too
|
|
105
|
+
hasRealId(globalIds) ||
|
|
106
|
+
hasRealId(projectIds));
|
|
107
|
+
},
|
|
108
|
+
shouldSkip(ctx) {
|
|
109
|
+
if (!ctx.prefill.userId)
|
|
110
|
+
return false;
|
|
111
|
+
return parseUserId(ctx.prefill.userId) !== null;
|
|
112
|
+
},
|
|
113
|
+
run: async (ctx) => {
|
|
114
|
+
if (ctx.prefill.userId) {
|
|
115
|
+
const n = parseUserId(ctx.prefill.userId);
|
|
116
|
+
if (n !== null) {
|
|
117
|
+
ctx.results.userId = n;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const needHelp = await confirm({
|
|
122
|
+
message: "Do you need help finding your Telegram user ID? (opens docs)",
|
|
123
|
+
initialValue: false,
|
|
124
|
+
});
|
|
125
|
+
guardCancel(needHelp);
|
|
126
|
+
if (needHelp) {
|
|
127
|
+
try {
|
|
128
|
+
const cmd = process.platform === "darwin"
|
|
129
|
+
? "open"
|
|
130
|
+
: process.platform === "win32"
|
|
131
|
+
? "start"
|
|
132
|
+
: "xdg-open";
|
|
133
|
+
const { spawn } = await import("node:child_process");
|
|
134
|
+
spawn(cmd, [HELP_URL], { stdio: "ignore", detached: true }).unref();
|
|
135
|
+
}
|
|
136
|
+
catch { }
|
|
137
|
+
console.log(`\n Docs: ${HELP_URL}\n`);
|
|
138
|
+
}
|
|
139
|
+
const answer = await text({
|
|
140
|
+
message: "Enter your Telegram user ID (numeric):",
|
|
141
|
+
placeholder: "123456789",
|
|
142
|
+
validate(value) {
|
|
143
|
+
if (!value || value.trim() === "")
|
|
144
|
+
return "User ID is required.";
|
|
145
|
+
const n = parseUserId(value);
|
|
146
|
+
if (n === null)
|
|
147
|
+
return `Invalid user ID. Must be a positive integer up to ${TELEGRAM_USER_ID_MAX}.`;
|
|
148
|
+
return undefined;
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
guardCancel(answer);
|
|
152
|
+
ctx.results.userId = parseUserId(answer.trim());
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=user-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-id.js","sourceRoot":"","sources":["../../../src/wizard/steps/user-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { ConfigFormat, SessionMode } from "../config.js";
|
|
2
|
+
export type { SessionMode };
|
|
3
|
+
/**
|
|
4
|
+
* Loosely-typed raw config object (pre-Zod), read directly from the config
|
|
5
|
+
* file without env-var substitution. Only covers fields the wizard cares about.
|
|
6
|
+
*/
|
|
7
|
+
export interface PartialConfig {
|
|
8
|
+
providers?: unknown;
|
|
9
|
+
env?: string;
|
|
10
|
+
globals?: {
|
|
11
|
+
access?: {
|
|
12
|
+
allowedUserIds?: unknown[];
|
|
13
|
+
};
|
|
14
|
+
engine?: {
|
|
15
|
+
name?: string;
|
|
16
|
+
model?: string;
|
|
17
|
+
session?: unknown;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
projects?: Record<string, {
|
|
21
|
+
active?: boolean;
|
|
22
|
+
name?: string;
|
|
23
|
+
cwd?: string;
|
|
24
|
+
telegram?: {
|
|
25
|
+
botToken?: string;
|
|
26
|
+
};
|
|
27
|
+
access?: {
|
|
28
|
+
allowedUserIds?: unknown[];
|
|
29
|
+
};
|
|
30
|
+
engine?: {
|
|
31
|
+
name?: string;
|
|
32
|
+
model?: string;
|
|
33
|
+
session?: unknown;
|
|
34
|
+
};
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
export type ProjectEdits = Record<string, {
|
|
38
|
+
cwd?: string;
|
|
39
|
+
botToken?: string;
|
|
40
|
+
name?: string;
|
|
41
|
+
}>;
|
|
42
|
+
export interface PrefillFlags {
|
|
43
|
+
/** Project display name (wizard step 1). */
|
|
44
|
+
name?: string;
|
|
45
|
+
/** Project cwd (wizard step 2). */
|
|
46
|
+
cwd?: string;
|
|
47
|
+
engine?: string;
|
|
48
|
+
model?: string;
|
|
49
|
+
/** Telegram bot token to use for the project. */
|
|
50
|
+
apiKey?: string;
|
|
51
|
+
/** Back-compat alias for apiKey. */
|
|
52
|
+
botKey?: string;
|
|
53
|
+
userId?: string;
|
|
54
|
+
session?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface WizardContext {
|
|
57
|
+
/** Config directory (where hal.config.* lives / will be written). */
|
|
58
|
+
cwd: string;
|
|
59
|
+
/** Parsed existing config, or null when creating from scratch. */
|
|
60
|
+
existingConfig: PartialConfig | null;
|
|
61
|
+
/** Absolute path to the existing config file, or null. */
|
|
62
|
+
existingConfigPath: string | null;
|
|
63
|
+
/** Format of the existing config file (drives write-back format). null = fresh → default YAML. */
|
|
64
|
+
existingConfigFormat: ConfigFormat | null;
|
|
65
|
+
/** CLI pre-fill flags. */
|
|
66
|
+
prefill: PrefillFlags;
|
|
67
|
+
/** When true, skip isConfigured checks and re-prompt all steps. */
|
|
68
|
+
reset: boolean;
|
|
69
|
+
/** Active projects the wizard should validate/fill (existing config only). */
|
|
70
|
+
targetProjectKeys?: string[];
|
|
71
|
+
/** Project currently being filled (project-scoped steps). */
|
|
72
|
+
currentProjectKey?: string | null;
|
|
73
|
+
/** Background engine discovery; started at wizard boot. */
|
|
74
|
+
availableEnginesPromise?: Promise<string[]>;
|
|
75
|
+
/** Accumulates outputs from each step. */
|
|
76
|
+
results: {
|
|
77
|
+
projectKey?: string;
|
|
78
|
+
projectName?: string;
|
|
79
|
+
cwd?: string;
|
|
80
|
+
/** Engines enabled in config providers (for /engine switching). */
|
|
81
|
+
enabledEngines?: string[];
|
|
82
|
+
botToken?: string;
|
|
83
|
+
/** Multi-project edits (project-scoped). */
|
|
84
|
+
projectEdits?: ProjectEdits;
|
|
85
|
+
userId?: number;
|
|
86
|
+
additionalUserIds?: number[];
|
|
87
|
+
/** Default engine (stored in globals.engine.*). */
|
|
88
|
+
engine?: string;
|
|
89
|
+
/** Default model for globals.engine.*. */
|
|
90
|
+
model?: string;
|
|
91
|
+
session?: SessionMode;
|
|
92
|
+
/** Whether to store secrets inline in config or via .env placeholders. */
|
|
93
|
+
secretsMode?: "env" | "inline";
|
|
94
|
+
/** set by confirm-and-write */
|
|
95
|
+
startBot?: boolean;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export interface WizardStep {
|
|
99
|
+
id: string;
|
|
100
|
+
label: string;
|
|
101
|
+
/** True when this step's value is already present in the config and --reset is false. */
|
|
102
|
+
isConfigured(ctx: WizardContext): boolean;
|
|
103
|
+
/** Additional skip logic beyond isConfigured (e.g. prefill provided). */
|
|
104
|
+
shouldSkip?(ctx: WizardContext): boolean;
|
|
105
|
+
/** Run the step, mutating ctx.results in place. */
|
|
106
|
+
run(ctx: WizardContext): Promise<void>;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/wizard/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/wizard/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marcopeg/hal",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.34",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"url": "git+https://github.com/marcopeg/hal.git"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
+
"@clack/prompts": "^1.1.0",
|
|
33
34
|
"chokidar": "^5.0.0",
|
|
34
35
|
"dotenv": "^17.2.3",
|
|
35
36
|
"grammy": "^1.39.2",
|
|
@@ -52,7 +53,11 @@
|
|
|
52
53
|
"node": ">=18"
|
|
53
54
|
},
|
|
54
55
|
"scripts": {
|
|
55
|
-
"start": "tsx
|
|
56
|
+
"start": "tsx src/cli.ts start --config-dir examples",
|
|
57
|
+
"dev": "tsx watch src/cli.ts start --config-dir examples",
|
|
58
|
+
"start:test": "tsx src/cli.ts start --config-dir manual-tests",
|
|
59
|
+
"dev:test": "tsx watch src/cli.ts start --config-dir manual-tests",
|
|
60
|
+
"wiz:test": "tsx src/cli.ts wiz --config-dir manual-tests",
|
|
56
61
|
"build": "tsc && cp src/init-template.yaml dist/ && chmod +x dist/cli.js",
|
|
57
62
|
"typecheck": "tsc --noEmit",
|
|
58
63
|
"lint": "biome check src",
|