From 577dce4323176dc13da0aa897a7759fd1c145cf3 Mon Sep 17 00:00:00 2001 From: Paul Bakaus Date: Mon, 17 Aug 2026 18:57:45 -0700 Subject: [PATCH] Oracle: live-mode cases and goldens (roots, inject, wrap, insert, accept, session, manual edits, daemon) Prepared with AI assistance (Claude Code). --- tests/oracle/README.md | 32 ++++ tests/oracle/cases/live-accept.mjs | 165 ++++++++++++++++++ tests/oracle/cases/live-daemon.mjs | 45 +++++ tests/oracle/cases/live-manual.mjs | 80 +++++++++ tests/oracle/cases/live-roots.mjs | 124 +++++++++++++ tests/oracle/cases/live-session.mjs | 86 +++++++++ tests/oracle/cases/live-wrap.mjs | 94 ++++++++++ .../golden/live-accept-generated-file.json | 10 ++ tests/oracle/golden/live-accept-help.json | 9 + .../live-accept-html-discard-then-accept.json | 21 +++ .../golden/live-accept-html-discard.json | 11 ++ .../live-accept-html-malformed-params.json | 11 ++ .../golden/live-accept-html-no-css-block.json | 11 ++ .../golden/live-accept-html-no-params.json | 11 ++ .../live-accept-html-receipt-conflict.json | 27 +++ .../live-accept-html-receipt-replay.json | 21 +++ .../live-accept-html-variant-1-range.json | 11 ++ .../live-accept-html-variant-2-steps.json | 11 ++ .../live-accept-html-variant-3-toggle.json | 11 ++ .../live-accept-html-variant-missing.json | 10 ++ .../oracle/golden/live-accept-invalid-id.json | 9 + .../live-accept-invalid-variant-regex.json | 9 + .../golden/live-accept-invalid-variant.json | 9 + .../golden/live-accept-jsx-discard.json | 13 ++ .../golden/live-accept-jsx-from-subdir.json | 13 ++ .../golden/live-accept-jsx-variant-1.json | 13 ++ .../live-accept-jsx-variant-3-toggle-off.json | 13 ++ .../golden/live-accept-markers-not-found.json | 9 + .../oracle/golden/live-accept-missing-id.json | 9 + .../oracle/golden/live-accept-need-mode.json | 9 + .../live-accept-no-page-url-keeps-buffer.json | 12 ++ .../live-accept-scrubs-buffer-for-page.json | 12 ++ .../golden/live-accept-source-locked.json | 10 ++ .../live-accept-source-shadow-deprecated.json | 11 ++ .../live-accept-stale-lock-dead-pid.json | 10 ++ .../live-accept-svelte-component-accept.json | 24 +++ .../live-accept-svelte-component-discard.json | 30 ++++ ...ccept-svelte-component-styled-variant.json | 24 +++ ...cept-svelte-component-variant-missing.json | 27 +++ ...accept-svelte-fallback-source-wrapper.json | 22 +++ ...ve-accept-svelte-insert-empty-variant.json | 24 +++ .../live-accept-target-missing-value.json | 9 + .../live-boot-astro-config-missing.json | 9 + .../golden/live-boot-config-invalid-json.json | 10 ++ .../live-boot-config-invalid-schema.json | 10 ++ .../live-boot-context-missing-both.json | 9 + ...ive-boot-context-missing-design-empty.json | 9 + .../live-boot-context-missing-product.json | 9 + tests/oracle/golden/live-boot-full-cycle.json | 30 ++++ .../golden/live-boot-html-config-missing.json | 9 + .../golden/live-boot-monorepo-from-child.json | 10 ++ .../golden/live-boot-monorepo-from-root.json | 10 ++ .../live-boot-monorepo-no-git-from-root.json | 7 + .../golden/live-boot-monorepo-target-eq.json | 10 ++ .../live-boot-monorepo-target-file.json | 10 ++ .../golden/live-boot-multi-app-selection.json | 7 + .../golden/live-boot-multi-app-target.json | 11 ++ .../golden/live-boot-pointer-accumulates.json | 27 +++ .../live-boot-sveltekit-config-missing.json | 9 + .../golden/live-boot-vite-config-missing.json | 9 + .../golden/live-boot-vite-from-subdir.json | 7 + .../live-boot-workspaces-from-child.json | 10 ++ .../live-boot-workspaces-selection.json | 7 + .../golden/live-boot-workspaces-target.json | 10 ++ tests/oracle/golden/live-commit-help.json | 13 ++ .../golden/live-commit-invalid-buffer.json | 14 ++ .../golden/live-commit-mock-applied-page.json | 14 ++ .../live-commit-mock-default-result.json | 14 ++ .../oracle/golden/live-commit-mock-error.json | 14 ++ .../live-commit-mock-invalid-result-json.json | 14 ++ ...ive-commit-mock-leftover-marker-check.json | 14 ++ .../golden/live-commit-mock-partial.json | 14 ++ ...ve-commit-mock-then-discard-remaining.json | 24 +++ ...ve-commit-mock-unreported-file-change.json | 14 ++ .../golden/live-commit-no-pending-page.json | 13 ++ .../oracle/golden/live-commit-no-pending.json | 13 ++ tests/oracle/golden/live-complete-clean.json | 11 ++ .../golden/live-complete-discard-alias.json | 11 ++ .../golden/live-complete-discarded.json | 11 ++ .../oracle/golden/live-complete-error-eq.json | 11 ++ .../live-complete-error-no-message.json | 11 ++ tests/oracle/golden/live-complete-error.json | 11 ++ tests/oracle/golden/live-complete-help.json | 9 + tests/oracle/golden/live-complete-no-id.json | 9 + ...lete-source-dirty-carbonize-leftovers.json | 10 ++ .../live-complete-source-dirty-force.json | 11 ++ .../golden/live-complete-source-dirty.json | 11 ++ .../live-complete-source-in-node-modules.json | 11 ++ .../live-complete-source-missing-file.json | 11 ++ tests/oracle/golden/live-complete-twice.json | 21 +++ .../golden/live-complete-unknown-session.json | 11 ++ ...ve-daemon-server-status-poll-complete.json | 95 ++++++++++ tests/oracle/golden/live-discard-all.json | 14 ++ tests/oracle/golden/live-discard-empty.json | 14 ++ tests/oracle/golden/live-discard-help.json | 13 ++ .../golden/live-discard-invalid-buffer.json | 14 ++ .../golden/live-discard-page-bare-flag.json | 14 ++ .../golden/live-discard-page-no-match.json | 14 ++ tests/oracle/golden/live-discard-page.json | 14 ++ tests/oracle/golden/live-discard-twice.json | 24 +++ tests/oracle/golden/live-help.json | 7 + .../live-inject-anchor-missing-all.json | 11 ++ .../golden/live-inject-astro-inline.json | 22 +++ .../golden/live-inject-check-env-config.json | 7 + .../live-inject-check-invalid-anchor.json | 7 + .../live-inject-check-invalid-files.json | 7 + .../live-inject-check-invalid-json.json | 7 + .../golden/live-inject-check-missing.json | 7 + tests/oracle/golden/live-inject-check-ok.json | 7 + .../live-inject-csp-meta-no-connect-src.json | 12 ++ .../golden/live-inject-exclude-glob.json | 16 ++ .../golden/live-inject-file-not-found.json | 12 ++ .../live-inject-from-repo-root-via-roots.json | 30 ++++ .../live-inject-heals-orphan-journal.json | 14 ++ tests/oracle/golden/live-inject-help.json | 7 + .../live-inject-html-repeat-and-remove.json | 35 ++++ .../golden/live-inject-html-tag-no-token.json | 12 ++ tests/oracle/golden/live-inject-html-tag.json | 14 ++ .../golden/live-inject-insert-after.json | 12 ++ .../golden/live-inject-missing-port.json | 9 + ...live-inject-monorepo-repo-root-ignore.json | 14 ++ tests/oracle/golden/live-inject-next-jsx.json | 22 +++ .../oracle/golden/live-inject-no-config.json | 7 + .../golden/live-inject-nuxt-adapter.json | 26 +++ .../live-inject-nuxt-plugin-conflict.json | 21 +++ .../golden/live-inject-nuxt-srcdir.json | 13 ++ tests/oracle/golden/live-inject-port-nan.json | 9 + .../golden/live-inject-remove-clean.json | 10 ++ .../golden/live-inject-sveltekit-adapter.json | 35 ++++ ...live-inject-sveltekit-existing-layout.json | 23 +++ .../golden/live-inject-tanstack-adapter.json | 28 +++ ...ve-inject-tanstack-component-conflict.json | 13 ++ .../live-inject-target-missing-value.json | 7 + .../live-inject-token-from-server-json.json | 13 ++ ...nject-token-server-json-port-mismatch.json | 13 ++ .../golden/live-inject-vite-csp-meta.json | 21 +++ .../golden/live-insert-astro-after.json | 11 ++ .../golden/live-insert-element-not-found.json | 9 + .../live-insert-element-not-in-source.json | 9 + .../golden/live-insert-file-is-generated.json | 9 + tests/oracle/golden/live-insert-help.json | 9 + .../oracle/golden/live-insert-html-after.json | 10 ++ .../golden/live-insert-html-before.json | 10 ++ .../golden/live-insert-html-deferred.json | 10 ++ .../live-insert-html-text-ambiguous.json | 10 ++ .../golden/live-insert-html-text-picks.json | 10 ++ .../golden/live-insert-invalid-position.json | 9 + .../oracle/golden/live-insert-jsx-after.json | 12 ++ .../live-insert-jsx-before-deferred.json | 12 ++ .../oracle/golden/live-insert-missing-id.json | 9 + .../golden/live-insert-missing-locator.json | 9 + .../golden/live-insert-missing-position.json | 9 + .../golden/live-insert-svelte-component.json | 17 ++ .../live-insert-svelte-env-disabled.json | 11 ++ .../oracle/golden/live-insert-vue-after.json | 10 ++ .../golden/live-poll-connection-refused.json | 10 ++ tests/oracle/golden/live-poll-help.json | 9 + .../live-poll-no-server-stale-record.json | 9 + tests/oracle/golden/live-poll-no-server.json | 9 + .../golden/live-poll-reply-bad-data-json.json | 10 ++ .../live-poll-reply-connection-refused.json | 10 ++ .../golden/live-poll-reply-missing-id.json | 10 ++ .../live-poll-reply-missing-status.json | 10 ++ .../golden/live-poll-reply-status-as-id.json | 10 ++ .../golden/live-poll-reply-status-flag.json | 10 ++ .../golden/live-resume-accept-requested.json | 10 ++ tests/oracle/golden/live-resume-by-id-eq.json | 12 ++ tests/oracle/golden/live-resume-by-id.json | 12 ++ .../live-resume-carbonize-required.json | 10 ++ .../golden/live-resume-completed-only.json | 10 ++ .../live-resume-first-active-sorted.json | 12 ++ .../oracle/golden/live-resume-generating.json | 10 ++ tests/oracle/golden/live-resume-help.json | 9 + .../golden/live-resume-manual-apply.json | 10 ++ .../golden/live-resume-mount-failed.json | 10 ++ tests/oracle/golden/live-resume-none.json | 9 + .../oracle/golden/live-resume-unknown-id.json | 10 ++ .../golden/live-server-already-running.json | 10 ++ tests/oracle/golden/live-server-help.json | 9 + .../golden/live-server-stop-no-config.json | 7 + .../live-server-stop-none-keep-inject.json | 9 + .../oracle/golden/live-server-stop-none.json | 10 ++ .../golden/live-server-stop-removes-tag.json | 10 ++ .../live-server-target-missing-value.json | 7 + tests/oracle/golden/live-status-empty.json | 9 + .../golden/live-status-from-subdir.json | 10 ++ .../oracle/golden/live-status-generating.json | 10 ++ .../live-status-legacy-sessions-dir.json | 9 + .../golden/live-status-manual-apply.json | 10 ++ .../golden/live-status-many-sessions.json | 12 ++ .../golden/live-status-mount-failed.json | 10 ++ .../golden/live-status-stale-server-json.json | 10 ++ .../live-status-target-missing-value.json | 9 + .../golden/live-target-missing-value.json | 7 + .../golden/live-wrap-astro-deferred.json | 11 ++ tests/oracle/golden/live-wrap-astro.json | 11 ++ .../golden/live-wrap-element-not-found.json | 9 + .../live-wrap-element-not-in-source.json | 9 + .../live-wrap-file-element-missing.json | 9 + .../golden/live-wrap-file-is-generated.json | 9 + tests/oracle/golden/live-wrap-help.json | 9 + .../golden/live-wrap-html-by-classes-tag.json | 10 ++ tests/oracle/golden/live-wrap-html-by-id.json | 10 ++ .../golden/live-wrap-html-by-query.json | 10 ++ .../golden/live-wrap-html-deferred.json | 10 ++ .../oracle/golden/live-wrap-html-eq-form.json | 10 ++ .../golden/live-wrap-html-explicit-file.json | 11 ++ .../golden/live-wrap-html-multiline.json | 10 ++ .../live-wrap-html-page-url-no-pending.json | 10 ++ .../oracle/golden/live-wrap-jsx-deferred.json | 12 ++ .../golden/live-wrap-jsx-mapped-item.json | 12 ++ tests/oracle/golden/live-wrap-jsx.json | 12 ++ tests/oracle/golden/live-wrap-missing-id.json | 9 + .../golden/live-wrap-missing-locator.json | 9 + .../live-wrap-monorepo-child-from-root.json | 10 ++ .../golden/live-wrap-no-text-first-match.json | 10 ++ .../live-wrap-pending-edits-ambiguous.json | 11 ++ .../live-wrap-pending-edits-applied.json | 11 ++ .../live-wrap-pending-edits-no-page-url.json | 11 ++ .../live-wrap-pending-edits-other-page.json | 11 ++ .../live-wrap-pending-edits-unrelated.json | 11 ++ .../live-wrap-svelte-component-each.json | 17 ++ ...-wrap-svelte-component-refused-script.json | 11 ++ .../live-wrap-svelte-component-twice.json | 27 +++ .../golden/live-wrap-svelte-component.json | 17 ++ .../golden/live-wrap-svelte-env-disabled.json | 11 ++ .../golden/live-wrap-svelte-no-compiler.json | 11 ++ .../oracle/golden/live-wrap-tanstack-tsx.json | 11 ++ .../live-wrap-target-missing-value.json | 9 + .../golden/live-wrap-text-ambiguous.json | 10 ++ .../golden/live-wrap-text-not-in-source.json | 10 ++ .../golden/live-wrap-text-picks-second.json | 10 ++ .../live-wrap-text-short-falls-back.json | 10 ++ .../golden/live-wrap-tsx-multiline.json | 12 ++ tests/oracle/golden/live-wrap-vue.json | 10 ++ tests/oracle/lib.mjs | 8 +- tests/oracle/live-helpers.mjs | 158 +++++++++++++++++ .../live-astro/.impeccable/live/config.json | 5 + tests/oracle/workspaces/live-astro/DESIGN.md | 12 ++ tests/oracle/workspaces/live-astro/PRODUCT.md | 8 + .../workspaces/live-astro/astro.config.mjs | 3 + .../oracle/workspaces/live-astro/package.json | 1 + .../live-astro/src/layouts/Layout.astro | 14 ++ .../live-astro/src/pages/index.astro | 13 ++ .../live-html/.impeccable/live/config.json | 5 + tests/oracle/workspaces/live-html/DESIGN.md | 12 ++ tests/oracle/workspaces/live-html/PRODUCT.md | 8 + tests/oracle/workspaces/live-html/index.html | 25 +++ .../live-html/public/docs/guide.html | 13 ++ .../workspaces/live-html/public/no-body.html | 5 + .../workspaces/live-html/src/cards.html | 14 ++ .../oracle/workspaces/live-monorepo/DESIGN.md | 12 ++ .../workspaces/live-monorepo/PRODUCT.md | 8 + .../workspaces/live-monorepo/package.json | 4 + .../website/.impeccable/live/config.json | 5 + .../live-monorepo/website/index.html | 11 ++ .../live-monorepo/website/package.json | 7 + .../live-monorepo/website/src/App.jsx | 22 +++ .../live-monorepo/website/vite.config.js | 4 + .../live-next/.impeccable/live/config.json | 5 + tests/oracle/workspaces/live-next/DESIGN.md | 12 ++ tests/oracle/workspaces/live-next/PRODUCT.md | 8 + .../workspaces/live-next/app/layout.tsx | 17 ++ .../oracle/workspaces/live-next/app/page.tsx | 8 + .../workspaces/live-next/next.config.js | 4 + .../oracle/workspaces/live-next/package.json | 1 + .../live-nuxt/.impeccable/live/config.json | 5 + tests/oracle/workspaces/live-nuxt/DESIGN.md | 12 ++ tests/oracle/workspaces/live-nuxt/PRODUCT.md | 8 + tests/oracle/workspaces/live-nuxt/app.vue | 10 ++ .../workspaces/live-nuxt/nuxt.config.ts | 4 + .../oracle/workspaces/live-nuxt/package.json | 1 + .../workspaces/live-nuxt/pages/index.vue | 6 + .../.impeccable/live/config.json | 5 + .../workspaces/live-sveltekit/DESIGN.md | 12 ++ .../workspaces/live-sveltekit/PRODUCT.md | 8 + .../workspaces/live-sveltekit/package.json | 13 ++ .../workspaces/live-sveltekit/src/app.html | 11 ++ .../live-sveltekit/src/routes/+page.svelte | 27 +++ .../live-sveltekit/svelte.config.js | 3 + .../.impeccable/live/config.json | 5 + .../oracle/workspaces/live-tanstack/DESIGN.md | 12 ++ .../workspaces/live-tanstack/PRODUCT.md | 8 + .../workspaces/live-tanstack/package.json | 12 ++ .../live-tanstack/src/routes/__root.tsx | 25 +++ .../live-tanstack/src/routes/index.tsx | 14 ++ .../workspaces/live-tanstack/vite.config.js | 4 + .../live-vite/.impeccable/live/config.json | 5 + tests/oracle/workspaces/live-vite/DESIGN.md | 12 ++ tests/oracle/workspaces/live-vite/PRODUCT.md | 8 + tests/oracle/workspaces/live-vite/index.html | 11 ++ .../oracle/workspaces/live-vite/package.json | 9 + tests/oracle/workspaces/live-vite/src/App.jsx | 22 +++ .../oracle/workspaces/live-vite/src/Panel.tsx | 12 ++ .../oracle/workspaces/live-vite/src/main.jsx | 4 + .../workspaces/live-vite/vite.config.js | 4 + .../workspaces/live-workspaces/DESIGN.md | 12 ++ .../workspaces/live-workspaces/PRODUCT.md | 8 + .../apps/admin/astro.config.mjs | 3 + .../live-workspaces/apps/admin/package.json | 1 + .../apps/admin/src/pages/index.astro | 13 ++ .../live-workspaces/apps/web/index.html | 11 ++ .../live-workspaces/apps/web/package.json | 1 + .../live-workspaces/apps/web/src/App.jsx | 22 +++ .../live-workspaces/apps/web/vite.config.js | 4 + .../workspaces/live-workspaces/package.json | 5 + 306 files changed, 4281 insertions(+), 2 deletions(-) create mode 100644 tests/oracle/cases/live-accept.mjs create mode 100644 tests/oracle/cases/live-daemon.mjs create mode 100644 tests/oracle/cases/live-manual.mjs create mode 100644 tests/oracle/cases/live-roots.mjs create mode 100644 tests/oracle/cases/live-session.mjs create mode 100644 tests/oracle/cases/live-wrap.mjs create mode 100644 tests/oracle/golden/live-accept-generated-file.json create mode 100644 tests/oracle/golden/live-accept-help.json create mode 100644 tests/oracle/golden/live-accept-html-discard-then-accept.json create mode 100644 tests/oracle/golden/live-accept-html-discard.json create mode 100644 tests/oracle/golden/live-accept-html-malformed-params.json create mode 100644 tests/oracle/golden/live-accept-html-no-css-block.json create mode 100644 tests/oracle/golden/live-accept-html-no-params.json create mode 100644 tests/oracle/golden/live-accept-html-receipt-conflict.json create mode 100644 tests/oracle/golden/live-accept-html-receipt-replay.json create mode 100644 tests/oracle/golden/live-accept-html-variant-1-range.json create mode 100644 tests/oracle/golden/live-accept-html-variant-2-steps.json create mode 100644 tests/oracle/golden/live-accept-html-variant-3-toggle.json create mode 100644 tests/oracle/golden/live-accept-html-variant-missing.json create mode 100644 tests/oracle/golden/live-accept-invalid-id.json create mode 100644 tests/oracle/golden/live-accept-invalid-variant-regex.json create mode 100644 tests/oracle/golden/live-accept-invalid-variant.json create mode 100644 tests/oracle/golden/live-accept-jsx-discard.json create mode 100644 tests/oracle/golden/live-accept-jsx-from-subdir.json create mode 100644 tests/oracle/golden/live-accept-jsx-variant-1.json create mode 100644 tests/oracle/golden/live-accept-jsx-variant-3-toggle-off.json create mode 100644 tests/oracle/golden/live-accept-markers-not-found.json create mode 100644 tests/oracle/golden/live-accept-missing-id.json create mode 100644 tests/oracle/golden/live-accept-need-mode.json create mode 100644 tests/oracle/golden/live-accept-no-page-url-keeps-buffer.json create mode 100644 tests/oracle/golden/live-accept-scrubs-buffer-for-page.json create mode 100644 tests/oracle/golden/live-accept-source-locked.json create mode 100644 tests/oracle/golden/live-accept-source-shadow-deprecated.json create mode 100644 tests/oracle/golden/live-accept-stale-lock-dead-pid.json create mode 100644 tests/oracle/golden/live-accept-svelte-component-accept.json create mode 100644 tests/oracle/golden/live-accept-svelte-component-discard.json create mode 100644 tests/oracle/golden/live-accept-svelte-component-styled-variant.json create mode 100644 tests/oracle/golden/live-accept-svelte-component-variant-missing.json create mode 100644 tests/oracle/golden/live-accept-svelte-fallback-source-wrapper.json create mode 100644 tests/oracle/golden/live-accept-svelte-insert-empty-variant.json create mode 100644 tests/oracle/golden/live-accept-target-missing-value.json create mode 100644 tests/oracle/golden/live-boot-astro-config-missing.json create mode 100644 tests/oracle/golden/live-boot-config-invalid-json.json create mode 100644 tests/oracle/golden/live-boot-config-invalid-schema.json create mode 100644 tests/oracle/golden/live-boot-context-missing-both.json create mode 100644 tests/oracle/golden/live-boot-context-missing-design-empty.json create mode 100644 tests/oracle/golden/live-boot-context-missing-product.json create mode 100644 tests/oracle/golden/live-boot-full-cycle.json create mode 100644 tests/oracle/golden/live-boot-html-config-missing.json create mode 100644 tests/oracle/golden/live-boot-monorepo-from-child.json create mode 100644 tests/oracle/golden/live-boot-monorepo-from-root.json create mode 100644 tests/oracle/golden/live-boot-monorepo-no-git-from-root.json create mode 100644 tests/oracle/golden/live-boot-monorepo-target-eq.json create mode 100644 tests/oracle/golden/live-boot-monorepo-target-file.json create mode 100644 tests/oracle/golden/live-boot-multi-app-selection.json create mode 100644 tests/oracle/golden/live-boot-multi-app-target.json create mode 100644 tests/oracle/golden/live-boot-pointer-accumulates.json create mode 100644 tests/oracle/golden/live-boot-sveltekit-config-missing.json create mode 100644 tests/oracle/golden/live-boot-vite-config-missing.json create mode 100644 tests/oracle/golden/live-boot-vite-from-subdir.json create mode 100644 tests/oracle/golden/live-boot-workspaces-from-child.json create mode 100644 tests/oracle/golden/live-boot-workspaces-selection.json create mode 100644 tests/oracle/golden/live-boot-workspaces-target.json create mode 100644 tests/oracle/golden/live-commit-help.json create mode 100644 tests/oracle/golden/live-commit-invalid-buffer.json create mode 100644 tests/oracle/golden/live-commit-mock-applied-page.json create mode 100644 tests/oracle/golden/live-commit-mock-default-result.json create mode 100644 tests/oracle/golden/live-commit-mock-error.json create mode 100644 tests/oracle/golden/live-commit-mock-invalid-result-json.json create mode 100644 tests/oracle/golden/live-commit-mock-leftover-marker-check.json create mode 100644 tests/oracle/golden/live-commit-mock-partial.json create mode 100644 tests/oracle/golden/live-commit-mock-then-discard-remaining.json create mode 100644 tests/oracle/golden/live-commit-mock-unreported-file-change.json create mode 100644 tests/oracle/golden/live-commit-no-pending-page.json create mode 100644 tests/oracle/golden/live-commit-no-pending.json create mode 100644 tests/oracle/golden/live-complete-clean.json create mode 100644 tests/oracle/golden/live-complete-discard-alias.json create mode 100644 tests/oracle/golden/live-complete-discarded.json create mode 100644 tests/oracle/golden/live-complete-error-eq.json create mode 100644 tests/oracle/golden/live-complete-error-no-message.json create mode 100644 tests/oracle/golden/live-complete-error.json create mode 100644 tests/oracle/golden/live-complete-help.json create mode 100644 tests/oracle/golden/live-complete-no-id.json create mode 100644 tests/oracle/golden/live-complete-source-dirty-carbonize-leftovers.json create mode 100644 tests/oracle/golden/live-complete-source-dirty-force.json create mode 100644 tests/oracle/golden/live-complete-source-dirty.json create mode 100644 tests/oracle/golden/live-complete-source-in-node-modules.json create mode 100644 tests/oracle/golden/live-complete-source-missing-file.json create mode 100644 tests/oracle/golden/live-complete-twice.json create mode 100644 tests/oracle/golden/live-complete-unknown-session.json create mode 100644 tests/oracle/golden/live-daemon-server-status-poll-complete.json create mode 100644 tests/oracle/golden/live-discard-all.json create mode 100644 tests/oracle/golden/live-discard-empty.json create mode 100644 tests/oracle/golden/live-discard-help.json create mode 100644 tests/oracle/golden/live-discard-invalid-buffer.json create mode 100644 tests/oracle/golden/live-discard-page-bare-flag.json create mode 100644 tests/oracle/golden/live-discard-page-no-match.json create mode 100644 tests/oracle/golden/live-discard-page.json create mode 100644 tests/oracle/golden/live-discard-twice.json create mode 100644 tests/oracle/golden/live-help.json create mode 100644 tests/oracle/golden/live-inject-anchor-missing-all.json create mode 100644 tests/oracle/golden/live-inject-astro-inline.json create mode 100644 tests/oracle/golden/live-inject-check-env-config.json create mode 100644 tests/oracle/golden/live-inject-check-invalid-anchor.json create mode 100644 tests/oracle/golden/live-inject-check-invalid-files.json create mode 100644 tests/oracle/golden/live-inject-check-invalid-json.json create mode 100644 tests/oracle/golden/live-inject-check-missing.json create mode 100644 tests/oracle/golden/live-inject-check-ok.json create mode 100644 tests/oracle/golden/live-inject-csp-meta-no-connect-src.json create mode 100644 tests/oracle/golden/live-inject-exclude-glob.json create mode 100644 tests/oracle/golden/live-inject-file-not-found.json create mode 100644 tests/oracle/golden/live-inject-from-repo-root-via-roots.json create mode 100644 tests/oracle/golden/live-inject-heals-orphan-journal.json create mode 100644 tests/oracle/golden/live-inject-help.json create mode 100644 tests/oracle/golden/live-inject-html-repeat-and-remove.json create mode 100644 tests/oracle/golden/live-inject-html-tag-no-token.json create mode 100644 tests/oracle/golden/live-inject-html-tag.json create mode 100644 tests/oracle/golden/live-inject-insert-after.json create mode 100644 tests/oracle/golden/live-inject-missing-port.json create mode 100644 tests/oracle/golden/live-inject-monorepo-repo-root-ignore.json create mode 100644 tests/oracle/golden/live-inject-next-jsx.json create mode 100644 tests/oracle/golden/live-inject-no-config.json create mode 100644 tests/oracle/golden/live-inject-nuxt-adapter.json create mode 100644 tests/oracle/golden/live-inject-nuxt-plugin-conflict.json create mode 100644 tests/oracle/golden/live-inject-nuxt-srcdir.json create mode 100644 tests/oracle/golden/live-inject-port-nan.json create mode 100644 tests/oracle/golden/live-inject-remove-clean.json create mode 100644 tests/oracle/golden/live-inject-sveltekit-adapter.json create mode 100644 tests/oracle/golden/live-inject-sveltekit-existing-layout.json create mode 100644 tests/oracle/golden/live-inject-tanstack-adapter.json create mode 100644 tests/oracle/golden/live-inject-tanstack-component-conflict.json create mode 100644 tests/oracle/golden/live-inject-target-missing-value.json create mode 100644 tests/oracle/golden/live-inject-token-from-server-json.json create mode 100644 tests/oracle/golden/live-inject-token-server-json-port-mismatch.json create mode 100644 tests/oracle/golden/live-inject-vite-csp-meta.json create mode 100644 tests/oracle/golden/live-insert-astro-after.json create mode 100644 tests/oracle/golden/live-insert-element-not-found.json create mode 100644 tests/oracle/golden/live-insert-element-not-in-source.json create mode 100644 tests/oracle/golden/live-insert-file-is-generated.json create mode 100644 tests/oracle/golden/live-insert-help.json create mode 100644 tests/oracle/golden/live-insert-html-after.json create mode 100644 tests/oracle/golden/live-insert-html-before.json create mode 100644 tests/oracle/golden/live-insert-html-deferred.json create mode 100644 tests/oracle/golden/live-insert-html-text-ambiguous.json create mode 100644 tests/oracle/golden/live-insert-html-text-picks.json create mode 100644 tests/oracle/golden/live-insert-invalid-position.json create mode 100644 tests/oracle/golden/live-insert-jsx-after.json create mode 100644 tests/oracle/golden/live-insert-jsx-before-deferred.json create mode 100644 tests/oracle/golden/live-insert-missing-id.json create mode 100644 tests/oracle/golden/live-insert-missing-locator.json create mode 100644 tests/oracle/golden/live-insert-missing-position.json create mode 100644 tests/oracle/golden/live-insert-svelte-component.json create mode 100644 tests/oracle/golden/live-insert-svelte-env-disabled.json create mode 100644 tests/oracle/golden/live-insert-vue-after.json create mode 100644 tests/oracle/golden/live-poll-connection-refused.json create mode 100644 tests/oracle/golden/live-poll-help.json create mode 100644 tests/oracle/golden/live-poll-no-server-stale-record.json create mode 100644 tests/oracle/golden/live-poll-no-server.json create mode 100644 tests/oracle/golden/live-poll-reply-bad-data-json.json create mode 100644 tests/oracle/golden/live-poll-reply-connection-refused.json create mode 100644 tests/oracle/golden/live-poll-reply-missing-id.json create mode 100644 tests/oracle/golden/live-poll-reply-missing-status.json create mode 100644 tests/oracle/golden/live-poll-reply-status-as-id.json create mode 100644 tests/oracle/golden/live-poll-reply-status-flag.json create mode 100644 tests/oracle/golden/live-resume-accept-requested.json create mode 100644 tests/oracle/golden/live-resume-by-id-eq.json create mode 100644 tests/oracle/golden/live-resume-by-id.json create mode 100644 tests/oracle/golden/live-resume-carbonize-required.json create mode 100644 tests/oracle/golden/live-resume-completed-only.json create mode 100644 tests/oracle/golden/live-resume-first-active-sorted.json create mode 100644 tests/oracle/golden/live-resume-generating.json create mode 100644 tests/oracle/golden/live-resume-help.json create mode 100644 tests/oracle/golden/live-resume-manual-apply.json create mode 100644 tests/oracle/golden/live-resume-mount-failed.json create mode 100644 tests/oracle/golden/live-resume-none.json create mode 100644 tests/oracle/golden/live-resume-unknown-id.json create mode 100644 tests/oracle/golden/live-server-already-running.json create mode 100644 tests/oracle/golden/live-server-help.json create mode 100644 tests/oracle/golden/live-server-stop-no-config.json create mode 100644 tests/oracle/golden/live-server-stop-none-keep-inject.json create mode 100644 tests/oracle/golden/live-server-stop-none.json create mode 100644 tests/oracle/golden/live-server-stop-removes-tag.json create mode 100644 tests/oracle/golden/live-server-target-missing-value.json create mode 100644 tests/oracle/golden/live-status-empty.json create mode 100644 tests/oracle/golden/live-status-from-subdir.json create mode 100644 tests/oracle/golden/live-status-generating.json create mode 100644 tests/oracle/golden/live-status-legacy-sessions-dir.json create mode 100644 tests/oracle/golden/live-status-manual-apply.json create mode 100644 tests/oracle/golden/live-status-many-sessions.json create mode 100644 tests/oracle/golden/live-status-mount-failed.json create mode 100644 tests/oracle/golden/live-status-stale-server-json.json create mode 100644 tests/oracle/golden/live-status-target-missing-value.json create mode 100644 tests/oracle/golden/live-target-missing-value.json create mode 100644 tests/oracle/golden/live-wrap-astro-deferred.json create mode 100644 tests/oracle/golden/live-wrap-astro.json create mode 100644 tests/oracle/golden/live-wrap-element-not-found.json create mode 100644 tests/oracle/golden/live-wrap-element-not-in-source.json create mode 100644 tests/oracle/golden/live-wrap-file-element-missing.json create mode 100644 tests/oracle/golden/live-wrap-file-is-generated.json create mode 100644 tests/oracle/golden/live-wrap-help.json create mode 100644 tests/oracle/golden/live-wrap-html-by-classes-tag.json create mode 100644 tests/oracle/golden/live-wrap-html-by-id.json create mode 100644 tests/oracle/golden/live-wrap-html-by-query.json create mode 100644 tests/oracle/golden/live-wrap-html-deferred.json create mode 100644 tests/oracle/golden/live-wrap-html-eq-form.json create mode 100644 tests/oracle/golden/live-wrap-html-explicit-file.json create mode 100644 tests/oracle/golden/live-wrap-html-multiline.json create mode 100644 tests/oracle/golden/live-wrap-html-page-url-no-pending.json create mode 100644 tests/oracle/golden/live-wrap-jsx-deferred.json create mode 100644 tests/oracle/golden/live-wrap-jsx-mapped-item.json create mode 100644 tests/oracle/golden/live-wrap-jsx.json create mode 100644 tests/oracle/golden/live-wrap-missing-id.json create mode 100644 tests/oracle/golden/live-wrap-missing-locator.json create mode 100644 tests/oracle/golden/live-wrap-monorepo-child-from-root.json create mode 100644 tests/oracle/golden/live-wrap-no-text-first-match.json create mode 100644 tests/oracle/golden/live-wrap-pending-edits-ambiguous.json create mode 100644 tests/oracle/golden/live-wrap-pending-edits-applied.json create mode 100644 tests/oracle/golden/live-wrap-pending-edits-no-page-url.json create mode 100644 tests/oracle/golden/live-wrap-pending-edits-other-page.json create mode 100644 tests/oracle/golden/live-wrap-pending-edits-unrelated.json create mode 100644 tests/oracle/golden/live-wrap-svelte-component-each.json create mode 100644 tests/oracle/golden/live-wrap-svelte-component-refused-script.json create mode 100644 tests/oracle/golden/live-wrap-svelte-component-twice.json create mode 100644 tests/oracle/golden/live-wrap-svelte-component.json create mode 100644 tests/oracle/golden/live-wrap-svelte-env-disabled.json create mode 100644 tests/oracle/golden/live-wrap-svelte-no-compiler.json create mode 100644 tests/oracle/golden/live-wrap-tanstack-tsx.json create mode 100644 tests/oracle/golden/live-wrap-target-missing-value.json create mode 100644 tests/oracle/golden/live-wrap-text-ambiguous.json create mode 100644 tests/oracle/golden/live-wrap-text-not-in-source.json create mode 100644 tests/oracle/golden/live-wrap-text-picks-second.json create mode 100644 tests/oracle/golden/live-wrap-text-short-falls-back.json create mode 100644 tests/oracle/golden/live-wrap-tsx-multiline.json create mode 100644 tests/oracle/golden/live-wrap-vue.json create mode 100644 tests/oracle/live-helpers.mjs create mode 100644 tests/oracle/workspaces/live-astro/.impeccable/live/config.json create mode 100644 tests/oracle/workspaces/live-astro/DESIGN.md create mode 100644 tests/oracle/workspaces/live-astro/PRODUCT.md create mode 100644 tests/oracle/workspaces/live-astro/astro.config.mjs create mode 100644 tests/oracle/workspaces/live-astro/package.json create mode 100644 tests/oracle/workspaces/live-astro/src/layouts/Layout.astro create mode 100644 tests/oracle/workspaces/live-astro/src/pages/index.astro create mode 100644 tests/oracle/workspaces/live-html/.impeccable/live/config.json create mode 100644 tests/oracle/workspaces/live-html/DESIGN.md create mode 100644 tests/oracle/workspaces/live-html/PRODUCT.md create mode 100644 tests/oracle/workspaces/live-html/index.html create mode 100644 tests/oracle/workspaces/live-html/public/docs/guide.html create mode 100644 tests/oracle/workspaces/live-html/public/no-body.html create mode 100644 tests/oracle/workspaces/live-html/src/cards.html create mode 100644 tests/oracle/workspaces/live-monorepo/DESIGN.md create mode 100644 tests/oracle/workspaces/live-monorepo/PRODUCT.md create mode 100644 tests/oracle/workspaces/live-monorepo/package.json create mode 100644 tests/oracle/workspaces/live-monorepo/website/.impeccable/live/config.json create mode 100644 tests/oracle/workspaces/live-monorepo/website/index.html create mode 100644 tests/oracle/workspaces/live-monorepo/website/package.json create mode 100644 tests/oracle/workspaces/live-monorepo/website/src/App.jsx create mode 100644 tests/oracle/workspaces/live-monorepo/website/vite.config.js create mode 100644 tests/oracle/workspaces/live-next/.impeccable/live/config.json create mode 100644 tests/oracle/workspaces/live-next/DESIGN.md create mode 100644 tests/oracle/workspaces/live-next/PRODUCT.md create mode 100644 tests/oracle/workspaces/live-next/app/layout.tsx create mode 100644 tests/oracle/workspaces/live-next/app/page.tsx create mode 100644 tests/oracle/workspaces/live-next/next.config.js create mode 100644 tests/oracle/workspaces/live-next/package.json create mode 100644 tests/oracle/workspaces/live-nuxt/.impeccable/live/config.json create mode 100644 tests/oracle/workspaces/live-nuxt/DESIGN.md create mode 100644 tests/oracle/workspaces/live-nuxt/PRODUCT.md create mode 100644 tests/oracle/workspaces/live-nuxt/app.vue create mode 100644 tests/oracle/workspaces/live-nuxt/nuxt.config.ts create mode 100644 tests/oracle/workspaces/live-nuxt/package.json create mode 100644 tests/oracle/workspaces/live-nuxt/pages/index.vue create mode 100644 tests/oracle/workspaces/live-sveltekit/.impeccable/live/config.json create mode 100644 tests/oracle/workspaces/live-sveltekit/DESIGN.md create mode 100644 tests/oracle/workspaces/live-sveltekit/PRODUCT.md create mode 100644 tests/oracle/workspaces/live-sveltekit/package.json create mode 100644 tests/oracle/workspaces/live-sveltekit/src/app.html create mode 100644 tests/oracle/workspaces/live-sveltekit/src/routes/+page.svelte create mode 100644 tests/oracle/workspaces/live-sveltekit/svelte.config.js create mode 100644 tests/oracle/workspaces/live-tanstack/.impeccable/live/config.json create mode 100644 tests/oracle/workspaces/live-tanstack/DESIGN.md create mode 100644 tests/oracle/workspaces/live-tanstack/PRODUCT.md create mode 100644 tests/oracle/workspaces/live-tanstack/package.json create mode 100644 tests/oracle/workspaces/live-tanstack/src/routes/__root.tsx create mode 100644 tests/oracle/workspaces/live-tanstack/src/routes/index.tsx create mode 100644 tests/oracle/workspaces/live-tanstack/vite.config.js create mode 100644 tests/oracle/workspaces/live-vite/.impeccable/live/config.json create mode 100644 tests/oracle/workspaces/live-vite/DESIGN.md create mode 100644 tests/oracle/workspaces/live-vite/PRODUCT.md create mode 100644 tests/oracle/workspaces/live-vite/index.html create mode 100644 tests/oracle/workspaces/live-vite/package.json create mode 100644 tests/oracle/workspaces/live-vite/src/App.jsx create mode 100644 tests/oracle/workspaces/live-vite/src/Panel.tsx create mode 100644 tests/oracle/workspaces/live-vite/src/main.jsx create mode 100644 tests/oracle/workspaces/live-vite/vite.config.js create mode 100644 tests/oracle/workspaces/live-workspaces/DESIGN.md create mode 100644 tests/oracle/workspaces/live-workspaces/PRODUCT.md create mode 100644 tests/oracle/workspaces/live-workspaces/apps/admin/astro.config.mjs create mode 100644 tests/oracle/workspaces/live-workspaces/apps/admin/package.json create mode 100644 tests/oracle/workspaces/live-workspaces/apps/admin/src/pages/index.astro create mode 100644 tests/oracle/workspaces/live-workspaces/apps/web/index.html create mode 100644 tests/oracle/workspaces/live-workspaces/apps/web/package.json create mode 100644 tests/oracle/workspaces/live-workspaces/apps/web/src/App.jsx create mode 100644 tests/oracle/workspaces/live-workspaces/apps/web/vite.config.js create mode 100644 tests/oracle/workspaces/live-workspaces/package.json diff --git a/tests/oracle/README.md b/tests/oracle/README.md index 3b15d539b..d4c32458c 100644 --- a/tests/oracle/README.md +++ b/tests/oracle/README.md @@ -55,3 +55,35 @@ Not covered on purpose: `palette` with no `--id` / `--from` / env seed (random), `concept-seed` against the live roll API, `generate-image` real mode, `serve-question --start` / blocking mode (opens a browser and binds a port), and unhandled-exception paths whose stack traces carry Node line numbers. + +## Live-mode cases (`cases/live-*.mjs`, workspaces `live-*`) + +Helpers live in `live-helpers.mjs` (staged journals, buffers, wrapped source +files with the fake-agent variant block, a `.git` FILE pointing at a non-repo +gitdir so roots resolution sees a git boundary while `git check-ignore` exits +128 everywhere and the ignore block lands in the snapshotable +`.gitfake/info/exclude`). Svelte component preview cases symlink this repo's +`node_modules/svelte` into the staged app, exactly like the unit tests. + +Harness additions made for live: + +- `steps[]` entries may carry their own `setup(ws)` (run right before that + step) and `daemon: true` with `readyFile` / `readyTimeoutMs`: the verb is + spawned detached, the harness waits for the ready file, later steps run + against it, and teardown SIGTERMs (then SIGKILLs) it. Its stdout/stderr land + in the golden as `daemon: [{stdout, stderr}]`. +- `normalize: [[regexSource, flags, replacement], ...]` on a case applies extra + masks to that case only. Live uses it for the dynamic helper port + (`localhost:`, `"port": `), lease and phase stamps (``), + and float durations (``). +- Global masks added: `"pid": ` / `(pid )` and UUID tokens ``. +- `snapshotFiles` walks `node_modules/.impeccable-live` (the Svelte preview + tree) and nothing else under `node_modules`. + +Deliberately not covered here (rely on `tests/live-e2e`): the browser +handshake and `/live.js` bundle, SSE, generate/accept round-trips through a +real browser, `variant_mount_failed` republish, manual-edit chat routing and +the codex/claude subprocess providers, Svelte revision-dir publishing, and +`live.mjs`'s dev-server-dependent flows. Lock-file names hash the absolute +source path, so lock cases do not snapshot `.impeccable/live/locks/`. +`live-poll-*-connection-refused` assumes nothing listens on 127.0.0.1:65531. diff --git a/tests/oracle/cases/live-accept.mjs b/tests/oracle/cases/live-accept.mjs new file mode 100644 index 000000000..a9af86b89 --- /dev/null +++ b/tests/oracle/cases/live-accept.mjs @@ -0,0 +1,165 @@ +/** + * `live-accept` corpus: argument paths, HTML and JSX accept/discard + * (carbonize output, param baking inputs), receipts, lock contention, + * generated-file fallback, buffer scrub, and the Svelte component path + * (wrap with the linked compiler, then accept/discard the stub variant). + */ +import fs from 'node:fs'; +import path from 'node:path'; +import { + LIVE_FILES, linkSvelte, lockPathFor, stageWrappedHtml, stageWrappedJsx, write, writeBuffer, +} from '../live-helpers.mjs'; + +const F = LIVE_FILES; +const HTML = [...F, 'index.html']; +const JSX = [...F, 'src/**']; +const A = (id, workspace, args, extra = {}) => ({ id, verb: 'live-accept', workspace, args, files: [...F, ...(extra.snap || [])], ...extra }); +const ID = 'ab12cd34'; + +export default [ + A('live-accept-help', 'live-html', ['--help']), + A('live-accept-missing-id', 'live-html', ['--variant', '1']), + A('live-accept-invalid-id', 'live-html', ['--id', '../etc', '--variant', '1']), + A('live-accept-need-mode', 'live-html', ['--id', ID]), + A('live-accept-invalid-variant', 'live-html', ['--id', ID, '--variant', '1a']), + A('live-accept-invalid-variant-regex', 'live-html', ['--id', ID, '--variant', '.*']), + A('live-accept-markers-not-found', 'live-html', ['--id', 'nothere1', '--variant', '1']), + A('live-accept-target-missing-value', 'live-html', ['--id', ID, '--variant', '1', '--target']), + + // --- HTML source-preview accept / discard --- + A('live-accept-html-variant-1-range', 'live-html', ['--id', ID, '--variant', '1', '--param-values', '{"lightness":0.65}'], { snap: ['index.html'], setup: stageWrappedHtml }), + A('live-accept-html-variant-2-steps', 'live-html', ['--id', ID, '--variant', '2', '--param-values', '{"face":"serif"}'], { snap: ['index.html'], setup: stageWrappedHtml }), + A('live-accept-html-variant-3-toggle', 'live-html', ['--id', ID, '--variant', '3', '--param-values', '{"italic":true}'], { snap: ['index.html'], setup: stageWrappedHtml }), + A('live-accept-html-no-params', 'live-html', ['--id', ID, '--variant', '2'], { snap: ['index.html'], setup: stageWrappedHtml }), + A('live-accept-html-malformed-params', 'live-html', ['--id', ID, '--variant', '1', '--param-values', '{bad'], { snap: ['index.html'], setup: stageWrappedHtml }), + A('live-accept-html-variant-missing', 'live-html', ['--id', ID, '--variant', '9'], { snap: ['index.html'], setup: stageWrappedHtml }), + A('live-accept-html-discard', 'live-html', ['--id', ID, '--discard'], { snap: ['index.html'], setup: stageWrappedHtml }), + A('live-accept-html-receipt-replay', 'live-html', ['--id', ID, '--variant', '1'], { snap: ['index.html'], setup: stageWrappedHtml, steps: [{}, {}] }), + A('live-accept-html-receipt-conflict', 'live-html', [], { snap: ['index.html'], setup: stageWrappedHtml, steps: [{ args: ['--id', ID, '--variant', '1'] }, { args: ['--id', ID, '--variant', '2'] }, { args: ['--id', ID, '--discard'] }] }), + A('live-accept-html-discard-then-accept', 'live-html', [], { snap: ['index.html'], setup: stageWrappedHtml, steps: [{ args: ['--id', ID, '--discard'] }, { args: ['--id', ID, '--variant', '1'] }] }), + A('live-accept-html-no-css-block', 'live-html', ['--id', ID, '--variant', '2'], { + snap: ['index.html'], + setup: (ws) => { + stageWrappedHtml(ws); + const p = path.join(ws, 'index.html'); + fs.writeFileSync(p, fs.readFileSync(p, 'utf8').replace(/ {8}\n'); + fs.writeFileSync(path.join(dir, 'params.json'), JSON.stringify({ 2: [ + { id: 'lead', kind: 'range', min: 1, max: 2, step: 0.1, default: 1.2, label: 'Lead' }, + { id: 'density', kind: 'steps', default: 'airy', label: 'Density', options: [{ value: 'airy', label: 'Airy' }, { value: 'snug', label: 'Snug' }] }, + ] }, null, 2)); + }, + }, + ], + }, + { + id: 'live-accept-svelte-component-discard', workspace: 'live-sveltekit', files: [...F, 'src/**'], setup: linkSvelte, + steps: [ + { verb: 'live-wrap', args: ['--id', ID, '--classes', 'expense-list', '--tag', 'ul'] }, + { verb: 'live-accept', args: ['--id', ID, '--discard'] }, + { verb: 'live-accept', args: ['--id', ID, '--discard'] }, + ], + }, + { + id: 'live-accept-svelte-component-variant-missing', workspace: 'live-sveltekit', files: [...F, 'src/**'], setup: linkSvelte, + steps: [ + { verb: 'live-wrap', args: ['--id', ID, '--classes', 'hero-title', '--tag', 'h1'] }, + { verb: 'live-accept', args: ['--id', ID, '--variant', '7'] }, + ], + }, + { + id: 'live-accept-svelte-insert-empty-variant', workspace: 'live-sveltekit', files: [...F, 'src/**'], + steps: [ + { verb: 'live-insert', args: ['--id', ID, '--position', 'after', '--element-id', 'features'] }, + { verb: 'live-accept', args: ['--id', ID, '--variant', '1'] }, + ], + }, + { + id: 'live-accept-svelte-fallback-source-wrapper', workspace: 'live-sveltekit', files: [...F, 'src/**'], + // No compiler: wrap wrote a plain source wrapper into the .svelte route. + steps: [ + { verb: 'live-wrap', args: ['--id', ID, '--classes', 'hero-title', '--tag', 'h1'] }, + { verb: 'live-accept', args: ['--id', ID, '--discard'] }, + ], + }, +]; diff --git a/tests/oracle/cases/live-daemon.mjs b/tests/oracle/cases/live-daemon.mjs new file mode 100644 index 000000000..0ef808e7f --- /dev/null +++ b/tests/oracle/cases/live-daemon.mjs @@ -0,0 +1,45 @@ +/** + * One end-to-end helper-server flow driven through the daemon step support + * in lib.mjs: start `live-server` detached, then status / poll / reply / + * complete / stop against it. Everything run-dependent (port, token, pids, + * lease and phase timestamps, durations) is masked per-case. + */ +import { LIVE_FILES, writeJournal } from '../live-helpers.mjs'; + +const ID = 'ab12cd34'; +const GEN = { type: 'generate', action: 'bolder', count: 3, pageUrl: '/', element: { tagName: 'h1', id: 'hero', classes: ['hero-title'], textContent: 'Oracle Fixture', outerHTML: '

