# Market Export Range Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Add configurable CSV export ranges for the Xingtu market plugin, defaulting to the first 5 pages and supporting current page, preset ranges, all pages, and custom page counts. **Architecture:** Keep filter and sort scoped to the current page, and introduce a dedicated batch-export path that only runs when exporting. Extend the toolbar with export-range controls, extract page-navigation/signature helpers, and add a focused controller that iterates pages, harvests lazy-loaded DOM fields, merges records by `authorId`, and returns a single record set for CSV generation. **Tech Stack:** TypeScript, Vitest, jsdom, Chrome MV3 content script --- ### Task 1: Extend Toolbar Controls For Export Range **Files:** - Modify: `src/content/market/plugin-toolbar.ts` - Test: `tests/market-content-entry.test.ts` - [ ] **Step 1: Write the failing tests** Add tests that assert: - the toolbar defaults to `前5页` - selecting `自定义` shows and uses a page-count input - invalid custom values prevent export - export mode disables toolbar controls during a running task - [ ] **Step 2: Run tests to verify they fail** Run: `npm test -- tests/market-content-entry.test.ts -t "export range"` Expected: FAIL because the toolbar has no range selector or custom input behavior. - [ ] **Step 3: Write the minimal implementation** Update `plugin-toolbar.ts` to: - add an export-range `` - add status text support - expose helpers for reading range state and toggling disabled/running UI - [ ] **Step 4: Run tests to verify they pass** Run: `npm test -- tests/market-content-entry.test.ts -t "export range"` Expected: PASS - [ ] **Step 5: Commit** ```bash git add src/content/market/plugin-toolbar.ts tests/market-content-entry.test.ts git commit -m "feat: add export range toolbar controls" ``` ### Task 2: Add Batch Export Coverage **Files:** - Modify: `tests/market-content-entry.test.ts` - Modify: `tests/market-dom-sync.test.ts` - Test: `tests/market-content-entry.test.ts` - [ ] **Step 1: Write the failing tests** Add tests that assert: - `当前页` exports only the current page - `前5页` iterates through pages until it reaches page 5 or runs out of pages - `全部` stops when the next-page control is no longer usable - repeated authors across pages are merged by `authorId` - empty fields from later pages do not erase existing populated fields - page export waits for page signature change before harvesting the next page - [ ] **Step 2: Run tests to verify they fail** Run: `npm test -- tests/market-content-entry.test.ts` Expected: FAIL on the new batch-export expectations. - [ ] **Step 3: Write the minimal implementation scaffolding** Only introduce the minimum new helpers/types needed to make the tests compile: - export range type(s) - page signature helpers - harness utilities in tests - [ ] **Step 4: Run tests to verify the failures are now behavioral** Run: `npm test -- tests/market-content-entry.test.ts` Expected: FAIL because batch export logic is still missing, not because types/selectors are missing. - [ ] **Step 5: Commit** ```bash git add tests/market-content-entry.test.ts tests/market-dom-sync.test.ts src/content/market/types.ts git commit -m "test: cover multi-page export behavior" ``` ### Task 3: Implement Batch Export Controller **Files:** - Create: `src/content/market/export-range-controller.ts` - Modify: `src/content/market/types.ts` - Modify: `src/content/market/dom-sync.ts` - Modify: `src/content/market/result-store.ts` - Test: `tests/market-content-entry.test.ts` - Test: `tests/market-dom-sync.test.ts` - [ ] **Step 1: Write the failing tests** Add focused tests for: - reading a page signature from current DOM - detecting/using the next-page control - merging rows by `authorId` with non-empty-field preference - [ ] **Step 2: Run tests to verify they fail** Run: `npm test -- tests/market-dom-sync.test.ts` Expected: FAIL because these helpers/controller do not exist yet. - [ ] **Step 3: Write the minimal implementation** Implement `export-range-controller.ts` to: - normalize export targets (`current`, `count`, `all`) - harvest current page rows with the existing lazy-load scroll path - read page signatures - click/advance pagination and wait for signature change - merge pages by `authorId` without overwriting non-empty fields - return a final `MarketRecord[]` Keep `dom-sync.ts` focused on DOM reads: - page signature - next-page element lookup - next-page enabled check - [ ] **Step 4: Run tests to verify they pass** Run: - `npm test -- tests/market-dom-sync.test.ts` - `npm test -- tests/market-content-entry.test.ts` Expected: PASS - [ ] **Step 5: Commit** ```bash git add src/content/market/export-range-controller.ts src/content/market/dom-sync.ts src/content/market/result-store.ts src/content/market/types.ts tests/market-content-entry.test.ts tests/market-dom-sync.test.ts git commit -m "feat: add multi-page export controller" ``` ### Task 4: Wire Controller Into Market Entry **Files:** - Modify: `src/content/market/index.ts` - Modify: `src/content/market/plugin-toolbar.ts` - Test: `tests/market-content-entry.test.ts` - [ ] **Step 1: Write the failing tests** Add tests that assert: - `导出CSV` uses the selected range - progress text updates while exporting - controls are re-enabled on success and failure - invalid custom input blocks export without calling CSV builder - [ ] **Step 2: Run tests to verify they fail** Run: `npm test -- tests/market-content-entry.test.ts` Expected: FAIL because `market/index.ts` still always exports current-page records. - [ ] **Step 3: Write the minimal implementation** Update `market/index.ts` to: - parse toolbar export range - keep current-page export for `当前页` - delegate batch modes to `export-range-controller.ts` - update toolbar running/error/progress state - preserve existing current-page lazy-load harvest path - [ ] **Step 4: Run tests to verify they pass** Run: `npm test -- tests/market-content-entry.test.ts` Expected: PASS - [ ] **Step 5: Commit** ```bash git add src/content/market/index.ts src/content/market/plugin-toolbar.ts tests/market-content-entry.test.ts git commit -m "feat: wire export range selection into market export" ``` ### Task 5: Verify End-To-End **Files:** - Modify: `docs/superpowers/plans/2026-04-21-market-export-range.md` - [ ] **Step 1: Run targeted regression tests** Run: - `npm test -- tests/market-content-entry.test.ts` - `npm test -- tests/market-dom-sync.test.ts` Expected: PASS - [ ] **Step 2: Run the full suite** Run: `npm test` Expected: PASS with all test files green. - [ ] **Step 3: Run the build** Run: `npm run build` Expected: PASS and emit updated `dist/` bundles. - [ ] **Step 4: Mark the plan status** Update this document’s checkboxes to reflect completed steps. - [ ] **Step 5: Commit** ```bash git add docs/superpowers/plans/2026-04-21-market-export-range.md git commit -m "docs: record export range implementation progress" ```