{
  "schema": "high-signal-file-index/1",
  "repository": "youtube-transcript-to-pdf",
  "note": "Runtime, tools, tests and CI. Regenerate with npm run docs:generate; validate with npm run lint:docs.",
  "files": [
    {
      "path": ".github/workflows/ci.yml",
      "kind": "config",
      "lines": 79,
      "description": "Maintained config: .github/workflows/ci.yml.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "manifest.json",
      "kind": "config",
      "lines": 37,
      "description": "Manifest V3 declaration: permissions, host permissions, service worker, popup, icons.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "package.json",
      "kind": "config",
      "lines": 37,
      "description": "npm scripts for validation, tests, doc index checks, and packaging. Zero dependencies.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "scripts/build-store-assets.mjs",
      "kind": "tooling",
      "lines": 199,
      "description": "Renders the real popup and viewer markup into screenshot harness pages and generates a genuine PDF, for Chrome Web Store assets.",
      "exports": [],
      "depends_on": [
        "src/lib/transcript.js",
        "src/lib/pdf.js",
        "src/lib/youtube.js"
      ]
    },
    {
      "path": "scripts/check-doc-indexes.mjs",
      "kind": "tooling",
      "lines": 134,
      "description": "Path-validates the documentation retrieval indexes; --prune removes dead entries.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "scripts/check-syntax.mjs",
      "kind": "tooling",
      "lines": 19,
      "description": "Maintained tooling: scripts/check-syntax.mjs.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "scripts/compose-store-screenshots.py",
      "kind": "tooling",
      "lines": 286,
      "description": "Composes captured harness renders into the 1280x800 store screenshots and the 440x280 promo tile.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "scripts/generate-doc-index.mjs",
      "kind": "tooling",
      "lines": 77,
      "description": "Maintained tooling: scripts/generate-doc-index.mjs.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "scripts/generate-icons.py",
      "kind": "tooling",
      "lines": 104,
      "description": "Draws the extension's icon set — a document mark on the project's red field — at every declared size, with size-aware detail.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "scripts/package-extension.mjs",
      "kind": "tooling",
      "lines": 50,
      "description": "Builds the Chrome Web Store archive from only the files Chrome loads.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "scripts/validate-manifest.mjs",
      "kind": "tooling",
      "lines": 184,
      "description": "Validates manifest shape, referenced files, icon PNG signatures and real pixel dimensions, and absence of Manifest V2 keys.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "src/background/service-worker.js",
      "kind": "source",
      "lines": 340,
      "description": "MV3 service worker. Owns all network and tab work; runs the direct-download and transcript-panel strategies; message contract with the popup.",
      "exports": [],
      "depends_on": [
        "src/lib/youtube.js",
        "src/lib/transcript.js"
      ]
    },
    {
      "path": "src/content/scrape-transcript.js",
      "kind": "source",
      "lines": 209,
      "description": "Injected transcript-panel reader. Handles both YouTube markup generations plus a structural fallback. The most fragile file in the repo.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "src/lib/pdf.js",
      "kind": "source",
      "lines": 371,
      "description": "Dependency-free PDF 1.4 writer: toWinAnsi, wrapText, buildTranscriptPdf, toSafeFilename. Helvetica AFM metrics, verified xref table.",
      "exports": [
        "toWinAnsi",
        "wrapText",
        "buildTranscriptPdf",
        "toSafeFilename"
      ],
      "depends_on": []
    },
    {
      "path": "src/lib/transcript.js",
      "kind": "source",
      "lines": 239,
      "description": "Pure caption parsing and formatting: parseJson3, parseTimedTextXml, parseCaptions, formatTimestamp, groupIntoParagraphs, renderText.",
      "exports": [
        "parseJson3",
        "parseTimedTextXml",
        "parseCaptions",
        "formatTimestamp",
        "groupIntoParagraphs",
        "renderText"
      ],
      "depends_on": []
    },
    {
      "path": "src/lib/youtube.js",
      "kind": "source",
      "lines": 234,
      "description": "Pure YouTube URL parsing and watch-page scraping: parseVideoId, parseWatchPage, pickTrack, extractJsonVar, watchUrl.",
      "exports": [
        "parseVideoId",
        "watchUrl",
        "extractJsonVar",
        "parseWatchPage",
        "pickTrack"
      ],
      "depends_on": []
    },
    {
      "path": "src/popup/popup.css",
      "kind": "style",
      "lines": 144,
      "description": "Popup styles with light and dark palettes.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "src/popup/popup.html",
      "kind": "markup",
      "lines": 62,
      "description": "Popup markup. Module script only, no inline handlers.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "src/popup/popup.js",
      "kind": "source",
      "lines": 347,
      "description": "Popup controller: prefill, fetch, preview, PDF download, print handoff, clipboard, persisted options.",
      "exports": [],
      "depends_on": [
        "src/lib/youtube.js",
        "src/lib/transcript.js",
        "src/lib/pdf.js"
      ]
    },
    {
      "path": "src/viewer/viewer.css",
      "kind": "style",
      "lines": 81,
      "description": "Viewer styles including print rules.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "src/viewer/viewer.html",
      "kind": "markup",
      "lines": 16,
      "description": "Printable viewer markup.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "src/viewer/viewer.js",
      "kind": "source",
      "lines": 86,
      "description": "Printable viewer. Reads a one-shot payload from session storage, deletes it, renders for Chrome print-to-PDF.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "test/content-script.test.js",
      "kind": "test",
      "lines": 132,
      "description": "Behavioral regression tests for content-script.test.js.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "test/pdf.test.js",
      "kind": "test",
      "lines": 227,
      "description": "Tests: transliteration, word wrap, PDF structural validity including byte-accurate xref offsets, pagination, filenames.",
      "exports": [],
      "depends_on": [
        "src/lib/pdf.js"
      ]
    },
    {
      "path": "test/popup.test.js",
      "kind": "test",
      "lines": 212,
      "description": "Behavioral regression tests for popup.test.js.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "test/service-worker.test.js",
      "kind": "test",
      "lines": 184,
      "description": "Behavioral regression tests for service-worker.test.js.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "test/store_assets_test.py",
      "kind": "test",
      "lines": 51,
      "description": "Behavioral regression tests for store_assets_test.py.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "test/tooling.test.js",
      "kind": "test",
      "lines": 295,
      "description": "Behavioral regression tests for tooling.test.js.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "test/transcript.test.js",
      "kind": "test",
      "lines": 150,
      "description": "Tests: json3 and XML parsing, empty bodies, timestamps, paragraph grouping, render options.",
      "exports": [],
      "depends_on": [
        "src/lib/transcript.js"
      ]
    },
    {
      "path": "test/viewer.test.js",
      "kind": "test",
      "lines": 89,
      "description": "Behavioral regression tests for viewer.test.js.",
      "exports": [],
      "depends_on": []
    },
    {
      "path": "test/youtube.test.js",
      "kind": "test",
      "lines": 136,
      "description": "Tests: URL shapes, hostname allowlist, watch-page parsing, fallbacks, parsed flag, track selection.",
      "exports": [],
      "depends_on": [
        "src/lib/youtube.js"
      ]
    }
  ]
}