Oracle Fixture

' }, clientSentAt: 1754042400000 }; +const NORM = [ + ['localhost:\\d{4,5}', 'g', 'localhost:'], + ['"(port|serverPort)":(\\s*)\\d{4,5}', 'g', '"$1":$2'], + ['Stopped live server on port \\d+\\.', 'g', 'Stopped live server on port .'], + ['already running on port \\d+ ', 'g', 'already running on port '], + ['"(leaseUntil|generationReadyAt|lastPollAt|generationCompletedAt|generationCanceledAt|at|leasedAt|clientSentAt)":(\\s*)\\d{10,}', 'g', '"$1":$2'], + ['"(durationMs|scaffoldDurationMs)":(\\s*)\\d+(?:\\.\\d+)?', 'g', '"$1":$2'], + // The journal embeds the float duration above, so its byte length moves too. + ['"__journalBytes":(\\s*)\\d+', 'g', '"__journalBytes":$1'], +]; + +export default [ + { + id: 'live-daemon-server-status-poll-complete', workspace: 'live-html', files: [...LIVE_FILES, 'index.html'], normalize: NORM, + // A durable session with a pending generate: the server restores it into + // its queue on start, so the first poll leases it (running the deferred + // wrap preflight against index.html) instead of timing out. + setup: (ws) => writeJournal(ws, ID, [GEN]), + steps: [ + { verb: 'live-server', daemon: true, readyFile: '.impeccable/live/server.json', readyTimeoutMs: 15000 }, + { verb: 'live-server', args: [] }, + { verb: 'live-status', args: [] }, + { verb: 'live-poll', args: ['--timeout=8000'] }, + { verb: 'live-poll', args: ['--reply', ID, 'done', '--file', 'index.html'] }, + { verb: 'live-poll', args: ['--timeout=300'] }, + { verb: 'live-poll', args: ['--reply', 'zz99zz99', 'done'] }, + { verb: 'live-poll', args: ['--reply', ID, 'steer_done'] }, + { verb: 'live-resume', args: [] }, + { verb: 'live-complete', args: ['--id', ID] }, + { verb: 'live-status', args: [] }, + { verb: 'live-server', args: ['stop'] }, + { verb: 'live-status', args: [] }, + ], + }, +]; diff --git a/tests/oracle/cases/live-manual.mjs b/tests/oracle/cases/live-manual.mjs new file mode 100644 index 000000000..1896067b5 --- /dev/null +++ b/tests/oracle/cases/live-manual.mjs @@ -0,0 +1,80 @@ +/** + * Manual copy-edit helpers: `live-discard-manual-edits`, + * `live-commit-manual-edits` (mock provider only: no codex/claude spawn), + * driven from a staged pending-manual-edits.json buffer. + */ +import { LIVE_FILES, write, writeBuffer } from '../live-helpers.mjs'; + +const F = [...LIVE_FILES, 'index.html', 'src/**', 'public/**']; +const entry = (id, pageUrl, ops) => ({ id, pageUrl, element: { tagName: 'h1', classes: ['hero-title'] }, ops, stagedAt: '2026-08-01T00:00:00.000Z' }); +const twoPages = (ws) => writeBuffer(ws, [ + entry('e1', '/', [{ ref: 'main>h1', tag: 'h1', classes: ['hero-title'], originalText: 'Oracle Fixture', newText: 'Oracle Fixture, renamed', sourceHint: { file: 'index.html', line: 13, column: 7 } }]), + entry('e2', '/', [{ ref: 'main>p', tag: 'p', originalText: 'Minimal static page for oracle live-mode goldens.', newText: 'A tighter hook.' }, { ref: 'aside>p', tag: 'p', originalText: 'Nested content.', newText: 'Nested copy.' }]), + entry('e3', '/docs/guide', [{ ref: 'article>p', tag: 'p', originalText: 'A second page covered by the config glob.', newText: 'Second page lead.' }]), +]); +const D = (id, args, setup, extra = {}) => ({ id, verb: 'live-discard-manual-edits', workspace: 'live-html', args, setup, files: F, ...extra }); +const C = (id, args, setup, extra = {}) => ({ id, verb: 'live-commit-manual-edits', workspace: 'live-html', args, setup, files: F, ...extra }); +const MOCK = { IMPECCABLE_LIVE_COPY_AGENT: 'mock' }; + +export default [ + D('live-discard-help', ['--help'], null), + D('live-discard-empty', [], null), + D('live-discard-all', [], twoPages), + D('live-discard-page', ['--page-url=/'], twoPages), + D('live-discard-page-no-match', ['--page-url=/nope'], twoPages), + D('live-discard-page-bare-flag', ['--page-url'], twoPages), + D('live-discard-twice', [], twoPages, { steps: [{}, {}] }), + D('live-discard-invalid-buffer', [], (ws) => write(ws, '.impeccable/live/pending-manual-edits.json', '{ nope')), + + C('live-commit-help', ['--help'], null), + C('live-commit-no-pending', [], null, { env: MOCK }), + C('live-commit-no-pending-page', ['--page-url=/'], null, { env: MOCK }), + C('live-commit-invalid-buffer', [], (ws) => write(ws, '.impeccable/live/pending-manual-edits.json', '{ nope'), { env: MOCK }), + C('live-commit-mock-default-result', ['--provider=mock'], twoPages, { + // Mock reports every entry applied but touched no files: source + // verification finds the new text nowhere and refuses to clear. + env: MOCK, + }), + C('live-commit-mock-applied-page', ['--page-url=/', '--provider=mock'], twoPages, { + env: { + ...MOCK, + IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'index.html': '\n\n \n
\n

Oracle Fixture, renamed

\n

A tighter hook.

\n \n
\n \n\n' }), + IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'done', appliedEntryIds: ['e1', 'e2'], failed: [], files: ['index.html'], notes: ['oracle mock'] }), + }, + }), + C('live-commit-mock-partial', ['--page-url=/', '--provider=mock'], twoPages, { + env: { + ...MOCK, + IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'index.html': '

Oracle Fixture, renamed

Minimal static page for oracle live-mode goldens.

\n' }), + IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'partial', appliedEntryIds: ['e1'], failed: [{ entryId: 'e2', reason: 'ambiguous duplicate copy' }], files: ['index.html'] }), + }, + }), + C('live-commit-mock-error', ['--provider=mock'], twoPages, { + env: { ...MOCK, IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'error', message: 'agent gave up', appliedEntryIds: [], failed: [], files: [] }) }, + }), + C('live-commit-mock-unreported-file-change', ['--page-url=/', '--provider=mock'], twoPages, { + env: { + ...MOCK, + IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'index.html': '

Oracle Fixture, renamed

A tighter hook.

\n' }), + IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'done', appliedEntryIds: ['e1', 'e2'], failed: [], files: [] }), + }, + }), + C('live-commit-mock-invalid-result-json', ['--provider=mock'], twoPages, { + env: { ...MOCK, IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: '{not json' }, + }), + C('live-commit-mock-leftover-marker-check', ['--page-url=/docs/guide', '--provider=mock'], twoPages, { + env: { + ...MOCK, + IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'public/docs/guide.html': '\n\n

Second page lead.

\n\n' }), + IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'done', appliedEntryIds: ['e3'], failed: [], files: ['public/docs/guide.html'] }), + }, + }), + C('live-commit-mock-then-discard-remaining', ['--page-url=/docs/guide', '--provider=mock'], twoPages, { + env: { + ...MOCK, + IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'public/docs/guide.html': '

Guide

Second page lead.

\n' }), + IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'done', appliedEntryIds: ['e3'], failed: [], files: ['public/docs/guide.html'] }), + }, + steps: [{}, { verb: 'live-discard-manual-edits', args: [] }], + }), +]; diff --git a/tests/oracle/cases/live-roots.mjs b/tests/oracle/cases/live-roots.mjs new file mode 100644 index 000000000..ac6ceca9e --- /dev/null +++ b/tests/oracle/cases/live-roots.mjs @@ -0,0 +1,124 @@ +/** + * `impeccable live` (boot) and `live-inject` corpus: root resolution + * (roots.json + repo pointer), config checks, framework injection. + * Boot cases stop at config_missing so no helper server is spawned; the one + * full boot (`live-boot-full-cycle`) stops its server in a final step. + */ +import { LIVE_FILES, fakeGit, rm, write } from '../live-helpers.mjs'; + +const CFG = '.impeccable/live/config.json'; +const F = LIVE_FILES; +const PORT_NORM = [ + ['localhost:\\d{4,5}', 'g', 'localhost:'], + ['"(port|serverPort)":(\\s*)\\d{4,5}', 'g', '"$1":$2'], + ['Stopped live server on port \\d+\\.', 'g', 'Stopped live server on port .'], +]; + +export default [ + // --- live.mjs (boot) --- + { id: 'live-help', verb: 'live', workspace: 'live-html', args: ['--help'] }, + { id: 'live-target-missing-value', verb: 'live', workspace: 'live-html', args: ['--target'] }, + { id: 'live-boot-html-config-missing', verb: 'live', workspace: 'live-html', setup: (ws) => rm(ws, CFG), files: F }, + { id: 'live-boot-vite-config-missing', verb: 'live', workspace: 'live-vite', setup: (ws) => rm(ws, CFG), files: F }, + { id: 'live-boot-vite-from-subdir', verb: 'live', workspace: 'live-vite', cwd: 'src', setup: (ws) => rm(ws, CFG), files: F }, + { id: 'live-boot-context-missing-product', verb: 'live', workspace: 'live-vite', setup: (ws) => { rm(ws, 'PRODUCT.md'); }, files: F }, + { id: 'live-boot-context-missing-design-empty', verb: 'live', workspace: 'live-vite', setup: (ws) => { write(ws, 'DESIGN.md', ''); }, files: F }, + { id: 'live-boot-context-missing-both', verb: 'live', workspace: 'live-vite', setup: (ws) => { rm(ws, 'PRODUCT.md'); rm(ws, 'DESIGN.md'); }, files: F }, + { id: 'live-boot-config-invalid-json', verb: 'live', workspace: 'live-html', setup: (ws) => write(ws, CFG, '{ nope'), files: F }, + { id: 'live-boot-config-invalid-schema', verb: 'live', workspace: 'live-html', setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], insertBefore: '', commentSyntax: 'vue' })), files: F }, + { id: 'live-boot-sveltekit-config-missing', verb: 'live', workspace: 'live-sveltekit', setup: (ws) => rm(ws, CFG), files: F }, + { id: 'live-boot-astro-config-missing', verb: 'live', workspace: 'live-astro', setup: (ws) => rm(ws, CFG), files: F }, + { id: 'live-boot-monorepo-from-root', verb: 'live', workspace: 'live-monorepo', setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] }, + { id: 'live-boot-monorepo-from-child', verb: 'live', workspace: 'live-monorepo', cwd: 'website', setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] }, + { id: 'live-boot-monorepo-target-file', verb: 'live', workspace: 'live-monorepo', args: ['--target', 'website/src/App.jsx'], setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] }, + { id: 'live-boot-monorepo-target-eq', verb: 'live', workspace: 'live-monorepo', args: ['--target=website'], setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] }, + { id: 'live-boot-monorepo-no-git-from-root', verb: 'live', workspace: 'live-monorepo', setup: (ws) => rm(ws, 'website/' + CFG), files: [...F, 'website/.impeccable/**'] }, + { + id: 'live-boot-multi-app-selection', verb: 'live', workspace: 'live-monorepo', files: [...F, 'website/.impeccable/**', 'admin/.impeccable/**'], + setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); write(ws, 'admin/astro.config.mjs', 'export default {};\n'); write(ws, 'admin/package.json', '{"name":"admin"}\n'); }, + }, + { + id: 'live-boot-multi-app-target', verb: 'live', workspace: 'live-monorepo', args: ['--target', 'admin'], files: [...F, 'website/.impeccable/**', 'admin/.impeccable/**'], + setup: (ws) => { fakeGit(ws); write(ws, 'admin/astro.config.mjs', 'export default {};\n'); write(ws, 'admin/package.json', '{"name":"admin"}\n'); }, + }, + { id: 'live-boot-workspaces-selection', verb: 'live', workspace: 'live-workspaces', setup: (ws) => fakeGit(ws), files: F }, + { id: 'live-boot-workspaces-target', verb: 'live', workspace: 'live-workspaces', args: ['--target', 'apps/web'], setup: (ws) => fakeGit(ws), files: [...F, 'apps/web/.impeccable/**'] }, + { id: 'live-boot-workspaces-from-child', verb: 'live', workspace: 'live-workspaces', cwd: 'apps/admin', setup: (ws) => fakeGit(ws), files: [...F, 'apps/admin/.impeccable/**'] }, + { + id: 'live-boot-pointer-accumulates', verb: 'live', workspace: 'live-monorepo', files: [...F, 'website/.impeccable/**', 'admin/.impeccable/**'], + setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); write(ws, 'admin/astro.config.mjs', 'export default {};\n'); }, + steps: [{ args: ['--target', 'website'] }, { args: ['--target', 'admin'] }, { args: ['--target', 'website'] }], + }, + { + // Real boot: background server + inject + drift scan, then stop. Port is + // dynamic (first free from 8400), masked per-case. + id: 'live-boot-full-cycle', verb: 'live', workspace: 'live-html', files: [...F, 'index.html', 'public/**'], normalize: PORT_NORM, + steps: [{ verb: 'live' }, { verb: 'live-inject', args: ['--check'] }, { verb: 'live-server', args: ['stop'] }], + }, + + // --- live-inject.mjs --- + { id: 'live-inject-help', verb: 'live-inject', workspace: 'live-html', args: ['--help'] }, + { id: 'live-inject-check-ok', verb: 'live-inject', workspace: 'live-html', args: ['--check'] }, + { id: 'live-inject-check-missing', verb: 'live-inject', workspace: 'live-vite', args: ['--check'], setup: (ws) => rm(ws, CFG) }, + { id: 'live-inject-check-invalid-json', verb: 'live-inject', workspace: 'live-html', args: ['--check'], setup: (ws) => write(ws, CFG, '[1') }, + { id: 'live-inject-check-invalid-files', verb: 'live-inject', workspace: 'live-html', args: ['--check'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: [], insertBefore: '', commentSyntax: 'html' })) }, + { id: 'live-inject-check-invalid-anchor', verb: 'live-inject', workspace: 'live-html', args: ['--check'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], commentSyntax: 'html' })) }, + { id: 'live-inject-check-env-config', verb: 'live-inject', workspace: 'live-html', args: ['--check'], env: { IMPECCABLE_LIVE_CONFIG: 'alt.json' }, setup: (ws) => write(ws, 'alt.json', JSON.stringify({ files: ['public/docs/guide.html'], insertAfter: '', commentSyntax: 'html' })) }, + { id: 'live-inject-missing-port', verb: 'live-inject', workspace: 'live-html', args: [], files: F }, + { id: 'live-inject-port-nan', verb: 'live-inject', workspace: 'live-html', args: ['--port', 'abc'], files: F }, + { id: 'live-inject-no-config', verb: 'live-inject', workspace: 'live-vite', args: ['--port', '8412'], setup: (ws) => rm(ws, CFG), files: F }, + { id: 'live-inject-target-missing-value', verb: 'live-inject', workspace: 'live-html', args: ['--check', '--target'] }, + { id: 'live-inject-html-tag', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 'tok-oracle'], files: [...F, 'index.html', 'public/**'] }, + { id: 'live-inject-html-tag-no-token', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412'], files: [...F, 'index.html'] }, + { id: 'live-inject-token-from-server-json', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412'], setup: (ws) => write(ws, '.impeccable/live/server.json', '{"pid":1,"port":8412,"token":"from-server-json"}'), files: [...F, 'index.html'] }, + { id: 'live-inject-token-server-json-port-mismatch', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412'], setup: (ws) => write(ws, '.impeccable/live/server.json', '{"pid":1,"port":8499,"token":"other"}'), files: [...F, 'index.html'] }, + { id: 'live-inject-html-repeat-and-remove', verb: 'live-inject', workspace: 'live-html', files: [...F, 'index.html', 'public/**'], steps: [{ args: ['--port', '8412', '--token', 'a'] }, { args: ['--port', '8413', '--token', 'b'] }, { args: ['--remove'] }, { args: ['--remove'] }] }, + { id: 'live-inject-remove-clean', verb: 'live-inject', workspace: 'live-html', args: ['--remove'], files: [...F, 'index.html'] }, + { id: 'live-inject-file-not-found', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['missing.html', 'index.html'], insertBefore: '', commentSyntax: 'html' })), files: [...F, 'index.html'] }, + { id: 'live-inject-anchor-missing-all', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], insertBefore: '', commentSyntax: 'html' })), files: [...F, 'index.html'] }, + { id: 'live-inject-insert-after', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], exclude: ['public/**'], insertAfter: '', commentSyntax: 'html' })), files: [...F, 'index.html'] }, + { id: 'live-inject-exclude-glob', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['**/*.html'], exclude: ['dist/**', 'public/no-body.html'], insertBefore: '', commentSyntax: 'html' })), files: [...F, 'index.html', 'public/**', 'dist/**', 'src/**'] }, + { + id: 'live-inject-vite-csp-meta', verb: 'live-inject', workspace: 'live-vite', files: [...F, 'index.html'], + setup: (ws) => write(ws, 'index.html', '\n\n \n \n \n CSP\n \n \n
\n \n \n\n'), + steps: [{ args: ['--port', '8412', '--token', 't'] }, { args: ['--remove'] }], + }, + { + id: 'live-inject-csp-meta-no-connect-src', verb: 'live-inject', workspace: 'live-html', files: [...F, 'index.html'], + setup: (ws) => write(ws, 'index.html', '\n\n\n\n\n\n

Hi

\n\n\n'), + args: ['--port', '8412', '--token', 't'], + }, + { id: 'live-inject-next-jsx', verb: 'live-inject', workspace: 'live-next', files: [...F, 'app/**'], steps: [{ args: ['--port', '8412', '--token', 't'] }, { args: ['--remove'] }] }, + { id: 'live-inject-astro-inline', verb: 'live-inject', workspace: 'live-astro', files: [...F, 'src/**'], steps: [{ args: ['--port', '8412', '--token', 't'] }, { args: ['--remove'] }] }, + { id: 'live-inject-sveltekit-adapter', verb: 'live-inject', workspace: 'live-sveltekit', files: [...F, 'src/**'], steps: [{ args: ['--port', '8412', '--token', 't'] }, { args: ['--port', '8412', '--token', 't'] }, { args: ['--remove'] }, { args: ['--remove'] }] }, + { id: 'live-inject-sveltekit-existing-layout', verb: 'live-inject', workspace: 'live-sveltekit', files: [...F, 'src/**'], setup: (ws) => write(ws, 'src/routes/+layout.svelte', '\n\n\n{@render children()}\n'), steps: [{ args: ['--port', '8412', '--token', 't'] }, { args: ['--remove'] }] }, + { id: 'live-inject-nuxt-adapter', verb: 'live-inject', workspace: 'live-nuxt', files: [...F, 'plugins/**', 'app/**'], steps: [{ args: ['--port', '8412', '--token', 't'] }, { args: ['--remove'] }, { args: ['--remove'] }] }, + { id: 'live-inject-nuxt-plugin-conflict', verb: 'live-inject', workspace: 'live-nuxt', files: [...F, 'plugins/**'], setup: (ws) => write(ws, 'plugins/impeccable-live.client.ts', 'export default {};\n'), steps: [{ args: ['--port', '8412', '--token', 't'] }, { args: ['--remove'] }] }, + { id: 'live-inject-nuxt-srcdir', verb: 'live-inject', workspace: 'live-nuxt', files: [...F, 'app/**', 'plugins/**'], setup: (ws) => { write(ws, 'nuxt.config.ts', "export default defineNuxtConfig({ srcDir: 'app/' });\n"); write(ws, 'app/app.vue', '\n'); write(ws, CFG, JSON.stringify({ files: ['app/app.vue'], insertBefore: '', commentSyntax: 'html' })); }, args: ['--port', '8412', '--token', 't'] }, + { id: 'live-inject-tanstack-adapter', verb: 'live-inject', workspace: 'live-tanstack', files: [...F, 'src/**'], steps: [{ args: ['--port', '8412', '--token', 't'] }, { args: ['--port', '8412', '--token', 't'] }, { args: ['--remove'] }] }, + { id: 'live-inject-tanstack-component-conflict', verb: 'live-inject', workspace: 'live-tanstack', files: [...F, 'src/**'], setup: (ws) => write(ws, 'src/impeccable/ImpeccableLiveRoot.tsx', 'export default function X() { return null; }\n'), args: ['--port', '8412', '--token', 't'] }, + { + id: 'live-inject-monorepo-repo-root-ignore', verb: 'live-inject', workspace: 'live-monorepo', cwd: 'website', files: [...F, 'website/.impeccable/**', 'website/.gitignore', 'website/index.html'], + setup: (ws) => { fakeGit(ws); write(ws, 'website/.impeccable/live/roots.json', JSON.stringify({ version: 1, appRoot: `${ws}/website`, repoRoot: ws, contextRoot: ws, sessionRoot: `${ws}/website/.impeccable/live`, productPath: `${ws}/PRODUCT.md`, designPath: `${ws}/DESIGN.md`, resolvedFrom: 'cwd' }, null, 2)); }, + args: ['--port', '8412', '--token', 't'], + }, + { + id: 'live-inject-from-repo-root-via-roots', verb: 'live-inject', workspace: 'live-monorepo', files: [...F, 'website/.impeccable/**', 'website/.gitignore', 'website/index.html'], + setup: (ws) => { fakeGit(ws); write(ws, 'website/.impeccable/live/roots.json', JSON.stringify({ version: 1, appRoot: `${ws}/website`, repoRoot: ws, contextRoot: ws, sessionRoot: `${ws}/website/.impeccable/live`, productPath: `${ws}/PRODUCT.md`, designPath: `${ws}/DESIGN.md`, resolvedFrom: 'cwd' }, null, 2)); write(ws, '.impeccable/live/app-root.json', JSON.stringify({ version: 2, appRoots: [{ appRoot: `${ws}/website`, bootedAt: '2026-08-01T00:00:00.000Z' }] })); }, + steps: [{ args: ['--check'] }, { args: ['--port', '8412', '--token', 't'] }, { args: ['--remove'] }], + }, + { + id: 'live-inject-heals-orphan-journal', verb: 'live-inject', workspace: 'live-html', files: [...F, 'index.html', 'src/**'], + setup: (ws) => { + write(ws, 'src/lib/impeccable/ImpeccableLiveRoot.svelte', '\n
\n'); + write(ws, 'src/keep.svelte', '
no marker
\n'); + write(ws, '.impeccable/live/inject-journal.json', JSON.stringify({ version: 1, appRoot: ws, framework: 'sveltekit', port: 8400, pid: 1, recordedAt: '2026-08-01T00:00:00.000Z', artifacts: [ + { kind: 'created', path: 'src/lib/impeccable/ImpeccableLiveRoot.svelte', marker: 'impeccable-live-root', pruneTo: 'src' }, + { kind: 'created', path: 'src/keep.svelte', marker: 'impeccable-live-root', pruneTo: 'src' }, + { kind: 'created', path: '../outside.svelte', marker: 'impeccable-live-root' }, + { kind: 'patched', path: 'public/no-body.html', patch: 'live-tag', markers: ['impeccable-live-start'] }, + ] }, null, 2) + '\n'); + }, + args: ['--port', '8412', '--token', 't'], + }, +]; diff --git a/tests/oracle/cases/live-session.mjs b/tests/oracle/cases/live-session.mjs new file mode 100644 index 000000000..12cfd2c67 --- /dev/null +++ b/tests/oracle/cases/live-session.mjs @@ -0,0 +1,86 @@ +/** + * `live-status`, `live-resume`, `live-complete`, `live-poll`, `live-server` + * against staged durable session state (journals under + * .impeccable/live/sessions). No helper server runs except in the daemon case. + */ +import { LIVE_FILES, rm, stageWrappedHtml, write, writeJournal } from '../live-helpers.mjs'; + +const F = LIVE_FILES; +const ID = 'ab12cd34'; +const GEN = { type: 'generate', action: 'bolder', count: 3, pageUrl: '/', element: { tagName: 'h1', id: 'hero', classes: ['hero-title'], textContent: 'Oracle Fixture', outerHTML: '

Oracle Fixture

' }, clientSentAt: 1754042400000 }; +const S = (id, verb, args, setup, extra = {}) => ({ id, verb, workspace: 'live-html', args, setup, files: F, ...extra }); + +const generating = (ws) => writeJournal(ws, ID, [GEN, { type: 'agent_phase', phase: 'picked_up', at: 1754042401000 }]); +const carbonizeRequired = (ws) => writeJournal(ws, ID, [GEN, { type: 'agent_done', file: 'index.html', sourceEventType: 'generate', carbonize: false, arrivedVariants: 3 }, { type: 'accept', variantId: '2', pageUrl: '/', paramValues: { face: 'serif' } }, { type: 'agent_done', file: 'index.html', sourceEventType: 'accept', carbonize: true }]); +const acceptRequested = (ws) => writeJournal(ws, ID, [GEN, { type: 'agent_done', file: 'index.html', sourceEventType: 'generate', arrivedVariants: 3 }, { type: 'checkpoint', revision: 3, revisionDomain: 'browser', owner: 'deadbeef', phase: 'cycling', reason: 'variants_ready', pageUrl: '/', expectedVariants: 3, arrivedVariants: 3, visibleVariant: 1, paramValues: { lightness: 0.5 } }, { type: 'accept', variantId: '1', pageUrl: '/', paramValues: { lightness: 0.6 } }]); +const manualApply = (ws) => writeJournal(ws, 'c0ffee01', [{ type: 'manual_edit_apply', pageUrl: '/', chunk: { index: 1, total: 2, opCount: 2, totalOpCount: 3 }, batch: { version: 1, pageUrl: '/', count: 1, entries: [{ id: 'e1', pageUrl: '/', ops: [{ ref: 'h1', tag: 'h1', originalText: 'A', newText: 'B', sourceHint: { file: 'index.html', line: 12 } }, { ref: 'p', tag: 'p', originalText: 'C', newText: 'D' }] }] }, evidencePath: '/tmp/x.json' }]); +const mountFailed = (ws) => writeJournal(ws, ID, [GEN, { type: 'agent_done', file: 'index.html', arrivedVariants: 3 }, { type: 'variant_mount_failed', variant: 2, url: 'http://localhost:5173/node_modules/.impeccable-live/ab12cd34/r1/v2.svelte', error: 'SyntaxError: unexpected token' }]); +const completed = (ws) => writeJournal(ws, ID, [GEN, { type: 'discard' }, { type: 'discarded' }]); +const twoSessions = (ws) => { generating(ws); writeJournal(ws, 'bb22cc33', [{ type: 'steer', message: 'make the hero calmer', pageUrl: '/' }]); completed(ws); writeJournal(ws, 'dd44ee55', [GEN, { type: 'complete', file: 'index.html' }]); }; +const staleServerJson = (ws) => write(ws, '.impeccable/live/server.json', '{"pid":2147483646,"port":8497,"token":"stale"}'); +const aliveServerJson = (ws) => write(ws, '.impeccable/live/server.json', JSON.stringify({ pid: process.pid, port: 65531, token: 'oracle-token' })); + +export default [ + // --- live-status --- + S('live-status-empty', 'live-status', [], null), + S('live-status-generating', 'live-status', [], generating), + S('live-status-many-sessions', 'live-status', [], twoSessions), + S('live-status-manual-apply', 'live-status', [], manualApply), + S('live-status-mount-failed', 'live-status', [], mountFailed), + S('live-status-stale-server-json', 'live-status', [], (ws) => { generating(ws); staleServerJson(ws); }), + S('live-status-legacy-sessions-dir', 'live-status', [], (ws) => write(ws, '.impeccable-live/sessions/legacy01.jsonl', JSON.stringify({ seq: 1, id: 'legacy01', type: 'generate', ts: '2026-08-01T10:00:00.000Z', event: { id: 'legacy01', ...GEN } }) + '\n')), + S('live-status-target-missing-value', 'live-status', ['--target'], null), + S('live-status-from-subdir', 'live-status', [], generating, { cwd: 'src' }), + // --- live-resume --- + S('live-resume-help', 'live-resume', ['--help'], null), + S('live-resume-none', 'live-resume', [], null), + S('live-resume-generating', 'live-resume', [], generating), + S('live-resume-by-id', 'live-resume', ['--id', 'bb22cc33'], twoSessions), + S('live-resume-by-id-eq', 'live-resume', ['--id=dd44ee55'], twoSessions), + S('live-resume-unknown-id', 'live-resume', ['--id', 'zz99zz99'], generating), + S('live-resume-first-active-sorted', 'live-resume', [], twoSessions), + S('live-resume-carbonize-required', 'live-resume', [], carbonizeRequired), + S('live-resume-accept-requested', 'live-resume', [], acceptRequested), + S('live-resume-manual-apply', 'live-resume', [], manualApply), + S('live-resume-mount-failed', 'live-resume', [], mountFailed), + S('live-resume-completed-only', 'live-resume', [], completed), + // --- live-complete --- + S('live-complete-help', 'live-complete', ['--help'], null), + S('live-complete-no-id', 'live-complete', [], null), + S('live-complete-clean', 'live-complete', ['--id', ID], carbonizeRequired), + S('live-complete-source-dirty', 'live-complete', ['--id', ID], (ws) => { carbonizeRequired(ws); stageWrappedHtml(ws); }, { files: [...F, 'index.html'] }), + S('live-complete-source-dirty-force', 'live-complete', ['--id', ID, '--force'], (ws) => { carbonizeRequired(ws); stageWrappedHtml(ws); }), + S('live-complete-source-dirty-carbonize-leftovers', 'live-complete', ['--id', ID], (ws) => { + carbonizeRequired(ws); + write(ws, 'index.html', '\n\n\n\n\n

Hi

\n\n'); + }), + S('live-complete-discarded', 'live-complete', ['--id', ID, '--discarded'], generating), + S('live-complete-discard-alias', 'live-complete', ['--id=' + ID, '--discard'], generating), + S('live-complete-error', 'live-complete', ['--id', ID, '--error', 'variant generation crashed'], generating), + S('live-complete-error-eq', 'live-complete', ['--id', ID, '--error=boom'], generating), + S('live-complete-error-no-message', 'live-complete', ['--id', ID, '--error'], generating), + S('live-complete-unknown-session', 'live-complete', ['--id', 'zz99zz99'], null), + S('live-complete-twice', 'live-complete', ['--id', ID], carbonizeRequired, { steps: [{}, {}] }), + S('live-complete-source-in-node-modules', 'live-complete', ['--id', ID], (ws) => writeJournal(ws, ID, [GEN, { type: 'agent_done', file: 'node_modules/.impeccable-live/ab12cd34/manifest.json', sourceFile: 'src/routes/+page.svelte', previewMode: 'svelte-component' }])), + S('live-complete-source-missing-file', 'live-complete', ['--id', ID], (ws) => writeJournal(ws, ID, [GEN, { type: 'agent_done', file: 'src/gone.html' }])), + // --- live-poll (no server, or a server.json whose pid is the recorder) --- + S('live-poll-help', 'live-poll', ['--help'], null), + S('live-poll-no-server', 'live-poll', [], null), + S('live-poll-no-server-stale-record', 'live-poll', [], staleServerJson), + S('live-poll-reply-missing-id', 'live-poll', ['--reply'], aliveServerJson), + S('live-poll-reply-status-as-id', 'live-poll', ['--reply', 'done'], aliveServerJson), + S('live-poll-reply-missing-status', 'live-poll', ['--reply', ID], aliveServerJson), + S('live-poll-reply-status-flag', 'live-poll', ['--reply', ID, '--file', 'x'], aliveServerJson), + S('live-poll-reply-bad-data-json', 'live-poll', ['--reply', ID, 'done', '--data', '{nope'], aliveServerJson), + // Port 65531 on loopback: connection refused (nothing listens there). + S('live-poll-reply-connection-refused', 'live-poll', ['--reply', ID, 'done'], aliveServerJson), + S('live-poll-connection-refused', 'live-poll', ['--timeout=200'], aliveServerJson), + // --- live-server (no process started) --- + S('live-server-help', 'live-server', ['--help'], null), + S('live-server-stop-none', 'live-server', ['stop'], null, { files: [...F, 'index.html'] }), + S('live-server-stop-none-keep-inject', 'live-server', ['stop', '--keep-inject'], null), + S('live-server-stop-removes-tag', 'live-server', ['stop'], (ws) => write(ws, 'index.html', '\n\n\n\n\n'), { files: [...F, 'index.html'] }), + { id: 'live-server-stop-no-config', verb: 'live-server', workspace: 'live-vite', args: ['stop'], setup: (ws) => rm(ws, '.impeccable/live/config.json'), files: F }, + { id: 'live-server-already-running', verb: 'live-server', workspace: 'live-html', args: [], setup: aliveServerJson, files: F }, + { id: 'live-server-target-missing-value', verb: 'live-server', workspace: 'live-html', args: ['--target'] }, +]; diff --git a/tests/oracle/cases/live-wrap.mjs b/tests/oracle/cases/live-wrap.mjs new file mode 100644 index 000000000..da210757c --- /dev/null +++ b/tests/oracle/cases/live-wrap.mjs @@ -0,0 +1,94 @@ +/** + * `live-wrap` and `live-insert` corpus: locator errors, replace/insert + * wrappers across HTML / JSX / TSX / Astro / Vue / Svelte, deferred writes, + * --text disambiguation, generated-file guards, buffer-aware originals. + */ +import { LIVE_FILES, linkSvelte, write, writeBuffer } from '../live-helpers.mjs'; + +const F = LIVE_FILES; +const W = (id, workspace, args, extra = {}) => ({ id, verb: 'live-wrap', workspace, args, files: [...F, ...(extra.snap || [])], ...extra }); +const I = (id, workspace, args, extra = {}) => ({ id, verb: 'live-insert', workspace, args, files: [...F, ...(extra.snap || [])], ...extra }); +const buffered = (ws, ops, pageUrl = '/') => writeBuffer(ws, [{ id: 'e1', pageUrl, element: { tagName: 'p' }, ops, stagedAt: '2026-08-01T00:00:00.000Z' }]); + +export default [ + // --- argument / usage paths --- + W('live-wrap-help', 'live-html', ['--help']), + W('live-wrap-missing-id', 'live-html', ['--classes', 'hero-title']), + W('live-wrap-missing-locator', 'live-html', ['--id', 'ab12cd34', '--tag', 'h1']), + W('live-wrap-target-missing-value', 'live-html', ['--id', 'ab12cd34', '--classes', 'x', '--target']), + W('live-wrap-element-not-found', 'live-html', ['--id', 'ab12cd34', '--classes', 'no-such-class']), + W('live-wrap-element-not-in-source', 'live-html', ['--id', 'ab12cd34', '--classes', 'built-title']), + W('live-wrap-file-is-generated', 'live-html', ['--id', 'ab12cd34', '--classes', 'built-title', '--file', 'dist/generated.html']), + W('live-wrap-file-element-missing', 'live-html', ['--id', 'ab12cd34', '--classes', 'hero-title', '--file', 'src/cards.html']), + // --- HTML replace wrappers --- + W('live-wrap-html-by-id', 'live-html', ['--id', 'ab12cd34', '--count', '3', '--element-id', 'hero'], { snap: ['index.html'] }), + W('live-wrap-html-by-classes-tag', 'live-html', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1'], { snap: ['index.html'] }), + W('live-wrap-html-by-query', 'live-html', ['--id', 'ab12cd34', '--count', '2', '--query', 'hero-hook'], { snap: ['index.html'] }), + W('live-wrap-html-eq-form', 'live-html', ['--id=ab12cd34', '--count=1', '--element-id=features'], { snap: ['index.html'] }), + W('live-wrap-html-multiline', 'live-html', ['--id', 'ab12cd34', '--classes', 'side-note', '--tag', 'aside'], { snap: ['index.html'] }), + W('live-wrap-html-deferred', 'live-html', ['--id', 'ab12cd34', '--classes', 'side-note', '--tag', 'aside', '--defer-source-write'], { snap: ['index.html'] }), + W('live-wrap-html-explicit-file', 'live-html', ['--id', 'ab12cd34', '--classes', 'doc-title', '--file', 'public/docs/guide.html'], { snap: ['public/**'] }), + W('live-wrap-html-page-url-no-pending', 'live-html', ['--id', 'ab12cd34', '--element-id', 'hero', '--page-url', '/'], { snap: ['index.html'] }), + // --- --text disambiguation (src/cards.html has three identical cards) --- + W('live-wrap-text-picks-second', 'live-html', ['--id', 'ab12cd34', '--classes', 'card', '--tag', 'div', '--text', 'Beta card Second card body copy.', '--file', 'src/cards.html'], { snap: ['src/**'] }), + W('live-wrap-text-ambiguous', 'live-html', ['--id', 'ab12cd34', '--classes', 'card-body', '--tag', 'p', '--text', 'card body copy', '--file', 'src/cards.html'], { snap: ['src/**'] }), + W('live-wrap-text-not-in-source', 'live-html', ['--id', 'ab12cd34', '--classes', 'card', '--tag', 'div', '--text', 'Rendered from props elsewhere', '--file', 'src/cards.html'], { snap: ['src/**'] }), + W('live-wrap-text-short-falls-back', 'live-html', ['--id', 'ab12cd34', '--classes', 'card', '--tag', 'div', '--text', 'zzz', '--file', 'src/cards.html'], { snap: ['src/**'] }), + W('live-wrap-no-text-first-match', 'live-html', ['--id', 'ab12cd34', '--classes', 'card', '--tag', 'div', '--file', 'src/cards.html'], { snap: ['src/**'] }), + // --- JSX / TSX / Astro / Vue --- + W('live-wrap-jsx', 'live-vite', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1'], { snap: ['src/**'] }), + W('live-wrap-jsx-deferred', 'live-vite', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1', '--defer-source-write'], { snap: ['src/**'] }), + W('live-wrap-jsx-mapped-item', 'live-vite', ['--id', 'ab12cd34', '--classes', 'item-row', '--tag', 'li', '--text', 'First'], { snap: ['src/**'] }), + W('live-wrap-tsx-multiline', 'live-vite', ['--id', 'ab12cd34', '--classes', 'panel', '--tag', 'section'], { snap: ['src/**'] }), + W('live-wrap-astro', 'live-astro', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1'], { snap: ['src/**'] }), + W('live-wrap-astro-deferred', 'live-astro', ['--id', 'ab12cd34', '--element-id', 'features', '--defer-source-write'], { snap: ['src/**'] }), + W('live-wrap-vue', 'live-nuxt', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1'], { snap: ['pages/**'] }), + W('live-wrap-tanstack-tsx', 'live-tanstack', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1'], { snap: ['src/**'] }), + W('live-wrap-monorepo-child-from-root', 'live-monorepo', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1', '--target', 'website'], { snap: ['website/src/**', 'website/.impeccable/**'] }), + // --- Svelte: no compiler -> source-preview fallback; with compiler -> component preview --- + W('live-wrap-svelte-no-compiler', 'live-sveltekit', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1'], { snap: ['src/**'] }), + W('live-wrap-svelte-env-disabled', 'live-sveltekit', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1'], { snap: ['src/**'], env: { IMPECCABLE_LIVE_SVELTE_COMPONENT: '0' }, setup: linkSvelte }), + W('live-wrap-svelte-component', 'live-sveltekit', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1'], { snap: ['src/**'], setup: linkSvelte }), + W('live-wrap-svelte-component-each', 'live-sveltekit', ['--id', 'ab12cd34', '--classes', 'expense-list', '--tag', 'ul'], { snap: ['src/**'], setup: linkSvelte }), + W('live-wrap-svelte-component-refused-script', 'live-sveltekit', ['--id', 'ab12cd34', '--classes', 'page', '--tag', 'main'], { + snap: ['src/**'], setup: (ws) => { linkSvelte(ws); write(ws, 'src/routes/+page.svelte', '
\n \n

Hi

\n
\n'); }, + }), + W('live-wrap-svelte-component-twice', 'live-sveltekit', ['--id', 'ab12cd34', '--classes', 'hero-title', '--tag', 'h1'], { snap: ['src/**'], setup: linkSvelte, steps: [{}, {}] }), + // --- pending manual edits --- + W('live-wrap-pending-edits-no-page-url', 'live-html', ['--id', 'ab12cd34', '--classes', 'hero-hook', '--tag', 'p'], { + snap: ['index.html'], setup: (ws) => buffered(ws, [{ ref: 'main>p.hero-hook', tag: 'p', originalText: 'Minimal static page for oracle live-mode goldens.', newText: 'Edited hook copy.' }]), + }), + W('live-wrap-pending-edits-applied', 'live-html', ['--id', 'ab12cd34', '--classes', 'hero-hook', '--tag', 'p', '--page-url', '/'], { + snap: ['index.html'], setup: (ws) => buffered(ws, [{ ref: 'main>p.hero-hook', tag: 'p', originalText: 'Minimal static page for oracle live-mode goldens.', newText: 'Edited hook copy.' }]), + }), + W('live-wrap-pending-edits-other-page', 'live-html', ['--id', 'ab12cd34', '--classes', 'hero-hook', '--tag', 'p', '--page-url', '/about'], { + snap: ['index.html'], setup: (ws) => buffered(ws, [{ ref: 'main>p.hero-hook', tag: 'p', originalText: 'Minimal static page for oracle live-mode goldens.', newText: 'Edited hook copy.' }]), + }), + W('live-wrap-pending-edits-ambiguous', 'live-html', ['--id', 'ab12cd34', '--classes', 'cards', '--tag', 'section', '--file', 'src/cards.html', '--page-url', '/'], { + snap: ['src/**'], setup: (ws) => buffered(ws, [{ ref: 'section>div>p', tag: 'p', originalText: 'card body copy.', newText: 'card body text.' }]), + }), + W('live-wrap-pending-edits-unrelated', 'live-html', ['--id', 'ab12cd34', '--element-id', 'hero'], { + snap: ['index.html'], setup: (ws) => buffered(ws, [{ ref: 'x', tag: 'p', originalText: 'Some other page copy', newText: 'x' }]), + }), + + // --- live-insert.mjs --- + I('live-insert-help', 'live-html', ['--help']), + I('live-insert-missing-id', 'live-html', ['--position', 'after', '--element-id', 'features']), + I('live-insert-missing-position', 'live-html', ['--id', 'ab12cd34', '--element-id', 'features']), + I('live-insert-invalid-position', 'live-html', ['--id', 'ab12cd34', '--position', 'below', '--element-id', 'features']), + I('live-insert-missing-locator', 'live-html', ['--id', 'ab12cd34', '--position', 'after']), + I('live-insert-element-not-found', 'live-html', ['--id', 'ab12cd34', '--position', 'after', '--classes', 'nope']), + I('live-insert-element-not-in-source', 'live-html', ['--id', 'ab12cd34', '--position', 'after', '--classes', 'built-title']), + I('live-insert-file-is-generated', 'live-html', ['--id', 'ab12cd34', '--position', 'after', '--classes', 'built-title', '--file', 'dist/generated.html']), + I('live-insert-html-after', 'live-html', ['--id', 'ab12cd34', '--position', 'after', '--element-id', 'features'], { snap: ['index.html'] }), + I('live-insert-html-before', 'live-html', ['--id', 'ab12cd34', '--count', '2', '--position', 'before', '--element-id', 'features'], { snap: ['index.html'] }), + I('live-insert-html-deferred', 'live-html', ['--id', 'ab12cd34', '--position', 'after', '--classes', 'side-note', '--tag', 'aside', '--defer-source-write'], { snap: ['index.html'] }), + I('live-insert-html-text-ambiguous', 'live-html', ['--id', 'ab12cd34', '--position', 'after', '--classes', 'card-body', '--tag', 'p', '--text', 'card body copy', '--file', 'src/cards.html'], { snap: ['src/**'] }), + I('live-insert-html-text-picks', 'live-html', ['--id', 'ab12cd34', '--position', 'before', '--classes', 'card', '--tag', 'div', '--text', 'Gamma card Third card body copy.', '--file', 'src/cards.html'], { snap: ['src/**'] }), + I('live-insert-jsx-after', 'live-vite', ['--id', 'ab12cd34', '--position', 'after', '--element-id', 'features'], { snap: ['src/**'] }), + I('live-insert-jsx-before-deferred', 'live-vite', ['--id', 'ab12cd34', '--position', 'before', '--classes', 'hero-title', '--tag', 'h1', '--defer-source-write'], { snap: ['src/**'] }), + I('live-insert-astro-after', 'live-astro', ['--id', 'ab12cd34', '--position', 'after', '--element-id', 'features'], { snap: ['src/**'] }), + I('live-insert-vue-after', 'live-nuxt', ['--id', 'ab12cd34', '--position', 'after', '--classes', 'hero-hook', '--tag', 'p'], { snap: ['pages/**'] }), + I('live-insert-svelte-component', 'live-sveltekit', ['--id', 'ab12cd34', '--position', 'after', '--element-id', 'features'], { snap: ['src/**'] }), + I('live-insert-svelte-env-disabled', 'live-sveltekit', ['--id', 'ab12cd34', '--position', 'after', '--element-id', 'features'], { snap: ['src/**'], env: { IMPECCABLE_LIVE_SVELTE_COMPONENT: 'false' } }), +]; diff --git a/tests/oracle/golden/live-accept-generated-file.json b/tests/oracle/golden/live-accept-generated-file.json new file mode 100644 index 000000000..85563b682 --- /dev/null +++ b/tests/oracle/golden/live-accept-generated-file.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"handled\":false,\"error\":\"Session markers not found for id: ab12cd34\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "dist/generated.html": "\n\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n
\n \n
\n

Oracle Fixture

\n
\n \n \n \n
\n

Oracle Fixture

\n
\n \n
\n

Oracle Fixture

\n
\n \n
\n

Oracle Fixture

\n
\n
\n \n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-help.json b/tests/oracle/golden/live-accept-help.json new file mode 100644 index 000000000..d0d2f02e1 --- /dev/null +++ b/tests/oracle/golden/live-accept-help.json @@ -0,0 +1,9 @@ +{ + "stdout": "Usage: node live-accept.mjs [options]\n\nDeterministic accept/discard for live variant sessions.\n\nModes:\n --discard Remove variants, restore original\n --variant N Accept variant N, discard the rest\n\nRequired:\n --id SESSION_ID Session ID of the variant wrapper\n\nOptions:\n --page-url URL Current browser page URL; scopes staged copy-edit cleanup\n --defer-source-write\n Deprecated compatibility flag. Svelte component accepts\n now write the real source immediately.\n\nOutput (JSON):\n { handled, file, carbonize }\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-discard-then-accept.json b/tests/oracle/golden/live-accept-html-discard-then-accept.json new file mode 100644 index 000000000..f0e035f5b --- /dev/null +++ b/tests/oracle/golden/live-accept-html-discard-then-accept.json @@ -0,0 +1,21 @@ +{ + "steps": [ + { + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":false}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"handled\":false,\"mode\":\"error\",\"error\":\"accept_receipt_conflict\",\"priorOperation\":\"discard\",\"priorVariantId\":null}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"discard\",\n \"variantId\": null,\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": false\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n\n

Oracle Fixture

\n\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-discard.json b/tests/oracle/golden/live-accept-html-discard.json new file mode 100644 index 000000000..925e07d24 --- /dev/null +++ b/tests/oracle/golden/live-accept-html-discard.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":false}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"discard\",\n \"variantId\": null,\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": false\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n\n

Oracle Fixture

\n\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-malformed-params.json b/tests/oracle/golden/live-accept-html-malformed-params.json new file mode 100644 index 000000000..c73b41a56 --- /dev/null +++ b/tests/oracle/golden/live-accept-html-malformed-params.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-no-css-block.json b/tests/oracle/golden/live-accept-html-no-css-block.json new file mode 100644 index 000000000..37cb002e8 --- /dev/null +++ b/tests/oracle/golden/live-accept-html-no-css-block.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":false}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"2\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": false\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-no-params.json b/tests/oracle/golden/live-accept-html-no-params.json new file mode 100644 index 000000000..b018f0a68 --- /dev/null +++ b/tests/oracle/golden/live-accept-html-no-params.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"2\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-receipt-conflict.json b/tests/oracle/golden/live-accept-html-receipt-conflict.json new file mode 100644 index 000000000..f0c76ec85 --- /dev/null +++ b/tests/oracle/golden/live-accept-html-receipt-conflict.json @@ -0,0 +1,27 @@ +{ + "steps": [ + { + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"handled\":false,\"mode\":\"error\",\"error\":\"accept_receipt_conflict\",\"priorOperation\":\"accept\",\"priorVariantId\":\"1\"}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"handled\":false,\"mode\":\"error\",\"error\":\"accept_receipt_conflict\",\"priorOperation\":\"accept\",\"priorVariantId\":\"1\"}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-receipt-replay.json b/tests/oracle/golden/live-accept-html-receipt-replay.json new file mode 100644 index 000000000..e5faa6185 --- /dev/null +++ b/tests/oracle/golden/live-accept-html-receipt-replay.json @@ -0,0 +1,21 @@ +{ + "steps": [ + { + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\",\"alreadyApplied\":true}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-variant-1-range.json b/tests/oracle/golden/live-accept-html-variant-1-range.json new file mode 100644 index 000000000..88c1d3f83 --- /dev/null +++ b/tests/oracle/golden/live-accept-html-variant-1-range.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-variant-2-steps.json b/tests/oracle/golden/live-accept-html-variant-2-steps.json new file mode 100644 index 000000000..504fc0810 --- /dev/null +++ b/tests/oracle/golden/live-accept-html-variant-2-steps.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"2\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-variant-3-toggle.json b/tests/oracle/golden/live-accept-html-variant-3-toggle.json new file mode 100644 index 000000000..132d75e7c --- /dev/null +++ b/tests/oracle/golden/live-accept-html-variant-3-toggle.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"3\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-html-variant-missing.json b/tests/oracle/golden/live-accept-html-variant-missing.json new file mode 100644 index 000000000..3124d77c4 --- /dev/null +++ b/tests/oracle/golden/live-accept-html-variant-missing.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"handled\":false,\"file\":\"index.html\",\"error\":\"Variant 9 not found\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n
\n \n
\n

Oracle Fixture

\n
\n \n \n \n
\n

Oracle Fixture

\n
\n \n
\n

Oracle Fixture

\n
\n \n
\n

Oracle Fixture

\n
\n
\n \n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-invalid-id.json b/tests/oracle/golden/live-accept-invalid-id.json new file mode 100644 index 000000000..632b45540 --- /dev/null +++ b/tests/oracle/golden/live-accept-invalid-id.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "Invalid --id\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-invalid-variant-regex.json b/tests/oracle/golden/live-accept-invalid-variant-regex.json new file mode 100644 index 000000000..60e3bfbaf --- /dev/null +++ b/tests/oracle/golden/live-accept-invalid-variant-regex.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "Invalid --variant\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-invalid-variant.json b/tests/oracle/golden/live-accept-invalid-variant.json new file mode 100644 index 000000000..60e3bfbaf --- /dev/null +++ b/tests/oracle/golden/live-accept-invalid-variant.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "Invalid --variant\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-jsx-discard.json b/tests/oracle/golden/live-accept-jsx-discard.json new file mode 100644 index 000000000..964f74075 --- /dev/null +++ b/tests/oracle/golden/live-accept-jsx-discard.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"src/App.jsx\",\"carbonize\":false}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"discard\",\n \"variantId\": null,\n \"result\": {\n \"handled\": true,\n \"file\": \"src/App.jsx\",\n \"carbonize\": false\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/App.jsx": "export default function App() {\n return (\n
\n\n

Vite Fixture

\n\n

Minimal React tree for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n
    \n {items.map((item) => (\n
  • {item.title}
  • \n ))}\n
\n
\n );\n}\n\nconst items = [\n { id: 1, title: 'First' },\n { id: 2, title: 'Second' },\n];\n", + "src/main.jsx": "import { createRoot } from 'react-dom/client';\nimport App from './App.jsx';\n\ncreateRoot(document.getElementById('root')).render();\n", + "src/Panel.tsx": "type PanelProps = { title: string; children?: React.ReactNode };\n\nexport function Panel({ title, children }: PanelProps) {\n return (\n
\n
\n

{title}

\n
\n
{children}
\n
\n );\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-jsx-from-subdir.json b/tests/oracle/golden/live-accept-jsx-from-subdir.json new file mode 100644 index 000000000..ac2b9cbbd --- /dev/null +++ b/tests/oracle/golden/live-accept-jsx-from-subdir.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"App.jsx\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in App.jsx. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/.impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"2\",\n \"result\": {\n \"handled\": true,\n \"file\": \"App.jsx\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in App.jsx. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + "src/App.jsx": "export default function App() {\n return (\n
\n
\n {/* impeccable-carbonize-start ab12cd34 */}\n \n {/* impeccable-carbonize-end ab12cd34 */}\n
\n

Vite Fixture

\n
\n
\n

Minimal React tree for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n
    \n {items.map((item) => (\n
  • {item.title}
  • \n ))}\n
\n
\n );\n}\n\nconst items = [\n { id: 1, title: 'First' },\n { id: 2, title: 'Second' },\n];\n", + "src/main.jsx": "import { createRoot } from 'react-dom/client';\nimport App from './App.jsx';\n\ncreateRoot(document.getElementById('root')).render();\n", + "src/Panel.tsx": "type PanelProps = { title: string; children?: React.ReactNode };\n\nexport function Panel({ title, children }: PanelProps) {\n return (\n
\n
\n

{title}

\n
\n
{children}
\n
\n );\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-jsx-variant-1.json b/tests/oracle/golden/live-accept-jsx-variant-1.json new file mode 100644 index 000000000..2061985e5 --- /dev/null +++ b/tests/oracle/golden/live-accept-jsx-variant-1.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"src/App.jsx\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in src/App.jsx. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"src/App.jsx\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in src/App.jsx. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/App.jsx": "export default function App() {\n return (\n
\n
\n {/* impeccable-carbonize-start ab12cd34 */}\n \n {/* impeccable-param-values ab12cd34: {\"lightness\":0.4} */}\n {/* impeccable-carbonize-end ab12cd34 */}\n
\n

Vite Fixture

\n
\n
\n

Minimal React tree for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n
    \n {items.map((item) => (\n
  • {item.title}
  • \n ))}\n
\n
\n );\n}\n\nconst items = [\n { id: 1, title: 'First' },\n { id: 2, title: 'Second' },\n];\n", + "src/main.jsx": "import { createRoot } from 'react-dom/client';\nimport App from './App.jsx';\n\ncreateRoot(document.getElementById('root')).render();\n", + "src/Panel.tsx": "type PanelProps = { title: string; children?: React.ReactNode };\n\nexport function Panel({ title, children }: PanelProps) {\n return (\n
\n
\n

{title}

\n
\n
{children}
\n
\n );\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-jsx-variant-3-toggle-off.json b/tests/oracle/golden/live-accept-jsx-variant-3-toggle-off.json new file mode 100644 index 000000000..e144e8cad --- /dev/null +++ b/tests/oracle/golden/live-accept-jsx-variant-3-toggle-off.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"src/App.jsx\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in src/App.jsx. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"3\",\n \"result\": {\n \"handled\": true,\n \"file\": \"src/App.jsx\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in src/App.jsx. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/App.jsx": "export default function App() {\n return (\n
\n
\n {/* impeccable-carbonize-start ab12cd34 */}\n \n {/* impeccable-param-values ab12cd34: {\"italic\":false} */}\n {/* impeccable-carbonize-end ab12cd34 */}\n
\n

Vite Fixture

\n
\n
\n

Minimal React tree for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n
    \n {items.map((item) => (\n
  • {item.title}
  • \n ))}\n
\n
\n );\n}\n\nconst items = [\n { id: 1, title: 'First' },\n { id: 2, title: 'Second' },\n];\n", + "src/main.jsx": "import { createRoot } from 'react-dom/client';\nimport App from './App.jsx';\n\ncreateRoot(document.getElementById('root')).render();\n", + "src/Panel.tsx": "type PanelProps = { title: string; children?: React.ReactNode };\n\nexport function Panel({ title, children }: PanelProps) {\n return (\n
\n
\n

{title}

\n
\n
{children}
\n
\n );\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-markers-not-found.json b/tests/oracle/golden/live-accept-markers-not-found.json new file mode 100644 index 000000000..31eb8c2db --- /dev/null +++ b/tests/oracle/golden/live-accept-markers-not-found.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\"handled\":false,\"error\":\"Session markers not found for id: nothere1\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-missing-id.json b/tests/oracle/golden/live-accept-missing-id.json new file mode 100644 index 000000000..5fdd06c2d --- /dev/null +++ b/tests/oracle/golden/live-accept-missing-id.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "Missing --id\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-need-mode.json b/tests/oracle/golden/live-accept-need-mode.json new file mode 100644 index 000000000..a48ece5bf --- /dev/null +++ b/tests/oracle/golden/live-accept-need-mode.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "Need --discard or --variant N\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-accept-no-page-url-keeps-buffer.json b/tests/oracle/golden/live-accept-no-page-url-keeps-buffer.json new file mode 100644 index 000000000..146984d45 --- /dev/null +++ b/tests/oracle/golden/live-accept-no-page-url-keeps-buffer.json @@ -0,0 +1,12 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e1\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\"\n },\n \"ops\": [\n {\n \"ref\": \"h1\",\n \"tag\": \"h1\",\n \"originalText\": \"Oracle Fixture\",\n \"newText\": \"Renamed\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-scrubs-buffer-for-page.json b/tests/oracle/golden/live-accept-scrubs-buffer-for-page.json new file mode 100644 index 000000000..b373d47d9 --- /dev/null +++ b/tests/oracle/golden/live-accept-scrubs-buffer-for-page.json @@ -0,0 +1,12 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e2\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"p\"\n },\n \"ops\": [\n {\n \"ref\": \"p\",\n \"tag\": \"p\",\n \"originalText\": \"Unrelated copy\",\n \"newText\": \"Other\"\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/about\",\n \"element\": {\n \"tagName\": \"h1\"\n },\n \"ops\": [\n {\n \"ref\": \"h1\",\n \"tag\": \"h1\",\n \"originalText\": \"Oracle Fixture\",\n \"newText\": \"Renamed\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-source-locked.json b/tests/oracle/golden/live-accept-source-locked.json new file mode 100644 index 000000000..1303e175d --- /dev/null +++ b/tests/oracle/golden/live-accept-source-locked.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-source-shadow-deprecated.json b/tests/oracle/golden/live-accept-source-shadow-deprecated.json new file mode 100644 index 000000000..c73b41a56 --- /dev/null +++ b/tests/oracle/golden/live-accept-source-shadow-deprecated.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-stale-lock-dead-pid.json b/tests/oracle/golden/live-accept-stale-lock-dead-pid.json new file mode 100644 index 000000000..1303e175d --- /dev/null +++ b/tests/oracle/golden/live-accept-stale-lock-dead-pid.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"handled\":true,\"file\":\"index.html\",\"carbonize\":true,\"todo\":\"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/accept-receipts/ab12cd34.json": "{\n \"id\": \"ab12cd34\",\n \"operation\": \"accept\",\n \"variantId\": \"1\",\n \"result\": {\n \"handled\": true,\n \"file\": \"index.html\",\n \"carbonize\": true,\n \"todo\": \"REQUIRED before next poll: carbonize cleanup in index.html. See reference/live.md \\\"Required after accept\\\".\"\n },\n \"completedAt\": \"\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n \n \n \n
\n

Oracle Fixture

\n
\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-accept-svelte-component-accept.json b/tests/oracle/golden/live-accept-svelte-component-accept.json new file mode 100644 index 000000000..b6d1f9adb --- /dev/null +++ b/tests/oracle/golden/live-accept-svelte-component-accept.json @@ -0,0 +1,24 @@ +{ + "steps": [ + { + "stdout": "{\"file\":\"node_modules/.impeccable-live/ab12cd34/manifest.json\",\"sourceFile\":\"src/routes/+page.svelte\",\"previewMode\":\"svelte-component\",\"componentDir\":\"node_modules/.impeccable-live/ab12cd34\",\"propContract\":[{\"prop\":\"title\",\"expr\":\"title\",\"kind\":\"text\",\"placeholder\":\"{title}\"}],\"componentStubMarkup\":\"

{title}

\",\"sourceStartLine\":10,\"sourceEndLine\":10,\"startLine\":1,\"endLine\":1,\"insertLine\":1,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"svelte-component\",\"styleTag\":null,\"cssSelectorPrefixExamples\":[],\"cssAuthoring\":{\"mode\":\"svelte-component\",\"styleTag\":null,\"strategy\":\"component-style-block\",\"rulePattern\":\".semantic-class { ... }\",\"selectorExamples\":[\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\"],\"requirements\":[\"Write each variant as a real Svelte component file (v1.svelte, v2.svelte, ...).\",\"Keep the prop names from propContract; bind dynamic text with {propName}, not literal snapshot text.\",\"Put variant CSS in the component \n" + } +} diff --git a/tests/oracle/golden/live-accept-svelte-component-discard.json b/tests/oracle/golden/live-accept-svelte-component-discard.json new file mode 100644 index 000000000..bfc7cd615 --- /dev/null +++ b/tests/oracle/golden/live-accept-svelte-component-discard.json @@ -0,0 +1,30 @@ +{ + "steps": [ + { + "stdout": "{\"file\":\"node_modules/.impeccable-live/ab12cd34/manifest.json\",\"sourceFile\":\"src/routes/+page.svelte\",\"previewMode\":\"svelte-component\",\"componentDir\":\"node_modules/.impeccable-live/ab12cd34\",\"propContract\":[{\"prop\":\"expenses\",\"expr\":\"expenses\",\"kind\":\"collection\",\"placeholder\":\"{expenses}\",\"item\":{\"rootTag\":\"li\",\"rootClasses\":[\"expense-row\"],\"textSlots\":[{\"key\":\"label\",\"expr\":\"expense.label\"},{\"key\":\"amount\",\"expr\":\"expense.amount\"}],\"attrSlots\":[],\"staticTexts\":[\":\"],\"nestedUnsupported\":false,\"keyField\":\"id\"}}],\"componentStubMarkup\":\"
    \\n {#each expenses as expense (expense.id)}\\n
  • {expense.label}: {expense.amount}
  • \\n {/each}\\n
\",\"sourceStartLine\":12,\"sourceEndLine\":16,\"startLine\":1,\"endLine\":1,\"insertLine\":1,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"svelte-component\",\"styleTag\":null,\"cssSelectorPrefixExamples\":[],\"cssAuthoring\":{\"mode\":\"svelte-component\",\"styleTag\":null,\"strategy\":\"component-style-block\",\"rulePattern\":\".semantic-class { ... }\",\"selectorExamples\":[\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\"],\"requirements\":[\"Write each variant as a real Svelte component file (v1.svelte, v2.svelte, ...).\",\"Keep the prop names from propContract; bind dynamic text with {propName}, not literal snapshot text.\",\"Put variant CSS in the component \n" + } +} diff --git a/tests/oracle/golden/live-accept-svelte-component-styled-variant.json b/tests/oracle/golden/live-accept-svelte-component-styled-variant.json new file mode 100644 index 000000000..74753de90 --- /dev/null +++ b/tests/oracle/golden/live-accept-svelte-component-styled-variant.json @@ -0,0 +1,24 @@ +{ + "steps": [ + { + "stdout": "{\"file\":\"node_modules/.impeccable-live/ab12cd34/manifest.json\",\"sourceFile\":\"src/routes/+page.svelte\",\"previewMode\":\"svelte-component\",\"componentDir\":\"node_modules/.impeccable-live/ab12cd34\",\"propContract\":[{\"prop\":\"title\",\"expr\":\"title\",\"kind\":\"text\",\"placeholder\":\"{title}\"}],\"componentStubMarkup\":\"

{title}

\",\"sourceStartLine\":10,\"sourceEndLine\":10,\"startLine\":1,\"endLine\":1,\"insertLine\":1,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"svelte-component\",\"styleTag\":null,\"cssSelectorPrefixExamples\":[],\"cssAuthoring\":{\"mode\":\"svelte-component\",\"styleTag\":null,\"strategy\":\"component-style-block\",\"rulePattern\":\".semantic-class { ... }\",\"selectorExamples\":[\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\"],\"requirements\":[\"Write each variant as a real Svelte component file (v1.svelte, v2.svelte, ...).\",\"Keep the prop names from propContract; bind dynamic text with {propName}, not literal snapshot text.\",\"Put variant CSS in the component \n" + } +} diff --git a/tests/oracle/golden/live-accept-svelte-component-variant-missing.json b/tests/oracle/golden/live-accept-svelte-component-variant-missing.json new file mode 100644 index 000000000..39e8a96ff --- /dev/null +++ b/tests/oracle/golden/live-accept-svelte-component-variant-missing.json @@ -0,0 +1,27 @@ +{ + "steps": [ + { + "stdout": "{\"file\":\"node_modules/.impeccable-live/ab12cd34/manifest.json\",\"sourceFile\":\"src/routes/+page.svelte\",\"previewMode\":\"svelte-component\",\"componentDir\":\"node_modules/.impeccable-live/ab12cd34\",\"propContract\":[{\"prop\":\"title\",\"expr\":\"title\",\"kind\":\"text\",\"placeholder\":\"{title}\"}],\"componentStubMarkup\":\"

{title}

\",\"sourceStartLine\":10,\"sourceEndLine\":10,\"startLine\":1,\"endLine\":1,\"insertLine\":1,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"svelte-component\",\"styleTag\":null,\"cssSelectorPrefixExamples\":[],\"cssAuthoring\":{\"mode\":\"svelte-component\",\"styleTag\":null,\"strategy\":\"component-style-block\",\"rulePattern\":\".semantic-class { ... }\",\"selectorExamples\":[\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\"],\"requirements\":[\"Write each variant as a real Svelte component file (v1.svelte, v2.svelte, ...).\",\"Keep the prop names from propContract; bind dynamic text with {propName}, not literal snapshot text.\",\"Put variant CSS in the component \n", + "node_modules/.impeccable-live/ab12cd34/v2.svelte": "\n\n\n

{title}

\n\n\n", + "node_modules/.impeccable-live/ab12cd34/v3.svelte": "\n\n\n

{title}

\n\n\n", + "src/app.html": "\n\n \n \n SvelteKit Fixture\n %sveltekit.head%\n \n \n
%sveltekit.body%
\n \n\n", + "src/routes/+page.svelte": "\n\n
\n

{title}

\n

Minimal SvelteKit route for oracle live-mode goldens.

\n
    \n {#each expenses as expense (expense.id)}\n
  • {expense.label}: {expense.amount}
  • \n {/each}\n
\n
\n
One
\n
Two
\n
\n
\n\n\n" + } +} diff --git a/tests/oracle/golden/live-accept-svelte-fallback-source-wrapper.json b/tests/oracle/golden/live-accept-svelte-fallback-source-wrapper.json new file mode 100644 index 000000000..c600204dc --- /dev/null +++ b/tests/oracle/golden/live-accept-svelte-fallback-source-wrapper.json @@ -0,0 +1,22 @@ +{ + "steps": [ + { + "stdout": "{\"file\":\"src/routes/+page.svelte\",\"previewFallback\":{\"from\":\"svelte-component\",\"reason\":\"svelte 5 compiler not resolvable from the app root\"},\"startLine\":10,\"endLine\":18,\"insertLine\":16,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n" + } +} diff --git a/tests/oracle/golden/live-accept-svelte-insert-empty-variant.json b/tests/oracle/golden/live-accept-svelte-insert-empty-variant.json new file mode 100644 index 000000000..abe648af1 --- /dev/null +++ b/tests/oracle/golden/live-accept-svelte-insert-empty-variant.json @@ -0,0 +1,24 @@ +{ + "steps": [ + { + "stdout": "{\"mode\":\"insert\",\"position\":\"after\",\"file\":\"node_modules/.impeccable-live/ab12cd34/manifest.json\",\"sourceFile\":\"src/routes/+page.svelte\",\"previewMode\":\"svelte-component\",\"componentDir\":\"node_modules/.impeccable-live/ab12cd34\",\"propContract\":[],\"insertLine\":1,\"sourceInsertLine\":21,\"anchorStartLine\":17,\"anchorEndLine\":20,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"svelte-component\",\"styleTag\":null,\"cssSelectorPrefixExamples\":[],\"cssAuthoring\":{\"mode\":\"svelte-component\",\"styleTag\":null,\"strategy\":\"component-style-block\",\"rulePattern\":\".semantic-class { ... }\",\"selectorExamples\":[\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\"],\"requirements\":[\"Write each variant as a real Svelte component file (v1.svelte, v2.svelte, ...).\",\"Keep the prop names from propContract; bind dynamic text with {propName}, not literal snapshot text.\",\"Put variant CSS in the component \n" + } +} diff --git a/tests/oracle/golden/live-accept-target-missing-value.json b/tests/oracle/golden/live-accept-target-missing-value.json new file mode 100644 index 000000000..c7b025ba1 --- /dev/null +++ b/tests/oracle/golden/live-accept-target-missing-value.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "[impeccable live] --target requires a path value (use --target or --target=)\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-boot-astro-config-missing.json b/tests/oracle/golden/live-boot-astro-config-missing.json new file mode 100644 index 000000000..274d8edec --- /dev/null +++ b/tests/oracle/golden/live-boot-astro-config-missing.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/.impeccable/live/config.json\",\"targetPath\":null,\"projectRoot\":\"\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-config-invalid-json.json b/tests/oracle/golden/live-boot-config-invalid-json.json new file mode 100644 index 000000000..869da0af9 --- /dev/null +++ b/tests/oracle/golden/live-boot-config-invalid-json.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_invalid\",\"message\":\"Expected property name or '}' in JSON at position 2 (line 1 column 3)\",\"path\":\"/.impeccable/live/config.json\",\"targetPath\":null,\"projectRoot\":\"\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{ nope", + ".impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-config-invalid-schema.json b/tests/oracle/golden/live-boot-config-invalid-schema.json new file mode 100644 index 000000000..4b3b2a3ef --- /dev/null +++ b/tests/oracle/golden/live-boot-config-invalid-schema.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_invalid\",\"message\":\"config.commentSyntax must be 'html' or 'jsx'\",\"path\":\"/.impeccable/live/config.json\",\"targetPath\":null,\"projectRoot\":\"\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\"files\":[\"index.html\"],\"insertBefore\":\"\",\"commentSyntax\":\"vue\"}", + ".impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-context-missing-both.json b/tests/oracle/golden/live-boot-context-missing-both.json new file mode 100644 index 000000000..2018181ef --- /dev/null +++ b/tests/oracle/golden/live-boot-context-missing-both.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\n \"ok\": false,\n \"error\": \"context_missing\",\n \"missing\": [\n \"PRODUCT.md\",\n \"DESIGN.md\"\n ],\n \"nextCommand\": \"init\",\n \"targetPath\": null,\n \"projectRoot\": \"\",\n \"repoRoot\": \"\",\n \"productPath\": null,\n \"designPath\": null\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-boot-context-missing-design-empty.json b/tests/oracle/golden/live-boot-context-missing-design-empty.json new file mode 100644 index 000000000..df829fa16 --- /dev/null +++ b/tests/oracle/golden/live-boot-context-missing-design-empty.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\n \"ok\": false,\n \"error\": \"context_missing\",\n \"missing\": [\n \"DESIGN.md\"\n ],\n \"nextCommand\": \"document\",\n \"targetPath\": null,\n \"projectRoot\": \"\",\n \"repoRoot\": \"\",\n \"productPath\": \"PRODUCT.md\",\n \"designPath\": \"DESIGN.md\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-boot-context-missing-product.json b/tests/oracle/golden/live-boot-context-missing-product.json new file mode 100644 index 000000000..42d99422e --- /dev/null +++ b/tests/oracle/golden/live-boot-context-missing-product.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\n \"ok\": false,\n \"error\": \"context_missing\",\n \"missing\": [\n \"PRODUCT.md\"\n ],\n \"nextCommand\": \"init\",\n \"targetPath\": null,\n \"projectRoot\": \"\",\n \"repoRoot\": \"\",\n \"productPath\": null,\n \"designPath\": \"DESIGN.md\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-boot-full-cycle.json b/tests/oracle/golden/live-boot-full-cycle.json new file mode 100644 index 000000000..35c03c975 --- /dev/null +++ b/tests/oracle/golden/live-boot-full-cycle.json @@ -0,0 +1,30 @@ +{ + "steps": [ + { + "stdout": "{\n \"ok\": true,\n \"serverPort\": ,\n \"serverToken\": \"\",\n \"pageFiles\": [\n \"index.html\",\n \"public/no-body.html\",\n \"public/docs/guide.html\"\n ],\n \"liveConfigPath\": \"/.impeccable/live/config.json\",\n \"configDrift\": {\n \"orphans\": [\n \"src/cards.html\"\n ],\n \"orphanCount\": 1,\n \"hint\": \"1 HTML file(s) exist but aren't in config.files. Consider adding them, or use a glob pattern like \\\"public/**/*.html\\\".\"\n },\n \"targetPath\": null,\n \"projectRoot\": \"\",\n \"repoRoot\": \"\",\n \"roots\": {\n \"version\": 1,\n \"appRoot\": \"\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n },\n \"hasProduct\": true,\n \"product\": \"\\n# Product\\n\\n## What it is\\nA fixture app used by the oracle harness for live mode.\\n\\n## Platform\\nweb\\n\",\n \"productPath\": \"PRODUCT.md\",\n \"hasDesign\": true,\n \"design\": \"---\\nname: Oracle Live Fixture\\ndescription: A one-page fixture set in plain type on paper-white surfaces.\\ncolors:\\n ink: \\\"#142720\\\"\\n paper: \\\"#ffffff\\\"\\ntypography:\\n body:\\n fontFamily: \\\"system-ui, sans-serif\\\"\\n fontWeight: 400\\n lineHeight: 1.5\\n---\\n\",\n \"designPath\": \"DESIGN.md\",\n \"hasSurfaceBrief\": false,\n \"surfaceBrief\": null,\n \"surfaceBriefPath\": null,\n \"_instructions\": \"Open the app URL that serves a pageFiles entry (never serverPort; that is the helper). Then start the poll loop per your harness policy in live.md and re-run live-poll immediately after every event or reply. Every event carries _instructions: follow them; they are the authoritative next step with real ids and paths filled in. A poll that is running is a poll you are SERVICING: never announce you are waiting and idle your turn; stay on the exec session until it returns an event, and never end a turn while a poll is outstanding.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"config\":{\"files\":[\"index.html\",\"public/**/*.html\"],\"insertBefore\":\"\",\"commentSyntax\":\"html\"},\"path\":\"/.impeccable/live/config.json\"}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "Stopped live server on port .\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n" + } +} diff --git a/tests/oracle/golden/live-boot-html-config-missing.json b/tests/oracle/golden/live-boot-html-config-missing.json new file mode 100644 index 000000000..50388c6fd --- /dev/null +++ b/tests/oracle/golden/live-boot-html-config-missing.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/.impeccable/live/config.json\",\"targetPath\":null,\"projectRoot\":\"\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"fallback\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-monorepo-from-child.json b/tests/oracle/golden/live-boot-monorepo-from-child.json new file mode 100644 index 000000000..3cb92a8f5 --- /dev/null +++ b/tests/oracle/golden/live-boot-monorepo-from-child.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/website/.impeccable/live/config.json\",\"targetPath\":null,\"projectRoot\":\"/website\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/app-root.json": "{\"version\":2,\"appRoots\":[{\"appRoot\":\"/website\",\"bootedAt\":\"\"}]}", + "website/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/website\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/website/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-monorepo-from-root.json b/tests/oracle/golden/live-boot-monorepo-from-root.json new file mode 100644 index 000000000..e3c0b11c2 --- /dev/null +++ b/tests/oracle/golden/live-boot-monorepo-from-root.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/website/.impeccable/live/config.json\",\"targetPath\":null,\"projectRoot\":\"/website\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/app-root.json": "{\"version\":2,\"appRoots\":[{\"appRoot\":\"/website\",\"bootedAt\":\"\"}]}", + "website/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/website\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/website/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"candidate:website\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-monorepo-no-git-from-root.json b/tests/oracle/golden/live-boot-monorepo-no-git-from-root.json new file mode 100644 index 000000000..d46d5031e --- /dev/null +++ b/tests/oracle/golden/live-boot-monorepo-no-git-from-root.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\n \"ok\": false,\n \"error\": \"context_missing\",\n \"missing\": [\n \"PRODUCT.md\",\n \"DESIGN.md\"\n ],\n \"nextCommand\": \"init\",\n \"targetPath\": null,\n \"projectRoot\": \"/website\",\n \"repoRoot\": \"/website\",\n \"productPath\": null,\n \"designPath\": null\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-boot-monorepo-target-eq.json b/tests/oracle/golden/live-boot-monorepo-target-eq.json new file mode 100644 index 000000000..824e29f0d --- /dev/null +++ b/tests/oracle/golden/live-boot-monorepo-target-eq.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/website/.impeccable/live/config.json\",\"targetPath\":\"website\",\"projectRoot\":\"/website\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/app-root.json": "{\"version\":2,\"appRoots\":[{\"appRoot\":\"/website\",\"bootedAt\":\"\"}]}", + "website/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/website\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/website/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"target:website\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-monorepo-target-file.json b/tests/oracle/golden/live-boot-monorepo-target-file.json new file mode 100644 index 000000000..7a51ba9c3 --- /dev/null +++ b/tests/oracle/golden/live-boot-monorepo-target-file.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/website/.impeccable/live/config.json\",\"targetPath\":\"website/src/App.jsx\",\"projectRoot\":\"/website\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/app-root.json": "{\"version\":2,\"appRoots\":[{\"appRoot\":\"/website\",\"bootedAt\":\"\"}]}", + "website/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/website\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/website/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"target:website/src/App.jsx\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-multi-app-selection.json b/tests/oracle/golden/live-boot-multi-app-selection.json new file mode 100644 index 000000000..16f55f108 --- /dev/null +++ b/tests/oracle/golden/live-boot-multi-app-selection.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\n \"ok\": false,\n \"error\": \"target_selection_required\",\n \"targetCandidates\": [\n {\n \"name\": \"admin\",\n \"path\": \"admin\"\n },\n {\n \"name\": \"website\",\n \"path\": \"website\"\n }\n ],\n \"hint\": \"Several apps with a dev-server config exist. Ask the user which one to use, then rerun with --target .\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-boot-multi-app-target.json b/tests/oracle/golden/live-boot-multi-app-target.json new file mode 100644 index 000000000..6da120c93 --- /dev/null +++ b/tests/oracle/golden/live-boot-multi-app-target.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/admin/.impeccable/live/config.json\",\"targetPath\":\"admin\",\"projectRoot\":\"/admin\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/app-root.json": "{\"version\":2,\"appRoots\":[{\"appRoot\":\"/admin\",\"bootedAt\":\"\"}]}", + "admin/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/admin\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/admin/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"target:admin\"\n}", + "website/.impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-boot-pointer-accumulates.json b/tests/oracle/golden/live-boot-pointer-accumulates.json new file mode 100644 index 000000000..de5b3a9d3 --- /dev/null +++ b/tests/oracle/golden/live-boot-pointer-accumulates.json @@ -0,0 +1,27 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/website/.impeccable/live/config.json\",\"targetPath\":\"website\",\"projectRoot\":\"/website\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/admin/.impeccable/live/config.json\",\"targetPath\":\"admin\",\"projectRoot\":\"/admin\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/website/.impeccable/live/config.json\",\"targetPath\":\"website\",\"projectRoot\":\"/website\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".impeccable/live/app-root.json": "{\"version\":2,\"appRoots\":[{\"appRoot\":\"/website\",\"bootedAt\":\"\"},{\"appRoot\":\"/admin\",\"bootedAt\":\"\"}]}", + "admin/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/admin\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/admin/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"target:admin\"\n}", + "website/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/website\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/website/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"target:website\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-sveltekit-config-missing.json b/tests/oracle/golden/live-boot-sveltekit-config-missing.json new file mode 100644 index 000000000..274d8edec --- /dev/null +++ b/tests/oracle/golden/live-boot-sveltekit-config-missing.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/.impeccable/live/config.json\",\"targetPath\":null,\"projectRoot\":\"\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-vite-config-missing.json b/tests/oracle/golden/live-boot-vite-config-missing.json new file mode 100644 index 000000000..274d8edec --- /dev/null +++ b/tests/oracle/golden/live-boot-vite-config-missing.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/.impeccable/live/config.json\",\"targetPath\":null,\"projectRoot\":\"\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-vite-from-subdir.json b/tests/oracle/golden/live-boot-vite-from-subdir.json new file mode 100644 index 000000000..6e37e88b2 --- /dev/null +++ b/tests/oracle/golden/live-boot-vite-from-subdir.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\n \"ok\": false,\n \"error\": \"context_missing\",\n \"missing\": [\n \"PRODUCT.md\",\n \"DESIGN.md\"\n ],\n \"nextCommand\": \"init\",\n \"targetPath\": null,\n \"projectRoot\": \"/src\",\n \"repoRoot\": \"/src\",\n \"productPath\": null,\n \"designPath\": null\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-boot-workspaces-from-child.json b/tests/oracle/golden/live-boot-workspaces-from-child.json new file mode 100644 index 000000000..240c229b1 --- /dev/null +++ b/tests/oracle/golden/live-boot-workspaces-from-child.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/apps/admin/.impeccable/live/config.json\",\"targetPath\":null,\"projectRoot\":\"/apps/admin\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/app-root.json": "{\"version\":2,\"appRoots\":[{\"appRoot\":\"/apps/admin\",\"bootedAt\":\"\"}]}", + "apps/admin/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/apps/admin\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/apps/admin/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}" + } +} diff --git a/tests/oracle/golden/live-boot-workspaces-selection.json b/tests/oracle/golden/live-boot-workspaces-selection.json new file mode 100644 index 000000000..a092fd54a --- /dev/null +++ b/tests/oracle/golden/live-boot-workspaces-selection.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\n \"ok\": false,\n \"error\": \"target_selection_required\",\n \"targetPath\": null,\n \"projectRoot\": \"\",\n \"repoRoot\": \"\",\n \"targetCandidates\": [\n {\n \"name\": \"admin\",\n \"path\": \"apps/admin\",\n \"targetExample\": \"apps/admin\",\n \"productStatus\": \"inherited\",\n \"productPath\": \"PRODUCT.md\",\n \"designStatus\": \"inherited\",\n \"designPath\": \"DESIGN.md\"\n },\n {\n \"name\": \"web\",\n \"path\": \"apps/web\",\n \"targetExample\": \"apps/web/src/App.jsx\",\n \"productStatus\": \"inherited\",\n \"productPath\": \"PRODUCT.md\",\n \"designStatus\": \"inherited\",\n \"designPath\": \"DESIGN.md\"\n }\n ],\n \"hint\": \"Ask the user which app Impeccable should use, then rerun live from that child app cwd. Use --target only as a fallback or explicit path diagnostic.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-boot-workspaces-target.json b/tests/oracle/golden/live-boot-workspaces-target.json new file mode 100644 index 000000000..681ce38a3 --- /dev/null +++ b/tests/oracle/golden/live-boot-workspaces-target.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/apps/web/.impeccable/live/config.json\",\"targetPath\":\"apps/web\",\"projectRoot\":\"/apps/web\",\"repoRoot\":\"\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/app-root.json": "{\"version\":2,\"appRoots\":[{\"appRoot\":\"/apps/web\",\"bootedAt\":\"\"}]}", + "apps/web/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/apps/web\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/apps/web/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"target:apps/web\"\n}" + } +} diff --git a/tests/oracle/golden/live-commit-help.json b/tests/oracle/golden/live-commit-help.json new file mode 100644 index 000000000..12a58b452 --- /dev/null +++ b/tests/oracle/golden/live-commit-help.json @@ -0,0 +1,13 @@ +{ + "stdout": "Usage: node live-commit-manual-edits.mjs [--page-url=] [--provider=auto|codex|claude|mock]\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-invalid-buffer.json b/tests/oracle/golden/live-commit-invalid-buffer.json new file mode 100644 index 000000000..87afc8b40 --- /dev/null +++ b/tests/oracle/golden/live-commit-invalid-buffer.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"applied\":[],\"failed\":[],\"files\":[],\"cleared\":0,\"count\":0,\"pageUrl\":null,\"reason\":\"manual_edit_buffer_invalid\",\"message\":\"manual_edit_buffer_unreadable: Expected property name or '}' in JSON at position 2 (line 1 column 3)\",\"totalCount\":0,\"perPage\":{}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{ nope", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-mock-applied-page.json b/tests/oracle/golden/live-commit-mock-applied-page.json new file mode 100644 index 000000000..8a3674d53 --- /dev/null +++ b/tests/oracle/golden/live-commit-mock-applied-page.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"applied\":[{\"id\":\"e1\",\"ref\":\"main>h1\",\"originalText\":\"Oracle Fixture\",\"newText\":\"Oracle Fixture, renamed\"},{\"id\":\"e2\",\"ref\":\"main>p\",\"originalText\":\"Minimal static page for oracle live-mode goldens.\",\"newText\":\"A tighter hook.\"},{\"id\":\"e2\",\"ref\":\"aside>p\",\"originalText\":\"Nested content.\",\"newText\":\"Nested copy.\"}],\"failed\":[],\"files\":[\"index.html\"],\"cleared\":3,\"count\":3,\"pageUrl\":\"/\",\"warnings\":[],\"notes\":[\"oracle mock\"],\"totalCount\":1,\"perPage\":{\"/docs/guide\":1}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/docs/guide\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"article>p\",\n \"tag\": \"p\",\n \"originalText\": \"A second page covered by the config glob.\",\n \"newText\": \"Second page lead.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}", + "index.html": "\n\n \n
\n

Oracle Fixture, renamed

\n

A tighter hook.

\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-mock-default-result.json b/tests/oracle/golden/live-commit-mock-default-result.json new file mode 100644 index 000000000..e5fe4835c --- /dev/null +++ b/tests/oracle/golden/live-commit-mock-default-result.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"applied\":[],\"failed\":[{\"id\":\"e1\",\"reason\":\"missing_touched_files\",\"checks\":[{\"id\":\"e1\",\"reason\":\"source_verification_failed\",\"failures\":[{\"ref\":\"main>h1\",\"reason\":\"source_verification_failed\",\"detail\":\"source_hint_still_contains_original_text\",\"candidates\":[{\"file\":\"index.html\",\"line\":13,\"reason\":\"source_hint_still_contains_original_text\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"source_hint\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"candidate_source_hint\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"text_match\"},{\"file\":\"index.html\",\"line\":7,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":9,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"}]}],\"candidates\":[{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"},{\"kind\":\"tag\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\"}]},{\"id\":\"e2\",\"reason\":\"source_verification_failed\",\"failures\":[{\"ref\":\"main>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"index.html\",\"line\":14,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":21,\"kind\":\"entry_text_match\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"}]},{\"ref\":\"aside>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"index.html\",\"line\":21,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":14,\"kind\":\"entry_text_match\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"}]}],\"candidates\":[{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]},{\"id\":\"e3\",\"reason\":\"source_verification_failed\",\"failures\":[{\"ref\":\"article>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"kind\":\"text\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.\",\"excerpt\":\"

A second page covered by the config glob.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"candidates\":[{\"kind\":\"text\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.\",\"excerpt\":\"

A second page covered by the config glob.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"candidates\":[{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"},{\"kind\":\"tag\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\"}]},{\"id\":\"e2\",\"reason\":\"missing_touched_files\",\"checks\":[{\"id\":\"e1\",\"reason\":\"source_verification_failed\",\"failures\":[{\"ref\":\"main>h1\",\"reason\":\"source_verification_failed\",\"detail\":\"source_hint_still_contains_original_text\",\"candidates\":[{\"file\":\"index.html\",\"line\":13,\"reason\":\"source_hint_still_contains_original_text\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"source_hint\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"candidate_source_hint\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"text_match\"},{\"file\":\"index.html\",\"line\":7,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":9,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"}]}],\"candidates\":[{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"},{\"kind\":\"tag\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\"}]},{\"id\":\"e2\",\"reason\":\"source_verification_failed\",\"failures\":[{\"ref\":\"main>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"index.html\",\"line\":14,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":21,\"kind\":\"entry_text_match\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"}]},{\"ref\":\"aside>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"index.html\",\"line\":21,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":14,\"kind\":\"entry_text_match\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"}]}],\"candidates\":[{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]},{\"id\":\"e3\",\"reason\":\"source_verification_failed\",\"failures\":[{\"ref\":\"article>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"kind\":\"text\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.\",\"excerpt\":\"

