@basaltbytes/odoo-agentic-dev 0.1.0-beta.1 → 0.1.0-beta.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 (64) hide show
  1. package/README.md +153 -73
  2. package/dist/cli.js +6 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/doctor.js +1 -1
  5. package/dist/commands/doctor.js.map +1 -1
  6. package/dist/commands/down.js +2 -1
  7. package/dist/commands/down.js.map +1 -1
  8. package/dist/commands/eject.d.ts +74 -0
  9. package/dist/commands/eject.js +331 -0
  10. package/dist/commands/eject.js.map +1 -0
  11. package/dist/commands/info.js +1 -1
  12. package/dist/commands/info.js.map +1 -1
  13. package/dist/commands/json-report.d.ts +39 -6
  14. package/dist/commands/json-report.js +55 -9
  15. package/dist/commands/json-report.js.map +1 -1
  16. package/dist/commands/link-source.js +1 -1
  17. package/dist/commands/link-source.js.map +1 -1
  18. package/dist/commands/list.js +1 -1
  19. package/dist/commands/list.js.map +1 -1
  20. package/dist/commands/logs.js +1 -1
  21. package/dist/commands/logs.js.map +1 -1
  22. package/dist/commands/prune.js +1 -1
  23. package/dist/commands/prune.js.map +1 -1
  24. package/dist/commands/psql.js +1 -1
  25. package/dist/commands/psql.js.map +1 -1
  26. package/dist/commands/reset-db.js +4 -2
  27. package/dist/commands/reset-db.js.map +1 -1
  28. package/dist/commands/setup.js +5 -2
  29. package/dist/commands/setup.js.map +1 -1
  30. package/dist/commands/shell.js +1 -1
  31. package/dist/commands/shell.js.map +1 -1
  32. package/dist/commands/test.js +7 -5
  33. package/dist/commands/test.js.map +1 -1
  34. package/dist/commands/up.d.ts +11 -0
  35. package/dist/commands/up.js +15 -1
  36. package/dist/commands/up.js.map +1 -1
  37. package/dist/commands/update.js +1 -1
  38. package/dist/commands/update.js.map +1 -1
  39. package/dist/commands/worktree.d.ts +1 -7
  40. package/dist/commands/worktree.js +5 -13
  41. package/dist/commands/worktree.js.map +1 -1
  42. package/dist/config/schema.js +41 -0
  43. package/dist/config/schema.js.map +1 -1
  44. package/dist/core/command-plan.d.ts +10 -5
  45. package/dist/core/command-plan.js +13 -4
  46. package/dist/core/command-plan.js.map +1 -1
  47. package/dist/core/compose-model.d.ts +20 -2
  48. package/dist/core/compose-model.js +59 -13
  49. package/dist/core/compose-model.js.map +1 -1
  50. package/dist/core/dockerfile-model.d.ts +8 -0
  51. package/dist/core/dockerfile-model.js +34 -0
  52. package/dist/core/dockerfile-model.js.map +1 -0
  53. package/dist/core/project-recipe.d.ts +37 -0
  54. package/dist/core/project-recipe.js +2 -0
  55. package/dist/core/project-recipe.js.map +1 -1
  56. package/dist/errors/errors.d.ts +9 -1
  57. package/dist/errors/errors.js +8 -0
  58. package/dist/errors/errors.js.map +1 -1
  59. package/dist/index.d.ts +1 -1
  60. package/dist/platform/docker-compose.js +4 -0
  61. package/dist/platform/docker-compose.js.map +1 -1
  62. package/dist/platform/odoo-lifecycle.js +5 -5
  63. package/dist/platform/odoo-lifecycle.js.map +1 -1
  64. package/package.json +1 -1
