Initial scaffold: Beat Pocket MV3 extension

- manifest.json with MV3 config, host permissions for beat-battle.net
- content/detector.ts: route + overlay observer, emits bbp:phase events
- content/layout.ts: defensive mobile-first layout reflow
- content/chat-drawer.ts: bottom-sheet drawer, dispatches synthetic events
  through site's own React-managed textarea + button (preserves auth,
  rate-limit, mute, profanity guards)
- content/util/selectors.ts: text- and role-based fallback chain
- content/util/ws-proxy.ts: lightweight WebSocket instrumentation, no
  payload capture
- content/inject.css: mobile overrides using site's existing --bb-* vars
- background.js: MV3 service worker stub
- package.json + tsconfig.json + esbuild.config.mjs: build pipeline
- icons/: 16/32/48/128 placeholder PNGs (chili-red disc)
- docs/PLAN.md: full V1 architecture, risks, scope
- README.md: scope, dev workflow (load unpacked), tech
This commit is contained in:
Zebratic
2026-07-11 02:24:37 +00:00
commit 02a90e839c
20 changed files with 1835 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
// esbuild config — bundles TS entry to a single content script
import * as esbuild from 'esbuild';
import { existsSync, mkdirSync } from 'node:fs';
const isWatch = process.argv.includes('--watch');
const outdir = 'dist/content';
if (!existsSync(outdir)) mkdirSync(outdir, { recursive: true });
const ctx = await esbuild.context({
entryPoints: ['extension/content/index.ts'],
bundle: true,
format: 'iife',
target: 'chrome109',
outfile: `${outdir}/index.js`,
sourcemap: 'linked',
logLevel: 'info',
banner: { js: '/* Beat Pocket content script */' },
});
if (isWatch) {
await ctx.watch();
console.log('esbuild watching…');
} else {
const r = await ctx.rebuild();
await ctx.dispose();
if (r.errors.length) process.exit(1);
console.log('build complete');
}