A second page covered by the config glob.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"candidates\":[{\"kind\":\"text\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.\",\"excerpt\":\"

A second page covered by the config glob.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"candidates\":[{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]},{\"id\":\"e3\",\"reason\":\"missing_touched_files\",\"checks\":[{\"id\":\"e1\",\"reason\":\"source_verification_failed\",\"failures\":[{\"ref\":\"main>h1\",\"reason\":\"source_verification_failed\",\"detail\":\"source_hint_still_contains_original_text\",\"candidates\":[{\"file\":\"index.html\",\"line\":13,\"reason\":\"source_hint_still_contains_original_text\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"source_hint\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"candidate_source_hint\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"text_match\"},{\"file\":\"index.html\",\"line\":7,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":9,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"}]}],\"candidates\":[{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"},{\"kind\":\"tag\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\"}]},{\"id\":\"e2\",\"reason\":\"source_verification_failed\",\"failures\":[{\"ref\":\"main>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"index.html\",\"line\":14,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":21,\"kind\":\"entry_text_match\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"}]},{\"ref\":\"aside>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"index.html\",\"line\":21,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":14,\"kind\":\"entry_text_match\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"}]}],\"candidates\":[{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]},{\"id\":\"e3\",\"reason\":\"source_verification_failed\",\"failures\":[{\"ref\":\"article>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"kind\":\"text\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.\",\"excerpt\":\"