@@ -0,0 +1,331 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { isAbsolute, relative, resolve } from "node:path";
3
+ import { Console, Effect, Option } from "effect";
4
+ import { Argument, Command, Flag } from "effect/unstable/cli";
5
+ import { createJiti } from "jiti";
6
+ import { EjectError, isRuntimeError, renderError } from "../errors/errors.js";
7
+ import { buildComposeModel, renderComposeYaml } from "../core/compose-model.js";
8
+ import { renderDockerfile } from "../core/dockerfile-model.js";
9
+ import { discoverConfigPath, loadRecipe } from "../config/load-recipe.js";
10
+ import { validateConfigInput } from "../config/schema.js";
11
+ import { resolveContext } from "./resolve-context.js";
12
+ export const DEFAULT_DOCKERFILE_OUT = "Dockerfile.odoo";
13
+ export const DEFAULT_COMPOSE_OUT = "docker-compose.worktree.yml";
14
+ // the CLI version stamped into the ejected Dockerfile header (single source:
15
+ // package.json, resolved from both dist/ and src/ — mirrors cli.ts)
16
+ const CLI_VERSION = (() => {
17
+ try {
18
+ const parsed = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8"));
19
+ return parsed.version;
20
+ }
21
+ catch {
22
+ return "0.0.0";
23
+ }
24
+ })();
25
+ /** A relative path for display/config (forward slashes, no leading "./"). */
26
+ const toRelative = (rootDir, target) => {
27
+ const abs = isAbsolute(target) ? target : resolve(rootDir, target);
28
+ const rel = relative(rootDir, abs);
29
+ return rel.length === 0 ? abs : rel.split("\\").join("/");
30
+ };
31
+ // --- pure renderers ---------------------------------------------------------
32
+ const GENERATED_DOCKERFILE_HEADER = "# Generated by odoo-agentic-dev from `odoo.build` in the project config — do not edit.";
33
+ /**
34
+ * The ejected Dockerfile is byte-identical to the generated one except for the
35
+ * first line: ownership now belongs to the project, so the "do not edit" notice
36
+ * is replaced by a provenance stamp carrying the CLI version it was cut from.
37
+ */
38
+ export const ejectedDockerfileHeader = (version) => `# Ejected from odoo-agentic-dev v${version} — this file is yours now.`;
39
+ /** Render the ejected Dockerfile: the generated body with the header swapped. */
40
+ export const renderEjectedDockerfile = (odooVersion, cliVersion, build) => {
41
+ const generated = renderDockerfile(odooVersion, build);
42
+ return generated.startsWith(GENERATED_DOCKERFILE_HEADER)
43
+ ? ejectedDockerfileHeader(cliVersion) + generated.slice(GENERATED_DOCKERFILE_HEADER.length)
44
+ : generated;
45
+ };
46
+ // --- config serialization ---------------------------------------------------
47
+ const IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
48
+ /** Deterministic JS-object literal: identifier keys unquoted, data only. */
49
+ const serializeValue = (value, indent) => {
50
+ if (value === null)
51
+ return "null";
52
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
53
+ return JSON.stringify(value);
54
+ }
55
+ const pad = " ".repeat(indent);
56
+ const childPad = " ".repeat(indent + 1);
57
+ if (Array.isArray(value)) {
58
+ if (value.length === 0)
59
+ return "[]";
60
+ const items = value.map((item) => `${childPad}${serializeValue(item, indent + 1)}`);
61
+ return `[\n${items.join(",\n")}\n${pad}]`;
62
+ }
63
+ if (typeof value === "object") {
64
+ const entries = Object.entries(value).filter(([, v]) => v !== undefined);
65
+ if (entries.length === 0)
66
+ return "{}";
67
+ const rendered = entries.map(([key, v]) => {
68
+ const renderedKey = IDENTIFIER.test(key) ? key : JSON.stringify(key);
69
+ return `${childPad}${renderedKey}: ${serializeValue(v, indent + 1)}`;
70
+ });
71
+ return `{\n${rendered.join(",\n")}\n${pad}}`;
72
+ }
73
+ return JSON.stringify(String(value));
74
+ };
75
+ /** Regenerate a complete config file from a validated input object. */
76
+ export const serializeConfigFile = (input) => `import { defineConfig } from "@basaltbytes/odoo-agentic-dev";\n\nexport default defineConfig(${serializeValue(input, 0)});\n`;
77
+ /**
78
+ * Whether the source contains `//` or `/*` OUTSIDE string/template literals.
79
+ * URLs like "http://x" inside strings do not count as comments.
80
+ */
81
+ export const hasComments = (source) => {
82
+ let index = 0;
83
+ const length = source.length;
84
+ while (index < length) {
85
+ const char = source[index];
86
+ if (char === '"' || char === "'" || char === "`") {
87
+ const quote = char;
88
+ index += 1;
89
+ while (index < length && source[index] !== quote) {
90
+ if (source[index] === "\\")
91
+ index += 1;
92
+ index += 1;
93
+ }
94
+ index += 1;
95
+ continue;
96
+ }
97
+ if (char === "/" && (source[index + 1] === "/" || source[index + 1] === "*")) {
98
+ return true;
99
+ }
100
+ index += 1;
101
+ }
102
+ return false;
103
+ };
104
+ /** Apply ejected-file references to a validated input object (immutably). */
105
+ export const applyEjectToInput = (input, changes) => {
106
+ const odoo = { ...input.odoo };
107
+ if (changes.dockerfileFile !== undefined) {
108
+ // dockerfile and build are mutually exclusive — replace the build block
109
+ delete odoo["build"];
110
+ odoo["dockerfile"] = changes.dockerfileFile;
111
+ }
112
+ const next = { ...input, odoo };
113
+ if (changes.composeFile !== undefined) {
114
+ next["compose"] = { ...input.compose, file: changes.composeFile };
115
+ }
116
+ return next;
117
+ };
118
+ /** Human-readable, ready-to-apply patch describing the exact config edits. */
119
+ export const buildConfigPatch = (changes) => {
120
+ const lines = ["Apply this patch to odoo-agentic-dev.config.ts:"];
121
+ if (changes.composeFile !== undefined) {
122
+ lines.push("", " add at the top level:", ` compose: { file: ${JSON.stringify(changes.composeFile)} },`);
123
+ }
124
+ if (changes.dockerfileFile !== undefined) {
125
+ lines.push("", " inside odoo, REPLACE the `build: { ... }` block with:", ` dockerfile: ${JSON.stringify(changes.dockerfileFile)},`);
126
+ }
127
+ return lines.join("\n");
128
+ };
129
+ const failEject = (reason) => Effect.fail(new EjectError({ reason }));
130
+ const tryWrite = (path, content) => Effect.try({
131
+ try: () => writeFileSync(path, content),
132
+ catch: (cause) => new EjectError({ reason: `could not write ${path}: ${String(cause)}` }),
133
+ });
134
+ // jiti for re-importing the config input during --write-config (the loader keeps
135
+ // its own jiti instance private; eject needs the raw input object back).
136
+ // moduleCache:false: we read the config, REWRITE it, and the loader re-imports
137
+ // the same path for round-trip proof — a shared module cache would hand the
138
+ // loader back the pre-rewrite module, so eject's jiti must never populate it.
139
+ const ejectJiti = createJiti(import.meta.url, {
140
+ interopDefault: true,
141
+ moduleCache: false,
142
+ alias: {
143
+ "@basaltbytes/odoo-agentic-dev": (() => {
144
+ for (const candidate of ["../index.js", "../index.ts"]) {
145
+ const path = new URL(candidate, import.meta.url);
146
+ if (existsSync(path))
147
+ return path.pathname;
148
+ }
149
+ return "@basaltbytes/odoo-agentic-dev";
150
+ })(),
151
+ },
152
+ });
153
+ const loadConfigInput = (path) => Effect.tryPromise({
154
+ try: () => ejectJiti.import(path, { default: true }),
155
+ catch: (cause) => new EjectError({ reason: `could not re-import config ${path}: ${String(cause)}` }),
156
+ }).pipe(Effect.flatMap(validateConfigInput));
157
+ /**
158
+ * Convert generated infra into project-owned files: render the portable compose
159
+ * model and (optionally) the ejected Dockerfile, write them as plain files, and
160
+ * either leave a config patch or regenerate the config in place.
161
+ */
162
+ export const performEject = (options) => Effect.gen(function* () {
163
+ const { ctx, force, recipe, rootDir, target } = options;
164
+ const dockerfileAbs = isAbsolute(options.dockerfileOut)
165
+ ? options.dockerfileOut
166
+ : resolve(rootDir, options.dockerfileOut);
167
+ const composeAbs = isAbsolute(options.composeOut)
168
+ ? options.composeOut
169
+ : resolve(rootDir, options.composeOut);
170
+ const dockerfileRel = toRelative(rootDir, dockerfileAbs);
171
+ const composeRel = toRelative(rootDir, composeAbs);
172
+ const wantDockerfile = target === "all" || target === "dockerfile";
173
+ const wantCompose = target === "all" || target === "compose";
174
+ const notes = [];
175
+ // A stock image (no build, no hand-written dockerfile) has nothing to eject.
176
+ const canEjectDockerfile = recipe.odoo.build !== null;
177
+ if (target === "dockerfile") {
178
+ if (recipe.odoo.dockerfile !== null) {
179
+ return yield* failEject(`the Dockerfile is already ejected / hand-written at ${recipe.odoo.dockerfile} (odoo.dockerfile); nothing to do`);
180
+ }
181
+ if (!canEjectDockerfile) {
182
+ return yield* failEject("there is no Dockerfile to eject: the config uses the stock odoo image. Add an `odoo.build` block first, or eject only the compose file.");
183
+ }
184
+ }
185
+ if (target === "all" && recipe.odoo.dockerfile !== null) {
186
+ notes.push(`odoo.dockerfile is already set (${recipe.odoo.dockerfile}); ejecting the compose file only.`);
187
+ }
188
+ if (target === "all" && !canEjectDockerfile && recipe.odoo.dockerfile === null) {
189
+ notes.push("no odoo.build/dockerfile in the config (stock image); ejecting the compose file only.");
190
+ }
191
+ const ejectDockerfileNow = wantDockerfile && canEjectDockerfile && recipe.odoo.dockerfile === null;
192
+ // Collision check across every file we will write (before writing any).
193
+ const planned = [];
194
+ if (ejectDockerfileNow)
195
+ planned.push(dockerfileAbs);
196
+ if (wantCompose)
197
+ planned.push(composeAbs);
198
+ const conflicts = planned.filter((path) => existsSync(path));
199
+ if (conflicts.length > 0 && !force) {
200
+ return yield* failEject(`refusing to overwrite existing file(s) without --force: ${conflicts
201
+ .map((path) => toRelative(rootDir, path))
202
+ .join(", ")}`);
203
+ }
204
+ const written = [];
205
+ const changes = {};
206
+ if (ejectDockerfileNow) {
207
+ const dockerfile = renderEjectedDockerfile(recipe.odoo.version, CLI_VERSION, recipe.odoo.build);
208
+ yield* tryWrite(dockerfileAbs, dockerfile);
209
+ written.push(dockerfileRel);
210
+ changes.dockerfileFile = dockerfileRel;
211
+ }
212
+ if (wantCompose) {
213
+ // point build.dockerfile at the ejected file when both are ejected,
214
+ // else let the model fall back to the existing config value.
215
+ const model = buildComposeModel(recipe, ctx, {
216
+ portable: true,
217
+ ...(ejectDockerfileNow ? { dockerfilePath: dockerfileRel } : {}),
218
+ });
219
+ yield* tryWrite(composeAbs, renderComposeYaml(model));
220
+ written.push(composeRel);
221
+ changes.composeFile = composeRel;
222
+ }
223
+ const configPatch = buildConfigPatch(changes);
224
+ let configWritten = false;
225
+ if (options.writeConfig) {
226
+ const path = yield* options.configFlag !== undefined
227
+ ? Effect.succeed(isAbsolute(options.configFlag)
228
+ ? options.configFlag
229
+ : resolve(rootDir, options.configFlag))
230
+ : discoverConfigPath(rootDir).pipe(Effect.flatMap((found) => found === undefined
231
+ ? failEject("could not find a config file to rewrite with --write-config; pass --config")
232
+ : Effect.succeed(found)));
233
+ const source = yield* Effect.try({
234
+ try: () => readFileSync(path, "utf8"),
235
+ catch: (cause) => new EjectError({ reason: `could not read config ${path}: ${String(cause)}` }),
236
+ });
237
+ if (hasComments(source) && !force) {
238
+ return yield* failEject(`--write-config would discard comments in ${toRelative(rootDir, path)}; re-run with --force to overwrite, or apply the printed patch by hand`);
239
+ }
240
+ const input = yield* loadConfigInput(path);
241
+ const nextInput = applyEjectToInput(input, changes);
242
+ yield* tryWrite(path, serializeConfigFile(nextInput));
243
+ // prove the regenerated file re-loads, re-validates, and re-normalizes
244
+ yield* loadRecipe({ cwd: rootDir, explicitPath: path, env: process.env }).pipe(Effect.mapError((error) => new EjectError({
245
+ reason: `the regenerated config did not round-trip: ${isRuntimeError(error) ? renderError(error) : String(error)}`,
246
+ })));
247
+ configWritten = true;
248
+ }
249
+ return { written, configPatch, configWritten, notes };
250
+ });
251
+ // --- command ----------------------------------------------------------------
252
+ /** The success payload printed (as one line) to stdout in `--json` mode. */
253
+ export const renderEjectJson = (result) => JSON.stringify({
254
+ ok: true,
255
+ command: "eject",
256
+ written: result.written,
257
+ configPatch: result.configPatch,
258
+ configWritten: result.configWritten,
259
+ });
260
+ /** The failure payload printed (as one line) to stdout in `--json` mode. */
261
+ export const renderEjectErrorJson = (error) => JSON.stringify({
262
+ ok: false,
263
+ command: "eject",
264
+ error: { tag: error._tag, message: error.message },
265
+ });
266
+ const parseTarget = (raw) => raw === undefined || raw === "all"
267
+ ? Effect.succeed("all")
268
+ : raw === "dockerfile" || raw === "compose"
269
+ ? Effect.succeed(raw)
270
+ : failEject(`unknown eject target "${raw}" (expected: all, dockerfile, or compose)`);
271
+ export const ejectCommand = Command.make("eject", {
272
+ target: Argument.string("target").pipe(Argument.optional, Argument.withDescription("all (default), dockerfile, or compose")),
273
+ dockerfileOut: Flag.string("dockerfile-out").pipe(Flag.optional, Flag.withDescription(`ejected Dockerfile path (default ${DEFAULT_DOCKERFILE_OUT})`)),
274
+ composeOut: Flag.string("compose-out").pipe(Flag.optional, Flag.withDescription(`ejected compose path (default ${DEFAULT_COMPOSE_OUT})`)),
275
+ force: Flag.boolean("force").pipe(Flag.withDescription("overwrite existing files / commented config")),
276
+ writeConfig: Flag.boolean("write-config").pipe(Flag.withDescription("rewrite the config in place (comments are lost)")),
277
+ json: Flag.boolean("json").pipe(Flag.withDescription("print machine-readable JSON")),
278
+ config: Flag.string("config").pipe(Flag.optional, Flag.withDescription("explicit config file path")),
279
+ }, (flags) => Effect.gen(function* () {
280
+ const json = flags.json;
281
+ const program = Effect.gen(function* () {
282
+ const target = yield* parseTarget(Option.getOrUndefined(flags.target));
283
+ const { ctx, recipe } = yield* resolveContext(flags.config);
284
+ const result = yield* performEject({
285
+ recipe,
286
+ ctx,
287
+ rootDir: ctx.rootDir,
288
+ target,
289
+ dockerfileOut: Option.getOrUndefined(flags.dockerfileOut) ?? DEFAULT_DOCKERFILE_OUT,
290
+ composeOut: Option.getOrUndefined(flags.composeOut) ?? DEFAULT_COMPOSE_OUT,
291
+ force: flags.force,
292
+ writeConfig: flags.writeConfig,
293
+ configFlag: Option.getOrUndefined(flags.config),
294
+ });
295
+ if (json) {
296
+ // human output to stderr; stdout is exactly one JSON object
297
+ for (const note of result.notes)
298
+ yield* Console.error(note);
299
+ for (const path of result.written)
300
+ yield* Console.error(`wrote ${path}`);
301
+ yield* Console.error(result.configWritten
302
+ ? "rewrote the config in place (comments, if any, were lost)"
303
+ : result.configPatch);
304
+ yield* Effect.sync(() => process.stdout.write(`${renderEjectJson(result)}\n`));
305
+ return;
306
+ }
307
+ for (const note of result.notes)
308
+ yield* Console.log(note);
309
+ for (const path of result.written)
310
+ yield* Console.log(`wrote ${path}`);
311
+ if (result.configWritten) {
312
+ yield* Console.log("rewrote the config in place (comments, if any, were lost).");
313
+ }
314
+ else {
315
+ yield* Console.log("");
316
+ yield* Console.log(result.configPatch);
317
+ }
318
+ });
319
+ // in JSON mode, typed failures still emit one JSON object on stdout
320
+ return yield* json
321
+ ? program.pipe(Effect.catch((error) => Effect.gen(function* () {
322
+ if (isRuntimeError(error))
323
+ yield* Console.error(renderError(error));
324
+ yield* Effect.sync(() => process.stdout.write(`${renderEjectErrorJson(error)}\n`));
325
+ yield* Effect.sync(() => {
326
+ process.exitCode = 1;
327
+ });
328
+ })))
329
+ : program;
330
+ })).pipe(Command.withDescription("write the Dockerfile/compose file into the repo and own them"));
331
+ //# sourceMappingURL=eject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eject.js","sourceRoot":"","sources":["../../src/commands/eject.ts"],"names":[],"mappings":"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"}
@@ -38,5 +38,5 @@ export const infoCommand = Command.make("info", {
38
38
  ? buildInfoEnv(ctx)
39
39
  : buildInfoText(ctx);
40
40
  yield* Console.log(output);
41
- }));
41
+ })).pipe(Command.withDescription("print the derived context: database, ports, URLs, env"));
42
42
  //# sourceMappingURL=info.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAoB,EAAU,EAAE;IAC5D,MAAM,GAAG,GAAG;QACV,aAAa,GAAG,CAAC,YAAY,EAAE;QAC/B,aAAa,GAAG,CAAC,YAAY,EAAE;QAC/B,oBAAoB,GAAG,CAAC,kBAAkB,EAAE;QAC5C,aAAa,GAAG,CAAC,WAAW,WAAW,GAAG,CAAC,YAAY,EAAE;KAC1D,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,cAAc;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACjG,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAoB,EAAU,EAAE,CAC5D,IAAI,CAAC,SAAS,CACZ;IACE,OAAO,EAAE,GAAG,CAAC,OAAO;IACpB,YAAY,EAAE,GAAG,CAAC,YAAY;IAC9B,YAAY,EAAE,GAAG,CAAC,YAAY;IAC9B,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;IAC1C,YAAY,EAAE,GAAG,CAAC,YAAY;IAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;IAC5B,OAAO,EAAE,GAAG,GAAG,CAAC,WAAW,WAAW,GAAG,CAAC,YAAY,EAAE;IACxD,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC;IAClD,GAAG,EAAE,GAAG,CAAC,GAAG;CACb,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AAEJ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAoB,EAAU,EAAE,CAC3D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;KACpB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;KACxC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEhB,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CACrC,MAAM,EACN;IACE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,6BAA6B,CAAC,CAAC;IACpF,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAC;IAChF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAChC,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAClD;CACF,EACD,CAAC,KAAK,EAAE,EAAE,CACR,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI;QACvB,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC,GAAG;YACT,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC;YACnB,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzB,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC,CAAC,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,uDAAuD,CAAC,CAAC,CAAC"}
