Problem
Both browser-extension workspace packages are confirmed unused and are being deleted (parent epic). They must be removed together, in one change: ci.yml's lint/typecheck steps invoke both packages in a single turbo run ... --filter=@loopover/extension --filter=@loopover/miner-extension command each, and ui-deploy.yml's "Validate frontend" step chains both packages' npm scripts in one && sequence — deleting one package first would break these steps immediately, before the second package is removed. Blocked-by the previous sub-issue (the UI download page must be gone before this lands, so there is never a live broken download link).
Full audit findings (2026-07-25), organized by what needs to change:
Directories and scripts to delete entirely
apps/loopover-extension/ (8 files: .gitignore, auth.js, background.js, content.js, manifest.json, options.html, options.js, package.json, styles.css)
apps/loopover-miner-extension/ (21 files: source .js/.html/.css/.d.ts, 4 PNG icons, its own README.md, vitest.config.ts, package.json, and its test/ subdirectory of 5 test files)
scripts/build-extension.ts, scripts/build-miner-extension.ts
scripts/extension-zip-core.ts — verify nothing else imports this shared zip-writer before deleting; at audit time only the two build scripts and test/unit/build-extension-zip-script.test.ts (also being deleted, see below) referenced it.
Root-level tests to delete (all read/import the app directories' raw source directly; they will ENOENT the moment the directories above are gone)
test/unit/build-extension-zip-script.test.ts
test/unit/ci-extension-packages.test.ts
test/unit/extension-auth.test.ts
test/unit/extension-background.test.ts
test/unit/extension-content.test.ts
test/unit/extension-options.test.ts
test/unit/miner-extension-content.test.ts
test/unit/miner-extension-icons.test.ts
test/unit/miner-extension-live-fetch.test.ts
test/unit/codecov-policy.test.ts — do not delete this file (it covers other policy assertions too); remove only its it("keeps miner-ui and miner-extension under app-local coverage gates (#4865)"...) test case and the @loopover/miner-extension run test substring assertion inside it.
Do not delete test/unit/extension-contributor-context.test.ts or test/unit/routes-extension.test.ts here — both test backend (src/) logic, not the app directories, and are in scope for the next sub-issue instead.
turbo.json
Remove all 5 task blocks: @loopover/extension#lint, @loopover/extension#typecheck, @loopover/extension#build, @loopover/miner-extension#lint, @loopover/miner-extension#typecheck, @loopover/miner-extension#build. Remove "@loopover/extension#build", "@loopover/miner-extension#build" from @loopover/ui#build's dependsOn array (leave "^build" in place). Remove "apps/loopover-extension/**" and "apps/loopover-miner-extension/**" from the root //#typecheck task's inputs array (and trim the accompanying comment's mention of them as part of the six cross-package reach paths it lists).
.github/workflows/ci.yml
- Remove
'apps/loopover-extension/**' and 'apps/loopover-miner-extension/**' from the changes job's ui: path-filter list, and 'scripts/build-extension.ts' / 'scripts/build-miner-extension.ts'.
- Remove the
UI tests (miner-extension), Extension lint, and Extension typecheck steps entirely.
- Update the comment preceding the "UI build" step (currently explains the
@loopover/ui#build dependsOn resolving "the exact same extension + miner-extension build pair") to no longer reference either package.
- Sweep the remaining ~7 comment-only mentions of "extension"/"Extension" in step-ordering rationale elsewhere in the file and remove or reword them so nothing describes a step that no longer exists.
.github/workflows/ui-deploy.yml
Rewrite the "Validate frontend" step's command, dropping npm run extension:lint && npm run miner-extension:lint && npm run extension:typecheck && npm run miner-extension:typecheck && npm run extension:build && npm run miner-extension:build — keep npm run ui:openapi:check && npm run ui:lint && npm run ui:typecheck && npm --workspace @loopover/ui run build (verify against the file's actual current content at implementation time; do not assume this quoted form is still exact if other changes have landed in between).
.github/actions/deploy-ui-preview/action.yml
Update the comment mentioning /downloads/loopover-extension.zip by name (justifying why .zip is an allowed static-asset extension) — the .zip extension itself stays allowlisted (other things may still use it), only the stale example reference needs rewording or removal.
Root package.json
- Remove the scripts:
extension:build, extension:lint, extension:typecheck, miner-extension:build, miner-extension:lint, miner-extension:typecheck.
- Edit
ui:build to drop && npm run extension:build && npm run miner-extension:build from its chain.
- Edit
ui:test to drop && npm --workspace @loopover/miner-extension run test from its chain.
- The
workspaces array itself (["apps/*", "packages/*"]) needs no edit — both packages are matched via the apps/* glob, not listed by name; deleting the directories removes them from the resolved workspace set automatically.
.gitignore
Remove the apps/loopover-ui/public/downloads/loopover-extension.zip line (dead once nothing generates it).
package-lock.json
Regenerate via npm install after the above — do not hand-edit; verify the apps/loopover-extension/apps/loopover-miner-extension workspace entries and their node_modules/@loopover/{extension,miner-extension} entries are gone from the result.
Docs
CONTRIBUTING.md: remove the extension conventional-commit scope token from its accepted-scopes list (line ~326), and reword the "screenshot evidence for ... extension changes" bullet (line ~137) to drop the extension mention.
.claude/skills/contributing-to-loopover/SKILL.md: remove the paragraph naming extension:lint/extension:typecheck/miner-extension:lint/miner-extension:typecheck as a test:ci exception.
.claude/skills/contributing-to-loopover/reference.md: remove the ui → extension lint and ui → extension typecheck table rows and the accompanying "One CI-gating exception... does NOT cover" paragraph, plus the apps/loopover-extension/**/apps/loopover-miner-extension/** mention in whatever surrounding sentence references them.
.claude/skills/contributor-pipeline-gardening/reference.md: reword the sentence mentioning apps/loopover-miner-extension (line ~33) to drop it.
Requirements
⚠️ This must land as one PR, not split across multiple — the shared CI/build wiring above means an intermediate state with only one package deleted breaks ci.yml and ui-deploy.yml outright.
- After the change:
npm run test:ci passes end to end with no reference to either package anywhere in its own script chain (ui:build, ui:test, and everything else it calls).
npx turbo run build --filter=@loopover/ui succeeds with no @loopover/extension#build/@loopover/miner-extension#build dependency in its graph.
- No dangling reference to either package name, either app directory path,
build-extension.ts, build-miner-extension.ts, or extension-zip-core.ts anywhere in the repo outside src/** (the backend surface, explicitly out of scope here — next sub-issue).
Deliverables
Links & Resources
Parent epic; the UI-surface removal sub-issue (blocked-by). apps/loopover-miner-ui/README.md and apps/loopover-miner-ui/vite-ranked-candidates-api.ts each have one comment-only mention of apps/loopover-miner-extension (no code import) — reword both so they don't reference a deleted package, but no functional change needed there (that app's local API stays as-is; it just no longer needs to describe itself as serving the now-removed extension).
Boundaries
Does not touch src/** (the backend API surface) — that is the next sub-issue, blocked on this one closing first. Does not touch anything under apps/loopover-ui/src/routes/extension.tsx or its nav links — those must already be gone (the previous sub-issue).
maintainer-only — repo-structure and CI-configuration authority.
Problem
Both browser-extension workspace packages are confirmed unused and are being deleted (parent epic). They must be removed together, in one change:
ci.yml's lint/typecheck steps invoke both packages in a singleturbo run ... --filter=@loopover/extension --filter=@loopover/miner-extensioncommand each, andui-deploy.yml's "Validate frontend" step chains both packages' npm scripts in one&&sequence — deleting one package first would break these steps immediately, before the second package is removed. Blocked-by the previous sub-issue (the UI download page must be gone before this lands, so there is never a live broken download link).Full audit findings (2026-07-25), organized by what needs to change:
Directories and scripts to delete entirely
apps/loopover-extension/(8 files:.gitignore,auth.js,background.js,content.js,manifest.json,options.html,options.js,package.json,styles.css)apps/loopover-miner-extension/(21 files: source.js/.html/.css/.d.ts, 4 PNG icons, its ownREADME.md,vitest.config.ts,package.json, and itstest/subdirectory of 5 test files)scripts/build-extension.ts,scripts/build-miner-extension.tsscripts/extension-zip-core.ts— verify nothing else imports this shared zip-writer before deleting; at audit time only the two build scripts andtest/unit/build-extension-zip-script.test.ts(also being deleted, see below) referenced it.Root-level tests to delete (all read/import the app directories' raw source directly; they will ENOENT the moment the directories above are gone)
test/unit/build-extension-zip-script.test.tstest/unit/ci-extension-packages.test.tstest/unit/extension-auth.test.tstest/unit/extension-background.test.tstest/unit/extension-content.test.tstest/unit/extension-options.test.tstest/unit/miner-extension-content.test.tstest/unit/miner-extension-icons.test.tstest/unit/miner-extension-live-fetch.test.tstest/unit/codecov-policy.test.ts— do not delete this file (it covers other policy assertions too); remove only itsit("keeps miner-ui and miner-extension under app-local coverage gates (#4865)"...)test case and the@loopover/miner-extension run testsubstring assertion inside it.Do not delete
test/unit/extension-contributor-context.test.tsortest/unit/routes-extension.test.tshere — both test backend (src/) logic, not the app directories, and are in scope for the next sub-issue instead.turbo.jsonRemove all 5 task blocks:
@loopover/extension#lint,@loopover/extension#typecheck,@loopover/extension#build,@loopover/miner-extension#lint,@loopover/miner-extension#typecheck,@loopover/miner-extension#build. Remove"@loopover/extension#build", "@loopover/miner-extension#build"from@loopover/ui#build'sdependsOnarray (leave"^build"in place). Remove"apps/loopover-extension/**"and"apps/loopover-miner-extension/**"from the root//#typechecktask'sinputsarray (and trim the accompanying comment's mention of them as part of the six cross-package reach paths it lists)..github/workflows/ci.yml'apps/loopover-extension/**'and'apps/loopover-miner-extension/**'from thechangesjob'sui:path-filter list, and'scripts/build-extension.ts'/'scripts/build-miner-extension.ts'.UI tests (miner-extension),Extension lint, andExtension typechecksteps entirely.@loopover/ui#builddependsOn resolving "the exact same extension + miner-extension build pair") to no longer reference either package..github/workflows/ui-deploy.ymlRewrite the "Validate frontend" step's command, dropping
npm run extension:lint && npm run miner-extension:lint && npm run extension:typecheck && npm run miner-extension:typecheck && npm run extension:build && npm run miner-extension:build— keepnpm run ui:openapi:check && npm run ui:lint && npm run ui:typecheck && npm --workspace @loopover/ui run build(verify against the file's actual current content at implementation time; do not assume this quoted form is still exact if other changes have landed in between)..github/actions/deploy-ui-preview/action.ymlUpdate the comment mentioning
/downloads/loopover-extension.zipby name (justifying why.zipis an allowed static-asset extension) — the.zipextension itself stays allowlisted (other things may still use it), only the stale example reference needs rewording or removal.Root
package.jsonextension:build,extension:lint,extension:typecheck,miner-extension:build,miner-extension:lint,miner-extension:typecheck.ui:buildto drop&& npm run extension:build && npm run miner-extension:buildfrom its chain.ui:testto drop&& npm --workspace @loopover/miner-extension run testfrom its chain.workspacesarray itself (["apps/*", "packages/*"]) needs no edit — both packages are matched via theapps/*glob, not listed by name; deleting the directories removes them from the resolved workspace set automatically..gitignoreRemove the
apps/loopover-ui/public/downloads/loopover-extension.zipline (dead once nothing generates it).package-lock.jsonRegenerate via
npm installafter the above — do not hand-edit; verify theapps/loopover-extension/apps/loopover-miner-extensionworkspace entries and theirnode_modules/@loopover/{extension,miner-extension}entries are gone from the result.Docs
CONTRIBUTING.md: remove theextensionconventional-commit scope token from its accepted-scopes list (line ~326), and reword the "screenshot evidence for ... extension changes" bullet (line ~137) to drop the extension mention..claude/skills/contributing-to-loopover/SKILL.md: remove the paragraph namingextension:lint/extension:typecheck/miner-extension:lint/miner-extension:typecheckas atest:ciexception..claude/skills/contributing-to-loopover/reference.md: remove theui → extension lintandui → extension typechecktable rows and the accompanying "One CI-gating exception... does NOT cover" paragraph, plus theapps/loopover-extension/**/apps/loopover-miner-extension/**mention in whatever surrounding sentence references them..claude/skills/contributor-pipeline-gardening/reference.md: reword the sentence mentioningapps/loopover-miner-extension(line ~33) to drop it.Requirements
npm run test:cipasses end to end with no reference to either package anywhere in its own script chain (ui:build,ui:test, and everything else it calls).npx turbo run build --filter=@loopover/uisucceeds with no@loopover/extension#build/@loopover/miner-extension#builddependency in its graph.build-extension.ts,build-miner-extension.ts, orextension-zip-core.tsanywhere in the repo outsidesrc/**(the backend surface, explicitly out of scope here — next sub-issue).Deliverables
extension-zip-core.tsdeletedcodecov-policy.test.tstrimmed (not deleted)turbo.json,ci.yml,ui-deploy.yml,deploy-ui-preview/action.yml, rootpackage.json,.gitignoreall updated per the exact list abovepackage-lock.jsonregeneratednpm run test:ci) greenLinks & Resources
Parent epic; the UI-surface removal sub-issue (blocked-by).
apps/loopover-miner-ui/README.mdandapps/loopover-miner-ui/vite-ranked-candidates-api.tseach have one comment-only mention ofapps/loopover-miner-extension(no code import) — reword both so they don't reference a deleted package, but no functional change needed there (that app's local API stays as-is; it just no longer needs to describe itself as serving the now-removed extension).Boundaries
Does not touch
src/**(the backend API surface) — that is the next sub-issue, blocked on this one closing first. Does not touch anything underapps/loopover-ui/src/routes/extension.tsxor its nav links — those must already be gone (the previous sub-issue).maintainer-only — repo-structure and CI-configuration authority.