@they-juanreina/compost-cli 0.1.1 → 0.1.3
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/dist/commands/agreement.d.ts +3 -0
- package/dist/commands/agreement.d.ts.map +1 -0
- package/dist/commands/agreement.js +35 -0
- package/dist/commands/agreement.js.map +1 -0
- package/dist/commands/create.d.ts +1 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +39 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +47 -4
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +59 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/jobs.d.ts +3 -0
- package/dist/commands/jobs.d.ts.map +1 -0
- package/dist/commands/jobs.js +105 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/label.d.ts +3 -0
- package/dist/commands/label.d.ts.map +1 -0
- package/dist/commands/label.js +67 -0
- package/dist/commands/label.js.map +1 -0
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js +2 -1
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/recode.d.ts +3 -0
- package/dist/commands/recode.d.ts.map +1 -0
- package/dist/commands/recode.js +60 -0
- package/dist/commands/recode.js.map +1 -0
- package/dist/commands/reindex.d.ts.map +1 -1
- package/dist/commands/reindex.js +6 -4
- package/dist/commands/reindex.js.map +1 -1
- package/dist/commands/rerun.d.ts +3 -0
- package/dist/commands/rerun.d.ts.map +1 -0
- package/dist/commands/rerun.js +91 -0
- package/dist/commands/rerun.js.map +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +2 -1
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/secrets.d.ts +3 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +143 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +90 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/transcribe.d.ts.map +1 -1
- package/dist/commands/transcribe.js +13 -2
- package/dist/commands/transcribe.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +29 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/engine.d.ts +23 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +32 -0
- package/dist/engine.js.map +1 -0
- package/dist/exporters/prov.d.ts +11 -0
- package/dist/exporters/prov.d.ts.map +1 -0
- package/dist/exporters/prov.js +151 -0
- package/dist/exporters/prov.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/agreement.d.ts +77 -0
- package/dist/lib/agreement.d.ts.map +1 -0
- package/dist/lib/agreement.js +261 -0
- package/dist/lib/agreement.js.map +1 -0
- package/dist/lib/artifacts.d.ts +32 -1
- package/dist/lib/artifacts.d.ts.map +1 -1
- package/dist/lib/artifacts.js +156 -22
- package/dist/lib/artifacts.js.map +1 -1
- package/dist/lib/blame.d.ts.map +1 -1
- package/dist/lib/blame.js +3 -2
- package/dist/lib/blame.js.map +1 -1
- package/dist/lib/config.d.ts +3 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/doctor.d.ts +3 -0
- package/dist/lib/doctor.d.ts.map +1 -1
- package/dist/lib/doctor.js +24 -1
- package/dist/lib/doctor.js.map +1 -1
- package/dist/lib/events.d.ts +34 -1
- package/dist/lib/events.d.ts.map +1 -1
- package/dist/lib/events.js +35 -1
- package/dist/lib/events.js.map +1 -1
- package/dist/lib/importTranscript.d.ts +16 -0
- package/dist/lib/importTranscript.d.ts.map +1 -0
- package/dist/lib/importTranscript.js +94 -0
- package/dist/lib/importTranscript.js.map +1 -0
- package/dist/lib/ingest.d.ts.map +1 -1
- package/dist/lib/ingest.js +12 -6
- package/dist/lib/ingest.js.map +1 -1
- package/dist/lib/journal.d.ts +13 -0
- package/dist/lib/journal.d.ts.map +1 -1
- package/dist/lib/journal.js +58 -2
- package/dist/lib/journal.js.map +1 -1
- package/dist/lib/legacyNative.d.ts +24 -0
- package/dist/lib/legacyNative.d.ts.map +1 -0
- package/dist/lib/legacyNative.js +51 -0
- package/dist/lib/legacyNative.js.map +1 -0
- package/dist/lib/migrate.d.ts.map +1 -1
- package/dist/lib/migrate.js +1 -0
- package/dist/lib/migrate.js.map +1 -1
- package/dist/lib/nativeRuntime.d.ts +6 -3
- package/dist/lib/nativeRuntime.d.ts.map +1 -1
- package/dist/lib/nativeRuntime.js +6 -3
- package/dist/lib/nativeRuntime.js.map +1 -1
- package/dist/lib/provisionNative.js +1 -1
- package/dist/lib/provisionNative.js.map +1 -1
- package/dist/lib/queue.d.ts +25 -0
- package/dist/lib/queue.d.ts.map +1 -1
- package/dist/lib/queue.js +70 -3
- package/dist/lib/queue.js.map +1 -1
- package/dist/lib/reads.d.ts +24 -0
- package/dist/lib/reads.d.ts.map +1 -0
- package/dist/lib/reads.js +115 -0
- package/dist/lib/reads.js.map +1 -0
- package/dist/lib/recode.d.ts +19 -0
- package/dist/lib/recode.d.ts.map +1 -0
- package/dist/lib/recode.js +43 -0
- package/dist/lib/recode.js.map +1 -0
- package/dist/lib/rerun.d.ts +51 -0
- package/dist/lib/rerun.d.ts.map +1 -0
- package/dist/lib/rerun.js +166 -0
- package/dist/lib/rerun.js.map +1 -0
- package/dist/lib/retrieve.d.ts +8 -4
- package/dist/lib/retrieve.d.ts.map +1 -1
- package/dist/lib/retrieve.js +12 -10
- package/dist/lib/retrieve.js.map +1 -1
- package/dist/lib/schemas.generated.d.ts.map +1 -1
- package/dist/lib/schemas.generated.js +28 -0
- package/dist/lib/schemas.generated.js.map +1 -1
- package/dist/lib/secrets.d.ts +158 -0
- package/dist/lib/secrets.d.ts.map +1 -0
- package/dist/lib/secrets.js +507 -0
- package/dist/lib/secrets.js.map +1 -0
- package/dist/lib/seed.d.ts +5 -0
- package/dist/lib/seed.d.ts.map +1 -1
- package/dist/lib/seed.js +15 -2
- package/dist/lib/seed.js.map +1 -1
- package/dist/lib/seedResolve.d.ts.map +1 -1
- package/dist/lib/seedResolve.js +1 -0
- package/dist/lib/seedResolve.js.map +1 -1
- package/dist/lib/session.d.ts +14 -0
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +47 -0
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/setup.d.ts +5 -0
- package/dist/lib/setup.d.ts.map +1 -1
- package/dist/lib/setup.js +78 -14
- package/dist/lib/setup.js.map +1 -1
- package/dist/lib/setupWizard.d.ts +51 -0
- package/dist/lib/setupWizard.d.ts.map +1 -0
- package/dist/lib/setupWizard.js +223 -0
- package/dist/lib/setupWizard.js.map +1 -0
- package/dist/lib/snap.d.ts.map +1 -1
- package/dist/lib/snap.js +2 -5
- package/dist/lib/snap.js.map +1 -1
- package/dist/lib/speakers.d.ts +41 -0
- package/dist/lib/speakers.d.ts.map +1 -0
- package/dist/lib/speakers.js +78 -0
- package/dist/lib/speakers.js.map +1 -0
- package/dist/lib/status.d.ts.map +1 -1
- package/dist/lib/status.js +21 -0
- package/dist/lib/status.js.map +1 -1
- package/dist/lib/userConfig.d.ts +22 -0
- package/dist/lib/userConfig.d.ts.map +1 -0
- package/dist/lib/userConfig.js +67 -0
- package/dist/lib/userConfig.js.map +1 -0
- package/dist/lib/validate.d.ts +18 -0
- package/dist/lib/validate.d.ts.map +1 -1
- package/dist/lib/validate.js +70 -1
- package/dist/lib/validate.js.map +1 -1
- package/dist/lib/version.d.ts +30 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +73 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/llm/adapter.d.ts.map +1 -1
- package/dist/llm/adapter.js +2 -0
- package/dist/llm/adapter.js.map +1 -1
- package/dist/llm/providers/ollama.d.ts.map +1 -1
- package/dist/llm/providers/ollama.js +6 -0
- package/dist/llm/providers/ollama.js.map +1 -1
- package/dist/loops/ingest_watcher.d.ts.map +1 -1
- package/dist/loops/ingest_watcher.js +6 -3
- package/dist/loops/ingest_watcher.js.map +1 -1
- package/dist/loops/legacy_worker.d.ts +28 -1
- package/dist/loops/legacy_worker.d.ts.map +1 -1
- package/dist/loops/legacy_worker.js +81 -9
- package/dist/loops/legacy_worker.js.map +1 -1
- package/dist/loops/supervisor.d.ts +3 -0
- package/dist/loops/supervisor.d.ts.map +1 -1
- package/dist/loops/supervisor.js +12 -0
- package/dist/loops/supervisor.js.map +1 -1
- package/dist/loops/synthesis.d.ts.map +1 -1
- package/dist/loops/synthesis.js +15 -0
- package/dist/loops/synthesis.js.map +1 -1
- package/dist/loops/transcribe_worker.d.ts.map +1 -1
- package/dist/loops/transcribe_worker.js +2 -4
- package/dist/loops/transcribe_worker.js.map +1 -1
- package/dist/output.d.ts +13 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +22 -2
- package/dist/output.js.map +1 -1
- package/dist/render/human.d.ts +20 -0
- package/dist/render/human.d.ts.map +1 -0
- package/dist/render/human.js +54 -0
- package/dist/render/human.js.map +1 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +17 -2
- package/dist/router.js.map +1 -1
- package/package.json +18 -5
- package/templates/config.toml +6 -1
- package/transcriber/app/__init__.py +3 -0
- package/transcriber/app/asr.py +198 -0
- package/transcriber/app/asr_parakeet.py +174 -0
- package/transcriber/app/cue_parser.py +110 -0
- package/transcriber/app/diarization.py +330 -0
- package/transcriber/app/frame_annotation.py +77 -0
- package/transcriber/app/frames.py +130 -0
- package/transcriber/app/health.py +70 -0
- package/transcriber/app/legacy.py +355 -0
- package/transcriber/app/legacy_cli.py +90 -0
- package/transcriber/app/main.py +30 -0
- package/transcriber/app/pipeline.py +210 -0
- package/transcriber/app/pptx_export.py +42 -0
- package/transcriber/app/prosody.py +128 -0
- package/transcriber/app/routes/__init__.py +1 -0
- package/transcriber/app/routes/legacy.py +117 -0
- package/transcriber/app/routes/transcribe.py +133 -0
- package/transcriber/app/shot_change.py +74 -0
- package/transcriber/app/silence_typer.py +144 -0
- package/transcriber/app/transcribe_cli.py +82 -0
- package/transcriber/app/vad.py +216 -0
- package/transcriber/pyproject.toml +56 -0
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join, relative } from 'node:path';
|
|
5
|
+
import { CompostError } from '../errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* Secret resolution + storage (#236 readiness hardening).
|
|
8
|
+
*
|
|
9
|
+
* Secrets (HuggingFace token, LLM provider API keys) are NEVER written into a
|
|
10
|
+
* seed, `config.toml`, or the event ledger — `config.toml` stores only the
|
|
11
|
+
* *name* of an env var (`api_key_env`). This module adds two secure conveniences
|
|
12
|
+
* around the primary env-var mechanism, with a single documented precedence:
|
|
13
|
+
*
|
|
14
|
+
* 1. environment variable (process.env[name]) — primary, always wins
|
|
15
|
+
* 2. OS keychain (macOS `security` / Linux `secret-tool`)
|
|
16
|
+
* 3. ~/.compost/secrets.env (0600-enforced dotenv; refused if loose)
|
|
17
|
+
*
|
|
18
|
+
* The keychain tier shells out to the OS-native tool rather than pulling a
|
|
19
|
+
* native npm dependency — keeping the supply chain tight (see SECURITY.md).
|
|
20
|
+
* Where no keychain exists (Windows, headless Linux without libsecret) storage
|
|
21
|
+
* falls back to the 0600 dotenv. The dotenv is auto-loaded into `process.env`
|
|
22
|
+
* at CLI startup so file-stored secrets resolve everywhere the env var does,
|
|
23
|
+
* without the user editing a shell profile.
|
|
24
|
+
*/
|
|
25
|
+
/** Keychain service name (macOS `-s` / Linux `service` attribute). */
|
|
26
|
+
export const KEYCHAIN_SERVICE = 'compost';
|
|
27
|
+
/**
|
|
28
|
+
* Well-known secret names. Used by `compost secrets list` (which never reads
|
|
29
|
+
* the value, only reports presence) and to decide what's worth probing in the
|
|
30
|
+
* keychain. Not a hard allow-list — `set`/`get`/`rm` accept any valid env name.
|
|
31
|
+
*/
|
|
32
|
+
export const KNOWN_SECRET_NAMES = [
|
|
33
|
+
'HUGGINGFACE_TOKEN',
|
|
34
|
+
'HF_TOKEN',
|
|
35
|
+
'ANTHROPIC_API_KEY',
|
|
36
|
+
'OPENAI_API_KEY',
|
|
37
|
+
];
|
|
38
|
+
/** Default aliases checked alongside a primary name when resolving. */
|
|
39
|
+
export const HF_ALIASES = ['HF_TOKEN'];
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Paths
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/** Resolve the `~/.compost` root. `$COMPOST_HOME` overrides the default; an
|
|
44
|
+
* explicit `deps.home` overrides everything (mirrors nativeRuntime.ts). */
|
|
45
|
+
export function compostHome(deps = {}) {
|
|
46
|
+
if (deps.home?.trim())
|
|
47
|
+
return deps.home;
|
|
48
|
+
const env = deps.env ?? process.env;
|
|
49
|
+
return env.COMPOST_HOME?.trim() ? env.COMPOST_HOME : join(homedir(), '.compost');
|
|
50
|
+
}
|
|
51
|
+
/** Path to the 0600 dotenv. `$COMPOST_SECRETS_ENV` points it at a custom file
|
|
52
|
+
* (e.g. an existing per-user dotenv) without moving the rest of `~/.compost`. */
|
|
53
|
+
export function secretsEnvPath(deps = {}) {
|
|
54
|
+
const env = deps.env ?? process.env;
|
|
55
|
+
if (env.COMPOST_SECRETS_ENV?.trim())
|
|
56
|
+
return env.COMPOST_SECRETS_ENV;
|
|
57
|
+
return join(compostHome(deps), 'secrets.env');
|
|
58
|
+
}
|
|
59
|
+
function octal(mode) {
|
|
60
|
+
return (mode & 0o777).toString(8).padStart(3, '0');
|
|
61
|
+
}
|
|
62
|
+
/** POSIX-only secrecy test: a secret file must have no group/other bits. On
|
|
63
|
+
* Windows (ACL model) mode bits aren't meaningful, so we treat it as secure. */
|
|
64
|
+
export function fileIsSecure(path, platform = process.platform) {
|
|
65
|
+
if (platform === 'win32')
|
|
66
|
+
return true;
|
|
67
|
+
try {
|
|
68
|
+
return (statSync(path).mode & 0o077) === 0;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return true; // absent file can't leak
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Dotenv parsing
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
const ENV_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
78
|
+
/** Validate an env-var-shaped secret name; throws INVALID_INPUT otherwise. */
|
|
79
|
+
export function assertSecretName(name) {
|
|
80
|
+
if (!ENV_NAME_RE.test(name)) {
|
|
81
|
+
throw new CompostError('INVALID_INPUT', `Invalid secret name "${name}". Use an environment-variable name (letters, digits, underscore; not starting with a digit), e.g. HUGGINGFACE_TOKEN.`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Minimal dotenv parser (no dependency). Supports `KEY=value`, `export KEY=`,
|
|
85
|
+
* `#` comments, blank lines, and single/double-quoted values. Malformed lines
|
|
86
|
+
* are skipped rather than throwing — a secrets file should never hard-fail a
|
|
87
|
+
* CLI invocation. */
|
|
88
|
+
export function parseDotenv(text) {
|
|
89
|
+
const out = {};
|
|
90
|
+
for (const rawLine of text.split('\n')) {
|
|
91
|
+
const line = rawLine.trim();
|
|
92
|
+
if (line === '' || line.startsWith('#'))
|
|
93
|
+
continue;
|
|
94
|
+
const eq = line.indexOf('=');
|
|
95
|
+
if (eq === -1)
|
|
96
|
+
continue;
|
|
97
|
+
const key = line
|
|
98
|
+
.slice(0, eq)
|
|
99
|
+
.trim()
|
|
100
|
+
.replace(/^export\s+/, '');
|
|
101
|
+
if (!ENV_NAME_RE.test(key))
|
|
102
|
+
continue;
|
|
103
|
+
let val = line.slice(eq + 1).trim();
|
|
104
|
+
if (val.length >= 2 &&
|
|
105
|
+
((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'")))) {
|
|
106
|
+
val = val.slice(1, -1);
|
|
107
|
+
}
|
|
108
|
+
out[key] = val;
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
function serializeDotenv(values) {
|
|
113
|
+
const header = '# compost secrets — managed by `compost secrets`. Mode 0600; never commit.\n' +
|
|
114
|
+
'# Each line is ENV_NAME=value. Environment variables of the same name win\n' +
|
|
115
|
+
'# over this file; this file wins over nothing below it.\n';
|
|
116
|
+
const body = Object.entries(values)
|
|
117
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
118
|
+
.join('\n');
|
|
119
|
+
return body ? `${header}${body}\n` : header;
|
|
120
|
+
}
|
|
121
|
+
/** Read the 0600 dotenv, refusing (without reading contents) when its perms are
|
|
122
|
+
* loose — so an insecure file can never leak its secrets through compost. */
|
|
123
|
+
export function readSecretsFile(deps = {}) {
|
|
124
|
+
const platform = deps.platform ?? process.platform;
|
|
125
|
+
const path = secretsEnvPath(deps);
|
|
126
|
+
if (!existsSync(path))
|
|
127
|
+
return { path, exists: false, secure: true, values: {} };
|
|
128
|
+
if (!fileIsSecure(path, platform)) {
|
|
129
|
+
return { path, exists: true, secure: false, values: {} };
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
return { path, exists: true, secure: true, values: parseDotenv(readFileSync(path, 'utf8')) };
|
|
133
|
+
}
|
|
134
|
+
catch (cause) {
|
|
135
|
+
throw new CompostError('IO_ERROR', `Could not read ${path}`, { cause });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Ensure `~/.compost` exists at 0700 and return it. */
|
|
139
|
+
function ensureSecureHome(deps) {
|
|
140
|
+
const dir = compostHome(deps);
|
|
141
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
142
|
+
if ((deps.platform ?? process.platform) !== 'win32') {
|
|
143
|
+
try {
|
|
144
|
+
chmodSync(dir, 0o700);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// best-effort: a pre-existing dir we don't own; the perms check will warn.
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return dir;
|
|
151
|
+
}
|
|
152
|
+
/** Write/replace a single key in the dotenv, always (re)normalizing perms to
|
|
153
|
+
* 0600. Reads existing contents raw (bypassing the secrecy gate) so a key set
|
|
154
|
+
* on a previously-loose file both preserves siblings and *fixes* the perms. */
|
|
155
|
+
function writeSecretToFile(name, value, deps) {
|
|
156
|
+
ensureSecureHome(deps);
|
|
157
|
+
const path = secretsEnvPath(deps);
|
|
158
|
+
const existing = existsSync(path) ? parseDotenv(readFileSync(path, 'utf8')) : {};
|
|
159
|
+
existing[name] = value;
|
|
160
|
+
writeFileSync(path, serializeDotenv(existing), { mode: 0o600 });
|
|
161
|
+
if ((deps.platform ?? process.platform) !== 'win32')
|
|
162
|
+
chmodSync(path, 0o600);
|
|
163
|
+
return path;
|
|
164
|
+
}
|
|
165
|
+
/** Remove a key from the dotenv. Returns true if the key was present. */
|
|
166
|
+
function removeSecretFromFile(name, deps) {
|
|
167
|
+
const path = secretsEnvPath(deps);
|
|
168
|
+
if (!existsSync(path))
|
|
169
|
+
return false;
|
|
170
|
+
const existing = parseDotenv(readFileSync(path, 'utf8'));
|
|
171
|
+
if (!(name in existing))
|
|
172
|
+
return false;
|
|
173
|
+
delete existing[name];
|
|
174
|
+
if (Object.keys(existing).length === 0) {
|
|
175
|
+
rmSync(path, { force: true });
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
writeFileSync(path, serializeDotenv(existing), { mode: 0o600 });
|
|
179
|
+
if ((deps.platform ?? process.platform) !== 'win32')
|
|
180
|
+
chmodSync(path, 0o600);
|
|
181
|
+
}
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
function runCmd(cmd, args, input) {
|
|
185
|
+
try {
|
|
186
|
+
const stdout = execFileSync(cmd, args, {
|
|
187
|
+
encoding: 'utf8',
|
|
188
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
189
|
+
timeout: 8000,
|
|
190
|
+
...(input !== undefined ? { input } : {}),
|
|
191
|
+
});
|
|
192
|
+
return { ok: true, stdout, code: 0 };
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
const e = err;
|
|
196
|
+
const out = typeof e.stdout === 'string' ? e.stdout : (e.stdout?.toString() ?? '');
|
|
197
|
+
return { ok: false, stdout: out, code: typeof e.status === 'number' ? e.status : null };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/** macOS Keychain via the `security` CLI. NB: `add-generic-password -w <value>`
|
|
201
|
+
* passes the secret as an argv (briefly visible to `ps`); there's no stdin mode
|
|
202
|
+
* for `security`. Acceptable under the single-user threat model (SECURITY.md). */
|
|
203
|
+
function macKeychain() {
|
|
204
|
+
return {
|
|
205
|
+
label: `macOS Keychain (service "${KEYCHAIN_SERVICE}")`,
|
|
206
|
+
get(name) {
|
|
207
|
+
const r = runCmd('security', [
|
|
208
|
+
'find-generic-password',
|
|
209
|
+
'-s',
|
|
210
|
+
KEYCHAIN_SERVICE,
|
|
211
|
+
'-a',
|
|
212
|
+
name,
|
|
213
|
+
'-w',
|
|
214
|
+
]);
|
|
215
|
+
if (!r.ok)
|
|
216
|
+
return undefined;
|
|
217
|
+
const v = r.stdout.replace(/\n$/, '');
|
|
218
|
+
return v === '' ? undefined : v;
|
|
219
|
+
},
|
|
220
|
+
set(name, value) {
|
|
221
|
+
const r = runCmd('security', [
|
|
222
|
+
'add-generic-password',
|
|
223
|
+
'-s',
|
|
224
|
+
KEYCHAIN_SERVICE,
|
|
225
|
+
'-a',
|
|
226
|
+
name,
|
|
227
|
+
'-l',
|
|
228
|
+
`${KEYCHAIN_SERVICE}: ${name}`,
|
|
229
|
+
'-U', // update if present
|
|
230
|
+
'-w',
|
|
231
|
+
value,
|
|
232
|
+
]);
|
|
233
|
+
if (!r.ok) {
|
|
234
|
+
throw new CompostError('IO_ERROR', `macOS keychain write failed (security exit ${r.code ?? 'spawn-error'})`);
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
del(name) {
|
|
238
|
+
const r = runCmd('security', ['delete-generic-password', '-s', KEYCHAIN_SERVICE, '-a', name]);
|
|
239
|
+
return r.ok;
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/** Linux Secret Service via libsecret's `secret-tool`. The secret is read from
|
|
244
|
+
* stdin on store (never an argv). Requires a running Secret Service. */
|
|
245
|
+
function linuxKeychain() {
|
|
246
|
+
const attrs = (name) => ['service', KEYCHAIN_SERVICE, 'key', name];
|
|
247
|
+
return {
|
|
248
|
+
label: `Secret Service (libsecret, service "${KEYCHAIN_SERVICE}")`,
|
|
249
|
+
get(name) {
|
|
250
|
+
const r = runCmd('secret-tool', ['lookup', ...attrs(name)]);
|
|
251
|
+
if (!r.ok)
|
|
252
|
+
return undefined;
|
|
253
|
+
const v = r.stdout.replace(/\n$/, '');
|
|
254
|
+
return v === '' ? undefined : v;
|
|
255
|
+
},
|
|
256
|
+
set(name, value) {
|
|
257
|
+
const r = runCmd('secret-tool', ['store', '--label', `${KEYCHAIN_SERVICE}: ${name}`, ...attrs(name)], value);
|
|
258
|
+
if (!r.ok) {
|
|
259
|
+
throw new CompostError('IO_ERROR', `secret-tool store failed (exit ${r.code ?? 'spawn-error'}); is a Secret Service running?`);
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
del(name) {
|
|
263
|
+
const r = runCmd('secret-tool', ['clear', ...attrs(name)]);
|
|
264
|
+
return r.ok;
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/** True when `secret-tool` is on PATH (any exit code means it spawned). */
|
|
269
|
+
function secretToolPresent() {
|
|
270
|
+
return runCmd('secret-tool', []).code !== null;
|
|
271
|
+
}
|
|
272
|
+
/** Auto-detect the platform keychain, or null when none is usable. */
|
|
273
|
+
export function detectKeychain(deps = {}) {
|
|
274
|
+
if (deps.keychain !== undefined)
|
|
275
|
+
return deps.keychain;
|
|
276
|
+
const env = deps.env ?? process.env;
|
|
277
|
+
if (env.COMPOST_NO_KEYCHAIN?.trim())
|
|
278
|
+
return null;
|
|
279
|
+
const platform = deps.platform ?? process.platform;
|
|
280
|
+
if (platform === 'darwin')
|
|
281
|
+
return macKeychain();
|
|
282
|
+
if (platform === 'linux')
|
|
283
|
+
return secretToolPresent() ? linuxKeychain() : null;
|
|
284
|
+
return null; // win32 / other → dotenv fallback
|
|
285
|
+
}
|
|
286
|
+
/** Resolve a secret by the documented precedence: env > keychain > 0600 file.
|
|
287
|
+
* Returns undefined when set nowhere (or only in an insecure, refused file). */
|
|
288
|
+
export function resolveSecret(name, opts = {}) {
|
|
289
|
+
const env = opts.env ?? process.env;
|
|
290
|
+
const names = [name, ...(opts.aliases ?? [])];
|
|
291
|
+
for (const key of names) {
|
|
292
|
+
const v = env[key];
|
|
293
|
+
if (v && v.trim() !== '')
|
|
294
|
+
return { value: v, source: 'env' };
|
|
295
|
+
}
|
|
296
|
+
const kc = detectKeychain(opts);
|
|
297
|
+
if (kc) {
|
|
298
|
+
for (const key of names) {
|
|
299
|
+
const v = kc.get(key);
|
|
300
|
+
if (v && v.trim() !== '')
|
|
301
|
+
return { value: v, source: 'keychain' };
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
const file = readSecretsFile(opts);
|
|
305
|
+
if (file.exists && file.secure) {
|
|
306
|
+
for (const key of names) {
|
|
307
|
+
const v = file.values[key];
|
|
308
|
+
if (v && v.trim() !== '')
|
|
309
|
+
return { value: v, source: 'file' };
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return undefined;
|
|
313
|
+
}
|
|
314
|
+
/** Store a secret. Prefers the keychain; falls back to the 0600 dotenv when no
|
|
315
|
+
* keychain exists or a keychain write fails. */
|
|
316
|
+
export function setSecret(name, value, deps = {}) {
|
|
317
|
+
assertSecretName(name);
|
|
318
|
+
if (value.trim() === '') {
|
|
319
|
+
throw new CompostError('INVALID_INPUT', `Refusing to store an empty value for ${name}.`);
|
|
320
|
+
}
|
|
321
|
+
const kc = detectKeychain(deps);
|
|
322
|
+
if (kc) {
|
|
323
|
+
try {
|
|
324
|
+
kc.set(name, value);
|
|
325
|
+
return { name, stored_in: 'keychain', location: kc.label };
|
|
326
|
+
}
|
|
327
|
+
catch (err) {
|
|
328
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
329
|
+
const path = writeSecretToFile(name, value, deps);
|
|
330
|
+
return { name, stored_in: 'file', location: path, fallback_reason: reason };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const path = writeSecretToFile(name, value, deps);
|
|
334
|
+
return { name, stored_in: 'file', location: path };
|
|
335
|
+
}
|
|
336
|
+
/** Remove a secret from the keychain and the dotenv (env vars are the user's
|
|
337
|
+
* shell — we can't and don't touch those). */
|
|
338
|
+
export function rmSecret(name, deps = {}) {
|
|
339
|
+
assertSecretName(name);
|
|
340
|
+
const removed = [];
|
|
341
|
+
const kc = detectKeychain(deps);
|
|
342
|
+
if (kc?.del(name))
|
|
343
|
+
removed.push('keychain');
|
|
344
|
+
if (removeSecretFromFile(name, deps))
|
|
345
|
+
removed.push('file');
|
|
346
|
+
return { name, removed_from: removed };
|
|
347
|
+
}
|
|
348
|
+
/** List which secrets are set and where — never the values. Covers the
|
|
349
|
+
* well-known names plus anything found in the dotenv. */
|
|
350
|
+
export function listSecrets(deps = {}) {
|
|
351
|
+
const env = deps.env ?? process.env;
|
|
352
|
+
const kc = detectKeychain(deps);
|
|
353
|
+
const file = readSecretsFile(deps);
|
|
354
|
+
const candidates = new Set([...KNOWN_SECRET_NAMES, ...Object.keys(file.values)]);
|
|
355
|
+
const items = [];
|
|
356
|
+
for (const name of candidates) {
|
|
357
|
+
const sources = [];
|
|
358
|
+
const e = env[name];
|
|
359
|
+
if (e && e.trim() !== '')
|
|
360
|
+
sources.push('env');
|
|
361
|
+
if (kc) {
|
|
362
|
+
const v = kc.get(name);
|
|
363
|
+
if (v && v.trim() !== '')
|
|
364
|
+
sources.push('keychain');
|
|
365
|
+
}
|
|
366
|
+
if (file.secure && file.values[name])
|
|
367
|
+
sources.push('file');
|
|
368
|
+
if (sources.length > 0)
|
|
369
|
+
items.push({ name, sources });
|
|
370
|
+
}
|
|
371
|
+
items.sort((a, b) => a.name.localeCompare(b.name));
|
|
372
|
+
return { items, file };
|
|
373
|
+
}
|
|
374
|
+
/** Load `~/.compost/secrets.env` into the environment at startup so file-stored
|
|
375
|
+
* secrets resolve everywhere an env var would — without editing a shell profile.
|
|
376
|
+
* Environment variables already set WIN (never overridden). An insecure file is
|
|
377
|
+
* refused (not read) with a warning, preserving the "0600 or it doesn't load"
|
|
378
|
+
* guarantee. Mutates `deps.env` (defaults to `process.env`). */
|
|
379
|
+
export function loadSecretsEnv(deps = {}) {
|
|
380
|
+
const env = deps.env ?? process.env;
|
|
381
|
+
const read = readSecretsFile(deps);
|
|
382
|
+
if (!read.exists)
|
|
383
|
+
return { path: read.path, loaded: [], skipped: 'not-found' };
|
|
384
|
+
if (!read.secure) {
|
|
385
|
+
deps.warn?.(`compost: refusing to load ${read.path} — it is group/world-readable. Fix with: chmod 600 ${read.path}`);
|
|
386
|
+
return { path: read.path, loaded: [], skipped: 'insecure-perms' };
|
|
387
|
+
}
|
|
388
|
+
const loaded = [];
|
|
389
|
+
for (const [k, v] of Object.entries(read.values)) {
|
|
390
|
+
const cur = env[k];
|
|
391
|
+
if (cur === undefined || cur === '') {
|
|
392
|
+
env[k] = v;
|
|
393
|
+
loaded.push(k);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return { path: read.path, loaded, skipped: null };
|
|
397
|
+
}
|
|
398
|
+
// ---------------------------------------------------------------------------
|
|
399
|
+
// Permission audit (for `compost setup`)
|
|
400
|
+
// ---------------------------------------------------------------------------
|
|
401
|
+
const SCAN_SKIP_DIRS = new Set(['transcriber-venv', 'node_modules', '.git', '__pycache__']);
|
|
402
|
+
const SECRETISH_RE = /(secret|token|credential|api[_-]?key|\.env\b|\.key\b)/i;
|
|
403
|
+
const SCAN_MAX_ENTRIES = 2000;
|
|
404
|
+
/** Audit secret-storage permissions under `~/.compost`. Returns issues for:
|
|
405
|
+
* - the home dir if group/world-WRITABLE (someone could swap your secrets),
|
|
406
|
+
* - the managed `secrets.env` if group/world-accessible,
|
|
407
|
+
* - any secret-ish file (by path: token/secret/credential/.env/.key) that's
|
|
408
|
+
* group/world-readable — catches hand-rolled files like the world-readable
|
|
409
|
+
* `~/.compost/hf_token/compost.txt` a readiness test produced.
|
|
410
|
+
* POSIX-only; Windows uses ACLs, so it returns []. */
|
|
411
|
+
export function auditSecretsPerms(deps = {}) {
|
|
412
|
+
const platform = deps.platform ?? process.platform;
|
|
413
|
+
if (platform === 'win32')
|
|
414
|
+
return [];
|
|
415
|
+
const issues = [];
|
|
416
|
+
const home = compostHome(deps);
|
|
417
|
+
// Home dir: flag group/world-writable (the dangerous case for a secrets dir).
|
|
418
|
+
if (existsSync(home)) {
|
|
419
|
+
try {
|
|
420
|
+
const m = statSync(home).mode;
|
|
421
|
+
if ((m & 0o022) !== 0) {
|
|
422
|
+
issues.push({
|
|
423
|
+
path: home,
|
|
424
|
+
kind: 'dir',
|
|
425
|
+
mode: octal(m),
|
|
426
|
+
fix: `chmod 700 ${home}`,
|
|
427
|
+
detail: 'group/world-writable — others could replace files here',
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
// unreadable dir: nothing we can assert
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// The managed dotenv specifically.
|
|
436
|
+
const sp = secretsEnvPath(deps);
|
|
437
|
+
if (existsSync(sp)) {
|
|
438
|
+
try {
|
|
439
|
+
const m = statSync(sp).mode;
|
|
440
|
+
if ((m & 0o077) !== 0) {
|
|
441
|
+
issues.push({
|
|
442
|
+
path: sp,
|
|
443
|
+
kind: 'file',
|
|
444
|
+
mode: octal(m),
|
|
445
|
+
fix: `chmod 600 ${sp}`,
|
|
446
|
+
detail: 'secrets file is group/world-readable',
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
catch {
|
|
451
|
+
// ignore
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// Bounded scan for other secret-ish files left around the home dir.
|
|
455
|
+
const seen = new Set(issues.map((i) => i.path));
|
|
456
|
+
let budget = SCAN_MAX_ENTRIES;
|
|
457
|
+
const walk = (dir, depth) => {
|
|
458
|
+
if (depth > 3 || budget <= 0)
|
|
459
|
+
return;
|
|
460
|
+
let entries;
|
|
461
|
+
try {
|
|
462
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
463
|
+
}
|
|
464
|
+
catch {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
for (const ent of entries) {
|
|
468
|
+
if (--budget <= 0)
|
|
469
|
+
return;
|
|
470
|
+
if (ent.isSymbolicLink())
|
|
471
|
+
continue; // never follow links (cf. #212)
|
|
472
|
+
const full = join(dir, ent.name);
|
|
473
|
+
if (ent.isDirectory()) {
|
|
474
|
+
if (!SCAN_SKIP_DIRS.has(ent.name))
|
|
475
|
+
walk(full, depth + 1);
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
if (!ent.isFile())
|
|
479
|
+
continue;
|
|
480
|
+
const rel = relative(home, full);
|
|
481
|
+
if (!SECRETISH_RE.test(rel))
|
|
482
|
+
continue;
|
|
483
|
+
if (seen.has(full))
|
|
484
|
+
continue;
|
|
485
|
+
try {
|
|
486
|
+
const m = statSync(full).mode;
|
|
487
|
+
if ((m & 0o077) !== 0) {
|
|
488
|
+
seen.add(full);
|
|
489
|
+
issues.push({
|
|
490
|
+
path: full,
|
|
491
|
+
kind: 'file',
|
|
492
|
+
mode: octal(m),
|
|
493
|
+
fix: `chmod 600 ${full}`,
|
|
494
|
+
detail: 'looks like a secret file and is group/world-readable',
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
catch {
|
|
499
|
+
// ignore unreadable entry
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
};
|
|
503
|
+
if (existsSync(home))
|
|
504
|
+
walk(home, 0);
|
|
505
|
+
return issues;
|
|
506
|
+
}
|
|
507
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/lib/secrets.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/seed.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export interface InitOptions {
|
|
|
4
4
|
now?: () => Date;
|
|
5
5
|
/** Unpack the bundled sample seed (a redacted single-session corpus). */
|
|
6
6
|
fromSample?: boolean;
|
|
7
|
+
/** Env for resolving the user-level config overlay (tests pass COMPOST_HOME). */
|
|
8
|
+
env?: NodeJS.ProcessEnv;
|
|
7
9
|
}
|
|
8
10
|
export interface InitResult {
|
|
9
11
|
seed_name: string;
|
|
@@ -11,6 +13,9 @@ export interface InitResult {
|
|
|
11
13
|
created_at: string;
|
|
12
14
|
files: string[];
|
|
13
15
|
directories: string[];
|
|
16
|
+
/** Non-fatal foot-gun notices, e.g. running init from inside a Seeds/ folder
|
|
17
|
+
* (which nests Seeds/Seeds/ — #241). Empty when nothing looks off. */
|
|
18
|
+
warnings: string[];
|
|
14
19
|
}
|
|
15
20
|
export declare function initSeed(name: string, opts?: InitOptions): InitResult;
|
|
16
21
|
//# sourceMappingURL=seed.d.ts.map
|
package/dist/lib/seed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/lib/seed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/lib/seed.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;IAChB,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB;0EACsE;IACtE,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CAuEzE"}
|
package/dist/lib/seed.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { cpSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { dirname, join, resolve } from 'node:path';
|
|
2
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { CompostError } from '../errors.js';
|
|
5
5
|
import { loadTemplate, render } from './templates.js';
|
|
6
|
+
import { applyUserConfig, loadUserConfig } from './userConfig.js';
|
|
6
7
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
8
|
// templates/ is a sibling of src/ and dist/ (lib/ → ../../templates).
|
|
8
9
|
const SAMPLE_SEED_DIR = join(__dirname, '..', '..', 'templates', 'sample-seed');
|
|
@@ -39,10 +40,14 @@ export function initSeed(name, opts = {}) {
|
|
|
39
40
|
createdDirs.push(dir);
|
|
40
41
|
}
|
|
41
42
|
const vars = { seed_name: name, created_at: createdAt };
|
|
43
|
+
// The setup wizard's machine-wide answers (model routing, provider tweaks)
|
|
44
|
+
// overlay the template, so a new seed starts with routes that actually
|
|
45
|
+
// resolve on this machine instead of the template's guesses.
|
|
46
|
+
const configToml = applyUserConfig(render(loadTemplate('config.toml'), vars), loadUserConfig(opts.env ?? process.env));
|
|
42
47
|
const files = [
|
|
43
48
|
{ path: 'seed.md', content: render(loadTemplate('seed.md'), vars) },
|
|
44
49
|
{ path: '.compost/AGENTS.md', content: render(loadTemplate('AGENTS.md'), vars) },
|
|
45
|
-
{ path: '.compost/config.toml', content:
|
|
50
|
+
{ path: '.compost/config.toml', content: configToml },
|
|
46
51
|
];
|
|
47
52
|
for (const file of files) {
|
|
48
53
|
writeFileSync(join(seedPath, file.path), file.content, 'utf8');
|
|
@@ -53,12 +58,20 @@ export function initSeed(name, opts = {}) {
|
|
|
53
58
|
if (opts.fromSample === true) {
|
|
54
59
|
cpSync(SAMPLE_SEED_DIR, seedPath, { recursive: true });
|
|
55
60
|
}
|
|
61
|
+
const warnings = [];
|
|
62
|
+
if (basename(cwd) === 'Seeds') {
|
|
63
|
+
// Init always scaffolds <cwd>/Seeds/<name>; run from inside a folder named
|
|
64
|
+
// Seeds that nests Seeds/Seeds/ — almost always a walkthrough mistake, and
|
|
65
|
+
// hand-moving the seed afterwards strands its job queue (#241, #240).
|
|
66
|
+
warnings.push(`the current folder is itself named Seeds, so the seed was created at ${seedPath} (note the nested Seeds/Seeds/). If you meant ${resolve(cwd, name)}, remove the new tree and rerun compost init from ${resolve(cwd, '..')}.`);
|
|
67
|
+
}
|
|
56
68
|
return {
|
|
57
69
|
seed_name: name,
|
|
58
70
|
path: seedPath,
|
|
59
71
|
created_at: createdAt,
|
|
60
72
|
files: files.map((f) => f.path),
|
|
61
73
|
directories: createdDirs,
|
|
74
|
+
warnings,
|
|
62
75
|
};
|
|
63
76
|
}
|
|
64
77
|
//# sourceMappingURL=seed.js.map
|
package/dist/lib/seed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/lib/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/lib/seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seedResolve.d.ts","sourceRoot":"","sources":["../../src/lib/seedResolve.ts"],"names":[],"mappings":"AA+CA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"seedResolve.d.ts","sourceRoot":"","sources":["../../src/lib/seedResolve.ts"],"names":[],"mappings":"AA+CA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BlE"}
|
package/dist/lib/seedResolve.js
CHANGED
|
@@ -61,6 +61,7 @@ export function resolveSeedPath(cwd, seed) {
|
|
|
61
61
|
if (entries.length > 1) {
|
|
62
62
|
throw new CompostError('INVALID_INPUT', `Multiple seeds under ${root} (${entries.join(', ')}). Pass --seed <name>.`);
|
|
63
63
|
}
|
|
64
|
+
// biome-ignore lint/style/noNonNullAssertion: prior guards throw for length 0 and >1, so entries has exactly one element here
|
|
64
65
|
return resolve(root, entries[0]);
|
|
65
66
|
}
|
|
66
67
|
//# sourceMappingURL=seedResolve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seedResolve.js","sourceRoot":"","sources":["../../src/lib/seedResolve.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"seedResolve.js","sourceRoot":"","sources":["../../src/lib/seedResolve.ts"],"names":[],"mappings":"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"}
|