@@ -6,18 +6,38 @@ import type { WorktreeContext } from "../core/worktree-context.js";
6
6
  * asserts these exact strings, so they are part of the CLI's contract.
7
7
  */
8
8
  export declare const resetPathActions: (path: ResetPath) => ReadonlyArray<string>;
9
- /** The single object a lifecycle command prints to stdout under `--json`. */
9
+ /** Coarse mode classification of a reset path for the JSON report. */
10
+ export declare const resetPathMode: (path: ResetPath) => "template-restore" | "full-init";
11
+ /** The typed-error summary emitted under `--json` when a command fails. */
12
+ export type JsonErrorReport = {
13
+ /** the TaggedError `_tag` (e.g. "SharedDatabaseProtectionError") */
14
+ readonly tag: string;
15
+ readonly message: string;
16
+ };
17
+ /**
18
+ * Per-command extra fields merged into the final report. Typed loosely on
19
+ * purpose: every value is JSON-serialisable and the per-command set is small
20
+ * (see each command's `setExtra` calls).
21
+ */
22
+ export type JsonReportExtras = Record<string, string | number | boolean | null>;
23
+ /** The fixed core of the object a lifecycle command prints under `--json`. */
10
24
  export type JsonReport = {
11
25
  readonly ok: boolean;
12
26
  readonly command: string;
13
27
  /** null when the command failed before the context resolved */
14
28
  readonly database: string | null;
29
+ /** plan name; `composeProject` is kept as a back-compat alias */
30
+ readonly composeProjectName: string | null;
31
+ /** legacy alias of `composeProjectName` (frozen e2e/nightly contract) */
15
32
  readonly composeProject: string | null;
33
+ readonly odooHttpPort: number | null;
16
34
  readonly odooUrl: string | null;
17
35
  readonly actions: ReadonlyArray<string>;
18
36
  readonly durationMs: number;
19
37
  /** child exit code, when the command ran one to completion (`test`) */
20
38
  readonly exitCode?: number;
39
+ /** present only on failure */
40
+ readonly error?: JsonErrorReport;
21
41
  };
