@heyditto/cli 2.13.0 → 2.14.0

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.
@@ -0,0 +1,449 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile, readdir, stat } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { parse as parseToml } from "smol-toml";
5
+ import { CONFIG_FILE, DITTO_CONFIG_VERSION, DITTO_DIR, ENDPOINTS_DIR, LOCAL_FILE, MISE_FILE, SECRET_REF_PREFIX, defaults, } from "./types.js";
6
+ /** A single, user-fixable problem in a `.ditto/` document. Mirrors Go's ValidationError. */
7
+ export class DittoConfigError extends Error {
8
+ file;
9
+ field;
10
+ constructor(message, file, field) {
11
+ super(`dittoconfig: ${file ? `${file}: ` : ""}${field ? `${field}: ` : ""}${message}`);
12
+ this.file = file;
13
+ this.field = field;
14
+ this.name = "DittoConfigError";
15
+ }
16
+ }
17
+ export class DittoConfigNotFound extends Error {
18
+ dir;
19
+ constructor(dir) {
20
+ super(`no ${DITTO_DIR}/${CONFIG_FILE} in ${dir}`);
21
+ this.dir = dir;
22
+ this.name = "DittoConfigNotFound";
23
+ }
24
+ }
25
+ const TOP_LEVEL = new Set(["repository", "teleport", "environment", "tasks", "policy"]);
26
+ /** TOML snake_case keys → the camelCase field names used by the JSON schema and the Go types. */
27
+ const KEY_MAP = {
28
+ default_endpoint: "defaultEndpoint",
29
+ api_base: "apiBase",
30
+ capture_roots: "captureRoots",
31
+ required_mirrors: "requiredMirrors",
32
+ mise_config: "miseConfig",
33
+ max_attempts: "maxAttempts",
34
+ install_only: "installOnly",
35
+ };
36
+ const KNOWN_KEYS = {
37
+ repository: new Set(["name", "default_endpoint", "bindings"]),
38
+ "repository.bindings.*": new Set(["api_base"]),
39
+ teleport: new Set(["capture_roots", "exclude", "include", "harness", "required_mirrors", "offload"]),
40
+ "teleport.harness": new Set(["kind", "session"]),
41
+ "teleport.offload": new Set(["unpushed", "destination"]),
42
+ environment: new Set(["mise_config", "services", "vars", "secrets"]),
43
+ "environment.services[]": new Set(["name", "image", "command", "port", "healthcheck"]),
44
+ tasks: new Set(["setup", "build", "test", "lint", "dev"]),
45
+ policy: new Set(["repair"]),
46
+ "policy.repair": new Set(["max_attempts", "install_only"]),
47
+ };
48
+ const ENDPOINT_KEYS = new Set(["managed", "name", "slug", "description", "model", "fallbacks", "settings"]);
49
+ /** Loads `.ditto/` for a repository with the same layering and validation as the backend. */
50
+ export async function loadDittoConfig(repoDir, opts = {}) {
51
+ const sources = {};
52
+ for (const t of TOP_LEVEL)
53
+ sources[t] = { layer: "default" };
54
+ const layers = [];
55
+ if (opts.workspaceDir)
56
+ layers.push({ layer: "workspace", dir: opts.workspaceDir, file: CONFIG_FILE });
57
+ layers.push({ layer: "repo", dir: repoDir, file: CONFIG_FILE }, { layer: "local", dir: repoDir, file: LOCAL_FILE });
58
+ const merged = {};
59
+ const contributing = [];
60
+ const warnings = [];
61
+ let found = false;
62
+ for (const l of layers) {
63
+ const file = path.join(l.dir, DITTO_DIR, l.file);
64
+ let raw;
65
+ try {
66
+ raw = await readFile(file, "utf8");
67
+ }
68
+ catch (err) {
69
+ if (err.code === "ENOENT")
70
+ continue;
71
+ throw err;
72
+ }
73
+ if (l.layer === "repo")
74
+ found = true;
75
+ let doc;
76
+ try {
77
+ doc = parseToml(raw);
78
+ }
79
+ catch (err) {
80
+ throw new DittoConfigError(`invalid TOML: ${err.message}`, file);
81
+ }
82
+ checkKnownKeys(file, doc);
83
+ if (l.layer !== "local") {
84
+ if (!("version" in doc))
85
+ throw new DittoConfigError("missing; set version = 1", file, "version");
86
+ if (doc.version !== DITTO_CONFIG_VERSION) {
87
+ throw new DittoConfigError(`unsupported schema version ${String(doc.version)} (this tool understands ${DITTO_CONFIG_VERSION})`, file, "version");
88
+ }
89
+ }
90
+ delete doc.version;
91
+ deepMerge(merged, doc);
92
+ contributing.push(l.layer);
93
+ for (const k of Object.keys(doc))
94
+ sources[k] = { layer: l.layer, path: file };
95
+ if (l.layer === "local" && !(await gitIgnored(repoDir, `${DITTO_DIR}/${LOCAL_FILE}`))) {
96
+ warnings.push(`${DITTO_DIR}/${LOCAL_FILE} is not git-ignored; machine-local overrides should never be committed`);
97
+ }
98
+ }
99
+ if (!found && !opts.workspaceDir)
100
+ throw new DittoConfigNotFound(repoDir);
101
+ const config = toConfig(merged);
102
+ if (opts.overrides && Object.keys(opts.overrides).length > 0) {
103
+ for (const [k, v] of Object.entries(opts.overrides).sort()) {
104
+ applyOverride(config, k, v);
105
+ sources[k.split(".")[0]] = { layer: "override" };
106
+ }
107
+ contributing.push("override");
108
+ }
109
+ const endpoints = await loadEndpoints(repoDir, sources);
110
+ const misePath = await resolveMise(repoDir, config.environment.miseConfig);
111
+ const eff = { config, endpoints, misePath, sources, layers: contributing, warnings };
112
+ validateEffective(eff);
113
+ if (!config.repository.name)
114
+ config.repository.name = slugify(path.basename(path.resolve(repoDir)));
115
+ return eff;
116
+ }
117
+ /** Digest identical to the Go package's: sha256 of the canonical JSON of {config, endpoints, misePath}. */
118
+ export function digest(eff) {
119
+ const canon = { config: eff.config, endpoints: Object.keys(eff.endpoints).length ? eff.endpoints : undefined, misePath: eff.misePath || undefined };
120
+ return createHash("sha256").update(canonicalJson(canon)).digest("hex");
121
+ }
122
+ export function summarize(eff) {
123
+ const out = { version: DITTO_CONFIG_VERSION, digest: digest(eff) };
124
+ if (eff.misePath)
125
+ out.misePath = eff.misePath;
126
+ if (eff.layers.length)
127
+ out.layers = [...eff.layers];
128
+ return out;
129
+ }
130
+ // ---------------------------------------------------------------------------
131
+ function checkKnownKeys(file, doc) {
132
+ for (const k of Object.keys(doc)) {
133
+ if (k !== "version" && !TOP_LEVEL.has(k)) {
134
+ throw new DittoConfigError("unknown top-level table (known: repository, teleport, environment, tasks, policy)", file, k);
135
+ }
136
+ }
137
+ const check = (prefix, schemaKey, table) => {
138
+ if (!isTable(table))
139
+ return;
140
+ const known = KNOWN_KEYS[schemaKey];
141
+ if (!known)
142
+ return;
143
+ for (const k of Object.keys(table)) {
144
+ if (!known.has(k))
145
+ throw new DittoConfigError("unknown key", file, `${prefix}.${k}`);
146
+ }
147
+ };
148
+ check("repository", "repository", doc.repository);
149
+ if (isTable(doc.repository) && isTable(doc.repository.bindings)) {
150
+ for (const [label, b] of Object.entries(doc.repository.bindings))
151
+ check(`repository.bindings.${label}`, "repository.bindings.*", b);
152
+ }
153
+ check("teleport", "teleport", doc.teleport);
154
+ if (isTable(doc.teleport)) {
155
+ check("teleport.harness", "teleport.harness", doc.teleport.harness);
156
+ check("teleport.offload", "teleport.offload", doc.teleport.offload);
157
+ }
158
+ check("environment", "environment", doc.environment);
159
+ if (isTable(doc.environment) && Array.isArray(doc.environment.services)) {
160
+ doc.environment.services.forEach((s, i) => check(`environment.services[${i}]`, "environment.services[]", s));
161
+ }
162
+ check("tasks", "tasks", doc.tasks);
163
+ check("policy", "policy", doc.policy);
164
+ if (isTable(doc.policy))
165
+ check("policy.repair", "policy.repair", doc.policy.repair);
166
+ }
167
+ function isTable(v) {
168
+ return typeof v === "object" && v !== null && !Array.isArray(v) && !(v instanceof Date);
169
+ }
170
+ /** Nested tables merge by key; scalars and arrays are replaced by the higher layer. */
171
+ function deepMerge(dst, src) {
172
+ for (const [k, v] of Object.entries(src)) {
173
+ const d = dst[k];
174
+ if (isTable(v) && isTable(d)) {
175
+ deepMerge(d, v);
176
+ continue;
177
+ }
178
+ dst[k] = v;
179
+ }
180
+ }
181
+ function camel(table) {
182
+ const out = {};
183
+ for (const [k, v] of Object.entries(table)) {
184
+ const key = KEY_MAP[k] ?? k;
185
+ if (k === "bindings" && isTable(v)) {
186
+ // Labels are user data (kept verbatim); each binding's own keys are schema keys.
187
+ out[key] = Object.fromEntries(Object.entries(v).map(([label, b]) => [label, isTable(b) ? camel(b) : b]));
188
+ continue;
189
+ }
190
+ out[key] = isTable(v) && !isEnvMap(k) ? camel(v) : Array.isArray(v) ? v.map((x) => (isTable(x) ? camel(x) : x)) : v;
191
+ }
192
+ return out;
193
+ }
194
+ /** Tables whose keys are user data, not schema keys: never renamed. */
195
+ function isEnvMap(key) {
196
+ return key === "vars" || key === "secrets" || key === "settings";
197
+ }
198
+ function toConfig(merged) {
199
+ const base = defaults();
200
+ const c = camel(merged);
201
+ const config = {
202
+ version: DITTO_CONFIG_VERSION,
203
+ repository: { ...base.repository, ...(c.repository ?? {}) },
204
+ teleport: {
205
+ ...base.teleport,
206
+ ...(c.teleport ?? {}),
207
+ harness: { ...base.teleport.harness, ...c.teleport?.harness },
208
+ offload: { ...base.teleport.offload, ...c.teleport?.offload },
209
+ },
210
+ environment: { ...base.environment, ...(c.environment ?? {}) },
211
+ tasks: { ...base.tasks, ...(c.tasks ?? {}) },
212
+ policy: { repair: { ...base.policy.repair, ...c.policy?.repair } },
213
+ };
214
+ return config;
215
+ }
216
+ function applyOverride(c, key, value) {
217
+ switch (key) {
218
+ case "repository.default_endpoint":
219
+ c.repository.defaultEndpoint = value;
220
+ break;
221
+ case "teleport.harness.kind":
222
+ c.teleport.harness.kind = value;
223
+ break;
224
+ case "teleport.harness.session":
225
+ c.teleport.harness.session = value;
226
+ break;
227
+ case "teleport.offload.unpushed":
228
+ c.teleport.offload.unpushed = value;
229
+ break;
230
+ case "teleport.offload.destination":
231
+ c.teleport.offload.destination = value;
232
+ break;
233
+ case "environment.mise_config":
234
+ c.environment.miseConfig = value;
235
+ break;
236
+ default:
237
+ throw new DittoConfigError("unsupported override key", undefined, key);
238
+ }
239
+ }
240
+ async function loadEndpoints(repoDir, sources) {
241
+ const dir = path.join(repoDir, DITTO_DIR, ENDPOINTS_DIR);
242
+ let entries;
243
+ try {
244
+ entries = (await readdir(dir)).filter((n) => n.endsWith(".toml")).sort();
245
+ }
246
+ catch (err) {
247
+ if (err.code === "ENOENT")
248
+ return {};
249
+ throw err;
250
+ }
251
+ const out = {};
252
+ for (const name of entries) {
253
+ const file = path.join(dir, name);
254
+ let doc;
255
+ try {
256
+ doc = parseToml(await readFile(file, "utf8"));
257
+ }
258
+ catch (err) {
259
+ throw new DittoConfigError(`invalid TOML: ${err.message}`, file);
260
+ }
261
+ for (const k of Object.keys(doc)) {
262
+ if (!ENDPOINT_KEYS.has(k))
263
+ throw new DittoConfigError("unknown key; put endpoint settings under [settings]", file, k);
264
+ }
265
+ const ep = doc;
266
+ if (!ep.name)
267
+ ep.name = name.replace(/\.toml$/, "");
268
+ if (out[ep.name])
269
+ throw new DittoConfigError(`duplicate endpoint name ${ep.name}`, file, "name");
270
+ out[ep.name] = ep;
271
+ sources[`endpoints.${ep.name}`] = { layer: "repo", path: file };
272
+ }
273
+ return out;
274
+ }
275
+ async function exists(p) {
276
+ return stat(p).then(() => true, () => false);
277
+ }
278
+ async function resolveMise(repoDir, declared) {
279
+ const inDitto = `${DITTO_DIR}/${MISE_FILE}`;
280
+ if (declared) {
281
+ if (!(await exists(path.join(repoDir, declared)))) {
282
+ throw new DittoConfigError(`${declared} does not exist`, undefined, "environment.mise_config");
283
+ }
284
+ return declared.split(path.sep).join("/");
285
+ }
286
+ const a = await exists(path.join(repoDir, inDitto));
287
+ const b = await exists(path.join(repoDir, MISE_FILE));
288
+ if (a && b) {
289
+ throw new DittoConfigError("both .ditto/mise.toml and mise.toml exist; set environment.mise_config to the one Ditto should use", undefined, "environment.mise_config");
290
+ }
291
+ return a ? inDitto : b ? MISE_FILE : "";
292
+ }
293
+ async function gitIgnored(repoDir, rel) {
294
+ for (const f of [".gitignore", `${DITTO_DIR}/.gitignore`]) {
295
+ let raw;
296
+ try {
297
+ raw = await readFile(path.join(repoDir, f), "utf8");
298
+ }
299
+ catch {
300
+ continue;
301
+ }
302
+ for (let line of raw.split("\n")) {
303
+ line = line.trim();
304
+ if (!line || line.startsWith("#"))
305
+ continue;
306
+ const l = line.replace(/^\//, "");
307
+ if (l === rel || l === path.basename(rel) || (f !== ".gitignore" && l === LOCAL_FILE))
308
+ return true;
309
+ }
310
+ }
311
+ return false;
312
+ }
313
+ // ---------------------------------------------------------------------------
314
+ // Validation (same rules as Go Validate; first problem wins)
315
+ const NAME_RE = /^[a-z0-9][a-z0-9._-]{0,63}$/;
316
+ const SLUG_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
317
+ const SVC_RE = /^[a-z][a-z0-9-]{0,31}$/;
318
+ const ENV_RE = /^[A-Z_][A-Z0-9_]{0,127}$/;
319
+ const SECRET_KEY_RE = /(^|[_.-])(key|token|secret|password|passwd|credential|apikey)s?([_.-]|$)|_?(api_?key|auth_?token)$/i;
320
+ const MIRROR_RE = /^(ditto-primary|ditto-secondary|user:[a-z0-9-]{1,64}|[a-z0-9][a-z0-9._-]{0,63})$/;
321
+ export function validateEffective(eff) {
322
+ const c = eff.config;
323
+ const fail = (field, msg) => {
324
+ throw new DittoConfigError(msg, undefined, field);
325
+ };
326
+ if (c.version !== DITTO_CONFIG_VERSION)
327
+ fail("version", `unsupported schema version ${c.version}`);
328
+ if (c.repository.name && !NAME_RE.test(c.repository.name))
329
+ fail("repository.name", "must be a lowercase slug (a-z 0-9 . _ -), max 64 chars");
330
+ for (const [label, b] of Object.entries(c.repository.bindings ?? {})) {
331
+ if (!SLUG_RE.test(label))
332
+ fail(`repository.bindings.${label}`, "environment label must be a lowercase slug");
333
+ const u = b?.apiBase ?? "";
334
+ if (!(u.startsWith("https://") || u.startsWith("http://localhost") || u.startsWith("http://127.0.0.1"))) {
335
+ fail(`repository.bindings.${label}.api_base`, "must be an https origin (http only for localhost)");
336
+ }
337
+ }
338
+ (c.teleport.captureRoots ?? []).forEach((p, i) => safeRelPath(p, `teleport.capture_roots[${i}]`));
339
+ (c.teleport.exclude ?? []).forEach((p, i) => safePattern(p, `teleport.exclude[${i}]`));
340
+ (c.teleport.include ?? []).forEach((p, i) => safePattern(p, `teleport.include[${i}]`));
341
+ if (!["auto", "claude-code", "codex", "none"].includes(c.teleport.harness.kind))
342
+ fail("teleport.harness.kind", "must be auto, claude-code, codex or none");
343
+ if (!["latest", "explicit"].includes(c.teleport.harness.session))
344
+ fail("teleport.harness.session", "must be latest or explicit");
345
+ if (!["refuse", "acknowledge"].includes(c.teleport.offload.unpushed))
346
+ fail("teleport.offload.unpushed", "must be refuse or acknowledge");
347
+ (c.teleport.requiredMirrors ?? []).forEach((m, i) => {
348
+ if (!MIRROR_RE.test(m))
349
+ fail(`teleport.required_mirrors[${i}]`, "must be ditto-primary, ditto-secondary, user:<bucket id> or a bucket name");
350
+ });
351
+ if (c.environment.miseConfig)
352
+ safeRelPath(c.environment.miseConfig, "environment.mise_config");
353
+ const seen = new Set();
354
+ (c.environment.services ?? []).forEach((s, i) => {
355
+ if (!SVC_RE.test(s.name ?? ""))
356
+ fail(`environment.services[${i}].name`, "must be a lowercase slug starting with a letter, max 32 chars");
357
+ if (seen.has(s.name))
358
+ fail(`environment.services[${i}].name`, `duplicate service ${s.name}`);
359
+ seen.add(s.name);
360
+ if (!s.image && !s.command)
361
+ fail(`environment.services[${i}]`, "set image or command");
362
+ if (s.port !== undefined && (s.port < 1 || s.port > 65535))
363
+ fail(`environment.services[${i}].port`, "must be 1..65535");
364
+ });
365
+ for (const [k, v] of Object.entries(c.environment.vars ?? {})) {
366
+ if (!ENV_RE.test(k))
367
+ fail(`environment.vars.${k}`, "must be an UPPER_SNAKE environment variable name");
368
+ if (SECRET_KEY_RE.test(k) && !isReference(String(v)))
369
+ fail(`environment.vars.${k}`, "looks like a credential; move it to [environment.secrets] as a secret:// reference");
370
+ }
371
+ for (const [k, v] of Object.entries(c.environment.secrets ?? {})) {
372
+ if (!ENV_RE.test(k))
373
+ fail(`environment.secrets.${k}`, "must be an UPPER_SNAKE environment variable name");
374
+ if (!String(v).startsWith(SECRET_REF_PREFIX))
375
+ fail(`environment.secrets.${k}`, "must be a secret:// reference to Ditto Secrets, never a literal value");
376
+ }
377
+ for (const [f, v] of Object.entries(c.tasks)) {
378
+ if (typeof v === "string" && v.startsWith("mise:") && !/^mise:[A-Za-z0-9:_.-]+$/.test(v))
379
+ fail(`tasks.${f}`, "mise task reference must be mise:<task-name>");
380
+ }
381
+ const r = c.policy.repair;
382
+ if (r.maxAttempts < 0 || r.maxAttempts > 10)
383
+ fail("policy.repair.max_attempts", "must be 0..10");
384
+ if (c.repository.defaultEndpoint && !(c.repository.defaultEndpoint in eff.endpoints) && !SLUG_RE.test(c.repository.defaultEndpoint)) {
385
+ fail("repository.default_endpoint", "must name an endpoint in .ditto/endpoints/ or an existing endpoint slug");
386
+ }
387
+ for (const [name, ep] of Object.entries(eff.endpoints)) {
388
+ if (typeof ep.managed !== "boolean")
389
+ fail(`endpoints.${name}.managed`, "required (true = managed by heyditto deploy)");
390
+ if (!NAME_RE.test(ep.name))
391
+ fail(`endpoints.${name}.name`, "must be a lowercase slug (a-z 0-9 . _ -), max 64 chars");
392
+ if (ep.slug && !SLUG_RE.test(ep.slug))
393
+ fail(`endpoints.${name}.slug`, "must be a lowercase slug (a-z 0-9 -), max 64 chars");
394
+ checkSecretLiterals(`endpoints.${name}.settings`, ep.settings ?? {});
395
+ }
396
+ }
397
+ function safeRelPath(p, field) {
398
+ if (!p)
399
+ throw new DittoConfigError("empty path", undefined, field);
400
+ if (p.startsWith("/") || p.startsWith("\\") || /^[A-Za-z]:/.test(p))
401
+ throw new DittoConfigError(`must be repository-relative, not absolute: ${p}`, undefined, field);
402
+ const clean = path.posix.normalize(p.replace(/\\/g, "/"));
403
+ if (clean === ".." || clean.startsWith("../"))
404
+ throw new DittoConfigError(`must stay inside the repository: ${p}`, undefined, field);
405
+ }
406
+ function safePattern(p, field) {
407
+ if (!p)
408
+ throw new DittoConfigError("empty pattern", undefined, field);
409
+ if (p.startsWith("/"))
410
+ throw new DittoConfigError(`patterns are repository-relative; drop the leading /: ${p}`, undefined, field);
411
+ if (p.replace(/\/$/, "").split("/").includes(".."))
412
+ throw new DittoConfigError(`must stay inside the repository: ${p}`, undefined, field);
413
+ }
414
+ function isReference(v) {
415
+ return v.startsWith(SECRET_REF_PREFIX) || (v.startsWith("${") && v.endsWith("}"));
416
+ }
417
+ function checkSecretLiterals(prefix, m) {
418
+ for (const [k, v] of Object.entries(m)) {
419
+ const field = `${prefix}.${k}`;
420
+ if (typeof v === "string") {
421
+ if (SECRET_KEY_RE.test(k) && !isReference(v))
422
+ throw new DittoConfigError("looks like a credential; use a secret:// reference", undefined, field);
423
+ }
424
+ else if (isTable(v)) {
425
+ checkSecretLiterals(field, v);
426
+ }
427
+ }
428
+ }
429
+ /** Canonical JSON: object keys sorted recursively, undefined dropped — matches Go's encoding/json map ordering for our shapes. */
430
+ export function canonicalJson(v) {
431
+ if (Array.isArray(v))
432
+ return `[${v.map(canonicalJson).join(",")}]`;
433
+ if (v !== null && typeof v === "object" && !(v instanceof Date)) {
434
+ const o = v;
435
+ const keys = Object.keys(o)
436
+ .filter((k) => o[k] !== undefined)
437
+ .sort();
438
+ return `{${keys.map((k) => `${JSON.stringify(k)}:${canonicalJson(o[k])}`).join(",")}}`;
439
+ }
440
+ return JSON.stringify(v);
441
+ }
442
+ export function slugify(s) {
443
+ const out = s
444
+ .toLowerCase()
445
+ .replace(/[^a-z0-9._-]/g, "-")
446
+ .replace(/^[-.]+|[-.]+$/g, "");
447
+ return (out || "repo").slice(0, 64);
448
+ }
449
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/dittoconfig/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Types for the `.ditto/` repository contract (schema version 1). They mirror
3
+ * backend `pkg/dittoconfig` field for field; `schema.json` next to this file is
4
+ * that package's JSON Schema export, and `schema.test` pins its checksum so a
5
+ * schema change on either side is visible.
6
+ */
7
+ export declare const DITTO_CONFIG_VERSION = 1;
8
+ export declare const DITTO_DIR = ".ditto";
9
+ export declare const CONFIG_FILE = "config.toml";
10
+ export declare const LOCAL_FILE = "local.toml";
11
+ export declare const ENDPOINTS_DIR = "endpoints";
12
+ export declare const MISE_FILE = "mise.toml";
13
+ export declare const SECRET_REF_PREFIX = "secret://";
14
+ export type HarnessKindSetting = "auto" | "claude-code" | "codex" | "none";
15
+ export type SessionSelection = "latest" | "explicit";
16
+ export type UnpushedPolicy = "refuse" | "acknowledge";
17
+ export interface Binding {
18
+ apiBase: string;
19
+ }
20
+ export interface RepositorySection {
21
+ name?: string;
22
+ defaultEndpoint?: string;
23
+ bindings?: Record<string, Binding>;
24
+ }
25
+ export interface TeleportSection {
26
+ captureRoots?: string[];
27
+ exclude?: string[];
28
+ include?: string[];
29
+ harness: {
30
+ kind: HarnessKindSetting;
31
+ session: SessionSelection;
32
+ };
33
+ requiredMirrors?: string[];
34
+ offload: {
35
+ unpushed: UnpushedPolicy;
36
+ destination?: string;
37
+ };
38
+ }
39
+ export interface ServiceDecl {
40
+ name: string;
41
+ image?: string;
42
+ command?: string;
43
+ port?: number;
44
+ healthcheck?: string;
45
+ }
46
+ export interface EnvironmentSection {
47
+ miseConfig?: string;
48
+ services?: ServiceDecl[];
49
+ vars?: Record<string, string>;
50
+ secrets?: Record<string, string>;
51
+ }
52
+ export interface TasksSection {
53
+ setup?: string;
54
+ build?: string;
55
+ test?: string;
56
+ lint?: string;
57
+ dev?: string;
58
+ }
59
+ export interface PolicySection {
60
+ repair: {
61
+ maxAttempts: number;
62
+ installOnly: boolean;
63
+ };
64
+ }
65
+ export interface DittoConfig {
66
+ version: number;
67
+ repository: RepositorySection;
68
+ teleport: TeleportSection;
69
+ environment: EnvironmentSection;
70
+ tasks: TasksSection;
71
+ policy: PolicySection;
72
+ }
73
+ export interface EndpointDecl {
74
+ managed: boolean;
75
+ name: string;
76
+ slug?: string;
77
+ description?: string;
78
+ model?: string;
79
+ fallbacks?: string[];
80
+ settings?: Record<string, unknown>;
81
+ }
82
+ export type Layer = "default" | "workspace" | "repo" | "local" | "override";
83
+ export interface Source {
84
+ layer: Layer;
85
+ path?: string;
86
+ }
87
+ export interface EffectiveConfig {
88
+ config: DittoConfig;
89
+ endpoints: Record<string, EndpointDecl>;
90
+ misePath: string;
91
+ sources: Record<string, Source>;
92
+ layers: Layer[];
93
+ warnings: string[];
94
+ }
95
+ /** The record teleport embeds in a manifest as repos[].dittoConfig. */
96
+ export interface DittoConfigSummary {
97
+ version: number;
98
+ digest: string;
99
+ misePath?: string;
100
+ layers?: Layer[];
101
+ }
102
+ export declare function defaults(): DittoConfig;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Types for the `.ditto/` repository contract (schema version 1). They mirror
3
+ * backend `pkg/dittoconfig` field for field; `schema.json` next to this file is
4
+ * that package's JSON Schema export, and `schema.test` pins its checksum so a
5
+ * schema change on either side is visible.
6
+ */
7
+ export const DITTO_CONFIG_VERSION = 1;
8
+ export const DITTO_DIR = ".ditto";
9
+ export const CONFIG_FILE = "config.toml";
10
+ export const LOCAL_FILE = "local.toml";
11
+ export const ENDPOINTS_DIR = "endpoints";
12
+ export const MISE_FILE = "mise.toml";
13
+ export const SECRET_REF_PREFIX = "secret://";
14
+ export function defaults() {
15
+ return {
16
+ version: DITTO_CONFIG_VERSION,
17
+ repository: {},
18
+ teleport: { harness: { kind: "auto", session: "latest" }, offload: { unpushed: "refuse" } },
19
+ environment: {},
20
+ tasks: {},
21
+ policy: { repair: { maxAttempts: 3, installOnly: true } },
22
+ };
23
+ }
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/dittoconfig/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;AAClC,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;AA+F7C,MAAM,UAAU,QAAQ;IACtB,OAAO;QACL,OAAO,EAAE,oBAAoB;QAC7B,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;QAC3F,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;KAC1D,CAAC;AACJ,CAAC"}