@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.
Files changed (242) hide show
  1. package/dist/commands/agreement.d.ts +3 -0
  2. package/dist/commands/agreement.d.ts.map +1 -0
  3. package/dist/commands/agreement.js +35 -0
  4. package/dist/commands/agreement.js.map +1 -0
  5. package/dist/commands/create.d.ts +1 -0
  6. package/dist/commands/create.d.ts.map +1 -1
  7. package/dist/commands/create.js +39 -1
  8. package/dist/commands/create.js.map +1 -1
  9. package/dist/commands/export.d.ts.map +1 -1
  10. package/dist/commands/export.js +47 -4
  11. package/dist/commands/export.js.map +1 -1
  12. package/dist/commands/import.d.ts +3 -0
  13. package/dist/commands/import.d.ts.map +1 -0
  14. package/dist/commands/import.js +59 -0
  15. package/dist/commands/import.js.map +1 -0
  16. package/dist/commands/init.d.ts.map +1 -1
  17. package/dist/commands/init.js +1 -0
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/jobs.d.ts +3 -0
  20. package/dist/commands/jobs.d.ts.map +1 -0
  21. package/dist/commands/jobs.js +105 -0
  22. package/dist/commands/jobs.js.map +1 -0
  23. package/dist/commands/label.d.ts +3 -0
  24. package/dist/commands/label.d.ts.map +1 -0
  25. package/dist/commands/label.js +67 -0
  26. package/dist/commands/label.js.map +1 -0
  27. package/dist/commands/models.d.ts.map +1 -1
  28. package/dist/commands/models.js +2 -1
  29. package/dist/commands/models.js.map +1 -1
  30. package/dist/commands/recode.d.ts +3 -0
  31. package/dist/commands/recode.d.ts.map +1 -0
  32. package/dist/commands/recode.js +60 -0
  33. package/dist/commands/recode.js.map +1 -0
  34. package/dist/commands/reindex.d.ts.map +1 -1
  35. package/dist/commands/reindex.js +6 -4
  36. package/dist/commands/reindex.js.map +1 -1
  37. package/dist/commands/rerun.d.ts +3 -0
  38. package/dist/commands/rerun.d.ts.map +1 -0
  39. package/dist/commands/rerun.js +91 -0
  40. package/dist/commands/rerun.js.map +1 -0
  41. package/dist/commands/search.d.ts.map +1 -1
  42. package/dist/commands/search.js +2 -1
  43. package/dist/commands/search.js.map +1 -1
  44. package/dist/commands/secrets.d.ts +3 -0
  45. package/dist/commands/secrets.d.ts.map +1 -0
  46. package/dist/commands/secrets.js +143 -0
  47. package/dist/commands/secrets.js.map +1 -0
  48. package/dist/commands/setup.d.ts.map +1 -1
  49. package/dist/commands/setup.js +90 -1
  50. package/dist/commands/setup.js.map +1 -1
  51. package/dist/commands/status.d.ts.map +1 -1
  52. package/dist/commands/status.js +2 -1
  53. package/dist/commands/status.js.map +1 -1
  54. package/dist/commands/transcribe.d.ts.map +1 -1
  55. package/dist/commands/transcribe.js +13 -2
  56. package/dist/commands/transcribe.js.map +1 -1
  57. package/dist/commands/validate.d.ts.map +1 -1
  58. package/dist/commands/validate.js +29 -1
  59. package/dist/commands/validate.js.map +1 -1
  60. package/dist/engine.d.ts +23 -0
  61. package/dist/engine.d.ts.map +1 -0
  62. package/dist/engine.js +32 -0
  63. package/dist/engine.js.map +1 -0
  64. package/dist/exporters/prov.d.ts +11 -0
  65. package/dist/exporters/prov.d.ts.map +1 -0
  66. package/dist/exporters/prov.js +151 -0
  67. package/dist/exporters/prov.js.map +1 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +6 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/lib/agreement.d.ts +77 -0
  72. package/dist/lib/agreement.d.ts.map +1 -0
  73. package/dist/lib/agreement.js +261 -0
  74. package/dist/lib/agreement.js.map +1 -0
  75. package/dist/lib/artifacts.d.ts +32 -1
  76. package/dist/lib/artifacts.d.ts.map +1 -1
  77. package/dist/lib/artifacts.js +156 -22
  78. package/dist/lib/artifacts.js.map +1 -1
  79. package/dist/lib/blame.d.ts.map +1 -1
  80. package/dist/lib/blame.js +3 -2
  81. package/dist/lib/blame.js.map +1 -1
  82. package/dist/lib/config.d.ts +3 -0
  83. package/dist/lib/config.d.ts.map +1 -1
  84. package/dist/lib/config.js.map +1 -1
  85. package/dist/lib/doctor.d.ts +3 -0
  86. package/dist/lib/doctor.d.ts.map +1 -1
  87. package/dist/lib/doctor.js +24 -1
  88. package/dist/lib/doctor.js.map +1 -1
  89. package/dist/lib/events.d.ts +34 -1
  90. package/dist/lib/events.d.ts.map +1 -1
  91. package/dist/lib/events.js +35 -1
  92. package/dist/lib/events.js.map +1 -1
  93. package/dist/lib/importTranscript.d.ts +16 -0
  94. package/dist/lib/importTranscript.d.ts.map +1 -0
  95. package/dist/lib/importTranscript.js +94 -0
  96. package/dist/lib/importTranscript.js.map +1 -0
  97. package/dist/lib/ingest.d.ts.map +1 -1
  98. package/dist/lib/ingest.js +12 -6
  99. package/dist/lib/ingest.js.map +1 -1
  100. package/dist/lib/journal.d.ts +13 -0
  101. package/dist/lib/journal.d.ts.map +1 -1
  102. package/dist/lib/journal.js +58 -2
  103. package/dist/lib/journal.js.map +1 -1
  104. package/dist/lib/legacyNative.d.ts +24 -0
  105. package/dist/lib/legacyNative.d.ts.map +1 -0
  106. package/dist/lib/legacyNative.js +51 -0
  107. package/dist/lib/legacyNative.js.map +1 -0
  108. package/dist/lib/migrate.d.ts.map +1 -1
  109. package/dist/lib/migrate.js +1 -0
  110. package/dist/lib/migrate.js.map +1 -1
  111. package/dist/lib/nativeRuntime.d.ts +6 -3
  112. package/dist/lib/nativeRuntime.d.ts.map +1 -1
  113. package/dist/lib/nativeRuntime.js +6 -3
  114. package/dist/lib/nativeRuntime.js.map +1 -1
  115. package/dist/lib/provisionNative.js +1 -1
  116. package/dist/lib/provisionNative.js.map +1 -1
  117. package/dist/lib/queue.d.ts +25 -0
  118. package/dist/lib/queue.d.ts.map +1 -1
  119. package/dist/lib/queue.js +70 -3
  120. package/dist/lib/queue.js.map +1 -1
  121. package/dist/lib/reads.d.ts +24 -0
  122. package/dist/lib/reads.d.ts.map +1 -0
  123. package/dist/lib/reads.js +115 -0
  124. package/dist/lib/reads.js.map +1 -0
  125. package/dist/lib/recode.d.ts +19 -0
  126. package/dist/lib/recode.d.ts.map +1 -0
  127. package/dist/lib/recode.js +43 -0
  128. package/dist/lib/recode.js.map +1 -0
  129. package/dist/lib/rerun.d.ts +51 -0
  130. package/dist/lib/rerun.d.ts.map +1 -0
  131. package/dist/lib/rerun.js +166 -0
  132. package/dist/lib/rerun.js.map +1 -0
  133. package/dist/lib/retrieve.d.ts +8 -4
  134. package/dist/lib/retrieve.d.ts.map +1 -1
  135. package/dist/lib/retrieve.js +12 -10
  136. package/dist/lib/retrieve.js.map +1 -1
  137. package/dist/lib/schemas.generated.d.ts.map +1 -1
  138. package/dist/lib/schemas.generated.js +28 -0
  139. package/dist/lib/schemas.generated.js.map +1 -1
  140. package/dist/lib/secrets.d.ts +158 -0
  141. package/dist/lib/secrets.d.ts.map +1 -0
  142. package/dist/lib/secrets.js +507 -0
  143. package/dist/lib/secrets.js.map +1 -0
  144. package/dist/lib/seed.d.ts +5 -0
  145. package/dist/lib/seed.d.ts.map +1 -1
  146. package/dist/lib/seed.js +15 -2
  147. package/dist/lib/seed.js.map +1 -1
  148. package/dist/lib/seedResolve.d.ts.map +1 -1
  149. package/dist/lib/seedResolve.js +1 -0
  150. package/dist/lib/seedResolve.js.map +1 -1
  151. package/dist/lib/session.d.ts +14 -0
  152. package/dist/lib/session.d.ts.map +1 -1
  153. package/dist/lib/session.js +47 -0
  154. package/dist/lib/session.js.map +1 -1
  155. package/dist/lib/setup.d.ts +5 -0
  156. package/dist/lib/setup.d.ts.map +1 -1
  157. package/dist/lib/setup.js +78 -14
  158. package/dist/lib/setup.js.map +1 -1
  159. package/dist/lib/setupWizard.d.ts +51 -0
  160. package/dist/lib/setupWizard.d.ts.map +1 -0
  161. package/dist/lib/setupWizard.js +223 -0
  162. package/dist/lib/setupWizard.js.map +1 -0
  163. package/dist/lib/snap.d.ts.map +1 -1
  164. package/dist/lib/snap.js +2 -5
  165. package/dist/lib/snap.js.map +1 -1
  166. package/dist/lib/speakers.d.ts +41 -0
  167. package/dist/lib/speakers.d.ts.map +1 -0
  168. package/dist/lib/speakers.js +78 -0
  169. package/dist/lib/speakers.js.map +1 -0
  170. package/dist/lib/status.d.ts.map +1 -1
  171. package/dist/lib/status.js +21 -0
  172. package/dist/lib/status.js.map +1 -1
  173. package/dist/lib/userConfig.d.ts +22 -0
  174. package/dist/lib/userConfig.d.ts.map +1 -0
  175. package/dist/lib/userConfig.js +67 -0
  176. package/dist/lib/userConfig.js.map +1 -0
  177. package/dist/lib/validate.d.ts +18 -0
  178. package/dist/lib/validate.d.ts.map +1 -1
  179. package/dist/lib/validate.js +70 -1
  180. package/dist/lib/validate.js.map +1 -1
  181. package/dist/lib/version.d.ts +30 -0
  182. package/dist/lib/version.d.ts.map +1 -0
  183. package/dist/lib/version.js +73 -0
  184. package/dist/lib/version.js.map +1 -0
  185. package/dist/llm/adapter.d.ts.map +1 -1
  186. package/dist/llm/adapter.js +2 -0
  187. package/dist/llm/adapter.js.map +1 -1
  188. package/dist/llm/providers/ollama.d.ts.map +1 -1
  189. package/dist/llm/providers/ollama.js +6 -0
  190. package/dist/llm/providers/ollama.js.map +1 -1
  191. package/dist/loops/ingest_watcher.d.ts.map +1 -1
  192. package/dist/loops/ingest_watcher.js +6 -3
  193. package/dist/loops/ingest_watcher.js.map +1 -1
  194. package/dist/loops/legacy_worker.d.ts +28 -1
  195. package/dist/loops/legacy_worker.d.ts.map +1 -1
  196. package/dist/loops/legacy_worker.js +81 -9
  197. package/dist/loops/legacy_worker.js.map +1 -1
  198. package/dist/loops/supervisor.d.ts +3 -0
  199. package/dist/loops/supervisor.d.ts.map +1 -1
  200. package/dist/loops/supervisor.js +12 -0
  201. package/dist/loops/supervisor.js.map +1 -1
  202. package/dist/loops/synthesis.d.ts.map +1 -1
  203. package/dist/loops/synthesis.js +15 -0
  204. package/dist/loops/synthesis.js.map +1 -1
  205. package/dist/loops/transcribe_worker.d.ts.map +1 -1
  206. package/dist/loops/transcribe_worker.js +2 -4
  207. package/dist/loops/transcribe_worker.js.map +1 -1
  208. package/dist/output.d.ts +13 -1
  209. package/dist/output.d.ts.map +1 -1
  210. package/dist/output.js +22 -2
  211. package/dist/output.js.map +1 -1
  212. package/dist/render/human.d.ts +20 -0
  213. package/dist/render/human.d.ts.map +1 -0
  214. package/dist/render/human.js +54 -0
  215. package/dist/render/human.js.map +1 -0
  216. package/dist/router.d.ts.map +1 -1
  217. package/dist/router.js +17 -2
  218. package/dist/router.js.map +1 -1
  219. package/package.json +18 -5
  220. package/templates/config.toml +6 -1
  221. package/transcriber/app/__init__.py +3 -0
  222. package/transcriber/app/asr.py +198 -0
  223. package/transcriber/app/asr_parakeet.py +174 -0
  224. package/transcriber/app/cue_parser.py +110 -0
  225. package/transcriber/app/diarization.py +330 -0
  226. package/transcriber/app/frame_annotation.py +77 -0
  227. package/transcriber/app/frames.py +130 -0
  228. package/transcriber/app/health.py +70 -0
  229. package/transcriber/app/legacy.py +355 -0
  230. package/transcriber/app/legacy_cli.py +90 -0
  231. package/transcriber/app/main.py +30 -0
  232. package/transcriber/app/pipeline.py +210 -0
  233. package/transcriber/app/pptx_export.py +42 -0
  234. package/transcriber/app/prosody.py +128 -0
  235. package/transcriber/app/routes/__init__.py +1 -0
  236. package/transcriber/app/routes/legacy.py +117 -0
  237. package/transcriber/app/routes/transcribe.py +133 -0
  238. package/transcriber/app/shot_change.py +74 -0
  239. package/transcriber/app/silence_typer.py +144 -0
  240. package/transcriber/app/transcribe_cli.py +82 -0
  241. package/transcriber/app/vad.py +216 -0
  242. 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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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/lib/seed.ts"],"names":[],"mappings":"AA0BA,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;CACrB;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;CACtB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CAqDzE"}
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: render(loadTemplate('config.toml'), vars) },
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
@@ -1 +1 @@
1
- {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/lib/seed.ts"],"names":[],"mappings":"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"}
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,CAyBlE"}
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"}
@@ -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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"}