A second page covered by the config glob.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"candidates\":[{\"kind\":\"text\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.\",\"excerpt\":\"

A second page covered by the config glob.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"candidates\":[{\"kind\":\"text\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.\",\"excerpt\":\"

A second page covered by the config glob.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"files\":[],\"cleared\":0,\"count\":4,\"pageUrl\":null,\"warnings\":[],\"notes\":[\"mock copy-edit batch result\",\"mock copy-edit batch result\",\"mock copy-edit batch result\",\"mock copy-edit batch result\"],\"reason\":\"manual_edit_repair_needs_decision\",\"needsManualDecision\":true,\"repair\":{\"status\":\"needs_decision\",\"attempts\":3,\"maxAttempts\":3,\"transactionId\":null,\"failures\":[{\"reason\":\"source_verification_failed\",\"entryId\":\"e1\",\"candidates\":[{\"file\":\"index.html\",\"line\":13},{\"file\":\"index.html\",\"line\":13,\"kind\":\"text\"},{\"file\":\"index.html\",\"line\":7,\"kind\":\"class\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"class\"},{\"file\":\"public/docs/guide.html\",\"line\":9,\"kind\":\"tag\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"tag\"}],\"failures\":[{\"ref\":\"main>h1\",\"reason\":\"source_verification_failed\",\"detail\":\"source_hint_still_contains_original_text\",\"candidates\":[{\"file\":\"index.html\",\"line\":13,\"reason\":\"source_hint_still_contains_original_text\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"source_hint\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"candidate_source_hint\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"text_match\"},{\"file\":\"index.html\",\"line\":7,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":13,\"kind\":\"locator_match\"}]}]},{\"reason\":\"source_verification_failed\",\"entryId\":\"e2\",\"candidates\":[{\"file\":\"index.html\",\"line\":14,\"kind\":\"text\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"tag\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"tag\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"tag\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"tag\"},{\"file\":\"index.html\",\"line\":21,\"kind\":\"text\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"tag\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"tag\"}],\"failures\":[{\"ref\":\"main>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"index.html\",\"line\":14,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":21,\"kind\":\"entry_text_match\"}]},{\"ref\":\"aside>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"index.html\",\"line\":21,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"file\":\"index.html\",\"line\":14,\"kind\":\"entry_text_match\"}]}]},{\"reason\":\"source_verification_failed\",\"entryId\":\"e3\",\"candidates\":[{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"text\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"tag\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"tag\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"tag\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"tag\"}],\"failures\":[{\"ref\":\"article>p\",\"reason\":\"source_verification_failed\",\"detail\":\"newText_not_found_in_plausible_source_location\",\"candidates\":[{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"text_match\"},{\"file\":\"src/cards.html\",\"line\":4,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":8,\"kind\":\"locator_match\"},{\"file\":\"src/cards.html\",\"line\":12,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"locator_match\"},{\"file\":\"public/docs/guide.html\",\"line\":10,\"kind\":\"text\"}]}]}],\"files\":[]},\"totalCount\":4,\"perPage\":{\"/\":3,\"/docs/guide\":1}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e1\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>h1\",\n \"tag\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ],\n \"originalText\": \"Oracle Fixture\",\n \"newText\": \"Oracle Fixture, renamed\",\n \"sourceHint\": {\n \"file\": \"index.html\",\n \"line\": 13,\n \"column\": 7\n }\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e2\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>p\",\n \"tag\": \"p\",\n \"originalText\": \"Minimal static page for oracle live-mode goldens.\",\n \"newText\": \"A tighter hook.\"\n },\n {\n \"ref\": \"aside>p\",\n \"tag\": \"p\",\n \"originalText\": \"Nested content.\",\n \"newText\": \"Nested copy.\"\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/docs/guide\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"article>p\",\n \"tag\": \"p\",\n \"originalText\": \"A second page covered by the config glob.\",\n \"newText\": \"Second page lead.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-mock-error.json b/tests/oracle/golden/live-commit-mock-error.json new file mode 100644 index 000000000..4bd9280bf --- /dev/null +++ b/tests/oracle/golden/live-commit-mock-error.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"applied\":[],\"failed\":[{\"id\":\"e1\",\"reason\":\"agent gave up\",\"candidates\":[{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"},{\"kind\":\"tag\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\"}]},{\"id\":\"e2\",\"reason\":\"agent gave up\",\"candidates\":[{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]},{\"id\":\"e3\",\"reason\":\"agent gave up\",\"candidates\":[{\"kind\":\"text\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.\",\"excerpt\":\"

A second page covered by the config glob.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"files\":[],\"cleared\":0,\"count\":4,\"pageUrl\":null,\"notes\":[],\"rolledBackFiles\":[],\"rollbackFailures\":[],\"totalCount\":4,\"perPage\":{\"/\":3,\"/docs/guide\":1}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e1\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>h1\",\n \"tag\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ],\n \"originalText\": \"Oracle Fixture\",\n \"newText\": \"Oracle Fixture, renamed\",\n \"sourceHint\": {\n \"file\": \"index.html\",\n \"line\": 13,\n \"column\": 7\n }\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e2\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>p\",\n \"tag\": \"p\",\n \"originalText\": \"Minimal static page for oracle live-mode goldens.\",\n \"newText\": \"A tighter hook.\"\n },\n {\n \"ref\": \"aside>p\",\n \"tag\": \"p\",\n \"originalText\": \"Nested content.\",\n \"newText\": \"Nested copy.\"\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/docs/guide\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"article>p\",\n \"tag\": \"p\",\n \"originalText\": \"A second page covered by the config glob.\",\n \"newText\": \"Second page lead.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-mock-invalid-result-json.json b/tests/oracle/golden/live-commit-mock-invalid-result-json.json new file mode 100644 index 000000000..1e87ad446 --- /dev/null +++ b/tests/oracle/golden/live-commit-mock-invalid-result-json.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"applied\":[],\"failed\":[{\"id\":\"e1\",\"reason\":\"Invalid IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT JSON\",\"candidates\":[{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"},{\"kind\":\"tag\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\"}]},{\"id\":\"e2\",\"reason\":\"Invalid IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT JSON\",\"candidates\":[{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]},{\"id\":\"e3\",\"reason\":\"Invalid IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT JSON\",\"candidates\":[{\"kind\":\"text\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.\",\"excerpt\":\"

A second page covered by the config glob.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"files\":[],\"cleared\":0,\"count\":4,\"pageUrl\":null,\"rolledBackFiles\":[],\"rollbackFailures\":[],\"totalCount\":4,\"perPage\":{\"/\":3,\"/docs/guide\":1}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e1\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>h1\",\n \"tag\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ],\n \"originalText\": \"Oracle Fixture\",\n \"newText\": \"Oracle Fixture, renamed\",\n \"sourceHint\": {\n \"file\": \"index.html\",\n \"line\": 13,\n \"column\": 7\n }\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e2\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>p\",\n \"tag\": \"p\",\n \"originalText\": \"Minimal static page for oracle live-mode goldens.\",\n \"newText\": \"A tighter hook.\"\n },\n {\n \"ref\": \"aside>p\",\n \"tag\": \"p\",\n \"originalText\": \"Nested content.\",\n \"newText\": \"Nested copy.\"\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/docs/guide\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"article>p\",\n \"tag\": \"p\",\n \"originalText\": \"A second page covered by the config glob.\",\n \"newText\": \"Second page lead.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-mock-leftover-marker-check.json b/tests/oracle/golden/live-commit-mock-leftover-marker-check.json new file mode 100644 index 000000000..acb895a7e --- /dev/null +++ b/tests/oracle/golden/live-commit-mock-leftover-marker-check.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"applied\":[],\"failed\":[{\"id\":\"e3\",\"reason\":\"post_apply_validation_failed\",\"checks\":[{\"file\":\"public/docs/guide.html\",\"reason\":\"leftover_impeccable_marker\",\"marker\":\"\n

Second page lead.

\n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-mock-partial.json b/tests/oracle/golden/live-commit-mock-partial.json new file mode 100644 index 000000000..fa2052659 --- /dev/null +++ b/tests/oracle/golden/live-commit-mock-partial.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"applied\":[{\"id\":\"e1\",\"ref\":\"main>h1\",\"originalText\":\"Oracle Fixture\",\"newText\":\"Oracle Fixture, renamed\"}],\"failed\":[{\"id\":\"e2\",\"reason\":\"ambiguous duplicate copy\",\"candidates\":[{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}]}],\"files\":[\"index.html\"],\"cleared\":1,\"count\":3,\"pageUrl\":\"/\",\"warnings\":[],\"notes\":[],\"totalCount\":3,\"perPage\":{\"/\":2,\"/docs/guide\":1}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e2\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>p\",\n \"tag\": \"p\",\n \"originalText\": \"Minimal static page for oracle live-mode goldens.\",\n \"newText\": \"A tighter hook.\"\n },\n {\n \"ref\": \"aside>p\",\n \"tag\": \"p\",\n \"originalText\": \"Nested content.\",\n \"newText\": \"Nested copy.\"\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/docs/guide\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"article>p\",\n \"tag\": \"p\",\n \"originalText\": \"A second page covered by the config glob.\",\n \"newText\": \"Second page lead.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}", + "index.html": "

Oracle Fixture, renamed

Minimal static page for oracle live-mode goldens.

\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-mock-then-discard-remaining.json b/tests/oracle/golden/live-commit-mock-then-discard-remaining.json new file mode 100644 index 000000000..9c3bc6ad0 --- /dev/null +++ b/tests/oracle/golden/live-commit-mock-then-discard-remaining.json @@ -0,0 +1,24 @@ +{ + "steps": [ + { + "stdout": "{\"applied\":[{\"id\":\"e3\",\"ref\":\"article>p\",\"originalText\":\"A second page covered by the config glob.\",\"newText\":\"Second page lead.\"}],\"failed\":[],\"files\":[\"public/docs/guide.html\"],\"cleared\":1,\"count\":1,\"pageUrl\":\"/docs/guide\",\"warnings\":[],\"notes\":[],\"totalCount\":3,\"perPage\":{\"/\":3}}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"discarded\":3,\"entries\":[{\"id\":\"e1\",\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"main>h1\",\"tag\":\"h1\",\"classes\":[\"hero-title\"],\"originalText\":\"Oracle Fixture\",\"newText\":\"Oracle Fixture, renamed\",\"sourceHint\":{\"file\":\"index.html\",\"line\":13,\"column\":7}}],\"stagedAt\":\"\"},{\"id\":\"e2\",\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"main>p\",\"tag\":\"p\",\"originalText\":\"Minimal static page for oracle live-mode goldens.\",\"newText\":\"A tighter hook.\"},{\"ref\":\"aside>p\",\"tag\":\"p\",\"originalText\":\"Nested content.\",\"newText\":\"Nested copy.\"}],\"stagedAt\":\"\"}],\"totalCount\":0}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": []\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "

Guide

Second page lead.

\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-mock-unreported-file-change.json b/tests/oracle/golden/live-commit-mock-unreported-file-change.json new file mode 100644 index 000000000..23833863c --- /dev/null +++ b/tests/oracle/golden/live-commit-mock-unreported-file-change.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"applied\":[],\"failed\":[{\"id\":\"e1\",\"reason\":\"unreported_source_changes\",\"candidates\":[{\"file\":\"index.html\",\"loc\":\"\",\"line\":13,\"column\":7,\"status\":\"ok\",\"relativeFile\":\"index.html\",\"excerpt\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\"
\"},{\"line\":13,\"text\":\"

Oracle Fixture

\"},{\"line\":14,\"text\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"line\":15,\"text\":\"
\"},{\"line\":16,\"text\":\"
One
\"}]},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":7,\"needle\":\"hero-title\",\"excerpt\":\".hero-title { font-size: 2rem; }\"},{\"kind\":\"class\",\"file\":\"index.html\",\"line\":13,\"needle\":\"hero-title\",\"excerpt\":\"

Oracle Fixture

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":9,\"needle\":\"Guide\"},{\"kind\":\"tag\",\"file\":\"index.html\",\"line\":13,\"needle\":\"Oracle Fixture\"}],\"files\":[\"index.html\"]},{\"id\":\"e2\",\"reason\":\"unreported_source_changes\",\"candidates\":[{\"kind\":\"text\",\"file\":\"index.html\",\"line\":14,\"needle\":\"Minimal static page for oracle live-mode goldens.\",\"excerpt\":\"

Minimal static page for oracle live-mode goldens.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"},{\"kind\":\"text\",\"file\":\"index.html\",\"line\":21,\"needle\":\"Nested content.\",\"excerpt\":\"

Nested content.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":4,\"needle\":\"First card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":8,\"needle\":\"Second card body copy.

\"},{\"kind\":\"tag\",\"file\":\"src/cards.html\",\"line\":12,\"needle\":\"Third card body copy.

\"},{\"kind\":\"tag\",\"file\":\"public/docs/guide.html\",\"line\":10,\"needle\":\"A second page covered by the config glob.

\"}],\"files\":[\"index.html\"]}],\"files\":[],\"unreportedFiles\":[\"index.html\"],\"cleared\":0,\"count\":3,\"pageUrl\":\"/\",\"notes\":[],\"rolledBackFiles\":[\"index.html\"],\"rollbackFailures\":[],\"totalCount\":4,\"perPage\":{\"/\":3,\"/docs/guide\":1}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e1\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>h1\",\n \"tag\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ],\n \"originalText\": \"Oracle Fixture\",\n \"newText\": \"Oracle Fixture, renamed\",\n \"sourceHint\": {\n \"file\": \"index.html\",\n \"line\": 13,\n \"column\": 7\n }\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e2\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>p\",\n \"tag\": \"p\",\n \"originalText\": \"Minimal static page for oracle live-mode goldens.\",\n \"newText\": \"A tighter hook.\"\n },\n {\n \"ref\": \"aside>p\",\n \"tag\": \"p\",\n \"originalText\": \"Nested content.\",\n \"newText\": \"Nested copy.\"\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/docs/guide\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"article>p\",\n \"tag\": \"p\",\n \"originalText\": \"A second page covered by the config glob.\",\n \"newText\": \"Second page lead.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-no-pending-page.json b/tests/oracle/golden/live-commit-no-pending-page.json new file mode 100644 index 000000000..c31930357 --- /dev/null +++ b/tests/oracle/golden/live-commit-no-pending-page.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"applied\":[],\"failed\":[],\"files\":[],\"cleared\":0,\"count\":0,\"pageUrl\":\"/\",\"reason\":\"no_pending_edits\",\"totalCount\":0,\"perPage\":{}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-commit-no-pending.json b/tests/oracle/golden/live-commit-no-pending.json new file mode 100644 index 000000000..1f19532a0 --- /dev/null +++ b/tests/oracle/golden/live-commit-no-pending.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"applied\":[],\"failed\":[],\"files\":[],\"cleared\":0,\"count\":0,\"pageUrl\":null,\"reason\":\"no_pending_edits\",\"totalCount\":0,\"perPage\":{}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-complete-clean.json b/tests/oracle/golden/live-complete-clean.json new file mode 100644 index 000000000..ed965da35 --- /dev/null +++ b/tests/oracle/golden/live-complete-clean.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"index.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": 2,\n \"paramValues\": {\n \"face\": \"serif\"\n },\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578580000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": true,\n \"generationCanceledAt\": 1785578520000,\n \"cancelReason\": \"accept\",\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [\n {\n \"error\": \"carbonize_cleanup_required\",\n \"file\": \"index.html\",\n \"message\": \"Accepted variant still has carbonize markers that must be folded into source CSS.\"\n }\n ],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"index.html\",\"sourceEventType\":\"generate\",\"carbonize\":false,\"arrivedVariants\":3}}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"accept\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"accept\",\"variantId\":\"2\",\"pageUrl\":\"/\",\"paramValues\":{\"face\":\"serif\"}}}\n{\"seq\":4,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"index.html\",\"sourceEventType\":\"accept\",\"carbonize\":true}}\n{\"seq\":5,\"id\":\"ab12cd34\",\"type\":\"complete\",\"ts\":\"\",\"event\":{\"type\":\"complete\",\"id\":\"ab12cd34\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"index.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": 2,\n \"paramValues\": {\n \"face\": \"serif\"\n },\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578580000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": true,\n \"generationCanceledAt\": 1785578520000,\n \"cancelReason\": \"accept\",\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [\n {\n \"error\": \"carbonize_cleanup_required\",\n \"file\": \"index.html\",\n \"message\": \"Accepted variant still has carbonize markers that must be folded into source CSS.\"\n }\n ],\n \"updatedAt\": \"\",\n \"__journalBytes\": 1053,\n \"__nextSeq\": 6\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-discard-alias.json b/tests/oracle/golden/live-complete-discard-alias.json new file mode 100644 index 000000000..f871a64df --- /dev/null +++ b/tests/oracle/golden/live-complete-discard-alias.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"discarded\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"discarded\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"phase\":\"picked_up\",\"at\": }}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"discarded\",\"ts\":\"\",\"event\":{\"type\":\"discarded\",\"id\":\"ab12cd34\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"discarded\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\",\n \"__journalBytes\": 644,\n \"__nextSeq\": 4\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-discarded.json b/tests/oracle/golden/live-complete-discarded.json new file mode 100644 index 000000000..f871a64df --- /dev/null +++ b/tests/oracle/golden/live-complete-discarded.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"discarded\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"discarded\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"phase\":\"picked_up\",\"at\": }}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"discarded\",\"ts\":\"\",\"event\":{\"type\":\"discarded\",\"id\":\"ab12cd34\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"discarded\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\",\n \"__journalBytes\": 644,\n \"__nextSeq\": 4\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-error-eq.json b/tests/oracle/golden/live-complete-error-eq.json new file mode 100644 index 000000000..3c8eec8a4 --- /dev/null +++ b/tests/oracle/golden/live-complete-error-eq.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"agent_error\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"agent_error\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [\n {\n \"error\": \"agent_error\",\n \"message\": \"boom\"\n }\n ],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"phase\":\"picked_up\",\"at\": }}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"agent_error\",\"ts\":\"\",\"event\":{\"type\":\"agent_error\",\"id\":\"ab12cd34\",\"message\":\"boom\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"agent_error\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [\n {\n \"error\": \"agent_error\",\n \"message\": \"boom\"\n }\n ],\n \"updatedAt\": \"\",\n \"__journalBytes\": 665,\n \"__nextSeq\": 4\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-error-no-message.json b/tests/oracle/golden/live-complete-error-no-message.json new file mode 100644 index 000000000..a835cb57f --- /dev/null +++ b/tests/oracle/golden/live-complete-error-no-message.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"agent_error\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"agent_error\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [\n {\n \"error\": \"agent_error\",\n \"message\": \"unknown error\"\n }\n ],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"phase\":\"picked_up\",\"at\": }}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"agent_error\",\"ts\":\"\",\"event\":{\"type\":\"agent_error\",\"id\":\"ab12cd34\",\"message\":\"unknown error\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"agent_error\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [\n {\n \"error\": \"agent_error\",\n \"message\": \"unknown error\"\n }\n ],\n \"updatedAt\": \"\",\n \"__journalBytes\": 674,\n \"__nextSeq\": 4\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-error.json b/tests/oracle/golden/live-complete-error.json new file mode 100644 index 000000000..56f6c463c --- /dev/null +++ b/tests/oracle/golden/live-complete-error.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"agent_error\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"agent_error\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [\n {\n \"error\": \"agent_error\",\n \"message\": \"variant generation crashed\"\n }\n ],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"phase\":\"picked_up\",\"at\": }}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"agent_error\",\"ts\":\"\",\"event\":{\"type\":\"agent_error\",\"id\":\"ab12cd34\",\"message\":\"variant generation crashed\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"agent_error\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [\n {\n \"error\": \"agent_error\",\n \"message\": \"variant generation crashed\"\n }\n ],\n \"updatedAt\": \"\",\n \"__journalBytes\": 687,\n \"__nextSeq\": 4\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-help.json b/tests/oracle/golden/live-complete-help.json new file mode 100644 index 000000000..913dace9e --- /dev/null +++ b/tests/oracle/golden/live-complete-help.json @@ -0,0 +1,9 @@ +{ + "stdout": "Usage: node live-complete.mjs --id SESSION_ID [--discarded|--error MESSAGE] [--force]\n\nAppend the final durable session acknowledgement. Use after accept/discard cleanup is verified.\nCompletion is refused while the session's source file still carries live-mode leftovers\n(markers, data-p-* attributes, unbaked --p-* vars); fix the file or pass --force.\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-no-id.json b/tests/oracle/golden/live-complete-no-id.json new file mode 100644 index 000000000..678dc7a14 --- /dev/null +++ b/tests/oracle/golden/live-complete-no-id.json @@ -0,0 +1,9 @@ +{ + "stdout": "Usage: node live-complete.mjs --id SESSION_ID [--discarded|--error MESSAGE] [--force]\n\nAppend the final durable session acknowledgement. Use after accept/discard cleanup is verified.\nCompletion is refused while the session's source file still carries live-mode leftovers\n(markers, data-p-* attributes, unbaked --p-* vars); fix the file or pass --force.\n", + "stderr": "", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-source-dirty-carbonize-leftovers.json b/tests/oracle/golden/live-complete-source-dirty-carbonize-leftovers.json new file mode 100644 index 000000000..cee57d250 --- /dev/null +++ b/tests/oracle/golden/live-complete-source-dirty-carbonize-leftovers.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\n \"ok\": false,\n \"error\": \"source_dirty\",\n \"id\": \"ab12cd34\",\n \"file\": \"index.html\",\n \"findings\": [\n {\n \"marker\": \"impeccable-carbonize-start\",\n \"line\": 2,\n \"excerpt\": \"\",\n \"why\": \"carbonize block not rewritten into permanent form\"\n },\n {\n \"marker\": \"var(--p-*)\",\n \"line\": 3,\n \"excerpt\": \"\",\n \"why\": \"preview parameter variable not baked to a literal\"\n },\n {\n \"marker\": \"impeccable-param-values\",\n \"line\": 4,\n \"excerpt\": \"\",\n \"why\": \"param-values comment not baked and removed\"\n },\n {\n \"marker\": \"impeccable-carbonize-end\",\n \"line\": 5,\n \"excerpt\": \"\",\n \"why\": \"carbonize block not rewritten into permanent form\"\n },\n {\n \"marker\": \"data-p-*\",\n \"line\": 6,\n \"excerpt\": \"

Hi

\",\n \"why\": \"preview parameter attribute left on markup\"\n },\n {\n \"marker\": \"--impeccable-variant-ready\",\n \"line\": 6,\n \"excerpt\": \"

Hi

\",\n \"why\": \"preview readiness sentinel left in CSS\"\n }\n ],\n \"hint\": \"The accepted source still carries live-mode leftovers. Finish the carbonize cleanup (bake params, remove markers and data-p-* attributes), then run live-complete again. Use --force only if a finding is a false positive.\"\n}\n", + "stderr": "", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"index.html\",\"sourceEventType\":\"generate\",\"carbonize\":false,\"arrivedVariants\":3}}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"accept\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"accept\",\"variantId\":\"2\",\"pageUrl\":\"/\",\"paramValues\":{\"face\":\"serif\"}}}\n{\"seq\":4,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"index.html\",\"sourceEventType\":\"accept\",\"carbonize\":true}}\n" + } +} diff --git a/tests/oracle/golden/live-complete-source-dirty-force.json b/tests/oracle/golden/live-complete-source-dirty-force.json new file mode 100644 index 000000000..ed965da35 --- /dev/null +++ b/tests/oracle/golden/live-complete-source-dirty-force.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"index.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": 2,\n \"paramValues\": {\n \"face\": \"serif\"\n },\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578580000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": true,\n \"generationCanceledAt\": 1785578520000,\n \"cancelReason\": \"accept\",\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [\n {\n \"error\": \"carbonize_cleanup_required\",\n \"file\": \"index.html\",\n \"message\": \"Accepted variant still has carbonize markers that must be folded into source CSS.\"\n }\n ],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"index.html\",\"sourceEventType\":\"generate\",\"carbonize\":false,\"arrivedVariants\":3}}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"accept\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"accept\",\"variantId\":\"2\",\"pageUrl\":\"/\",\"paramValues\":{\"face\":\"serif\"}}}\n{\"seq\":4,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"index.html\",\"sourceEventType\":\"accept\",\"carbonize\":true}}\n{\"seq\":5,\"id\":\"ab12cd34\",\"type\":\"complete\",\"ts\":\"\",\"event\":{\"type\":\"complete\",\"id\":\"ab12cd34\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"index.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": 2,\n \"paramValues\": {\n \"face\": \"serif\"\n },\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578580000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": true,\n \"generationCanceledAt\": 1785578520000,\n \"cancelReason\": \"accept\",\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [\n {\n \"error\": \"carbonize_cleanup_required\",\n \"file\": \"index.html\",\n \"message\": \"Accepted variant still has carbonize markers that must be folded into source CSS.\"\n }\n ],\n \"updatedAt\": \"\",\n \"__journalBytes\": 1053,\n \"__nextSeq\": 6\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-source-dirty.json b/tests/oracle/golden/live-complete-source-dirty.json new file mode 100644 index 000000000..9d360f0fa --- /dev/null +++ b/tests/oracle/golden/live-complete-source-dirty.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": false,\n \"error\": \"source_dirty\",\n \"id\": \"ab12cd34\",\n \"file\": \"index.html\",\n \"findings\": [\n {\n \"marker\": \"impeccable-variants-start\",\n \"line\": 13,\n \"excerpt\": \"\",\n \"why\": \"variant wrapper comment left in source\"\n },\n {\n \"marker\": \"data-impeccable-\",\n \"line\": 14,\n \"excerpt\": \"
\",\n \"why\": \"live-mode plumbing attribute left on markup\"\n },\n {\n \"marker\": \"data-impeccable-\",\n \"line\": 16,\n \"excerpt\": \"
\",\n \"why\": \"live-mode plumbing attribute left on markup\"\n },\n {\n \"marker\": \"data-impeccable-\",\n \"line\": 20,\n \"excerpt\": \"\n \n \n
\n \n
\n \n
\n

Oracle Fixture

\n
\n \n \n \n
\n

Oracle Fixture

\n
\n \n
\n

Oracle Fixture

\n
\n \n
\n

Oracle Fixture

\n
\n
\n \n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-complete-source-in-node-modules.json b/tests/oracle/golden/live-complete-source-in-node-modules.json new file mode 100644 index 000000000..c3a704c43 --- /dev/null +++ b/tests/oracle/golden/live-complete-source-in-node-modules.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"src/routes/+page.svelte\",\n \"previewFile\": null,\n \"previewMode\": \"svelte-component\",\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578460000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"node_modules/.impeccable-live/ab12cd34/manifest.json\",\"sourceFile\":\"src/routes/+page.svelte\",\"previewMode\":\"svelte-component\"}}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"complete\",\"ts\":\"\",\"event\":{\"type\":\"complete\",\"id\":\"ab12cd34\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"src/routes/+page.svelte\",\n \"previewFile\": null,\n \"previewMode\": \"svelte-component\",\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578460000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [],\n \"updatedAt\": \"\",\n \"__journalBytes\": 735,\n \"__nextSeq\": 4\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-source-missing-file.json b/tests/oracle/golden/live-complete-source-missing-file.json new file mode 100644 index 000000000..243ea316e --- /dev/null +++ b/tests/oracle/golden/live-complete-source-missing-file.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"src/gone.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578460000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"src/gone.html\"}}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"complete\",\"ts\":\"\",\"event\":{\"type\":\"complete\",\"id\":\"ab12cd34\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"src/gone.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578460000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [],\n \"updatedAt\": \"\",\n \"__journalBytes\": 624,\n \"__nextSeq\": 4\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-twice.json b/tests/oracle/golden/live-complete-twice.json new file mode 100644 index 000000000..a06ba454d --- /dev/null +++ b/tests/oracle/golden/live-complete-twice.json @@ -0,0 +1,21 @@ +{ + "steps": [ + { + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"index.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": 2,\n \"paramValues\": {\n \"face\": \"serif\"\n },\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578580000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": true,\n \"generationCanceledAt\": 1785578520000,\n \"cancelReason\": \"accept\",\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [\n {\n \"error\": \"carbonize_cleanup_required\",\n \"file\": \"index.html\",\n \"message\": \"Accepted variant still has carbonize markers that must be folded into source CSS.\"\n }\n ],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\n \"ok\": true,\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"snapshot\": {\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"index.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": 2,\n \"paramValues\": {\n \"face\": \"serif\"\n },\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578580000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": true,\n \"generationCanceledAt\": 1785578520000,\n \"cancelReason\": \"accept\",\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [\n {\n \"error\": \"carbonize_cleanup_required\",\n \"file\": \"index.html\",\n \"message\": \"Accepted variant still has carbonize markers that must be folded into source CSS.\"\n }\n ],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"index.html\",\"sourceEventType\":\"generate\",\"carbonize\":false,\"arrivedVariants\":3}}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"accept\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"accept\",\"variantId\":\"2\",\"pageUrl\":\"/\",\"paramValues\":{\"face\":\"serif\"}}}\n{\"seq\":4,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"index.html\",\"sourceEventType\":\"accept\",\"carbonize\":true}}\n{\"seq\":5,\"id\":\"ab12cd34\",\"type\":\"complete\",\"ts\":\"\",\"event\":{\"type\":\"complete\",\"id\":\"ab12cd34\"}}\n{\"seq\":6,\"id\":\"ab12cd34\",\"type\":\"complete\",\"ts\":\"\",\"event\":{\"type\":\"complete\",\"id\":\"ab12cd34\"}}\n", + ".impeccable/live/sessions/ab12cd34.snapshot.json": "{\n \"id\": \"ab12cd34\",\n \"phase\": \"completed\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"index.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": 2,\n \"paramValues\": {\n \"face\": \"serif\"\n },\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578580000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": true,\n \"generationCanceledAt\": 1785578520000,\n \"cancelReason\": \"accept\",\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": \"pending\",\n \"diagnostics\": [\n {\n \"error\": \"carbonize_cleanup_required\",\n \"file\": \"index.html\",\n \"message\": \"Accepted variant still has carbonize markers that must be folded into source CSS.\"\n }\n ],\n \"updatedAt\": \"\",\n \"__journalBytes\": 1173,\n \"__nextSeq\": 7\n}\n" + } +} diff --git a/tests/oracle/golden/live-complete-unknown-session.json b/tests/oracle/golden/live-complete-unknown-session.json new file mode 100644 index 000000000..611f43e25 --- /dev/null +++ b/tests/oracle/golden/live-complete-unknown-session.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\n \"ok\": true,\n \"id\": \"zz99zz99\",\n \"phase\": \"completed\",\n \"snapshot\": {\n \"id\": \"zz99zz99\",\n \"phase\": \"completed\",\n \"pageUrl\": null,\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 0,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": null,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/zz99zz99.jsonl": "{\"seq\":1,\"id\":\"zz99zz99\",\"type\":\"complete\",\"ts\":\"\",\"event\":{\"type\":\"complete\",\"id\":\"zz99zz99\"}}\n", + ".impeccable/live/sessions/zz99zz99.snapshot.json": "{\n \"id\": \"zz99zz99\",\n \"phase\": \"completed\",\n \"pageUrl\": null,\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 0,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": null,\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": null,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\",\n \"__journalBytes\": 120,\n \"__nextSeq\": 2\n}\n" + } +} diff --git a/tests/oracle/golden/live-daemon-server-status-poll-complete.json b/tests/oracle/golden/live-daemon-server-status-poll-complete.json new file mode 100644 index 000000000..cd9143895 --- /dev/null +++ b/tests/oracle/golden/live-daemon-server-status-poll-complete.json @@ -0,0 +1,95 @@ +{ + "steps": [ + { + "stdout": "", + "stderr": "", + "exit": null, + "signal": null, + "daemon": true + }, + { + "stdout": "", + "stderr": "Live server already running on port (pid ).\nStop it first with: node live-server.mjs stop\n", + "exit": 1, + "signal": null + }, + { + "stdout": "{\n \"liveServer\": {\n \"status\": \"ok\",\n \"port\": ,\n \"connectedClients\": 0,\n \"agentPolling\": false,\n \"pendingEvents\": [\n {\n \"id\": \"ab12cd34\",\n \"type\": \"generate\",\n \"leased\": false,\n \"leaseUntil\": null\n }\n ]\n },\n \"activeSessions\": [\n {\n \"id\": \"ab12cd34\",\n \"phase\": \"generate_requested\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"paramValues\": {},\n \"generationPhase\": null,\n \"generationCompletedAt\": null,\n \"generationCanceled\": false,\n \"cancelReason\": null,\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null\n }\n ],\n \"render\": [\n {\n \"id\": \"ab12cd34\",\n \"renderState\": null,\n \"mountedVariants\": [],\n \"mountFailures\": []\n }\n ],\n \"recoveryHint\": \"Run live-poll.mjs to continue pending work, or live-complete.mjs --id after manual cleanup.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":,\"scaffoldAttempted\":true,\"scaffoldDurationMs\":,\"scaffold\":{\"file\":\"index.html\",\"sourceWritten\":false,\"wrapperBlock\":\" \\n
\\n \\n
\\n

Oracle Fixture

\\n
\\n \\n
\\n \",\"replaceStartLine\":13,\"replaceEndLine\":13,\"startLine\":13,\"endLine\":21,\"insertLine\":19,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + }, + "daemon": [ + { + "stdout": "\nImpeccable live server running on http://localhost:\nToken: \n\nScript: http://localhost:/live.js\nInject: managed by live-inject.mjs; Astro source tags use is:inline automatically.\nStop: node live-server.mjs stop\n", + "stderr": "" + } + ] +} diff --git a/tests/oracle/golden/live-discard-all.json b/tests/oracle/golden/live-discard-all.json new file mode 100644 index 000000000..7769bbd55 --- /dev/null +++ b/tests/oracle/golden/live-discard-all.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"discarded\":4,\"entries\":[{\"id\":\"e1\",\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"main>h1\",\"tag\":\"h1\",\"classes\":[\"hero-title\"],\"originalText\":\"Oracle Fixture\",\"newText\":\"Oracle Fixture, renamed\",\"sourceHint\":{\"file\":\"index.html\",\"line\":13,\"column\":7}}],\"stagedAt\":\"\"},{\"id\":\"e2\",\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"main>p\",\"tag\":\"p\",\"originalText\":\"Minimal static page for oracle live-mode goldens.\",\"newText\":\"A tighter hook.\"},{\"ref\":\"aside>p\",\"tag\":\"p\",\"originalText\":\"Nested content.\",\"newText\":\"Nested copy.\"}],\"stagedAt\":\"\"},{\"id\":\"e3\",\"pageUrl\":\"/docs/guide\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"article>p\",\"tag\":\"p\",\"originalText\":\"A second page covered by the config glob.\",\"newText\":\"Second page lead.\"}],\"stagedAt\":\"\"}],\"totalCount\":0}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": []\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-discard-empty.json b/tests/oracle/golden/live-discard-empty.json new file mode 100644 index 000000000..dd2515645 --- /dev/null +++ b/tests/oracle/golden/live-discard-empty.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"discarded\":0,\"entries\":[],\"totalCount\":0}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": []\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-discard-help.json b/tests/oracle/golden/live-discard-help.json new file mode 100644 index 000000000..c4514189d --- /dev/null +++ b/tests/oracle/golden/live-discard-help.json @@ -0,0 +1,13 @@ +{ + "stdout": "Usage: node live-discard-manual-edits.mjs [--page-url=]\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-discard-invalid-buffer.json b/tests/oracle/golden/live-discard-invalid-buffer.json new file mode 100644 index 000000000..dd2515645 --- /dev/null +++ b/tests/oracle/golden/live-discard-invalid-buffer.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"discarded\":0,\"entries\":[],\"totalCount\":0}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": []\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-discard-page-bare-flag.json b/tests/oracle/golden/live-discard-page-bare-flag.json new file mode 100644 index 000000000..a24104b71 --- /dev/null +++ b/tests/oracle/golden/live-discard-page-bare-flag.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"discarded\":0,\"entries\":[],\"totalCount\":4}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e1\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>h1\",\n \"tag\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ],\n \"originalText\": \"Oracle Fixture\",\n \"newText\": \"Oracle Fixture, renamed\",\n \"sourceHint\": {\n \"file\": \"index.html\",\n \"line\": 13,\n \"column\": 7\n }\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e2\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>p\",\n \"tag\": \"p\",\n \"originalText\": \"Minimal static page for oracle live-mode goldens.\",\n \"newText\": \"A tighter hook.\"\n },\n {\n \"ref\": \"aside>p\",\n \"tag\": \"p\",\n \"originalText\": \"Nested content.\",\n \"newText\": \"Nested copy.\"\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/docs/guide\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"article>p\",\n \"tag\": \"p\",\n \"originalText\": \"A second page covered by the config glob.\",\n \"newText\": \"Second page lead.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-discard-page-no-match.json b/tests/oracle/golden/live-discard-page-no-match.json new file mode 100644 index 000000000..a24104b71 --- /dev/null +++ b/tests/oracle/golden/live-discard-page-no-match.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"discarded\":0,\"entries\":[],\"totalCount\":4}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e1\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>h1\",\n \"tag\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ],\n \"originalText\": \"Oracle Fixture\",\n \"newText\": \"Oracle Fixture, renamed\",\n \"sourceHint\": {\n \"file\": \"index.html\",\n \"line\": 13,\n \"column\": 7\n }\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e2\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"main>p\",\n \"tag\": \"p\",\n \"originalText\": \"Minimal static page for oracle live-mode goldens.\",\n \"newText\": \"A tighter hook.\"\n },\n {\n \"ref\": \"aside>p\",\n \"tag\": \"p\",\n \"originalText\": \"Nested content.\",\n \"newText\": \"Nested copy.\"\n }\n ],\n \"stagedAt\": \"\"\n },\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/docs/guide\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"article>p\",\n \"tag\": \"p\",\n \"originalText\": \"A second page covered by the config glob.\",\n \"newText\": \"Second page lead.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-discard-page.json b/tests/oracle/golden/live-discard-page.json new file mode 100644 index 000000000..cd96513a6 --- /dev/null +++ b/tests/oracle/golden/live-discard-page.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"discarded\":3,\"entries\":[{\"id\":\"e1\",\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"main>h1\",\"tag\":\"h1\",\"classes\":[\"hero-title\"],\"originalText\":\"Oracle Fixture\",\"newText\":\"Oracle Fixture, renamed\",\"sourceHint\":{\"file\":\"index.html\",\"line\":13,\"column\":7}}],\"stagedAt\":\"\"},{\"id\":\"e2\",\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"main>p\",\"tag\":\"p\",\"originalText\":\"Minimal static page for oracle live-mode goldens.\",\"newText\":\"A tighter hook.\"},{\"ref\":\"aside>p\",\"tag\":\"p\",\"originalText\":\"Nested content.\",\"newText\":\"Nested copy.\"}],\"stagedAt\":\"\"}],\"totalCount\":1}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e3\",\n \"pageUrl\": \"/docs/guide\",\n \"element\": {\n \"tagName\": \"h1\",\n \"classes\": [\n \"hero-title\"\n ]\n },\n \"ops\": [\n {\n \"ref\": \"article>p\",\n \"tag\": \"p\",\n \"originalText\": \"A second page covered by the config glob.\",\n \"newText\": \"Second page lead.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-discard-twice.json b/tests/oracle/golden/live-discard-twice.json new file mode 100644 index 000000000..bf301fa4c --- /dev/null +++ b/tests/oracle/golden/live-discard-twice.json @@ -0,0 +1,24 @@ +{ + "steps": [ + { + "stdout": "{\"discarded\":4,\"entries\":[{\"id\":\"e1\",\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"main>h1\",\"tag\":\"h1\",\"classes\":[\"hero-title\"],\"originalText\":\"Oracle Fixture\",\"newText\":\"Oracle Fixture, renamed\",\"sourceHint\":{\"file\":\"index.html\",\"line\":13,\"column\":7}}],\"stagedAt\":\"\"},{\"id\":\"e2\",\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"main>p\",\"tag\":\"p\",\"originalText\":\"Minimal static page for oracle live-mode goldens.\",\"newText\":\"A tighter hook.\"},{\"ref\":\"aside>p\",\"tag\":\"p\",\"originalText\":\"Nested content.\",\"newText\":\"Nested copy.\"}],\"stagedAt\":\"\"},{\"id\":\"e3\",\"pageUrl\":\"/docs/guide\",\"element\":{\"tagName\":\"h1\",\"classes\":[\"hero-title\"]},\"ops\":[{\"ref\":\"article>p\",\"tag\":\"p\",\"originalText\":\"A second page covered by the config glob.\",\"newText\":\"Second page lead.\"}],\"stagedAt\":\"\"}],\"totalCount\":0}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"discarded\":0,\"entries\":[],\"totalCount\":0}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": []\n}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-help.json b/tests/oracle/golden/live-help.json new file mode 100644 index 000000000..98f45d1b8 --- /dev/null +++ b/tests/oracle/golden/live-help.json @@ -0,0 +1,7 @@ +{ + "stdout": "Usage: node live.mjs\n\nPrepare everything for live variant mode in a single command:\n - Checks .impeccable/live/config.json (required, created once per project)\n - Starts (or reuses) the live server in the background\n - Injects the browser script tag\n - Reads PRODUCT.md / DESIGN.md for project context\n - Prepares the harness-native foreground/background poll loop\n - In monorepos, choose a child app first; --target is the fallback/manual path\n\nOn success, prints a JSON blob with:\n { ok, serverPort, serverToken, pageFiles, projectRoot, repoRoot, targetPath, productPath, designPath }\n\nOn target_selection_required, prints:\n { ok: false, error: \"target_selection_required\", targetCandidates }\n\nOn config_missing, prints:\n { ok: false, error: \"config_missing\", configPath, hint }\n\nThe agent should then:\n 1. If target_selection_required, ask which app to use and rerun from that child cwd\n 2. If config_missing, create the config and re-run this script\n 3. Optionally open the project's dev/preview URL in the browser (see reference/live.md—not serverPort)\n 4. Enter the poll loop: node live-poll.mjs\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-anchor-missing-all.json b/tests/oracle/golden/live-inject-anchor-missing-all.json new file mode 100644 index 000000000..4fbb17b41 --- /dev/null +++ b/tests/oracle/golden/live-inject-anchor-missing-all.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"ok\":false,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"}]}\n", + "stderr": "", + "exit": 1, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\"files\":[\"index.html\"],\"insertBefore\":\"\",\"commentSyntax\":\"html\"}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-inject-astro-inline.json b/tests/oracle/golden/live-inject-astro-inline.json new file mode 100644 index 000000000..c2f0b6eec --- /dev/null +++ b/tests/oracle/golden/live-inject-astro-inline.json @@ -0,0 +1,22 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"src/layouts/Layout.astro\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"results\":[{\"file\":\"src/layouts/Layout.astro\",\"removed\":true,\"cspReverted\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"src/layouts/Layout.astro\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/layouts/Layout.astro": "---\nexport interface Props { title: string }\nconst { title } = Astro.props;\n---\n\n\n \n \n {title}\n \n \n \n \n\n", + "src/pages/index.astro": "---\nimport Layout from '../layouts/Layout.astro';\n---\n\n
\n

Astro Fixture

\n

Minimal Astro tree for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-inject-check-env-config.json b/tests/oracle/golden/live-inject-check-env-config.json new file mode 100644 index 000000000..f1abe39d7 --- /dev/null +++ b/tests/oracle/golden/live-inject-check-env-config.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\"ok\":true,\"config\":{\"files\":[\"public/docs/guide.html\"],\"insertAfter\":\"\",\"commentSyntax\":\"html\"},\"path\":\"/alt.json\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-check-invalid-anchor.json b/tests/oracle/golden/live-inject-check-invalid-anchor.json new file mode 100644 index 000000000..28c9c3c54 --- /dev/null +++ b/tests/oracle/golden/live-inject-check-invalid-anchor.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_invalid\",\"message\":\"config.insertBefore or config.insertAfter (string) required\",\"path\":\"/.impeccable/live/config.json\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-check-invalid-files.json b/tests/oracle/golden/live-inject-check-invalid-files.json new file mode 100644 index 000000000..c844bb9e6 --- /dev/null +++ b/tests/oracle/golden/live-inject-check-invalid-files.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_invalid\",\"message\":\"config.files (non-empty string array) required\",\"path\":\"/.impeccable/live/config.json\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-check-invalid-json.json b/tests/oracle/golden/live-inject-check-invalid-json.json new file mode 100644 index 000000000..854dddf7e --- /dev/null +++ b/tests/oracle/golden/live-inject-check-invalid-json.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_invalid\",\"message\":\"Expected ',' or ']' after array element in JSON at position 2 (line 1 column 3)\",\"path\":\"/.impeccable/live/config.json\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-check-missing.json b/tests/oracle/golden/live-inject-check-missing.json new file mode 100644 index 000000000..9b3d0edd0 --- /dev/null +++ b/tests/oracle/golden/live-inject-check-missing.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/.impeccable/live/config.json\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-check-ok.json b/tests/oracle/golden/live-inject-check-ok.json new file mode 100644 index 000000000..608f86b32 --- /dev/null +++ b/tests/oracle/golden/live-inject-check-ok.json @@ -0,0 +1,7 @@ +{ + "stdout": "{\"ok\":true,\"config\":{\"files\":[\"index.html\",\"public/**/*.html\"],\"insertBefore\":\"\",\"commentSyntax\":\"html\"},\"path\":\"/.impeccable/live/config.json\"}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-csp-meta-no-connect-src.json b/tests/oracle/golden/live-inject-csp-meta-no-connect-src.json new file mode 100644 index 000000000..f479d35e7 --- /dev/null +++ b/tests/oracle/golden/live-inject-csp-meta-no-connect-src.json @@ -0,0 +1,12 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":true},{\"file\":\"public/no-body.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"},{\"file\":\"public/docs/guide.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"static-html\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n },\n {\n \"kind\": \"patched\",\n \"path\": \"public/docs/guide.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + "index.html": "\n\n\n\n\n\n

Hi

\n\n\n\n\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-exclude-glob.json b/tests/oracle/golden/live-inject-exclude-glob.json new file mode 100644 index 000000000..f8459bda5 --- /dev/null +++ b/tests/oracle/golden/live-inject-exclude-glob.json @@ -0,0 +1,16 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false},{\"file\":\"src/cards.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"},{\"file\":\"public/docs/guide.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\"files\":[\"**/*.html\"],\"exclude\":[\"dist/**\",\"public/no-body.html\"],\"insertBefore\":\"\",\"commentSyntax\":\"html\"}", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"static-html\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n },\n {\n \"kind\": \"patched\",\n \"path\": \"public/docs/guide.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + "dist/generated.html": "\n\n\n \n

Built output

\n \n\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n\n\n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n\n\n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-inject-file-not-found.json b/tests/oracle/golden/live-inject-file-not-found.json new file mode 100644 index 000000000..aadbacdc2 --- /dev/null +++ b/tests/oracle/golden/live-inject-file-not-found.json @@ -0,0 +1,12 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"missing.html\",\"error\":\"file_not_found\"},{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\"files\":[\"missing.html\",\"index.html\"],\"insertBefore\":\"\",\"commentSyntax\":\"html\"}", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"static-html\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n\n\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-from-repo-root-via-roots.json b/tests/oracle/golden/live-inject-from-repo-root-via-roots.json new file mode 100644 index 000000000..7d0d8aac1 --- /dev/null +++ b/tests/oracle/golden/live-inject-from-repo-root-via-roots.json @@ -0,0 +1,30 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":true,\"config\":{\"files\":[\"index.html\"],\"insertBefore\":\"\",\"commentSyntax\":\"html\"},\"path\":\"/website/.impeccable/live/config.json\"}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"results\":[{\"file\":\"index.html\",\"removed\":true,\"cspReverted\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitfake/info/exclude": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/app-root.json": "{\"version\":2,\"appRoots\":[{\"appRoot\":\"/website\",\"bootedAt\":\"\"}]}", + "website/.gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + "website/.impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "website/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/website\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/website/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}", + "website/index.html": "\n\n \n \n Nested Website Fixture\n \n \n
\n \n \n\n" + } +} diff --git a/tests/oracle/golden/live-inject-heals-orphan-journal.json b/tests/oracle/golden/live-inject-heals-orphan-journal.json new file mode 100644 index 000000000..4f734bd64 --- /dev/null +++ b/tests/oracle/golden/live-inject-heals-orphan-journal.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false},{\"file\":\"public/no-body.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"},{\"file\":\"public/docs/guide.html\",\"inserted\":true,\"cspPatched\":false}],\"healed\":[{\"path\":\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"action\":\"removed\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"static-html\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n },\n {\n \"kind\": \"patched\",\n \"path\": \"public/docs/guide.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n\n\n\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n", + "src/keep.svelte": "
no marker
\n" + } +} diff --git a/tests/oracle/golden/live-inject-help.json b/tests/oracle/golden/live-inject-help.json new file mode 100644 index 000000000..1fb89b539 --- /dev/null +++ b/tests/oracle/golden/live-inject-help.json @@ -0,0 +1,7 @@ +{ + "stdout": "Usage: node live-inject.mjs [options]\n\nInsert or remove the live mode script tag in the project's HTML entry point.\nReads configuration from .impeccable/live/config.json.\n\nModes:\n --port PORT Insert script tag pointing at http://localhost:PORT/live.js\n --remove Remove the script tag (if present)\n --check Print whether .impeccable/live/config.json exists and its content\n\nOutput (JSON):\n { ok, file, inserted|removed, config? }\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-html-repeat-and-remove.json b/tests/oracle/golden/live-inject-html-repeat-and-remove.json new file mode 100644 index 000000000..49427e099 --- /dev/null +++ b/tests/oracle/golden/live-inject-html-repeat-and-remove.json @@ -0,0 +1,35 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false},{\"file\":\"public/no-body.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"},{\"file\":\"public/docs/guide.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"port\":8413,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":false,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false},{\"file\":\"public/no-body.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"},{\"file\":\"public/docs/guide.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"results\":[{\"file\":\"index.html\",\"removed\":true,\"cspReverted\":false},{\"file\":\"public/no-body.html\",\"removed\":false,\"note\":\"no tag present\"},{\"file\":\"public/docs/guide.html\",\"removed\":true,\"cspReverted\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"results\":[{\"file\":\"index.html\",\"removed\":false,\"note\":\"no tag present\"},{\"file\":\"public/no-body.html\",\"removed\":false,\"note\":\"no tag present\"},{\"file\":\"public/docs/guide.html\",\"removed\":false,\"note\":\"no tag present\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-html-tag-no-token.json b/tests/oracle/golden/live-inject-html-tag-no-token.json new file mode 100644 index 000000000..720ca9c51 --- /dev/null +++ b/tests/oracle/golden/live-inject-html-tag-no-token.json @@ -0,0 +1,12 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false},{\"file\":\"public/no-body.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"},{\"file\":\"public/docs/guide.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"static-html\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n },\n {\n \"kind\": \"patched\",\n \"path\": \"public/docs/guide.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n\n\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-html-tag.json b/tests/oracle/golden/live-inject-html-tag.json new file mode 100644 index 000000000..19e2dbccd --- /dev/null +++ b/tests/oracle/golden/live-inject-html-tag.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false},{\"file\":\"public/no-body.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"},{\"file\":\"public/docs/guide.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"static-html\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n },\n {\n \"kind\": \"patched\",\n \"path\": \"public/docs/guide.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n\n\n\n", + "public/docs/guide.html": "\n\n \n \n Guide\n \n \n
\n

Guide

\n

A second page covered by the config glob.

\n
\n \n\n\n\n\n", + "public/no-body.html": "\n\n No body tag\n

This file has no closing body tag.

\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-insert-after.json b/tests/oracle/golden/live-inject-insert-after.json new file mode 100644 index 000000000..354c0ffb5 --- /dev/null +++ b/tests/oracle/golden/live-inject-insert-after.json @@ -0,0 +1,12 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\"files\":[\"index.html\"],\"exclude\":[\"public/**\"],\"insertAfter\":\"\",\"commentSyntax\":\"html\"}", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"static-html\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n\n\n\n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-inject-missing-port.json b/tests/oracle/golden/live-inject-missing-port.json new file mode 100644 index 000000000..69f23e77a --- /dev/null +++ b/tests/oracle/golden/live-inject-missing-port.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "{\"ok\":false,\"error\":\"missing_port\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-inject-monorepo-repo-root-ignore.json b/tests/oracle/golden/live-inject-monorepo-repo-root-ignore.json new file mode 100644 index 000000000..098a97356 --- /dev/null +++ b/tests/oracle/golden/live-inject-monorepo-repo-root-ignore.json @@ -0,0 +1,14 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitfake/info/exclude": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + "website/.gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + "website/.impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "website/.impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"/website\",\n \"framework\": \"vite-generic\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + "website/.impeccable/live/roots.json": "{\n \"version\": 1,\n \"appRoot\": \"/website\",\n \"repoRoot\": \"\",\n \"contextRoot\": \"\",\n \"sessionRoot\": \"/website/.impeccable/live\",\n \"productPath\": \"/PRODUCT.md\",\n \"designPath\": \"/DESIGN.md\",\n \"resolvedFrom\": \"cwd\"\n}", + "website/index.html": "\n\n \n \n Nested Website Fixture\n \n \n
\n \n \n\n\n\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-next-jsx.json b/tests/oracle/golden/live-inject-next-jsx.json new file mode 100644 index 000000000..3be7933dc --- /dev/null +++ b/tests/oracle/golden/live-inject-next-jsx.json @@ -0,0 +1,22 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"app/layout.tsx\",\"inserted\":true,\"cspPatched\":true}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"results\":[{\"file\":\"app/layout.tsx\",\"removed\":true,\"cspReverted\":true}]}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"app/layout.tsx\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"jsx\"\n}\n", + "app/layout.tsx": "export const metadata = { title: 'Next Fixture' };\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n \n \n \n \n \n {children}\n \n \n );\n}\n", + "app/page.tsx": "export default function Page() {\n return (\n
\n

Next Fixture

\n

Minimal Next app-router page.

\n
\n );\n}\n" + } +} diff --git a/tests/oracle/golden/live-inject-no-config.json b/tests/oracle/golden/live-inject-no-config.json new file mode 100644 index 000000000..d89b202f5 --- /dev/null +++ b/tests/oracle/golden/live-inject-no-config.json @@ -0,0 +1,7 @@ +{ + "stdout": "", + "stderr": "{\"ok\":false,\"error\":\"config_missing\",\"path\":\"/.impeccable/live/config.json\"}\n", + "exit": 1, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-nuxt-adapter.json b/tests/oracle/golden/live-inject-nuxt-adapter.json new file mode 100644 index 000000000..fff159fa4 --- /dev/null +++ b/tests/oracle/golden/live-inject-nuxt-adapter.json @@ -0,0 +1,26 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":true,\"port\":8412,\"adapter\":\"nuxt\",\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"plugins/impeccable-live.client.ts\",\"inserted\":true,\"changed\":true,\"devOnly\":true}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"adapter\":\"nuxt\",\"results\":[{\"file\":\"plugins/impeccable-live.client.ts\",\"removed\":true}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"adapter\":\"nuxt\",\"results\":[{\"file\":\"plugins/impeccable-live.client.ts\",\"removed\":false,\"note\":\"no adapter present\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"app.vue\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-inject-nuxt-plugin-conflict.json b/tests/oracle/golden/live-inject-nuxt-plugin-conflict.json new file mode 100644 index 000000000..44670c8e4 --- /dev/null +++ b/tests/oracle/golden/live-inject-nuxt-plugin-conflict.json @@ -0,0 +1,21 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":false,\"port\":8412,\"adapter\":\"nuxt\",\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"plugins/impeccable-live.client.ts\",\"error\":\"nuxt_plugin_conflict\",\"hint\":\"plugins/impeccable-live.client.ts already exists and is not managed by Impeccable Live\"}]}\n", + "stderr": "", + "exit": 1, + "signal": null + }, + { + "stdout": "{\"ok\":false,\"adapter\":\"nuxt\",\"results\":[{\"file\":\"plugins/impeccable-live.client.ts\",\"removed\":false,\"error\":\"nuxt_plugin_conflict\",\"hint\":\"plugins/impeccable-live.client.ts is not managed by Impeccable Live\"}]}\n", + "stderr": "", + "exit": 1, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"app.vue\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "plugins/impeccable-live.client.ts": "export default {};\n" + } +} diff --git a/tests/oracle/golden/live-inject-nuxt-srcdir.json b/tests/oracle/golden/live-inject-nuxt-srcdir.json new file mode 100644 index 000000000..4e5d3304f --- /dev/null +++ b/tests/oracle/golden/live-inject-nuxt-srcdir.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"adapter\":\"nuxt\",\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"app/plugins/impeccable-live.client.ts\",\"inserted\":true,\"changed\":true,\"devOnly\":true}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\"files\":[\"app/app.vue\"],\"insertBefore\":\"\",\"commentSyntax\":\"html\"}", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"nuxt\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"created\",\n \"path\": \"app/plugins/impeccable-live.client.ts\",\n \"marker\": \"impeccable-live-nuxt-plugin\",\n \"pruneTo\": \"app\"\n }\n ]\n}\n", + "app/app.vue": "\n", + "app/plugins/impeccable-live.client.ts": "/* impeccable-live-nuxt-plugin */\nconst liveSrc = 'http://localhost:8412/live.js?token=t';\nconst liveSelector = 'script[data-impeccable-live-nuxt]';\n\nexport default defineNuxtPlugin(() => {\n if (!import.meta.dev || typeof document === 'undefined') return;\n\n const expectedSrc = new URL(liveSrc, window.location.href).href;\n let script = document.querySelector(liveSelector);\n if (script?.src === expectedSrc) return;\n script?.remove();\n\n script = document.createElement('script');\n script.src = liveSrc;\n script.async = true;\n script.dataset.impeccableLiveNuxt = '';\n document.head.appendChild(script);\n\n import.meta.hot?.dispose(() => {\n if (script?.isConnected) script.remove();\n });\n});\n/* /impeccable-live-nuxt-plugin */\n" + } +} diff --git a/tests/oracle/golden/live-inject-port-nan.json b/tests/oracle/golden/live-inject-port-nan.json new file mode 100644 index 000000000..69f23e77a --- /dev/null +++ b/tests/oracle/golden/live-inject-port-nan.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "{\"ok\":false,\"error\":\"missing_port\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-inject-remove-clean.json b/tests/oracle/golden/live-inject-remove-clean.json new file mode 100644 index 000000000..8aeb970ba --- /dev/null +++ b/tests/oracle/golden/live-inject-remove-clean.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"ok\":true,\"results\":[{\"file\":\"index.html\",\"removed\":false,\"note\":\"no tag present\"},{\"file\":\"public/no-body.html\",\"removed\":false,\"note\":\"no tag present\"},{\"file\":\"public/docs/guide.html\",\"removed\":false,\"note\":\"no tag present\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-inject-sveltekit-adapter.json b/tests/oracle/golden/live-inject-sveltekit-adapter.json new file mode 100644 index 000000000..5bc316cad --- /dev/null +++ b/tests/oracle/golden/live-inject-sveltekit-adapter.json @@ -0,0 +1,35 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":true,\"port\":8412,\"adapter\":\"sveltekit\",\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"src/routes/+layout.svelte\",\"adapter\":\"sveltekit\",\"inserted\":true,\"appHtmlUntouched\":true,\"rootComponent\":\"src/lib/impeccable/ImpeccableLiveRoot.svelte\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"port\":8412,\"adapter\":\"sveltekit\",\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":false,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"src/routes/+layout.svelte\",\"adapter\":\"sveltekit\",\"inserted\":false,\"appHtmlUntouched\":true,\"rootComponent\":\"src/lib/impeccable/ImpeccableLiveRoot.svelte\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"adapter\":\"sveltekit\",\"results\":[{\"file\":\"src/routes/+layout.svelte\",\"adapter\":\"sveltekit\",\"removed\":true,\"appHtmlUntouched\":true,\"rootComponent\":\"src/lib/impeccable/ImpeccableLiveRoot.svelte\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"adapter\":\"sveltekit\",\"results\":[{\"file\":\"src/routes/+layout.svelte\",\"adapter\":\"sveltekit\",\"removed\":false,\"appHtmlUntouched\":true,\"rootComponent\":\"src/lib/impeccable/ImpeccableLiveRoot.svelte\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"src/app.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/app.html": "\n\n \n \n SvelteKit Fixture\n %sveltekit.head%\n \n \n
%sveltekit.body%
\n \n\n", + "src/routes/+layout.svelte": "\n\n{@render children?.()}\n", + "src/routes/+page.svelte": "\n\n
\n

{title}

\n

Minimal SvelteKit route for oracle live-mode goldens.

\n
    \n {#each expenses as expense (expense.id)}\n
  • {expense.label}: {expense.amount}
  • \n {/each}\n
\n
\n
One
\n
Two
\n
\n
\n\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-sveltekit-existing-layout.json b/tests/oracle/golden/live-inject-sveltekit-existing-layout.json new file mode 100644 index 000000000..862dda7d2 --- /dev/null +++ b/tests/oracle/golden/live-inject-sveltekit-existing-layout.json @@ -0,0 +1,23 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":true,\"port\":8412,\"adapter\":\"sveltekit\",\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"src/routes/+layout.svelte\",\"adapter\":\"sveltekit\",\"inserted\":true,\"appHtmlUntouched\":true,\"rootComponent\":\"src/lib/impeccable/ImpeccableLiveRoot.svelte\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"adapter\":\"sveltekit\",\"results\":[{\"file\":\"src/routes/+layout.svelte\",\"adapter\":\"sveltekit\",\"removed\":true,\"appHtmlUntouched\":true,\"rootComponent\":\"src/lib/impeccable/ImpeccableLiveRoot.svelte\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"src/app.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/app.html": "\n\n \n \n SvelteKit Fixture\n %sveltekit.head%\n \n \n
%sveltekit.body%
\n \n\n", + "src/routes/+layout.svelte": "\n\n\n{@render children()}\n", + "src/routes/+page.svelte": "\n\n
\n

{title}

\n

Minimal SvelteKit route for oracle live-mode goldens.

\n
    \n {#each expenses as expense (expense.id)}\n
  • {expense.label}: {expense.amount}
  • \n {/each}\n
\n
\n
One
\n
Two
\n
\n
\n\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-tanstack-adapter.json b/tests/oracle/golden/live-inject-tanstack-adapter.json new file mode 100644 index 000000000..5ac3367d2 --- /dev/null +++ b/tests/oracle/golden/live-inject-tanstack-adapter.json @@ -0,0 +1,28 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":true,\"port\":8412,\"adapter\":\"tanstack-start\",\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\",\"src/impeccable/ImpeccableLiveRoot.tsx\"]},\"results\":[{\"file\":\"src/routes/__root.tsx\",\"adapter\":\"tanstack-start\",\"inserted\":true,\"componentFile\":\"src/impeccable/ImpeccableLiveRoot.tsx\",\"devOnly\":true}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"port\":8412,\"adapter\":\"tanstack-start\",\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":false,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\",\"src/impeccable/ImpeccableLiveRoot.tsx\"]},\"results\":[{\"file\":\"src/routes/__root.tsx\",\"adapter\":\"tanstack-start\",\"inserted\":false,\"componentFile\":\"src/impeccable/ImpeccableLiveRoot.tsx\",\"devOnly\":true}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"adapter\":\"tanstack-start\",\"results\":[{\"file\":\"src/routes/__root.tsx\",\"adapter\":\"tanstack-start\",\"removed\":true,\"componentFile\":\"src/impeccable/ImpeccableLiveRoot.tsx\"}]}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\nsrc/impeccable/ImpeccableLiveRoot.tsx\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"src/routes/__root.tsx\"],\n \"insertBefore\": \" ({\n meta: [\n { charSet: 'utf-8' },\n { title: 'TanStack Start Fixture' },\n ],\n }),\n shellComponent: RootDocument,\n});\n\nfunction RootDocument({ children }: { children: React.ReactNode }) {\n return (\n \n \n \n \n \n {children}\n \n \n \n );\n}\n", + "src/routes/index.tsx": "import { createFileRoute } from '@tanstack/react-router';\n\nexport const Route = createFileRoute('/')({\n component: Home,\n});\n\nfunction Home() {\n return (\n
\n

Start Home Hero

\n

Server-rendered by TanStack Start.

\n
\n );\n}\n" + } +} diff --git a/tests/oracle/golden/live-inject-tanstack-component-conflict.json b/tests/oracle/golden/live-inject-tanstack-component-conflict.json new file mode 100644 index 000000000..cda762894 --- /dev/null +++ b/tests/oracle/golden/live-inject-tanstack-component-conflict.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"ok\":false,\"port\":8412,\"adapter\":\"tanstack-start\",\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\",\"src/impeccable/ImpeccableLiveRoot.tsx\"]},\"results\":[{\"file\":\"src/impeccable/ImpeccableLiveRoot.tsx\",\"error\":\"tanstack_component_conflict\",\"hint\":\"src/impeccable/ImpeccableLiveRoot.tsx already exists and is not managed by Impeccable Live\"}]}\n", + "stderr": "", + "exit": 1, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\nsrc/impeccable/ImpeccableLiveRoot.tsx\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"src/routes/__root.tsx\"],\n \"insertBefore\": \" ({\n meta: [\n { charSet: 'utf-8' },\n { title: 'TanStack Start Fixture' },\n ],\n }),\n shellComponent: RootDocument,\n});\n\nfunction RootDocument({ children }: { children: React.ReactNode }) {\n return (\n \n \n \n \n \n {children}\n \n \n \n );\n}\n", + "src/routes/index.tsx": "import { createFileRoute } from '@tanstack/react-router';\n\nexport const Route = createFileRoute('/')({\n component: Home,\n});\n\nfunction Home() {\n return (\n
\n

Start Home Hero

\n

Server-rendered by TanStack Start.

\n
\n );\n}\n" + } +} diff --git a/tests/oracle/golden/live-inject-target-missing-value.json b/tests/oracle/golden/live-inject-target-missing-value.json new file mode 100644 index 000000000..064e102f3 --- /dev/null +++ b/tests/oracle/golden/live-inject-target-missing-value.json @@ -0,0 +1,7 @@ +{ + "stdout": "", + "stderr": "[impeccable live] --target requires a path value (use --target or --target=)\n", + "exit": 1, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-inject-token-from-server-json.json b/tests/oracle/golden/live-inject-token-from-server-json.json new file mode 100644 index 000000000..7b6ae7510 --- /dev/null +++ b/tests/oracle/golden/live-inject-token-from-server-json.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false},{\"file\":\"public/no-body.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"},{\"file\":\"public/docs/guide.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"static-html\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n },\n {\n \"kind\": \"patched\",\n \"path\": \"public/docs/guide.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + ".impeccable/live/server.json": "{\"pid\":,\"port\":8412,\"token\":\"from-server-json\"}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n\n\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-token-server-json-port-mismatch.json b/tests/oracle/golden/live-inject-token-server-json-port-mismatch.json new file mode 100644 index 000000000..a101a2478 --- /dev/null +++ b/tests/oracle/golden/live-inject-token-server-json-port-mismatch.json @@ -0,0 +1,13 @@ +{ + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":false},{\"file\":\"public/no-body.html\",\"error\":\"insertion_point_not_found\",\"anchor\":\"\"},{\"file\":\"public/docs/guide.html\",\"inserted\":true,\"cspPatched\":false}]}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/inject-journal.json": "{\n \"version\": 1,\n \"appRoot\": \"\",\n \"framework\": \"static-html\",\n \"port\": 8412,\n \"pid\": ,\n \"recordedAt\": \"\",\n \"artifacts\": [\n {\n \"kind\": \"patched\",\n \"path\": \"index.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n },\n {\n \"kind\": \"patched\",\n \"path\": \"public/docs/guide.html\",\n \"patch\": \"live-tag\",\n \"markers\": [\n \"impeccable-live-start\",\n \"data-impeccable-csp-original\"\n ]\n }\n ]\n}\n", + ".impeccable/live/server.json": "{\"pid\":,\"port\":8499,\"token\":\"other\"}", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n\n\n\n" + } +} diff --git a/tests/oracle/golden/live-inject-vite-csp-meta.json b/tests/oracle/golden/live-inject-vite-csp-meta.json new file mode 100644 index 000000000..d6cca3a80 --- /dev/null +++ b/tests/oracle/golden/live-inject-vite-csp-meta.json @@ -0,0 +1,21 @@ +{ + "steps": [ + { + "stdout": "{\"ok\":true,\"port\":8412,\"gitIgnore\":{\"file\":\".gitignore\",\"mode\":\"gitignore\",\"changed\":true,\"patterns\":[\".impeccable/hook.cache.json\",\".impeccable/hook.pending.json\",\".impeccable/config.local.json\",\".impeccable/live/server.json\",\".impeccable/live/roots.json\",\".impeccable/live/app-root.json\",\".impeccable/live/inject-journal.json\",\".impeccable/live/sessions/\",\".impeccable/live/previews/\",\".impeccable/live/annotations/\",\".impeccable/live/artifacts/\",\".impeccable/live/accept-receipts/\",\".impeccable/live/locks/\",\".impeccable/live/cache/\",\".impeccable/live/manual-edit-apply-transaction.json\",\".impeccable/live/manual-edit-events.jsonl\",\".impeccable/live/manual-edit-evidence/\",\".impeccable/live/pending-manual-edits.json\",\".impeccable/live/deferred-svelte-component-accepts.json\",\".impeccable-live.json\",\".impeccable-live/\",\"app/.impeccable-live/\",\"src/.impeccable-live/\",\"node_modules/.impeccable-live/\",\"src/lib/impeccable/ImpeccableLiveRoot.svelte\",\"src/lib/impeccable/__runtime.js\",\"src/lib/impeccable/[0-9a-f]*/\",\"plugins/impeccable-live.client.ts\",\"app/plugins/impeccable-live.client.ts\",\"src/plugins/impeccable-live.client.ts\"]},\"results\":[{\"file\":\"index.html\",\"inserted\":true,\"cspPatched\":true}]}\n", + "stderr": "", + "exit": 0, + "signal": null + }, + { + "stdout": "{\"ok\":true,\"results\":[{\"file\":\"index.html\",\"removed\":true,\"cspReverted\":true}]}\n", + "stderr": "", + "exit": 0, + "signal": null + } + ], + "files": { + ".gitignore": "# impeccable-live-ignore-start\n.impeccable/hook.cache.json\n.impeccable/hook.pending.json\n.impeccable/config.local.json\n.impeccable/live/server.json\n.impeccable/live/roots.json\n.impeccable/live/app-root.json\n.impeccable/live/inject-journal.json\n.impeccable/live/sessions/\n.impeccable/live/previews/\n.impeccable/live/annotations/\n.impeccable/live/artifacts/\n.impeccable/live/accept-receipts/\n.impeccable/live/locks/\n.impeccable/live/cache/\n.impeccable/live/manual-edit-apply-transaction.json\n.impeccable/live/manual-edit-events.jsonl\n.impeccable/live/manual-edit-evidence/\n.impeccable/live/pending-manual-edits.json\n.impeccable/live/deferred-svelte-component-accepts.json\n.impeccable-live.json\n.impeccable-live/\napp/.impeccable-live/\nsrc/.impeccable-live/\nnode_modules/.impeccable-live/\nsrc/lib/impeccable/ImpeccableLiveRoot.svelte\nsrc/lib/impeccable/__runtime.js\nsrc/lib/impeccable/[0-9a-f]*/\nplugins/impeccable-live.client.ts\napp/plugins/impeccable-live.client.ts\nsrc/plugins/impeccable-live.client.ts\n# impeccable-live-ignore-end\n", + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n \n \n \n CSP\n \n \n
\n \n \n\n" + } +} diff --git a/tests/oracle/golden/live-insert-astro-after.json b/tests/oracle/golden/live-insert-astro-after.json new file mode 100644 index 000000000..81376babd --- /dev/null +++ b/tests/oracle/golden/live-insert-astro-after.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"mode\":\"insert\",\"position\":\"after\",\"file\":\"src/pages/index.astro\",\"insertLine\":15,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"astro-global-prefixed\",\"styleTag\":\" close.\",\"Prefix every preview selector with the matching [data-impeccable-variant=\\\"N\\\"] selector.\",\"Keep selectors anchored to the generated variant wrapper; do not rely on component CSS scoping for preview rules.\"],\"forbidden\":[\"Do not use @scope for this styleMode.\",\"Do not wrap style content in a JSX/TSX template literal ({` ... `}); that syntax is for .tsx/.jsx only.\",\"Do not put { immediately after the style opening tag; Astro parses { as expression syntax.\"]}}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"src/layouts/Layout.astro\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/layouts/Layout.astro": "---\nexport interface Props { title: string }\nconst { title } = Astro.props;\n---\n\n\n \n \n {title}\n \n \n \n \n\n", + "src/pages/index.astro": "---\nimport Layout from '../layouts/Layout.astro';\n---\n\n
\n

Astro Fixture

\n

Minimal Astro tree for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n
\n \n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-insert-element-not-found.json b/tests/oracle/golden/live-insert-element-not-found.json new file mode 100644 index 000000000..f96f318bd --- /dev/null +++ b/tests/oracle/golden/live-insert-element-not-found.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "{\"error\":\"element_not_found\",\"fallback\":\"agent-driven\",\"hint\":\"See \\\"Handle fallback\\\" in live.md.\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-insert-element-not-in-source.json b/tests/oracle/golden/live-insert-element-not-in-source.json new file mode 100644 index 000000000..28dd4c65e --- /dev/null +++ b/tests/oracle/golden/live-insert-element-not-in-source.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "{\"error\":\"element_not_in_source\",\"fallback\":\"agent-driven\",\"hint\":\"See \\\"Handle fallback\\\" in live.md.\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-insert-file-is-generated.json b/tests/oracle/golden/live-insert-file-is-generated.json new file mode 100644 index 000000000..415abce9f --- /dev/null +++ b/tests/oracle/golden/live-insert-file-is-generated.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "{\"error\":\"file_is_generated\",\"fallback\":\"agent-driven\",\"file\":\"dist/generated.html\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-insert-help.json b/tests/oracle/golden/live-insert-help.json new file mode 100644 index 000000000..18e202766 --- /dev/null +++ b/tests/oracle/golden/live-insert-help.json @@ -0,0 +1,9 @@ +{ + "stdout": "Usage: node live-insert.mjs [options]\n\nFind an anchor element in source and splice an insert-variant wrapper.\n\nRequired:\n --id ID Session ID for the variant wrapper\n --count N Number of expected variants (1-8)\n --position POS before | after (relative to the anchor element)\n\nElement identification (at least one required):\n --element-id ID HTML id attribute of the anchor element\n --classes A,B,C Comma-separated CSS class names\n --tag TAG Tag name (div, section, etc.)\n --query TEXT Fallback: raw text to search for\n\nOptional:\n --file PATH Source file to search in (skips auto-detection)\n --text TEXT Anchor textContent for disambiguation (~80 chars)\n\nOutput (JSON):\n { mode: \"insert\", file, position, insertLine, commentSyntax, styleMode, styleTag, cssAuthoring }\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-insert-html-after.json b/tests/oracle/golden/live-insert-html-after.json new file mode 100644 index 000000000..2c34c3962 --- /dev/null +++ b/tests/oracle/golden/live-insert-html-after.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"mode\":\"insert\",\"position\":\"after\",\"file\":\"index.html\",\"insertLine\":22,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n
\n \n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-insert-html-before.json b/tests/oracle/golden/live-insert-html-before.json new file mode 100644 index 000000000..644e885c5 --- /dev/null +++ b/tests/oracle/golden/live-insert-html-before.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"mode\":\"insert\",\"position\":\"before\",\"file\":\"index.html\",\"insertLine\":18,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n \n
\n \n
\n \n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-insert-html-deferred.json b/tests/oracle/golden/live-insert-html-deferred.json new file mode 100644 index 000000000..1c8416350 --- /dev/null +++ b/tests/oracle/golden/live-insert-html-deferred.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"mode\":\"insert\",\"position\":\"after\",\"file\":\"index.html\",\"sourceWritten\":false,\"wrapperBlock\":\" \\n
\\n \\n
\\n \",\"replaceStartLine\":23,\"replaceEndLine\":22,\"insertLine\":26,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-insert-html-text-ambiguous.json b/tests/oracle/golden/live-insert-html-text-ambiguous.json new file mode 100644 index 000000000..2e02ccaf5 --- /dev/null +++ b/tests/oracle/golden/live-insert-html-text-ambiguous.json @@ -0,0 +1,10 @@ +{ + "stdout": "", + "stderr": "{\"error\":\"element_ambiguous\",\"fallback\":\"agent-driven\",\"file\":\"src/cards.html\",\"candidates\":[{\"startLine\":4,\"endLine\":4},{\"startLine\":8,\"endLine\":8},{\"startLine\":12,\"endLine\":12}]}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/cards.html": "
\n
\n

Alpha card

\n

First card body copy.

\n
\n
\n

Beta card

\n

Second card body copy.

\n
\n
\n

Gamma card

\n

Third card body copy.

\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-insert-html-text-picks.json b/tests/oracle/golden/live-insert-html-text-picks.json new file mode 100644 index 000000000..add789524 --- /dev/null +++ b/tests/oracle/golden/live-insert-html-text-picks.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"mode\":\"insert\",\"position\":\"before\",\"file\":\"src/cards.html\",\"insertLine\":13,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n", + "node_modules/.impeccable-live/ab12cd34/v2.svelte": "\n
Insert variant 2
\n\n\n", + "node_modules/.impeccable-live/ab12cd34/v3.svelte": "\n
Insert variant 3
\n\n\n", + "src/app.html": "\n\n \n \n SvelteKit Fixture\n %sveltekit.head%\n \n \n
%sveltekit.body%
\n \n\n", + "src/routes/+page.svelte": "\n\n
\n

{title}

\n

Minimal SvelteKit route for oracle live-mode goldens.

\n
    \n {#each expenses as expense (expense.id)}\n
  • {expense.label}: {expense.amount}
  • \n {/each}\n
\n
\n
One
\n
Two
\n
\n
\n\n\n" + } +} diff --git a/tests/oracle/golden/live-insert-svelte-env-disabled.json b/tests/oracle/golden/live-insert-svelte-env-disabled.json new file mode 100644 index 000000000..2eb630506 --- /dev/null +++ b/tests/oracle/golden/live-insert-svelte-env-disabled.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"mode\":\"insert\",\"position\":\"after\",\"file\":\"src/routes/+page.svelte\",\"insertLine\":24,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n" + } +} diff --git a/tests/oracle/golden/live-insert-vue-after.json b/tests/oracle/golden/live-insert-vue-after.json new file mode 100644 index 000000000..0822aebee --- /dev/null +++ b/tests/oracle/golden/live-insert-vue-after.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"mode\":\"insert\",\"position\":\"after\",\"file\":\"pages/index.vue\",\"insertLine\":8,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-server-stop-removes-tag.json b/tests/oracle/golden/live-server-stop-removes-tag.json new file mode 100644 index 000000000..69ed38b06 --- /dev/null +++ b/tests/oracle/golden/live-server-stop-removes-tag.json @@ -0,0 +1,10 @@ +{ + "stdout": "No running live server found.\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "index.html": "\n\n" + } +} diff --git a/tests/oracle/golden/live-server-target-missing-value.json b/tests/oracle/golden/live-server-target-missing-value.json new file mode 100644 index 000000000..064e102f3 --- /dev/null +++ b/tests/oracle/golden/live-server-target-missing-value.json @@ -0,0 +1,7 @@ +{ + "stdout": "", + "stderr": "[impeccable live] --target requires a path value (use --target or --target=)\n", + "exit": 1, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-status-empty.json b/tests/oracle/golden/live-status-empty.json new file mode 100644 index 000000000..1b760a41c --- /dev/null +++ b/tests/oracle/golden/live-status-empty.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\n \"liveServer\": null,\n \"activeSessions\": [],\n \"render\": [],\n \"recoveryHint\": \"Start live-server.mjs to requeue pending durable events, then run live-poll.mjs.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-status-from-subdir.json b/tests/oracle/golden/live-status-from-subdir.json new file mode 100644 index 000000000..58bdb9d57 --- /dev/null +++ b/tests/oracle/golden/live-status-from-subdir.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\n \"liveServer\": null,\n \"activeSessions\": [],\n \"render\": [],\n \"recoveryHint\": \"Start live-server.mjs to requeue pending durable events, then run live-poll.mjs.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"phase\":\"picked_up\",\"at\": }}\n" + } +} diff --git a/tests/oracle/golden/live-status-generating.json b/tests/oracle/golden/live-status-generating.json new file mode 100644 index 000000000..18fafa7c2 --- /dev/null +++ b/tests/oracle/golden/live-status-generating.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\n \"liveServer\": null,\n \"activeSessions\": [\n {\n \"id\": \"ab12cd34\",\n \"phase\": \"generate_requested\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": 1,\n \"pendingEvent\": {\n \"id\": \"ab12cd34\",\n \"type\": \"generate\",\n \"action\": \"bolder\",\n \"count\": 3,\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"id\": \"hero\",\n \"classes\": [\n \"hero-title\"\n ],\n \"textContent\": \"Oracle Fixture\",\n \"outerHTML\": \"

Oracle Fixture

\"\n },\n \"clientSentAt\": 1754042400000\n },\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n ],\n \"render\": [\n {\n \"id\": \"ab12cd34\",\n \"renderState\": null,\n \"mountedVariants\": [],\n \"mountFailures\": []\n }\n ],\n \"recoveryHint\": \"Start live-server.mjs to requeue pending durable events, then run live-poll.mjs.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"phase\":\"picked_up\",\"at\": }}\n" + } +} diff --git a/tests/oracle/golden/live-status-legacy-sessions-dir.json b/tests/oracle/golden/live-status-legacy-sessions-dir.json new file mode 100644 index 000000000..ffc16a0f1 --- /dev/null +++ b/tests/oracle/golden/live-status-legacy-sessions-dir.json @@ -0,0 +1,9 @@ +{ + "stdout": "{\n \"liveServer\": null,\n \"activeSessions\": [\n {\n \"id\": \"legacy01\",\n \"phase\": \"generate_requested\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": 1,\n \"pendingEvent\": {\n \"id\": \"legacy01\",\n \"type\": \"generate\",\n \"action\": \"bolder\",\n \"count\": 3,\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"id\": \"hero\",\n \"classes\": [\n \"hero-title\"\n ],\n \"textContent\": \"Oracle Fixture\",\n \"outerHTML\": \"

Oracle Fixture

\"\n },\n \"clientSentAt\": 1754042400000\n },\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": null,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n ],\n \"render\": [\n {\n \"id\": \"legacy01\",\n \"renderState\": null,\n \"mountedVariants\": [],\n \"mountFailures\": []\n }\n ],\n \"recoveryHint\": \"Start live-server.mjs to requeue pending durable events, then run live-poll.mjs.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-status-manual-apply.json b/tests/oracle/golden/live-status-manual-apply.json new file mode 100644 index 000000000..be7145434 --- /dev/null +++ b/tests/oracle/golden/live-status-manual-apply.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\n \"liveServer\": null,\n \"activeSessions\": [\n {\n \"id\": \"c0ffee01\",\n \"phase\": \"manual_edit_apply_requested\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 0,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": 1,\n \"pendingEvent\": {\n \"id\": \"c0ffee01\",\n \"type\": \"manual_edit_apply\",\n \"pageUrl\": \"/\",\n \"chunk\": {\n \"index\": 1,\n \"total\": 2,\n \"opCount\": 2,\n \"totalOpCount\": 3\n },\n \"batch\": {\n \"version\": 1,\n \"pageUrl\": \"/\",\n \"count\": 1,\n \"entries\": [\n {\n \"id\": \"e1\",\n \"pageUrl\": \"/\",\n \"ops\": [\n {\n \"ref\": \"h1\",\n \"tag\": \"h1\",\n \"originalText\": \"A\",\n \"newText\": \"B\",\n \"sourceHint\": {\n \"file\": \"index.html\",\n \"line\": 12\n }\n },\n {\n \"ref\": \"p\",\n \"tag\": \"p\",\n \"originalText\": \"C\",\n \"newText\": \"D\"\n }\n ]\n }\n ]\n },\n \"evidencePath\": \"/tmp/x.json\"\n },\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": null,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n ],\n \"render\": [\n {\n \"id\": \"c0ffee01\",\n \"renderState\": null,\n \"mountedVariants\": [],\n \"mountFailures\": []\n }\n ],\n \"recoveryHint\": \"Manual Apply pending (page /, chunk 1/2, 2 op(s), 1 entry, likely files: index.html). If you have not already leased it, run live-poll.mjs. Apply the source edits from the manual_edit_apply batch, then reply with live-poll.mjs --reply c0ffee01 done --data ''. Polling only leases this work item; it does not commit source edits. Do not run live-commit-manual-edits.mjs for this leased event. Do not poll again before replying.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/c0ffee01.jsonl": "{\"seq\":1,\"id\":\"c0ffee01\",\"type\":\"manual_edit_apply\",\"ts\":\"\",\"event\":{\"id\":\"c0ffee01\",\"type\":\"manual_edit_apply\",\"pageUrl\":\"/\",\"chunk\":{\"index\":1,\"total\":2,\"opCount\":2,\"totalOpCount\":3},\"batch\":{\"version\":1,\"pageUrl\":\"/\",\"count\":1,\"entries\":[{\"id\":\"e1\",\"pageUrl\":\"/\",\"ops\":[{\"ref\":\"h1\",\"tag\":\"h1\",\"originalText\":\"A\",\"newText\":\"B\",\"sourceHint\":{\"file\":\"index.html\",\"line\":12}},{\"ref\":\"p\",\"tag\":\"p\",\"originalText\":\"C\",\"newText\":\"D\"}]}]},\"evidencePath\":\"/tmp/x.json\"}}\n" + } +} diff --git a/tests/oracle/golden/live-status-many-sessions.json b/tests/oracle/golden/live-status-many-sessions.json new file mode 100644 index 000000000..d32cf8dee --- /dev/null +++ b/tests/oracle/golden/live-status-many-sessions.json @@ -0,0 +1,12 @@ +{ + "stdout": "{\n \"liveServer\": null,\n \"activeSessions\": [\n {\n \"id\": \"bb22cc33\",\n \"phase\": \"steer_requested\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 0,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": 1,\n \"pendingEvent\": {\n \"id\": \"bb22cc33\",\n \"type\": \"steer\",\n \"message\": \"make the hero calmer\",\n \"pageUrl\": \"/\"\n },\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": null,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n ],\n \"render\": [\n {\n \"id\": \"bb22cc33\",\n \"renderState\": null,\n \"mountedVariants\": [],\n \"mountFailures\": []\n }\n ],\n \"recoveryHint\": \"Start live-server.mjs to requeue pending durable events, then run live-poll.mjs.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"discard\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"discard\"}}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"discarded\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"discarded\"}}\n", + ".impeccable/live/sessions/bb22cc33.jsonl": "{\"seq\":1,\"id\":\"bb22cc33\",\"type\":\"steer\",\"ts\":\"\",\"event\":{\"id\":\"bb22cc33\",\"type\":\"steer\",\"message\":\"make the hero calmer\",\"pageUrl\":\"/\"}}\n", + ".impeccable/live/sessions/dd44ee55.jsonl": "{\"seq\":1,\"id\":\"dd44ee55\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"dd44ee55\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"dd44ee55\",\"type\":\"complete\",\"ts\":\"\",\"event\":{\"id\":\"dd44ee55\",\"type\":\"complete\",\"file\":\"index.html\"}}\n" + } +} diff --git a/tests/oracle/golden/live-status-mount-failed.json b/tests/oracle/golden/live-status-mount-failed.json new file mode 100644 index 000000000..712afa153 --- /dev/null +++ b/tests/oracle/golden/live-status-mount-failed.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\n \"liveServer\": null,\n \"activeSessions\": [\n {\n \"id\": \"ab12cd34\",\n \"phase\": \"variants_ready\",\n \"pageUrl\": \"/\",\n \"sourceFile\": \"index.html\",\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 3,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": null,\n \"pendingEvent\": {\n \"id\": \"ab12cd34\",\n \"type\": \"variant_mount_failed\",\n \"variant\": 2,\n \"url\": \"http://localhost:5173/node_modules/.impeccable-live/ab12cd34/r1/v2.svelte\",\n \"error\": \"SyntaxError: unexpected token\"\n },\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": null,\n \"generationCompletedAt\": 1785578460000,\n \"generationTimings\": {},\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [\n {\n \"variant\": 2,\n \"url\": \"http://localhost:5173/node_modules/.impeccable-live/ab12cd34/r1/v2.svelte\",\n \"error\": \"SyntaxError: unexpected token\",\n \"at\": \n }\n ],\n \"renderState\": \"failed\",\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n ],\n \"render\": [\n {\n \"id\": \"ab12cd34\",\n \"renderState\": \"failed\",\n \"mountedVariants\": [],\n \"mountFailures\": [\n {\n \"variant\": 2,\n \"url\": \"http://localhost:5173/node_modules/.impeccable-live/ab12cd34/r1/v2.svelte\",\n \"error\": \"SyntaxError: unexpected token\",\n \"at\": \n }\n ]\n }\n ],\n \"recoveryHint\": \"The browser failed to mount variant 2 from http://localhost:5173/node_modules/.impeccable-live/ab12cd34/r1/v2.svelte (SyntaxError: unexpected token); nothing is on screen. Fix the variant files, then reply with live-poll.mjs --reply ab12cd34 done --file for the queued variant_mount_failed event (or republish) so the browser retries.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_done\",\"file\":\"index.html\",\"arrivedVariants\":3}}\n{\"seq\":3,\"id\":\"ab12cd34\",\"type\":\"variant_mount_failed\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"variant_mount_failed\",\"variant\":2,\"url\":\"http://localhost:5173/node_modules/.impeccable-live/ab12cd34/r1/v2.svelte\",\"error\":\"SyntaxError: unexpected token\"}}\n" + } +} diff --git a/tests/oracle/golden/live-status-stale-server-json.json b/tests/oracle/golden/live-status-stale-server-json.json new file mode 100644 index 000000000..18fafa7c2 --- /dev/null +++ b/tests/oracle/golden/live-status-stale-server-json.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\n \"liveServer\": null,\n \"activeSessions\": [\n {\n \"id\": \"ab12cd34\",\n \"phase\": \"generate_requested\",\n \"pageUrl\": \"/\",\n \"sourceFile\": null,\n \"previewFile\": null,\n \"previewMode\": null,\n \"expectedVariants\": 3,\n \"arrivedVariants\": 0,\n \"visibleVariant\": null,\n \"paramValues\": {},\n \"pendingEventSeq\": 1,\n \"pendingEvent\": {\n \"id\": \"ab12cd34\",\n \"type\": \"generate\",\n \"action\": \"bolder\",\n \"count\": 3,\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"h1\",\n \"id\": \"hero\",\n \"classes\": [\n \"hero-title\"\n ],\n \"textContent\": \"Oracle Fixture\",\n \"outerHTML\": \"