22
42
  /**
23
43
  * Per-invocation reporter threaded through a lifecycle command. In text mode
@@ -34,12 +54,25 @@ export interface CommandReporter {
34
54
  readonly setContext: (ctx: WorktreeContext) => Effect.Effect<void>;
35
55
  /** child exit code; a non-zero code makes the final report not-ok */
36
56
  readonly setExitCode: (code: number) => Effect.Effect<void>;
57
+ /** attach a per-command field (mode, templateKey, volumesRemoved, tails…) */
58
+ readonly setExtra: (key: string, value: string | number | boolean | null) => Effect.Effect<void>;
37
59
  }
38
60
  /**
39
- * Wrap a lifecycle command body with the `--json` reporting contract: collect
40
- * actions while the body runs, then print ONE single-line JSON object to
41
- * stdout on success and on typed failure alike (the error still propagates,
42
- * so it renders on stderr and drives the exit code). Streamed child output may
43
- * precede it; consumers parse the LAST stdout line (`tail -n 1`).
61
+ * Hook-mode stdout purity (the `exec 1>&2` trick): everything written to
62
+ * process.stdout while the effect runs Console.log, streamed child output
63
+ * lands on stderr instead; the original writer is restored afterwards so the
64
+ * caller can print the single contractual stdout line. Reused by `withJsonReport`
65
+ * and by `worktree create --hook-json`.
66
+ */
67
+ export declare const withStdoutRedirectedToStderr: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
68
+ /**
69
+ * Wrap a lifecycle command body with the `--json` reporting contract:
70
+ *
71
+ * - in json mode, redirect everything the body writes to stdout — Console.log,
72
+ * streamed compose/odoo subprocess output — onto stderr, so stdout carries
73
+ * EXACTLY ONE JSON object (the final line);
74
+ * - collect actions/extras while the body runs, then print that single JSON
75
+ * line to the real stdout — on success and on typed failure alike (the error
76
+ * still propagates, so it renders on stderr and drives the exit code).
44
77
  */
