@marcopeg/hal 1.0.32 → 1.0.33

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 (70) hide show
  1. package/README.md +18 -43
  2. package/dist/cli.js +207 -19
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.js +1 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/wizard/analyzer.d.ts +17 -0
  7. package/dist/wizard/analyzer.d.ts.map +1 -0
  8. package/dist/wizard/analyzer.js +173 -0
  9. package/dist/wizard/analyzer.js.map +1 -0
  10. package/dist/wizard/config-builder.d.ts +15 -0
  11. package/dist/wizard/config-builder.d.ts.map +1 -0
  12. package/dist/wizard/config-builder.js +199 -0
  13. package/dist/wizard/config-builder.js.map +1 -0
  14. package/dist/wizard/confirm-and-write.d.ts +7 -0
  15. package/dist/wizard/confirm-and-write.d.ts.map +1 -0
  16. package/dist/wizard/confirm-and-write.js +135 -0
  17. package/dist/wizard/confirm-and-write.js.map +1 -0
  18. package/dist/wizard/engine-discovery.d.ts +8 -0
  19. package/dist/wizard/engine-discovery.d.ts.map +1 -0
  20. package/dist/wizard/engine-discovery.js +55 -0
  21. package/dist/wizard/engine-discovery.js.map +1 -0
  22. package/dist/wizard/index.d.ts +14 -0
  23. package/dist/wizard/index.d.ts.map +1 -0
  24. package/dist/wizard/index.js +116 -0
  25. package/dist/wizard/index.js.map +1 -0
  26. package/dist/wizard/runner.d.ts +16 -0
  27. package/dist/wizard/runner.d.ts.map +1 -0
  28. package/dist/wizard/runner.js +47 -0
  29. package/dist/wizard/runner.js.map +1 -0
  30. package/dist/wizard/steps/additional-users.d.ts +3 -0
  31. package/dist/wizard/steps/additional-users.d.ts.map +1 -0
  32. package/dist/wizard/steps/additional-users.js +57 -0
  33. package/dist/wizard/steps/additional-users.js.map +1 -0
  34. package/dist/wizard/steps/bot-token.d.ts +3 -0
  35. package/dist/wizard/steps/bot-token.d.ts.map +1 -0
  36. package/dist/wizard/steps/bot-token.js +130 -0
  37. package/dist/wizard/steps/bot-token.js.map +1 -0
  38. package/dist/wizard/steps/cwd.d.ts +3 -0
  39. package/dist/wizard/steps/cwd.d.ts.map +1 -0
  40. package/dist/wizard/steps/cwd.js +80 -0
  41. package/dist/wizard/steps/cwd.js.map +1 -0
  42. package/dist/wizard/steps/engine.d.ts +3 -0
  43. package/dist/wizard/steps/engine.d.ts.map +1 -0
  44. package/dist/wizard/steps/engine.js +118 -0
  45. package/dist/wizard/steps/engine.js.map +1 -0
  46. package/dist/wizard/steps/index.d.ts +5 -0
  47. package/dist/wizard/steps/index.d.ts.map +1 -0
  48. package/dist/wizard/steps/index.js +15 -0
  49. package/dist/wizard/steps/index.js.map +1 -0
  50. package/dist/wizard/steps/model.d.ts +3 -0
  51. package/dist/wizard/steps/model.d.ts.map +1 -0
  52. package/dist/wizard/steps/model.js +88 -0
  53. package/dist/wizard/steps/model.js.map +1 -0
  54. package/dist/wizard/steps/project-name.d.ts +3 -0
  55. package/dist/wizard/steps/project-name.d.ts.map +1 -0
  56. package/dist/wizard/steps/project-name.js +59 -0
  57. package/dist/wizard/steps/project-name.js.map +1 -0
  58. package/dist/wizard/steps/session.d.ts +3 -0
  59. package/dist/wizard/steps/session.d.ts.map +1 -0
  60. package/dist/wizard/steps/session.js +81 -0
  61. package/dist/wizard/steps/session.js.map +1 -0
  62. package/dist/wizard/steps/user-id.d.ts +3 -0
  63. package/dist/wizard/steps/user-id.d.ts.map +1 -0
  64. package/dist/wizard/steps/user-id.js +155 -0
  65. package/dist/wizard/steps/user-id.js.map +1 -0
  66. package/dist/wizard/types.d.ts +108 -0
  67. package/dist/wizard/types.d.ts.map +1 -0
  68. package/dist/wizard/types.js +2 -0
  69. package/dist/wizard/types.js.map +1 -0
  70. package/package.json +7 -2
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,oBAAoB,GAAG,WAAW,CAAC;AACzC,MAAM,QAAQ,GACZ,mEAAmE,CAAC;AAEtE,+CAA+C;AAC/C,MAAM,cAAc,GAAG,eAAe,CAAC;AAEvC,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,CAAC,GAAI,KAAgB,CAAC,IAAI,EAAE,CAAC;IACnC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,oBAAoB;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CACvB,SAAiB,EACjB,MAAgC;IAEhC,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACzE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,qBAAqB,CACnD,SAAS,EACT,MAAM,CAAC,GAAG,CACX,CAAC;QACF,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YAChC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CACtB,GAA0B,EAC1B,GAA2B;IAE3B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;QACrB,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAEzC,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QAE1B,qBAAqB;QACrB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;QAExE,+EAA+E;QAC/E,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,GAA0B;IAC3C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;QACrB,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,OAAO,WAAW,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,uBAAuB;IAE9B,YAAY,CAAC,GAAkB;QAC7B,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;QACtE,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,EAAE,QAAQ,IAAI,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,cAAc,IAAI,EAAE,CACtC,CAAC;QACF,OAAO,CACL,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC;YAC/B,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC;YAChC,mEAAmE;YACnE,SAAS,CAAC,SAAS,CAAC;YACpB,SAAS,CAAC,UAAU,CAAC,CACtB,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,GAAkB;QAC3B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACtC,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAClD,CAAC;IAED,GAAG,EAAE,KAAK,EAAE,GAAkB,EAAE,EAAE;QAChC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACf,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,OAAO,EAAE,8DAA8D;YACvE,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC3B,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;wBAC5B,CAAC,CAAC,OAAO;wBACT,CAAC,CAAC,UAAU,CAAC;gBACnB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACrD,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACtE,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;YACxB,OAAO,EAAE,wCAAwC;YACjD,WAAW,EAAE,WAAW;YACxB,QAAQ,CAAC,KAAK;gBACZ,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;oBAAE,OAAO,sBAAsB,CAAC;gBACjE,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,CAAC,KAAK,IAAI;oBACZ,OAAO,qDAAqD,oBAAoB,GAAG,CAAC;gBACtF,OAAO,SAAS,CAAC;YACnB,CAAC;SACF,CAAC,CAAC;QACH,WAAW,CAAC,MAAM,CAAC,CAAC;QAEpB,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW,CAAE,MAAiB,CAAC,IAAI,EAAE,CAAW,CAAC;IACxE,CAAC;CACF,CAAC"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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.32",
3
+ "version": "1.0.33",
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 watch src/cli.ts start --cwd examples",
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",