Oracle Fixture

\"\n },\n \"clientSentAt\": 1754042400000\n },\n \"deliveryLease\": null,\n \"checkpointRevision\": 0,\n \"browserCheckpointRevision\": 0,\n \"publicationCheckpointRevision\": 0,\n \"activeOwner\": null,\n \"sourceMarkers\": {},\n \"fallbackMode\": null,\n \"generationPhase\": \"picked_up\",\n \"generationCompletedAt\": null,\n \"generationTimings\": {\n \"picked_up\": {\n \"at\": ,\n \"durationMs\": null\n }\n },\n \"variantPlan\": null,\n \"generationCanceled\": false,\n \"generationCanceledAt\": null,\n \"cancelReason\": null,\n \"annotationArtifacts\": [],\n \"mountedVariants\": [],\n \"mountFailures\": [],\n \"renderState\": null,\n \"diagnostics\": [],\n \"updatedAt\": \"\"\n }\n ],\n \"render\": [\n {\n \"id\": \"ab12cd34\",\n \"renderState\": null,\n \"mountedVariants\": [],\n \"mountFailures\": []\n }\n ],\n \"recoveryHint\": \"Start live-server.mjs to requeue pending durable events, then run live-poll.mjs.\"\n}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/sessions/ab12cd34.jsonl": "{\"seq\":1,\"id\":\"ab12cd34\",\"type\":\"generate\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"generate\",\"action\":\"bolder\",\"count\":3,\"pageUrl\":\"/\",\"element\":{\"tagName\":\"h1\",\"id\":\"hero\",\"classes\":[\"hero-title\"],\"textContent\":\"Oracle Fixture\",\"outerHTML\":\"