45
78
  export declare const withJsonReport: <A, E, R>(command: string, json: boolean, body: (report: CommandReporter) => Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
@@ -1,4 +1,5 @@
1
1
  import { Console, Effect } from "effect";
2
+ import { isRuntimeError } from "../errors/errors.js";
2
3
  /**
3
4
  * Semantic action names for the reset paths. The nightly real-Odoo workflow
4
5
  * asserts these exact strings, so they are part of the CLI's contract.
@@ -8,16 +9,50 @@ export const resetPathActions = (path) => path === "restore"
8
9
  : path === "full"
9
10
  ? ["full-init"]
10
11
  : ["full-init", "snapshot-template"];
12
+ /** Coarse mode classification of a reset path for the JSON report. */
13
+ export const resetPathMode = (path) => path === "restore" ? "template-restore" : "full-init";
11
14
  /**
12
- * Wrap a lifecycle command body with the `--json` reporting contract: collect
13
- * actions while the body runs, then print ONE single-line JSON object to
14
- * stdout on success and on typed failure alike (the error still propagates,
15
- * so it renders on stderr and drives the exit code). Streamed child output may
16
- * precede it; consumers parse the LAST stdout line (`tail -n 1`).
15
+ * Hook-mode stdout purity (the `exec 1>&2` trick): everything written to
16
+ * process.stdout while the effect runs Console.log, streamed child output
17
+ * lands on stderr instead; the original writer is restored afterwards so the
18
+ * caller can print the single contractual stdout line. Reused by `withJsonReport`
19
+ * and by `worktree create --hook-json`.
20
+ */
21
+ export const withStdoutRedirectedToStderr = (effect) => Effect.suspend(() => {
22
+ const original = process.stdout.write;
23
+ process.stdout.write = ((...args) => process.stderr.write(...args));
24
+ return effect.pipe(Effect.ensuring(Effect.sync(() => {
25
+ process.stdout.write = original;
26
+ })));
27
+ });
28
+ /** Best-effort tag/message extraction from an unknown failure value. */
29
+ const toErrorReport = (error) => {
30
+ if (isRuntimeError(error)) {
31
+ return { tag: error._tag, message: error.message };
32
+ }
33
+ if (typeof error === "object" && error !== null && "_tag" in error) {
34
+ const tag = String(error._tag);
35
+ const message = "message" in error && typeof error.message === "string"
36
+ ? error.message
37
+ : String(error);
38
+ return { tag, message };
39
+ }
40
+ return { tag: "UnknownError", message: String(error) };
41
+ };
42
+ /**
43
+ * Wrap a lifecycle command body with the `--json` reporting contract:
44
+ *
45
+ * - in json mode, redirect everything the body writes to stdout — Console.log,
46
+ * streamed compose/odoo subprocess output — onto stderr, so stdout carries
47
+ * EXACTLY ONE JSON object (the final line);
48
+ * - collect actions/extras while the body runs, then print that single JSON
49
+ * line to the real stdout — on success and on typed failure alike (the error
50
+ * still propagates, so it renders on stderr and drives the exit code).
17
51
  */
18
52
  export const withJsonReport = (command, json, body) => Effect.gen(function* () {
19
53
  const startedAt = Date.now();
20
54
  const actions = [];
55
+ const extras = {};
21
56
  let ctx = null;
22
57
  let exitCode;
23
58
  const record = (entry) => Effect.sync(() => {
@@ -33,23 +68,34 @@ export const withJsonReport = (command, json, body) => Effect.gen(function* () {
33
68
  setExitCode: (code) => Effect.sync(() => {
34
69
  exitCode = code;
35
70
  }),
71
+ setExtra: (key, value) => Effect.sync(() => {
72
+ extras[key] = value;
73
+ }),
36
74
  };
37
- const emit = (succeeded) => {
75
+ // the single contractual stdout line. In json mode the body ran with stdout
76
+ // redirected to stderr, but `original` was captured and restored by then, so
77
+ // this Console.log lands on the real stdout — alone.
78
+ const emit = (succeeded, error) => {
38
79
  if (!json)
39
80
  return Effect.void;
40
81
  const resolved = ctx;
41
- const report = {
82
+ const core = {
42
83
  ok: succeeded && (exitCode ?? 0) === 0,
43
84
  command,
44
85
  database: resolved === null ? null : resolved.databaseName,
86
+ composeProjectName: resolved === null ? null : resolved.composeProjectName,
45
87
  composeProject: resolved === null ? null : resolved.composeProjectName,
88
+ odooHttpPort: resolved === null ? null : resolved.odooHttpPort,
46
89
  odooUrl: resolved === null ? null : `${resolved.odooBaseUrl}/web?db=${resolved.databaseName}`,
47
90
  actions,
48
91
  durationMs: Date.now() - startedAt,
49
92
  ...(exitCode === undefined ? {} : { exitCode }),
93
+ ...(succeeded ? {} : { error: toErrorReport(error) }),
50
94
  };
51
- return Console.log(JSON.stringify(report));
95
+ // extras are merged AFTER the core so a command never clobbers a fixed key
96
+ return Console.log(JSON.stringify({ ...core, ...extras }));
52
97
  };
53
- return yield* body(reporter).pipe(Effect.tap(() => emit(true)), Effect.tapError(() => emit(false)));
98
+ const run = json ? withStdoutRedirectedToStderr(body(reporter)) : body(reporter);
99
+ return yield* run.pipe(Effect.tap(() => emit(true, undefined)), Effect.tapError((error) => emit(false, error)));
54
100
  });
55
101
  //# sourceMappingURL=json-report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-report.js","sourceRoot":"","sources":["../../src/commands/json-report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-report.js","sourceRoot":"","sources":["../../src/commands/json-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAe,EAAyB,EAAE,CACzE,IAAI,KAAK,SAAS;IAChB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAC3B,CAAC,CAAC,IAAI,KAAK,MAAM;QACf,CAAC,CAAC,CAAC,WAAW,CAAC;QACf,CAAC,CAAC,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;AAE3C,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAe,EAAoC,EAAE,CACjF,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC;AAuDxD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,MAA8B,EACN,EAAE,CAC1B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;IAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAA6C,EAAE,EAAE,CAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAgC,CAAC;IAChE,OAAO,MAAM,CAAC,IAAI,CAChB,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;IAClC,CAAC,CAAC,CACH,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,wEAAwE;AACxE,MAAM,aAAa,GAAG,CAAC,KAAc,EAAmB,EAAE;IACxD,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,MAAM,GAAG,GAAG,MAAM,CAAE,KAA2B,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,OAAO,GACX,SAAS,IAAI,KAAK,IAAI,OAAQ,KAA8B,CAAC,OAAO,KAAK,QAAQ;YAC/E,CAAC,CAAE,KAA6B,CAAC,OAAO;YACxC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACzD,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,OAAe,EACf,IAAa,EACb,IAAyD,EACjC,EAAE,CAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,IAAI,GAAG,GAA2B,IAAI,CAAC;IACvC,IAAI,QAA4B,CAAC;IAEjC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAuB,EAAE,CACpD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IACL,MAAM,QAAQ,GAAoB;QAChC,IAAI;QACJ,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CACpB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,GAAG,GAAG,KAAK,CAAC;QACd,CAAC,CAAC;QACJ,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CACpB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC,CAAC;QACJ,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACvB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC,CAAC;KACL,CAAC;IAEF,4EAA4E;IAC5E,6EAA6E;IAC7E,qDAAqD;IACrD,MAAM,IAAI,GAAG,CAAC,SAAkB,EAAE,KAAc,EAAuB,EAAE;QACvE,IAAI,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC;QAC9B,MAAM,QAAQ,GAA2B,GAAG,CAAC;QAC7C,MAAM,IAAI,GAAe;YACvB,EAAE,EAAE,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC;YACtC,OAAO;YACP,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY;YAC1D,kBAAkB,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB;YAC1E,cAAc,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB;YACtE,YAAY,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY;YAC9D,OAAO,EACL,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,WAAW,WAAW,QAAQ,CAAC,YAAY,EAAE;YACtF,OAAO;YACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;YAC/C,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;SACtD,CAAC;QACF,2EAA2E;QAC3E,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CACpB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EACvC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAC/C,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -112,5 +112,5 @@ export const linkSourceCommand = Command.make("link-source", {
112
112
  recipeSource: recipe.odoo.source,
113
113
  });
114
114
  yield* Console.log(`Linked ${linkPath} -> resolved Odoo source`);
115
- }));
115
+ })).pipe(Command.withDescription("symlink a local Odoo checkout for editor navigation"));
116
116
  //# sourceMappingURL=link-source.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"link-source.js","sourceRoot":"","sources":["../../src/commands/link-source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"link-source.js","sourceRoot":"","sources":["../../src/commands/link-source.ts"],"names":[],"mappings":"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"}
@@ -113,5 +113,5 @@ export const listCommand = Command.make("list", {
113
113
  else {
114
114
  yield* Console.log(buildListTable(entries, new Date().toISOString()));
115
115
  }
116
- }));
116
+ })).pipe(Command.withDescription("list registered environments and their Docker status"));
117
117
  //# sourceMappingURL=list.js.map