You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-up to #129: relocate the real-provider E2E suite from e2e/ to a scanner-safe e2e-tests/provider/ boundary, and remove the E2E_RUNTIME_DIR runtime-generation workaround that currently produces the Obsidian requestUrl shim, window-timer shim, and GitVerifier as shell-generated TypeScript instead of committed files.
Do not start until #129 merges. This should branch off main (after #129 lands there via claude/source-control-foundation), not be folded into #129 itself — that PR is already large (75 commits).
Update scripts/e2e-suites.txt and scripts/run-e2e.sh paths to the new location; keep the manifest/registration guard and core/full tiering as-is.
Remove the scanner-workaround runtime generation in scripts/e2e-harness.sh (generate_runtime_modules() and friends) and commit obsidian-request-url.ts, window-timers.ts, and git-verifier.ts as real static files under e2e-tests/provider/runtime/ and e2e-tests/provider/support/.
Simplify vitest.e2e.config.ts: drop E2E_RUNTIME_DIR-based aliasing (@e2e-runtime/*, runtime-modules.d.ts), point alias/setupFiles/include at the static paths instead.
Update CI changes.e2e-relevant filter: e2e/** → e2e-tests/**, add scripts/e2e-suites.txt and vitest.e2e.config.ts (currently not watched, so a manifest-only change could silently skip E2E), and fix the stale src/logic/sync-manager.ts path (sync logic is now split under src/logic/sync/).
Update ESLint config: e2e/**/*.ts → e2e-tests/**/*.ts, and flip the rule intent — this is Node test tooling, not shipping Obsidian runtime code, so Node globals/built-ins (node:fs, node:child_process, fetch, etc.) should be allowed there instead of banned.
Update tsconfig.json include path e2e/**/*.ts → e2e-tests/**/*.ts (scanner-ignored ≠ typecheck-ignored — keep it in the TS gate).
Extend tests/ci-workflow.test.ts with contract assertions for the new paths and for the removal of E2E_RUNTIME_DIR/runtime-generation, while keeping all existing assertions (Gitea dynamic port, mktemp isolation, workflow-level concurrency, required-checks, fork-PR trust boundary).
Update docs/testing/real-provider-e2e.md and docs/obsidian-scanner-audit.md to describe the new static architecture.
No changes to scripts/e2e-namespace.sh, scripts/e2e-namespace-cleanup.sh, scripts/e2e-janitor.sh — these are real lifecycle/isolation logic, not scanner workarounds.
Acceptance Criteria
Structure
e2e/ no longer exists
Provider E2E lives entirely under e2e-tests/provider/
scripts/e2e-suites.txt remains the single source of truth for suite registration
Scanner boundary
Scanner-sensitive Node tooling exists only inside the officially scanner-ignored e2e-tests/ boundary
No more runtime-generated TypeScript used to dodge the Obsidian plugin scanner
Shell
e2e-harness.sh no longer generates verifier/requestUrl/timer .ts files at runtime
Provision/seed/verify/cleanup logic is unchanged
e2e-namespace*.sh / e2e-janitor.sh unchanged
Quality gates
npx eslint . — 0 errors, includes e2e-tests/**
npm run build — passes (includes Obsidian 1.11.0 compat typecheck), includes e2e-tests/**
npx vitest run — passes
CI
e2e-tests/** triggers E2E
scripts/e2e-suites.txt and vitest.e2e.config.ts trigger E2E
Stale src/logic/sync-manager.ts filter path corrected
Evidence of the lint/build/test run (command + result) must be recorded in progress.md or the PR description per this repo's CLAUDE.md definition of done.
Summary
Follow-up to #129: relocate the real-provider E2E suite from
e2e/to a scanner-safee2e-tests/provider/boundary, and remove theE2E_RUNTIME_DIRruntime-generation workaround that currently produces the ObsidianrequestUrlshim, window-timer shim, andGitVerifieras shell-generated TypeScript instead of committed files.Do not start until #129 merges. This should branch off
main(after #129 lands there viaclaude/source-control-foundation), not be folded into #129 itself — that PR is already large (75 commits).refactor/e2e-tests-scanner-boundaryrun-e2e.shsuite manifest + registration guard + core/full tier,tests/ci-workflow.test.tscontract tests — all of that is baseline, not something this PR redoes)scripts/run-e2e.sh→vitest.e2e.config.ts).Scope
In scope — pure boundary/structure change, no coverage or test-semantics change:
e2e/{config,shim,suites,support}→e2e-tests/provider/{config,shim,suites,support}.scripts/e2e-suites.txtandscripts/run-e2e.shpaths to the new location; keep the manifest/registration guard and core/full tiering as-is.scripts/e2e-harness.sh(generate_runtime_modules()and friends) and commitobsidian-request-url.ts,window-timers.ts, andgit-verifier.tsas real static files undere2e-tests/provider/runtime/ande2e-tests/provider/support/.vitest.e2e.config.ts: dropE2E_RUNTIME_DIR-based aliasing (@e2e-runtime/*,runtime-modules.d.ts), pointalias/setupFiles/includeat the static paths instead.changes.e2e-relevantfilter:e2e/**→e2e-tests/**, addscripts/e2e-suites.txtandvitest.e2e.config.ts(currently not watched, so a manifest-only change could silently skip E2E), and fix the stalesrc/logic/sync-manager.tspath (sync logic is now split undersrc/logic/sync/).e2e/**/*.ts→e2e-tests/**/*.ts, and flip the rule intent — this is Node test tooling, not shipping Obsidian runtime code, so Node globals/built-ins (node:fs,node:child_process,fetch, etc.) should be allowed there instead of banned.tsconfig.jsoninclude pathe2e/**/*.ts→e2e-tests/**/*.ts(scanner-ignored ≠ typecheck-ignored — keep it in the TS gate).tests/ci-workflow.test.tswith contract assertions for the new paths and for the removal ofE2E_RUNTIME_DIR/runtime-generation, while keeping all existing assertions (Gitea dynamic port, mktemp isolation, workflow-level concurrency, required-checks, fork-PR trust boundary).docs/testing/real-provider-e2e.mdanddocs/obsidian-scanner-audit.mdto describe the new static architecture.Out of scope:
suites→specs).scripts/e2e-namespace.sh,scripts/e2e-namespace-cleanup.sh,scripts/e2e-janitor.sh— these are real lifecycle/isolation logic, not scanner workarounds.Acceptance Criteria
Structure
e2e/no longer existse2e-tests/provider/scripts/e2e-suites.txtremains the single source of truth for suite registrationScanner boundary
e2e-tests/boundaryShell
e2e-harness.shno longer generates verifier/requestUrl/timer.tsfiles at runtimee2e-namespace*.sh/e2e-janitor.shunchangedQuality gates
npx eslint .— 0 errors, includese2e-tests/**npm run build— passes (includes Obsidian 1.11.0 compat typecheck), includese2e-tests/**npx vitest run— passesCI
e2e-tests/**triggers E2Escripts/e2e-suites.txtandvitest.e2e.config.tstrigger E2Esrc/logic/sync-manager.tsfilter path correctedE2E
source-control-flowsandtwo-client-syncsuites still runDocs
docs/testing/real-provider-e2e.mdreflects the new static architecturedocs/obsidian-scanner-audit.mdupdatedEvidence of the lint/build/test run (command + result) must be recorded in
progress.mdor the PR description per this repo'sCLAUDE.mddefinition of done.