Oracle Fixture

\"},\"clientSentAt\":1754042400000}}\n{\"seq\":2,\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"ts\":\"\",\"event\":{\"id\":\"ab12cd34\",\"type\":\"agent_phase\",\"phase\":\"picked_up\",\"at\": }}\n" + } +} diff --git a/tests/oracle/golden/live-status-target-missing-value.json b/tests/oracle/golden/live-status-target-missing-value.json new file mode 100644 index 000000000..c7b025ba1 --- /dev/null +++ b/tests/oracle/golden/live-status-target-missing-value.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "[impeccable live] --target requires a path value (use --target or --target=)\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-target-missing-value.json b/tests/oracle/golden/live-target-missing-value.json new file mode 100644 index 000000000..ffb4c9175 --- /dev/null +++ b/tests/oracle/golden/live-target-missing-value.json @@ -0,0 +1,7 @@ +{ + "stdout": "", + "stderr": "--target requires a path value.\n", + "exit": 1, + "signal": null, + "files": {} +} diff --git a/tests/oracle/golden/live-wrap-astro-deferred.json b/tests/oracle/golden/live-wrap-astro-deferred.json new file mode 100644 index 000000000..e2dc18229 --- /dev/null +++ b/tests/oracle/golden/live-wrap-astro-deferred.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"file\":\"src/pages/index.astro\",\"sourceWritten\":false,\"wrapperBlock\":\" \\n
\\n \\n
\\n
\\n
One
\\n
Two
\\n
\\n
\\n \\n
\\n \",\"replaceStartLine\":8,\"replaceEndLine\":11,\"startLine\":8,\"endLine\":19,\"insertLine\":17,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"astro-global-prefixed\",\"styleTag\":\" close.\",\"Prefix every preview selector with the matching [data-impeccable-variant=\\\"N\\\"] selector.\",\"Keep selectors anchored to the generated variant wrapper; do not rely on component CSS scoping for preview rules.\"],\"forbidden\":[\"Do not use @scope for this styleMode.\",\"Do not wrap style content in a JSX/TSX template literal ({` ... `}); that syntax is for .tsx/.jsx only.\",\"Do not put { immediately after the style opening tag; Astro parses { as expression syntax.\"]},\"originalLineCount\":4}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"src/layouts/Layout.astro\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/layouts/Layout.astro": "---\nexport interface Props { title: string }\nconst { title } = Astro.props;\n---\n\n\n \n \n {title}\n \n \n \n \n\n", + "src/pages/index.astro": "---\nimport Layout from '../layouts/Layout.astro';\n---\n\n
\n

