mthds 0.3.0 → 0.3.2

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.
@@ -1,261 +0,0 @@
1
- import { join } from "node:path";
2
- import { homedir } from "node:os";
3
- import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, } from "node:fs";
4
- import { Runners } from "../runners/types.js";
5
- // ── Paths ──────────────────────────────────────────────────────────
6
- const CONFIG_DIR = join(homedir(), ".mthds");
7
- const CREDENTIALS_PATH = join(CONFIG_DIR, "credentials");
8
- // Legacy paths (for auto-migration)
9
- const LEGACY_CONFIG_PATH = join(CONFIG_DIR, "config.json");
10
- const LEGACY_ENV_LOCAL_PATH = join(CONFIG_DIR, ".env.local");
11
- // ── Credential keys ────────────────────────────────────────────────
12
- /** Map from credential key to env var name */
13
- const ENV_NAMES = {
14
- apiUrl: "PIPELEX_API_URL",
15
- apiKey: "PIPELEX_API_KEY",
16
- runner: "MTHDS_RUNNER",
17
- telemetry: "DISABLE_TELEMETRY",
18
- autoUpgrade: "MTHDS_AUTO_UPGRADE",
19
- updateCheck: "MTHDS_UPDATE_CHECK",
20
- };
21
- /** Map from credential key to file key (used in ~/.mthds/credentials) */
22
- const FILE_KEYS = {
23
- apiUrl: "PIPELEX_API_URL",
24
- apiKey: "PIPELEX_API_KEY",
25
- runner: "MTHDS_RUNNER",
26
- telemetry: "DISABLE_TELEMETRY",
27
- autoUpgrade: "MTHDS_AUTO_UPGRADE",
28
- updateCheck: "MTHDS_UPDATE_CHECK",
29
- };
30
- /** Defaults */
31
- const DEFAULTS = {
32
- runner: Runners.API,
33
- apiUrl: "https://api.pipelex.com",
34
- apiKey: "",
35
- telemetry: true,
36
- autoUpgrade: false,
37
- updateCheck: true,
38
- };
39
- /** Map from CLI flag names (kebab-case) to credential keys */
40
- const KEY_ALIASES = {
41
- runner: "runner",
42
- "api-url": "apiUrl",
43
- "api-key": "apiKey",
44
- telemetry: "telemetry",
45
- "auto-upgrade": "autoUpgrade",
46
- "update-check": "updateCheck",
47
- };
48
- // ── Boolean key sets ──────────────────────────────────────────────
49
- /** Keys that store boolean values (coerced from "0"/"1" in file/env) */
50
- const BOOLEAN_KEYS = new Set([
51
- "telemetry",
52
- "autoUpgrade",
53
- "updateCheck",
54
- ]);
55
- /** Boolean keys with inverted file semantics (DISABLE_TELEMETRY=1 → false) */
56
- const INVERTED_BOOLEAN_KEYS = new Set([
57
- "telemetry",
58
- ]);
59
- /** Strings treated as truthy for boolean keys — used in both load and set paths */
60
- const TRUTHY_STRINGS = new Set(["true", "1", "yes", "on"]);
61
- export const VALID_KEYS = Object.keys(KEY_ALIASES);
62
- export function resolveKey(cliKey) {
63
- return KEY_ALIASES[cliKey];
64
- }
65
- // ── Dotenv parser / serializer ─────────────────────────────────────
66
- function parseDotenv(content) {
67
- const result = {};
68
- for (const line of content.split("\n")) {
69
- const trimmed = line.trim();
70
- if (!trimmed || trimmed.startsWith("#"))
71
- continue;
72
- const eqIndex = trimmed.indexOf("=");
73
- if (eqIndex === -1)
74
- continue;
75
- const key = trimmed.slice(0, eqIndex).trim();
76
- const value = trimmed.slice(eqIndex + 1).trim();
77
- result[key] = value;
78
- }
79
- return result;
80
- }
81
- function serializeDotenv(entries) {
82
- const lines = [];
83
- for (const [key, value] of Object.entries(entries)) {
84
- lines.push(`${key}=${value}`);
85
- }
86
- return lines.join("\n") + "\n";
87
- }
88
- // ── File I/O ───────────────────────────────────────────────────────
89
- function readCredentialsFile() {
90
- migrateIfNeeded();
91
- if (!existsSync(CREDENTIALS_PATH))
92
- return {};
93
- try {
94
- return parseDotenv(readFileSync(CREDENTIALS_PATH, "utf-8"));
95
- }
96
- catch {
97
- return {};
98
- }
99
- }
100
- function writeCredentialsFile(entries) {
101
- mkdirSync(CONFIG_DIR, { recursive: true });
102
- writeFileSync(CREDENTIALS_PATH, serializeDotenv(entries), "utf-8");
103
- }
104
- // ── Migration ──────────────────────────────────────────────────────
105
- let migrationDone = false;
106
- function migrateIfNeeded() {
107
- if (migrationDone)
108
- return;
109
- migrationDone = true;
110
- if (existsSync(CREDENTIALS_PATH))
111
- return;
112
- const migrated = {};
113
- let configJsonMigrated = false;
114
- let envLocalMigrated = false;
115
- // Migrate from config.json
116
- if (existsSync(LEGACY_CONFIG_PATH)) {
117
- try {
118
- const raw = readFileSync(LEGACY_CONFIG_PATH, "utf-8");
119
- const config = JSON.parse(raw);
120
- if (typeof config.runner === "string") {
121
- migrated["MTHDS_RUNNER"] = config.runner;
122
- }
123
- if (typeof config.apiUrl === "string") {
124
- migrated["PIPELEX_API_URL"] = config.apiUrl;
125
- }
126
- if (typeof config.apiKey === "string") {
127
- migrated["PIPELEX_API_KEY"] = config.apiKey;
128
- }
129
- if (typeof config.telemetry === "boolean") {
130
- migrated["DISABLE_TELEMETRY"] = config.telemetry ? "0" : "1";
131
- }
132
- configJsonMigrated = true;
133
- }
134
- catch {
135
- // Parse failed — preserve the legacy file so the user can fix it
136
- }
137
- }
138
- // Migrate from .env.local (telemetry flag)
139
- if (existsSync(LEGACY_ENV_LOCAL_PATH)) {
140
- try {
141
- const envEntries = parseDotenv(readFileSync(LEGACY_ENV_LOCAL_PATH, "utf-8"));
142
- if (envEntries["DISABLE_TELEMETRY"]) {
143
- migrated["DISABLE_TELEMETRY"] = envEntries["DISABLE_TELEMETRY"];
144
- }
145
- envLocalMigrated = Boolean(envEntries["DISABLE_TELEMETRY"]);
146
- }
147
- catch {
148
- // Read failed — preserve the legacy file
149
- }
150
- }
151
- if (configJsonMigrated || envLocalMigrated) {
152
- mkdirSync(CONFIG_DIR, { recursive: true });
153
- writeFileSync(CREDENTIALS_PATH, serializeDotenv(migrated), "utf-8");
154
- // Only delete legacy files that were successfully migrated
155
- if (configJsonMigrated) {
156
- try {
157
- unlinkSync(LEGACY_CONFIG_PATH);
158
- }
159
- catch { /* ignore */ }
160
- }
161
- if (envLocalMigrated) {
162
- try {
163
- unlinkSync(LEGACY_ENV_LOCAL_PATH);
164
- }
165
- catch { /* ignore */ }
166
- }
167
- }
168
- }
169
- // ── Public API ─────────────────────────────────────────────────────
170
- function coerceValue(key, raw) {
171
- if (!BOOLEAN_KEYS.has(key))
172
- return raw;
173
- const truthy = TRUTHY_STRINGS.has(raw.toLowerCase());
174
- return INVERTED_BOOLEAN_KEYS.has(key) ? !truthy : truthy;
175
- }
176
- function toFileValue(key, value) {
177
- if (!BOOLEAN_KEYS.has(key))
178
- return String(value);
179
- const boolVal = typeof value === "boolean"
180
- ? value
181
- : TRUTHY_STRINGS.has(String(value).toLowerCase());
182
- return INVERTED_BOOLEAN_KEYS.has(key)
183
- ? (boolVal ? "0" : "1")
184
- : (boolVal ? "1" : "0");
185
- }
186
- export function loadCredentials() {
187
- const file = readCredentialsFile();
188
- const merged = { ...DEFAULTS };
189
- // Apply file values
190
- for (const [key, fileKey] of Object.entries(FILE_KEYS)) {
191
- if (fileKey in file) {
192
- merged[key] = coerceValue(key, file[fileKey]);
193
- }
194
- }
195
- // Env vars take precedence
196
- for (const [key, envName] of Object.entries(ENV_NAMES)) {
197
- const envVal = process.env[envName];
198
- if (envVal !== undefined) {
199
- merged[key] = coerceValue(key, envVal);
200
- }
201
- }
202
- return merged;
203
- }
204
- export function getCredentialValue(key) {
205
- const envName = ENV_NAMES[key];
206
- const envVal = process.env[envName];
207
- if (envVal !== undefined) {
208
- return { value: envVal, source: "env" };
209
- }
210
- const file = readCredentialsFile();
211
- const fileKey = FILE_KEYS[key];
212
- if (fileKey in file) {
213
- return { value: file[fileKey], source: "file" };
214
- }
215
- const defaultVal = DEFAULTS[key];
216
- if (BOOLEAN_KEYS.has(key)) {
217
- const boolDefault = defaultVal;
218
- if (INVERTED_BOOLEAN_KEYS.has(key)) {
219
- return { value: boolDefault ? "0" : "1", source: "default" };
220
- }
221
- return { value: boolDefault ? "1" : "0", source: "default" };
222
- }
223
- return { value: String(defaultVal), source: "default" };
224
- }
225
- export function setCredentialValue(key, value) {
226
- const file = readCredentialsFile();
227
- const fileKey = FILE_KEYS[key];
228
- if (BOOLEAN_KEYS.has(key)) {
229
- file[fileKey] = toFileValue(key, coerceBooleanInput(value));
230
- }
231
- else {
232
- file[fileKey] = value;
233
- }
234
- writeCredentialsFile(file);
235
- }
236
- /**
237
- * Normalize user-facing boolean input.
238
- * Accepts "true"/"false", "1"/"0", "yes"/"no", "on"/"off".
239
- */
240
- function coerceBooleanInput(value) {
241
- return TRUTHY_STRINGS.has(value.toLowerCase());
242
- }
243
- export function listCredentials() {
244
- const result = [];
245
- for (const [cliKey, credKey] of Object.entries(KEY_ALIASES)) {
246
- const { value, source } = getCredentialValue(credKey);
247
- result.push({ key: credKey, cliKey, value, source });
248
- }
249
- return result;
250
- }
251
- // ── Telemetry helpers (for PostHog module) ─────────────────────────
252
- export function isTelemetryEnabled() {
253
- return loadCredentials().telemetry;
254
- }
255
- export function setTelemetryEnabled(enabled) {
256
- setCredentialValue("telemetry", enabled ? "true" : "false");
257
- }
258
- export function getTelemetrySource() {
259
- return getCredentialValue("telemetry").source;
260
- }
261
- //# sourceMappingURL=credentials.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":"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"}