Astro Fixture

\n

Minimal Astro tree for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-wrap-astro.json b/tests/oracle/golden/live-wrap-astro.json new file mode 100644 index 000000000..eeb5e20d3 --- /dev/null +++ b/tests/oracle/golden/live-wrap-astro.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"file\":\"src/pages/index.astro\",\"startLine\":6,\"endLine\":14,\"insertLine\":12,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"astro-global-prefixed\",\"styleTag\":\" close.\",\"Prefix every preview selector with the matching [data-impeccable-variant=\\\"N\\\"] selector.\",\"Keep selectors anchored to the generated variant wrapper; do not rely on component CSS scoping for preview rules.\"],\"forbidden\":[\"Do not use @scope for this styleMode.\",\"Do not wrap style content in a JSX/TSX template literal ({` ... `}); that syntax is for .tsx/.jsx only.\",\"Do not put { immediately after the style opening tag; Astro parses { as expression syntax.\"]},\"originalLineCount\":1}\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"src/layouts/Layout.astro\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + "src/layouts/Layout.astro": "---\nexport interface Props { title: string }\nconst { title } = Astro.props;\n---\n\n\n \n \n {title}\n \n \n \n \n\n", + "src/pages/index.astro": "---\nimport Layout from '../layouts/Layout.astro';\n---\n\n
\n \n
\n \n
\n

Astro Fixture

\n
\n \n
\n \n

Minimal Astro tree for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n
\n
\n" + } +} diff --git a/tests/oracle/golden/live-wrap-element-not-found.json b/tests/oracle/golden/live-wrap-element-not-found.json new file mode 100644 index 000000000..0c0ed9efb --- /dev/null +++ b/tests/oracle/golden/live-wrap-element-not-found.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "{\"error\":\"element_not_found\",\"fallback\":\"agent-driven\",\"hint\":\"Element not found in any project file. It may be runtime-injected (JS component, etc.). See \\\"Handle fallback\\\" in live.md.\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-wrap-element-not-in-source.json b/tests/oracle/golden/live-wrap-element-not-in-source.json new file mode 100644 index 000000000..211d01c55 --- /dev/null +++ b/tests/oracle/golden/live-wrap-element-not-in-source.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "{\"error\":\"element_not_in_source\",\"fallback\":\"agent-driven\",\"generatedMatch\":\"dist/generated.html\",\"hint\":\"Element found only in a generated file. See \\\"Handle fallback\\\" in live.md.\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-wrap-file-element-missing.json b/tests/oracle/golden/live-wrap-file-element-missing.json new file mode 100644 index 000000000..a561236ba --- /dev/null +++ b/tests/oracle/golden/live-wrap-file-element-missing.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "{\"error\":\"Found file but could not locate element in src/cards.html. Searched for: hero-title\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-wrap-file-is-generated.json b/tests/oracle/golden/live-wrap-file-is-generated.json new file mode 100644 index 000000000..3e34876b0 --- /dev/null +++ b/tests/oracle/golden/live-wrap-file-is-generated.json @@ -0,0 +1,9 @@ +{ + "stdout": "", + "stderr": "{\"error\":\"file_is_generated\",\"fallback\":\"agent-driven\",\"file\":\"dist/generated.html\",\"hint\":\"Explicit --file points at a generated file. Writing here gets wiped by the next build. See \\\"Handle fallback\\\" in live.md.\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-wrap-help.json b/tests/oracle/golden/live-wrap-help.json new file mode 100644 index 000000000..36e573d2f --- /dev/null +++ b/tests/oracle/golden/live-wrap-help.json @@ -0,0 +1,9 @@ +{ + "stdout": "Usage: impeccable wrap [options]\n\nFind an element in source and wrap it in a variant container.\n\nRequired:\n --id ID Session ID for the variant wrapper\n --count N Number of expected variants (1-8)\n\nElement identification (at least one required):\n --element-id ID HTML id attribute of the element\n --classes A,B,C Comma- or space-separated CSS class names\n --tag TAG Tag name (div, section, etc.)\n --query TEXT Fallback: raw text to search for\n\nOptional:\n --file PATH Source file to search in (skips auto-detection)\n --text TEXT Picked element's textContent. Used to disambiguate when\n classes/tag match multiple sibling elements (e.g. a list\n of s with the same className). Pass the first ~80\n chars of event.element.textContent.\n --page-url URL Current page URL. Required when pending manual edits may\n affect the picked source block. Pending edits are filtered\n to this page so an edit on /a doesn't bleed into /b.\n --help Show this help message\n\nOutput (JSON):\n { file, startLine, endLine, insertLine, commentSyntax }\n\nThe agent should insert variant HTML at insertLine.\n", + "stderr": "", + "exit": 0, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n" + } +} diff --git a/tests/oracle/golden/live-wrap-html-by-classes-tag.json b/tests/oracle/golden/live-wrap-html-by-classes-tag.json new file mode 100644 index 000000000..021d52362 --- /dev/null +++ b/tests/oracle/golden/live-wrap-html-by-classes-tag.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"file\":\"index.html\",\"startLine\":13,\"endLine\":21,\"insertLine\":19,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n \n
\n \n
\n

Oracle Fixture

\n
\n \n
\n \n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-html-by-id.json b/tests/oracle/golden/live-wrap-html-by-id.json new file mode 100644 index 000000000..021d52362 --- /dev/null +++ b/tests/oracle/golden/live-wrap-html-by-id.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"file\":\"index.html\",\"startLine\":13,\"endLine\":21,\"insertLine\":19,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n \n
\n \n
\n

Oracle Fixture

\n
\n \n
\n \n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-html-by-query.json b/tests/oracle/golden/live-wrap-html-by-query.json new file mode 100644 index 000000000..4158493fc --- /dev/null +++ b/tests/oracle/golden/live-wrap-html-by-query.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"file\":\"index.html\",\"startLine\":6,\"endLine\":17,\"insertLine\":15,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n
\n \n
\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-html-deferred.json b/tests/oracle/golden/live-wrap-html-deferred.json new file mode 100644 index 000000000..cc02ca4d5 --- /dev/null +++ b/tests/oracle/golden/live-wrap-html-deferred.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"file\":\"index.html\",\"sourceWritten\":false,\"wrapperBlock\":\" \\n
\\n \\n
\\n \\n
\\n \\n
\\n \",\"replaceStartLine\":19,\"replaceEndLine\":22,\"startLine\":19,\"endLine\":30,\"insertLine\":28,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-html-eq-form.json b/tests/oracle/golden/live-wrap-html-eq-form.json new file mode 100644 index 000000000..b90a01fb4 --- /dev/null +++ b/tests/oracle/golden/live-wrap-html-eq-form.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"file\":\"index.html\",\"startLine\":15,\"endLine\":26,\"insertLine\":24,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n \n
\n \n
\n
\n
One
\n
Two
\n
\n
\n \n
\n \n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-html-explicit-file.json b/tests/oracle/golden/live-wrap-html-explicit-file.json new file mode 100644 index 000000000..04bbd31f5 --- /dev/null +++ b/tests/oracle/golden/live-wrap-html-explicit-file.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"file\":\"public/docs/guide.html\",\"startLine\":9,\"endLine\":17,\"insertLine\":15,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n
\n \n
\n \n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-html-page-url-no-pending.json b/tests/oracle/golden/live-wrap-html-page-url-no-pending.json new file mode 100644 index 000000000..021d52362 --- /dev/null +++ b/tests/oracle/golden/live-wrap-html-page-url-no-pending.json @@ -0,0 +1,10 @@ +{ + "stdout": "{\"file\":\"index.html\",\"startLine\":13,\"endLine\":21,\"insertLine\":19,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n \n
\n \n
\n

Oracle Fixture

\n
\n \n
\n \n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-jsx-deferred.json b/tests/oracle/golden/live-wrap-jsx-deferred.json new file mode 100644 index 000000000..1d6e67df8 --- /dev/null +++ b/tests/oracle/golden/live-wrap-jsx-deferred.json @@ -0,0 +1,12 @@ +{ + "stdout": "{\"file\":\"src/App.jsx\",\"sourceWritten\":false,\"wrapperBlock\":\"
\\n {/* impeccable-variants-start ab12cd34 */}\\n {/* Original */}\\n
\\n

Vite Fixture

\\n
\\n {/* Variants: insert below this line */}\\n {/* impeccable-variants-end ab12cd34 */}\\n
\",\"replaceStartLine\":4,\"replaceEndLine\":4,\"startLine\":4,\"endLine\":12,\"insertLine\":10,\"commentSyntax\":{\"open\":\"{/*\",\"close\":\"*/}\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n \n
\n \n
\n

Edited hook copy.

\n
\n \n
\n \n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-pending-edits-no-page-url.json b/tests/oracle/golden/live-wrap-pending-edits-no-page-url.json new file mode 100644 index 000000000..85687e0fc --- /dev/null +++ b/tests/oracle/golden/live-wrap-pending-edits-no-page-url.json @@ -0,0 +1,11 @@ +{ + "stdout": "", + "stderr": "{\"error\":\"missing_page_url_with_pending_edits\",\"pendingEntries\":1,\"hint\":\"Pending manual edits may affect the selected source block. Pass --page-url=$event.pageUrl so the wrap block reflects the user's staged DOM.\"}\n", + "exit": 1, + "signal": null, + "files": { + ".impeccable/live/config.json": "{\n \"files\": [\"index.html\", \"public/**/*.html\"],\n \"insertBefore\": \"\",\n \"commentSyntax\": \"html\"\n}\n", + ".impeccable/live/pending-manual-edits.json": "{\n \"version\": 1,\n \"entries\": [\n {\n \"id\": \"e1\",\n \"pageUrl\": \"/\",\n \"element\": {\n \"tagName\": \"p\"\n },\n \"ops\": [\n {\n \"ref\": \"main>p.hero-hook\",\n \"tag\": \"p\",\n \"originalText\": \"Minimal static page for oracle live-mode goldens.\",\n \"newText\": \"Edited hook copy.\"\n }\n ],\n \"stagedAt\": \"\"\n }\n ]\n}\n", + "index.html": "\n\n \n \n Oracle Live HTML Fixture\n \n \n \n
\n

Oracle Fixture

\n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-pending-edits-other-page.json b/tests/oracle/golden/live-wrap-pending-edits-other-page.json new file mode 100644 index 000000000..d56f4456f --- /dev/null +++ b/tests/oracle/golden/live-wrap-pending-edits-other-page.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"file\":\"index.html\",\"startLine\":14,\"endLine\":22,\"insertLine\":20,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n

Oracle Fixture

\n \n
\n \n
\n

Minimal static page for oracle live-mode goldens.

\n
\n \n
\n \n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-pending-edits-unrelated.json b/tests/oracle/golden/live-wrap-pending-edits-unrelated.json new file mode 100644 index 000000000..f8c9ab4b5 --- /dev/null +++ b/tests/oracle/golden/live-wrap-pending-edits-unrelated.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"file\":\"index.html\",\"startLine\":13,\"endLine\":21,\"insertLine\":19,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n \n \n
\n \n
\n \n
\n

Oracle Fixture

\n
\n \n
\n \n

Minimal static page for oracle live-mode goldens.

\n
\n
One
\n
Two
\n
\n \n
\n \n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-svelte-component-each.json b/tests/oracle/golden/live-wrap-svelte-component-each.json new file mode 100644 index 000000000..c3d91ffd7 --- /dev/null +++ b/tests/oracle/golden/live-wrap-svelte-component-each.json @@ -0,0 +1,17 @@ +{ + "stdout": "{\"file\":\"node_modules/.impeccable-live/ab12cd34/manifest.json\",\"sourceFile\":\"src/routes/+page.svelte\",\"previewMode\":\"svelte-component\",\"componentDir\":\"node_modules/.impeccable-live/ab12cd34\",\"propContract\":[{\"prop\":\"expenses\",\"expr\":\"expenses\",\"kind\":\"collection\",\"placeholder\":\"{expenses}\",\"item\":{\"rootTag\":\"li\",\"rootClasses\":[\"expense-row\"],\"textSlots\":[{\"key\":\"label\",\"expr\":\"expense.label\"},{\"key\":\"amount\",\"expr\":\"expense.amount\"}],\"attrSlots\":[],\"staticTexts\":[\":\"],\"nestedUnsupported\":false,\"keyField\":\"id\"}}],\"componentStubMarkup\":\"
    \\n {#each expenses as expense (expense.id)}\\n
  • {expense.label}: {expense.amount}
  • \\n {/each}\\n
\",\"sourceStartLine\":12,\"sourceEndLine\":16,\"startLine\":1,\"endLine\":1,\"insertLine\":1,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"svelte-component\",\"styleTag\":null,\"cssSelectorPrefixExamples\":[],\"cssAuthoring\":{\"mode\":\"svelte-component\",\"styleTag\":null,\"strategy\":\"component-style-block\",\"rulePattern\":\".semantic-class { ... }\",\"selectorExamples\":[\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\"],\"requirements\":[\"Write each variant as a real Svelte component file (v1.svelte, v2.svelte, ...).\",\"Keep the prop names from propContract; bind dynamic text with {propName}, not literal snapshot text.\",\"Put variant CSS in the component \n", + "node_modules/.impeccable-live/ab12cd34/v2.svelte": "\n\n\n
    \n {#each expenses as expense (expense.id)}\n
  • {expense.label}: {expense.amount}
  • \n {/each}\n
\n\n\n", + "node_modules/.impeccable-live/ab12cd34/v3.svelte": "\n\n\n
    \n {#each expenses as expense (expense.id)}\n
  • {expense.label}: {expense.amount}
  • \n {/each}\n
\n\n\n", + "src/app.html": "\n\n \n \n SvelteKit Fixture\n %sveltekit.head%\n \n \n
%sveltekit.body%
\n \n\n", + "src/routes/+page.svelte": "\n\n
\n

{title}

\n

Minimal SvelteKit route for oracle live-mode goldens.

\n
    \n {#each expenses as expense (expense.id)}\n
  • {expense.label}: {expense.amount}
  • \n {/each}\n
\n
\n
One
\n
Two
\n
\n
\n\n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-svelte-component-refused-script.json b/tests/oracle/golden/live-wrap-svelte-component-refused-script.json new file mode 100644 index 000000000..eb030552b --- /dev/null +++ b/tests/oracle/golden/live-wrap-svelte-component-refused-script.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"file\":\"src/routes/+page.svelte\",\"previewFallback\":{\"from\":\"svelte-component\",\"reason\":\"inline script element requires source-preview mode\"},\"startLine\":1,\"endLine\":12,\"insertLine\":10,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n", + "node_modules/.impeccable-live/ab12cd34/v2.svelte": "\n\n\n

{title}

\n\n\n", + "node_modules/.impeccable-live/ab12cd34/v3.svelte": "\n\n\n

{title}

\n\n\n", + "src/app.html": "\n\n \n \n SvelteKit Fixture\n %sveltekit.head%\n \n \n
%sveltekit.body%
\n \n\n", + "src/routes/+page.svelte": "\n\n
\n

{title}

\n

Minimal SvelteKit route for oracle live-mode goldens.

\n
    \n {#each expenses as expense (expense.id)}\n
  • {expense.label}: {expense.amount}
  • \n {/each}\n
\n
\n
One
\n
Two
\n
\n
\n\n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-svelte-component.json b/tests/oracle/golden/live-wrap-svelte-component.json new file mode 100644 index 000000000..bf654751f --- /dev/null +++ b/tests/oracle/golden/live-wrap-svelte-component.json @@ -0,0 +1,17 @@ +{ + "stdout": "{\"file\":\"node_modules/.impeccable-live/ab12cd34/manifest.json\",\"sourceFile\":\"src/routes/+page.svelte\",\"previewMode\":\"svelte-component\",\"componentDir\":\"node_modules/.impeccable-live/ab12cd34\",\"propContract\":[{\"prop\":\"title\",\"expr\":\"title\",\"kind\":\"text\",\"placeholder\":\"{title}\"}],\"componentStubMarkup\":\"

{title}

\",\"sourceStartLine\":10,\"sourceEndLine\":10,\"startLine\":1,\"endLine\":1,\"insertLine\":1,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"svelte-component\",\"styleTag\":null,\"cssSelectorPrefixExamples\":[],\"cssAuthoring\":{\"mode\":\"svelte-component\",\"styleTag\":null,\"strategy\":\"component-style-block\",\"rulePattern\":\".semantic-class { ... }\",\"selectorExamples\":[\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\",\".expense-row { padding: 22px; }\"],\"requirements\":[\"Write each variant as a real Svelte component file (v1.svelte, v2.svelte, ...).\",\"Keep the prop names from propContract; bind dynamic text with {propName}, not literal snapshot text.\",\"Put variant CSS in the component \n", + "node_modules/.impeccable-live/ab12cd34/v2.svelte": "\n\n\n

{title}

\n\n\n", + "node_modules/.impeccable-live/ab12cd34/v3.svelte": "\n\n\n

{title}

\n\n\n", + "src/app.html": "\n\n \n \n SvelteKit Fixture\n %sveltekit.head%\n \n \n
%sveltekit.body%
\n \n\n", + "src/routes/+page.svelte": "\n\n
\n

{title}

\n

Minimal SvelteKit route for oracle live-mode goldens.

\n
    \n {#each expenses as expense (expense.id)}\n
  • {expense.label}: {expense.amount}
  • \n {/each}\n
\n
\n
One
\n
Two
\n
\n
\n\n\n" + } +} diff --git a/tests/oracle/golden/live-wrap-svelte-env-disabled.json b/tests/oracle/golden/live-wrap-svelte-env-disabled.json new file mode 100644 index 000000000..ca2c8e1d8 --- /dev/null +++ b/tests/oracle/golden/live-wrap-svelte-env-disabled.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"file\":\"src/routes/+page.svelte\",\"startLine\":10,\"endLine\":18,\"insertLine\":16,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n" + } +} diff --git a/tests/oracle/golden/live-wrap-svelte-no-compiler.json b/tests/oracle/golden/live-wrap-svelte-no-compiler.json new file mode 100644 index 000000000..d3fe2c3e9 --- /dev/null +++ b/tests/oracle/golden/live-wrap-svelte-no-compiler.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"file\":\"src/routes/+page.svelte\",\"previewFallback\":{\"from\":\"svelte-component\",\"reason\":\"svelte 5 compiler not resolvable from the app root\"},\"startLine\":10,\"endLine\":18,\"insertLine\":16,\"commentSyntax\":{\"open\":\"\"},\"styleMode\":\"scoped\",\"styleTag\":\"\n" + } +} diff --git a/tests/oracle/golden/live-wrap-tanstack-tsx.json b/tests/oracle/golden/live-wrap-tanstack-tsx.json new file mode 100644 index 000000000..531908cfb --- /dev/null +++ b/tests/oracle/golden/live-wrap-tanstack-tsx.json @@ -0,0 +1,11 @@ +{ + "stdout": "{\"file\":\"src/routes/index.tsx\",\"startLine\":10,\"endLine\":18,\"insertLine\":16,\"commentSyntax\":{\"open\":\"{/*\",\"close\":\"*/}\"},\"styleMode\":\"scoped\",\"styleTag\":\"'] + : [indent + ' ']; + const blocks = [1, 2, 3].map((n) => { + const hide = n === 1 ? '' : jsx ? " style={{display: 'none'}}" : ' style="display: none"'; + return [ + indent + ' ' + o + ' Variant ' + n + ' ' + c, + indent + '
", + indent + ' ' + inner, + indent + '
', + ].join('\n'); + }); + return [...style, ...blocks].join('\n'); +} + +/** Replace-mode wrapper (as live-wrap writes it) with the variants block spliced in. */ +export function wrappedBlock({ id, count = 3, tag, inner, original, indent, jsx = false }) { + const o = jsx ? '{/*' : ''; + const styleContents = jsx ? 'style={{ display: "contents" }}' : 'style="display: contents"'; + const variants = variantsBlock({ id, tag, inner, indent, jsx }); + if (jsx) { + return [ + indent + '
', + indent + ' ' + o + ' impeccable-variants-start ' + id + ' ' + c, + indent + ' ' + o + ' Original ' + c, + indent + '
', + indent + ' ' + original, + indent + '
', + indent + ' ' + o + ' Variants: insert below this line ' + c, + variants, + indent + ' ' + o + ' impeccable-variants-end ' + id + ' ' + c, + indent + '
', + ].join('\n'); + } + return [ + indent + o + ' impeccable-variants-start ' + id + ' ' + c, + indent + '
', + indent + ' ' + o + ' Original ' + c, + indent + '
', + indent + ' ' + original, + indent + '
', + indent + ' ' + o + ' Variants: insert below this line ' + c, + variants, + indent + '
', + indent + o + ' impeccable-variants-end ' + id + ' ' + c, + ].join('\n'); +} + +/** live-html index.html with the hero h1 wrapped and variants written. */ +export function stageWrappedHtml(ws, id = 'ab12cd34') { + const file = path.join(ws, 'index.html'); + const src = fs.readFileSync(file, 'utf8'); + const original = '

Oracle Fixture

'; + const block = wrappedBlock({ id, tag: 'h1', inner: '

Oracle Fixture

', original, indent: ' ' }); + fs.writeFileSync(file, src.replace(' ' + original, block)); +} + +/** live-vite src/App.jsx with the hero h1 wrapped and variants written (JSX syntax). */ +export function stageWrappedJsx(ws, id = 'ab12cd34') { + const file = path.join(ws, 'src', 'App.jsx'); + const src = fs.readFileSync(file, 'utf8'); + const original = '

Vite Fixture

'; + const block = wrappedBlock({ id, tag: 'h1', inner: original, original, indent: ' ', jsx: true }); + fs.writeFileSync(file, src.replace(' ' + original, block)); +} diff --git a/tests/oracle/workspaces/live-astro/.impeccable/live/config.json b/tests/oracle/workspaces/live-astro/.impeccable/live/config.json new file mode 100644 index 000000000..032753b4c --- /dev/null +++ b/tests/oracle/workspaces/live-astro/.impeccable/live/config.json @@ -0,0 +1,5 @@ +{ + "files": ["src/layouts/Layout.astro"], + "insertBefore": "", + "commentSyntax": "html" +} diff --git a/tests/oracle/workspaces/live-astro/DESIGN.md b/tests/oracle/workspaces/live-astro/DESIGN.md new file mode 100644 index 000000000..4bf3a31d7 --- /dev/null +++ b/tests/oracle/workspaces/live-astro/DESIGN.md @@ -0,0 +1,12 @@ +--- +name: Oracle Live Fixture +description: A one-page fixture set in plain type on paper-white surfaces. +colors: + ink: "#142720" + paper: "#ffffff" +typography: + body: + fontFamily: "system-ui, sans-serif" + fontWeight: 400 + lineHeight: 1.5 +--- diff --git a/tests/oracle/workspaces/live-astro/PRODUCT.md b/tests/oracle/workspaces/live-astro/PRODUCT.md new file mode 100644 index 000000000..3656940aa --- /dev/null +++ b/tests/oracle/workspaces/live-astro/PRODUCT.md @@ -0,0 +1,8 @@ + +# Product + +## What it is +A fixture app used by the oracle harness for live mode. + +## Platform +web diff --git a/tests/oracle/workspaces/live-astro/astro.config.mjs b/tests/oracle/workspaces/live-astro/astro.config.mjs new file mode 100644 index 000000000..86dbfb924 --- /dev/null +++ b/tests/oracle/workspaces/live-astro/astro.config.mjs @@ -0,0 +1,3 @@ +import { defineConfig } from 'astro/config'; + +export default defineConfig({}); diff --git a/tests/oracle/workspaces/live-astro/package.json b/tests/oracle/workspaces/live-astro/package.json new file mode 100644 index 000000000..33a33a0bb --- /dev/null +++ b/tests/oracle/workspaces/live-astro/package.json @@ -0,0 +1 @@ +{ "name": "oracle-live-astro", "private": true, "type": "module", "dependencies": { "astro": "^5.0.0" } } diff --git a/tests/oracle/workspaces/live-astro/src/layouts/Layout.astro b/tests/oracle/workspaces/live-astro/src/layouts/Layout.astro new file mode 100644 index 000000000..3253ff876 --- /dev/null +++ b/tests/oracle/workspaces/live-astro/src/layouts/Layout.astro @@ -0,0 +1,14 @@ +--- +export interface Props { title: string } +const { title } = Astro.props; +--- + + + + + {title} + + + + + diff --git a/tests/oracle/workspaces/live-astro/src/pages/index.astro b/tests/oracle/workspaces/live-astro/src/pages/index.astro new file mode 100644 index 000000000..f3a102400 --- /dev/null +++ b/tests/oracle/workspaces/live-astro/src/pages/index.astro @@ -0,0 +1,13 @@ +--- +import Layout from '../layouts/Layout.astro'; +--- + +
+

Astro Fixture

+

Minimal Astro tree for oracle live-mode goldens.

+
+
One
+
Two
+
+
+
diff --git a/tests/oracle/workspaces/live-html/.impeccable/live/config.json b/tests/oracle/workspaces/live-html/.impeccable/live/config.json new file mode 100644 index 000000000..420664db9 --- /dev/null +++ b/tests/oracle/workspaces/live-html/.impeccable/live/config.json @@ -0,0 +1,5 @@ +{ + "files": ["index.html", "public/**/*.html"], + "insertBefore": "", + "commentSyntax": "html" +} diff --git a/tests/oracle/workspaces/live-html/DESIGN.md b/tests/oracle/workspaces/live-html/DESIGN.md new file mode 100644 index 000000000..4bf3a31d7 --- /dev/null +++ b/tests/oracle/workspaces/live-html/DESIGN.md @@ -0,0 +1,12 @@ +--- +name: Oracle Live Fixture +description: A one-page fixture set in plain type on paper-white surfaces. +colors: + ink: "#142720" + paper: "#ffffff" +typography: + body: + fontFamily: "system-ui, sans-serif" + fontWeight: 400 + lineHeight: 1.5 +--- diff --git a/tests/oracle/workspaces/live-html/PRODUCT.md b/tests/oracle/workspaces/live-html/PRODUCT.md new file mode 100644 index 000000000..3656940aa --- /dev/null +++ b/tests/oracle/workspaces/live-html/PRODUCT.md @@ -0,0 +1,8 @@ + +# Product + +## What it is +A fixture app used by the oracle harness for live mode. + +## Platform +web diff --git a/tests/oracle/workspaces/live-html/index.html b/tests/oracle/workspaces/live-html/index.html new file mode 100644 index 000000000..96a9587af --- /dev/null +++ b/tests/oracle/workspaces/live-html/index.html @@ -0,0 +1,25 @@ + + + + + Oracle Live HTML Fixture + + + +
+

Oracle Fixture

+

Minimal static page for oracle live-mode goldens.

+
+
One
+
Two
+
+ +
+ + diff --git a/tests/oracle/workspaces/live-html/public/docs/guide.html b/tests/oracle/workspaces/live-html/public/docs/guide.html new file mode 100644 index 000000000..753feb5bd --- /dev/null +++ b/tests/oracle/workspaces/live-html/public/docs/guide.html @@ -0,0 +1,13 @@ + + + + + Guide + + +
+

Guide

+

A second page covered by the config glob.

+
+ + diff --git a/tests/oracle/workspaces/live-html/public/no-body.html b/tests/oracle/workspaces/live-html/public/no-body.html new file mode 100644 index 000000000..54e798626 --- /dev/null +++ b/tests/oracle/workspaces/live-html/public/no-body.html @@ -0,0 +1,5 @@ + + + No body tag +

This file has no closing body tag.

+ diff --git a/tests/oracle/workspaces/live-html/src/cards.html b/tests/oracle/workspaces/live-html/src/cards.html new file mode 100644 index 000000000..f4e215795 --- /dev/null +++ b/tests/oracle/workspaces/live-html/src/cards.html @@ -0,0 +1,14 @@ +
+
+

Alpha card

+

First card body copy.

+
+
+

Beta card

+

Second card body copy.

+
+
+

Gamma card

+

Third card body copy.

+
+
diff --git a/tests/oracle/workspaces/live-monorepo/DESIGN.md b/tests/oracle/workspaces/live-monorepo/DESIGN.md new file mode 100644 index 000000000..4bf3a31d7 --- /dev/null +++ b/tests/oracle/workspaces/live-monorepo/DESIGN.md @@ -0,0 +1,12 @@ +--- +name: Oracle Live Fixture +description: A one-page fixture set in plain type on paper-white surfaces. +colors: + ink: "#142720" + paper: "#ffffff" +typography: + body: + fontFamily: "system-ui, sans-serif" + fontWeight: 400 + lineHeight: 1.5 +--- diff --git a/tests/oracle/workspaces/live-monorepo/PRODUCT.md b/tests/oracle/workspaces/live-monorepo/PRODUCT.md new file mode 100644 index 000000000..3656940aa --- /dev/null +++ b/tests/oracle/workspaces/live-monorepo/PRODUCT.md @@ -0,0 +1,8 @@ + +# Product + +## What it is +A fixture app used by the oracle harness for live mode. + +## Platform +web diff --git a/tests/oracle/workspaces/live-monorepo/package.json b/tests/oracle/workspaces/live-monorepo/package.json new file mode 100644 index 000000000..bd512177b --- /dev/null +++ b/tests/oracle/workspaces/live-monorepo/package.json @@ -0,0 +1,4 @@ +{ + "name": "fake-cli-tool", + "private": true +} diff --git a/tests/oracle/workspaces/live-monorepo/website/.impeccable/live/config.json b/tests/oracle/workspaces/live-monorepo/website/.impeccable/live/config.json new file mode 100644 index 000000000..b85f672e4 --- /dev/null +++ b/tests/oracle/workspaces/live-monorepo/website/.impeccable/live/config.json @@ -0,0 +1,5 @@ +{ + "files": ["index.html"], + "insertBefore": "", + "commentSyntax": "html" +} diff --git a/tests/oracle/workspaces/live-monorepo/website/index.html b/tests/oracle/workspaces/live-monorepo/website/index.html new file mode 100644 index 000000000..c3fcf9c3a --- /dev/null +++ b/tests/oracle/workspaces/live-monorepo/website/index.html @@ -0,0 +1,11 @@ + + + + + Nested Website Fixture + + +
+ + + diff --git a/tests/oracle/workspaces/live-monorepo/website/package.json b/tests/oracle/workspaces/live-monorepo/website/package.json new file mode 100644 index 000000000..3d7e70f6d --- /dev/null +++ b/tests/oracle/workspaces/live-monorepo/website/package.json @@ -0,0 +1,7 @@ +{ + "name": "oracle-monorepo-website", + "private": true, + "type": "module", + "scripts": { "dev": "vite --host 127.0.0.1" }, + "devDependencies": { "vite": "^8.0.0" } +} diff --git a/tests/oracle/workspaces/live-monorepo/website/src/App.jsx b/tests/oracle/workspaces/live-monorepo/website/src/App.jsx new file mode 100644 index 000000000..61f876f33 --- /dev/null +++ b/tests/oracle/workspaces/live-monorepo/website/src/App.jsx @@ -0,0 +1,22 @@ +export default function App() { + return ( +
+

Vite Fixture

+

Minimal React tree for oracle live-mode goldens.

+
+
One
+
Two
+
+
    + {items.map((item) => ( +
  • {item.title}
  • + ))} +
+
+ ); +} + +const items = [ + { id: 1, title: 'First' }, + { id: 2, title: 'Second' }, +]; diff --git a/tests/oracle/workspaces/live-monorepo/website/vite.config.js b/tests/oracle/workspaces/live-monorepo/website/vite.config.js new file mode 100644 index 000000000..56f762807 --- /dev/null +++ b/tests/oracle/workspaces/live-monorepo/website/vite.config.js @@ -0,0 +1,4 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ plugins: [react()] }); diff --git a/tests/oracle/workspaces/live-next/.impeccable/live/config.json b/tests/oracle/workspaces/live-next/.impeccable/live/config.json new file mode 100644 index 000000000..588ad17a6 --- /dev/null +++ b/tests/oracle/workspaces/live-next/.impeccable/live/config.json @@ -0,0 +1,5 @@ +{ + "files": ["app/layout.tsx"], + "insertBefore": "", + "commentSyntax": "jsx" +} diff --git a/tests/oracle/workspaces/live-next/DESIGN.md b/tests/oracle/workspaces/live-next/DESIGN.md new file mode 100644 index 000000000..4bf3a31d7 --- /dev/null +++ b/tests/oracle/workspaces/live-next/DESIGN.md @@ -0,0 +1,12 @@ +--- +name: Oracle Live Fixture +description: A one-page fixture set in plain type on paper-white surfaces. +colors: + ink: "#142720" + paper: "#ffffff" +typography: + body: + fontFamily: "system-ui, sans-serif" + fontWeight: 400 + lineHeight: 1.5 +--- diff --git a/tests/oracle/workspaces/live-next/PRODUCT.md b/tests/oracle/workspaces/live-next/PRODUCT.md new file mode 100644 index 000000000..3656940aa --- /dev/null +++ b/tests/oracle/workspaces/live-next/PRODUCT.md @@ -0,0 +1,8 @@ + +# Product + +## What it is +A fixture app used by the oracle harness for live mode. + +## Platform +web diff --git a/tests/oracle/workspaces/live-next/app/layout.tsx b/tests/oracle/workspaces/live-next/app/layout.tsx new file mode 100644 index 000000000..f69eec5aa --- /dev/null +++ b/tests/oracle/workspaces/live-next/app/layout.tsx @@ -0,0 +1,17 @@ +export const metadata = { title: 'Next Fixture' }; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + + + + {children} + + + ); +} diff --git a/tests/oracle/workspaces/live-next/app/page.tsx b/tests/oracle/workspaces/live-next/app/page.tsx new file mode 100644 index 000000000..1b05c4ccd --- /dev/null +++ b/tests/oracle/workspaces/live-next/app/page.tsx @@ -0,0 +1,8 @@ +export default function Page() { + return ( +
+

Next Fixture

+

Minimal Next app-router page.

+
+ ); +} diff --git a/tests/oracle/workspaces/live-next/next.config.js b/tests/oracle/workspaces/live-next/next.config.js new file mode 100644 index 000000000..658404ac6 --- /dev/null +++ b/tests/oracle/workspaces/live-next/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +module.exports = nextConfig; diff --git a/tests/oracle/workspaces/live-next/package.json b/tests/oracle/workspaces/live-next/package.json new file mode 100644 index 000000000..5780fcfad --- /dev/null +++ b/tests/oracle/workspaces/live-next/package.json @@ -0,0 +1 @@ +{ "name": "oracle-live-next", "private": true, "dependencies": { "next": "^15.0.0", "react": "^19.0.0", "react-dom": "^19.0.0" } } diff --git a/tests/oracle/workspaces/live-nuxt/.impeccable/live/config.json b/tests/oracle/workspaces/live-nuxt/.impeccable/live/config.json new file mode 100644 index 000000000..e58f0a79a --- /dev/null +++ b/tests/oracle/workspaces/live-nuxt/.impeccable/live/config.json @@ -0,0 +1,5 @@ +{ + "files": ["app.vue"], + "insertBefore": "", + "commentSyntax": "html" +} diff --git a/tests/oracle/workspaces/live-nuxt/DESIGN.md b/tests/oracle/workspaces/live-nuxt/DESIGN.md new file mode 100644 index 000000000..4bf3a31d7 --- /dev/null +++ b/tests/oracle/workspaces/live-nuxt/DESIGN.md @@ -0,0 +1,12 @@ +--- +name: Oracle Live Fixture +description: A one-page fixture set in plain type on paper-white surfaces. +colors: + ink: "#142720" + paper: "#ffffff" +typography: + body: + fontFamily: "system-ui, sans-serif" + fontWeight: 400 + lineHeight: 1.5 +--- diff --git a/tests/oracle/workspaces/live-nuxt/PRODUCT.md b/tests/oracle/workspaces/live-nuxt/PRODUCT.md new file mode 100644 index 000000000..3656940aa --- /dev/null +++ b/tests/oracle/workspaces/live-nuxt/PRODUCT.md @@ -0,0 +1,8 @@ + +# Product + +## What it is +A fixture app used by the oracle harness for live mode. + +## Platform +web diff --git a/tests/oracle/workspaces/live-nuxt/app.vue b/tests/oracle/workspaces/live-nuxt/app.vue new file mode 100644 index 000000000..59161c4a9 --- /dev/null +++ b/tests/oracle/workspaces/live-nuxt/app.vue @@ -0,0 +1,10 @@ + diff --git a/tests/oracle/workspaces/live-nuxt/nuxt.config.ts b/tests/oracle/workspaces/live-nuxt/nuxt.config.ts new file mode 100644 index 000000000..ba7a0f27e --- /dev/null +++ b/tests/oracle/workspaces/live-nuxt/nuxt.config.ts @@ -0,0 +1,4 @@ +export default defineNuxtConfig({ + compatibilityDate: '2025-01-01', + devtools: { enabled: true }, +}); diff --git a/tests/oracle/workspaces/live-nuxt/package.json b/tests/oracle/workspaces/live-nuxt/package.json new file mode 100644 index 000000000..4d81c0992 --- /dev/null +++ b/tests/oracle/workspaces/live-nuxt/package.json @@ -0,0 +1 @@ +{ "name": "oracle-live-nuxt", "private": true, "type": "module", "dependencies": { "nuxt": "^3.0.0" } } diff --git a/tests/oracle/workspaces/live-nuxt/pages/index.vue b/tests/oracle/workspaces/live-nuxt/pages/index.vue new file mode 100644 index 000000000..662832fc6 --- /dev/null +++ b/tests/oracle/workspaces/live-nuxt/pages/index.vue @@ -0,0 +1,6 @@ + diff --git a/tests/oracle/workspaces/live-sveltekit/.impeccable/live/config.json b/tests/oracle/workspaces/live-sveltekit/.impeccable/live/config.json new file mode 100644 index 000000000..8660c651f --- /dev/null +++ b/tests/oracle/workspaces/live-sveltekit/.impeccable/live/config.json @@ -0,0 +1,5 @@ +{ + "files": ["src/app.html"], + "insertBefore": "", + "commentSyntax": "html" +} diff --git a/tests/oracle/workspaces/live-sveltekit/DESIGN.md b/tests/oracle/workspaces/live-sveltekit/DESIGN.md new file mode 100644 index 000000000..4bf3a31d7 --- /dev/null +++ b/tests/oracle/workspaces/live-sveltekit/DESIGN.md @@ -0,0 +1,12 @@ +--- +name: Oracle Live Fixture +description: A one-page fixture set in plain type on paper-white surfaces. +colors: + ink: "#142720" + paper: "#ffffff" +typography: + body: + fontFamily: "system-ui, sans-serif" + fontWeight: 400 + lineHeight: 1.5 +--- diff --git a/tests/oracle/workspaces/live-sveltekit/PRODUCT.md b/tests/oracle/workspaces/live-sveltekit/PRODUCT.md new file mode 100644 index 000000000..3656940aa --- /dev/null +++ b/tests/oracle/workspaces/live-sveltekit/PRODUCT.md @@ -0,0 +1,8 @@ + +# Product + +## What it is +A fixture app used by the oracle harness for live mode. + +## Platform +web diff --git a/tests/oracle/workspaces/live-sveltekit/package.json b/tests/oracle/workspaces/live-sveltekit/package.json new file mode 100644 index 000000000..792a0873c --- /dev/null +++ b/tests/oracle/workspaces/live-sveltekit/package.json @@ -0,0 +1,13 @@ +{ + "name": "oracle-live-sveltekit", + "private": true, + "type": "module", + "scripts": { "dev": "vite dev --host 127.0.0.1" }, + "devDependencies": { + "@sveltejs/adapter-auto": "^6.0.0", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^6.0.0", + "svelte": "^5.0.0", + "vite": "^7.0.0" + } +} diff --git a/tests/oracle/workspaces/live-sveltekit/src/app.html b/tests/oracle/workspaces/live-sveltekit/src/app.html new file mode 100644 index 000000000..86314eb6e --- /dev/null +++ b/tests/oracle/workspaces/live-sveltekit/src/app.html @@ -0,0 +1,11 @@ + + + + + SvelteKit Fixture + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/tests/oracle/workspaces/live-sveltekit/src/routes/+page.svelte b/tests/oracle/workspaces/live-sveltekit/src/routes/+page.svelte new file mode 100644 index 000000000..1cfa77495 --- /dev/null +++ b/tests/oracle/workspaces/live-sveltekit/src/routes/+page.svelte @@ -0,0 +1,27 @@ + + +
+

{title}

+

Minimal SvelteKit route for oracle live-mode goldens.

+
    + {#each expenses as expense (expense.id)} +
  • {expense.label}: {expense.amount}
  • + {/each} +
+
+
One
+
Two
+
+
+ + diff --git a/tests/oracle/workspaces/live-sveltekit/svelte.config.js b/tests/oracle/workspaces/live-sveltekit/svelte.config.js new file mode 100644 index 000000000..2604dcccc --- /dev/null +++ b/tests/oracle/workspaces/live-sveltekit/svelte.config.js @@ -0,0 +1,3 @@ +import adapter from '@sveltejs/adapter-auto'; + +export default { kit: { adapter: adapter() } }; diff --git a/tests/oracle/workspaces/live-tanstack/.impeccable/live/config.json b/tests/oracle/workspaces/live-tanstack/.impeccable/live/config.json new file mode 100644 index 000000000..5792d197c --- /dev/null +++ b/tests/oracle/workspaces/live-tanstack/.impeccable/live/config.json @@ -0,0 +1,5 @@ +{ + "files": ["src/routes/__root.tsx"], + "insertBefore": " +# Product + +## What it is +A fixture app used by the oracle harness for live mode. + +## Platform +web diff --git a/tests/oracle/workspaces/live-tanstack/package.json b/tests/oracle/workspaces/live-tanstack/package.json new file mode 100644 index 000000000..6f9ad170a --- /dev/null +++ b/tests/oracle/workspaces/live-tanstack/package.json @@ -0,0 +1,12 @@ +{ + "name": "oracle-live-tanstack", + "private": true, + "type": "module", + "dependencies": { + "@tanstack/react-router": "^1.132.0", + "@tanstack/react-start": "^1.132.0", + "react": "^19.2.0", + "react-dom": "^19.2.0" + }, + "devDependencies": { "@vitejs/plugin-react": "^6.0.0", "vite": "^8.0.0" } +} diff --git a/tests/oracle/workspaces/live-tanstack/src/routes/__root.tsx b/tests/oracle/workspaces/live-tanstack/src/routes/__root.tsx new file mode 100644 index 000000000..b5d266604 --- /dev/null +++ b/tests/oracle/workspaces/live-tanstack/src/routes/__root.tsx @@ -0,0 +1,25 @@ +import { HeadContent, Scripts, createRootRoute } from '@tanstack/react-router'; + +export const Route = createRootRoute({ + head: () => ({ + meta: [ + { charSet: 'utf-8' }, + { title: 'TanStack Start Fixture' }, + ], + }), + shellComponent: RootDocument, +}); + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + + {children} + + + + ); +} diff --git a/tests/oracle/workspaces/live-tanstack/src/routes/index.tsx b/tests/oracle/workspaces/live-tanstack/src/routes/index.tsx new file mode 100644 index 000000000..52a49652f --- /dev/null +++ b/tests/oracle/workspaces/live-tanstack/src/routes/index.tsx @@ -0,0 +1,14 @@ +import { createFileRoute } from '@tanstack/react-router'; + +export const Route = createFileRoute('/')({ + component: Home, +}); + +function Home() { + return ( +
+

Start Home Hero

+

Server-rendered by TanStack Start.

+
+ ); +} diff --git a/tests/oracle/workspaces/live-tanstack/vite.config.js b/tests/oracle/workspaces/live-tanstack/vite.config.js new file mode 100644 index 000000000..5e77cacba --- /dev/null +++ b/tests/oracle/workspaces/live-tanstack/vite.config.js @@ -0,0 +1,4 @@ +import { defineConfig } from 'vite'; +import { tanstackStart } from '@tanstack/react-start/plugin/vite'; + +export default defineConfig({ plugins: [tanstackStart()] }); diff --git a/tests/oracle/workspaces/live-vite/.impeccable/live/config.json b/tests/oracle/workspaces/live-vite/.impeccable/live/config.json new file mode 100644 index 000000000..b85f672e4 --- /dev/null +++ b/tests/oracle/workspaces/live-vite/.impeccable/live/config.json @@ -0,0 +1,5 @@ +{ + "files": ["index.html"], + "insertBefore": "", + "commentSyntax": "html" +} diff --git a/tests/oracle/workspaces/live-vite/DESIGN.md b/tests/oracle/workspaces/live-vite/DESIGN.md new file mode 100644 index 000000000..4bf3a31d7 --- /dev/null +++ b/tests/oracle/workspaces/live-vite/DESIGN.md @@ -0,0 +1,12 @@ +--- +name: Oracle Live Fixture +description: A one-page fixture set in plain type on paper-white surfaces. +colors: + ink: "#142720" + paper: "#ffffff" +typography: + body: + fontFamily: "system-ui, sans-serif" + fontWeight: 400 + lineHeight: 1.5 +--- diff --git a/tests/oracle/workspaces/live-vite/PRODUCT.md b/tests/oracle/workspaces/live-vite/PRODUCT.md new file mode 100644 index 000000000..3656940aa --- /dev/null +++ b/tests/oracle/workspaces/live-vite/PRODUCT.md @@ -0,0 +1,8 @@ + +# Product + +## What it is +A fixture app used by the oracle harness for live mode. + +## Platform +web diff --git a/tests/oracle/workspaces/live-vite/index.html b/tests/oracle/workspaces/live-vite/index.html new file mode 100644 index 000000000..081e8bddc --- /dev/null +++ b/tests/oracle/workspaces/live-vite/index.html @@ -0,0 +1,11 @@ + + + + + Oracle Vite Fixture + + +
+ + + diff --git a/tests/oracle/workspaces/live-vite/package.json b/tests/oracle/workspaces/live-vite/package.json new file mode 100644 index 000000000..b842c1068 --- /dev/null +++ b/tests/oracle/workspaces/live-vite/package.json @@ -0,0 +1,9 @@ +{ + "name": "oracle-live-vite", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { "dev": "vite --host 127.0.0.1" }, + "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0" }, + "devDependencies": { "@vitejs/plugin-react": "^6.0.0", "vite": "^8.0.0" } +} diff --git a/tests/oracle/workspaces/live-vite/src/App.jsx b/tests/oracle/workspaces/live-vite/src/App.jsx new file mode 100644 index 000000000..61f876f33 --- /dev/null +++ b/tests/oracle/workspaces/live-vite/src/App.jsx @@ -0,0 +1,22 @@ +export default function App() { + return ( +
+

Vite Fixture

+

Minimal React tree for oracle live-mode goldens.

+
+
One
+
Two
+
+
    + {items.map((item) => ( +
  • {item.title}
  • + ))} +
+
+ ); +} + +const items = [ + { id: 1, title: 'First' }, + { id: 2, title: 'Second' }, +]; diff --git a/tests/oracle/workspaces/live-vite/src/Panel.tsx b/tests/oracle/workspaces/live-vite/src/Panel.tsx new file mode 100644 index 000000000..64cb784d0 --- /dev/null +++ b/tests/oracle/workspaces/live-vite/src/Panel.tsx @@ -0,0 +1,12 @@ +type PanelProps = { title: string; children?: React.ReactNode }; + +export function Panel({ title, children }: PanelProps) { + return ( +
+
+

{title}

+
+
{children}
+
+ ); +} diff --git a/tests/oracle/workspaces/live-vite/src/main.jsx b/tests/oracle/workspaces/live-vite/src/main.jsx new file mode 100644 index 000000000..b5c8e04ad --- /dev/null +++ b/tests/oracle/workspaces/live-vite/src/main.jsx @@ -0,0 +1,4 @@ +import { createRoot } from 'react-dom/client'; +import App from './App.jsx'; + +createRoot(document.getElementById('root')).render(); diff --git a/tests/oracle/workspaces/live-vite/vite.config.js b/tests/oracle/workspaces/live-vite/vite.config.js new file mode 100644 index 000000000..56f762807 --- /dev/null +++ b/tests/oracle/workspaces/live-vite/vite.config.js @@ -0,0 +1,4 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ plugins: [react()] }); diff --git a/tests/oracle/workspaces/live-workspaces/DESIGN.md b/tests/oracle/workspaces/live-workspaces/DESIGN.md new file mode 100644 index 000000000..4bf3a31d7 --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/DESIGN.md @@ -0,0 +1,12 @@ +--- +name: Oracle Live Fixture +description: A one-page fixture set in plain type on paper-white surfaces. +colors: + ink: "#142720" + paper: "#ffffff" +typography: + body: + fontFamily: "system-ui, sans-serif" + fontWeight: 400 + lineHeight: 1.5 +--- diff --git a/tests/oracle/workspaces/live-workspaces/PRODUCT.md b/tests/oracle/workspaces/live-workspaces/PRODUCT.md new file mode 100644 index 000000000..3656940aa --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/PRODUCT.md @@ -0,0 +1,8 @@ + +# Product + +## What it is +A fixture app used by the oracle harness for live mode. + +## Platform +web diff --git a/tests/oracle/workspaces/live-workspaces/apps/admin/astro.config.mjs b/tests/oracle/workspaces/live-workspaces/apps/admin/astro.config.mjs new file mode 100644 index 000000000..86dbfb924 --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/apps/admin/astro.config.mjs @@ -0,0 +1,3 @@ +import { defineConfig } from 'astro/config'; + +export default defineConfig({}); diff --git a/tests/oracle/workspaces/live-workspaces/apps/admin/package.json b/tests/oracle/workspaces/live-workspaces/apps/admin/package.json new file mode 100644 index 000000000..7b789eabd --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/apps/admin/package.json @@ -0,0 +1 @@ +{ "name": "admin", "private": true, "type": "module", "dependencies": { "astro": "^5.0.0" } } diff --git a/tests/oracle/workspaces/live-workspaces/apps/admin/src/pages/index.astro b/tests/oracle/workspaces/live-workspaces/apps/admin/src/pages/index.astro new file mode 100644 index 000000000..f3a102400 --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/apps/admin/src/pages/index.astro @@ -0,0 +1,13 @@ +--- +import Layout from '../layouts/Layout.astro'; +--- + +
+

Astro Fixture

+

Minimal Astro tree for oracle live-mode goldens.

+
+
One
+
Two
+
+
+
diff --git a/tests/oracle/workspaces/live-workspaces/apps/web/index.html b/tests/oracle/workspaces/live-workspaces/apps/web/index.html new file mode 100644 index 000000000..081e8bddc --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/apps/web/index.html @@ -0,0 +1,11 @@ + + + + + Oracle Vite Fixture + + +
+ + + diff --git a/tests/oracle/workspaces/live-workspaces/apps/web/package.json b/tests/oracle/workspaces/live-workspaces/apps/web/package.json new file mode 100644 index 000000000..40e000b9f --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/apps/web/package.json @@ -0,0 +1 @@ +{ "name": "web", "private": true, "type": "module", "devDependencies": { "vite": "^8.0.0" } } diff --git a/tests/oracle/workspaces/live-workspaces/apps/web/src/App.jsx b/tests/oracle/workspaces/live-workspaces/apps/web/src/App.jsx new file mode 100644 index 000000000..61f876f33 --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/apps/web/src/App.jsx @@ -0,0 +1,22 @@ +export default function App() { + return ( +
+

Vite Fixture

+

Minimal React tree for oracle live-mode goldens.

+
+
One
+
Two
+
+
    + {items.map((item) => ( +
  • {item.title}
  • + ))} +
+
+ ); +} + +const items = [ + { id: 1, title: 'First' }, + { id: 2, title: 'Second' }, +]; diff --git a/tests/oracle/workspaces/live-workspaces/apps/web/vite.config.js b/tests/oracle/workspaces/live-workspaces/apps/web/vite.config.js new file mode 100644 index 000000000..56f762807 --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/apps/web/vite.config.js @@ -0,0 +1,4 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ plugins: [react()] }); diff --git a/tests/oracle/workspaces/live-workspaces/package.json b/tests/oracle/workspaces/live-workspaces/package.json new file mode 100644 index 000000000..7563115e9 --- /dev/null +++ b/tests/oracle/workspaces/live-workspaces/package.json @@ -0,0 +1,5 @@ +{ + "name": "oracle-live-workspaces", + "private": true, + "workspaces": ["apps/*"] +}