mirror of
https://github.com/d0zingcat/BroadcastChannel.git
synced 2026-05-13 15:09:12 +00:00
Replaces PostCSS-based styling with Tailwind CSS v4 via Vite plugin Converts all .js files to .ts with proper type annotations Adds comprehensive type definitions for Telegram data structures Extracts reusable UI components and standardizes class utilities Improves maintainability by eliminating custom CSS in favor of Tailwind utilities and design tokens Enhances type safety across Telegram parsing, env access, and API routes Centralizes agent guidelines in AGENTS.md following repository standards Upgrades iconography to astro-icon with Remix Icon integration Expands accessible HTML patterns including ARIA labels, semantic navigation, and keyboard interaction support Refactors static proxy logic into shared utility functions Consolidates modal and image preview markup for consistency
7.6 KiB
7.6 KiB
Repository Guidelines for Coding Agents
1. Scope
- This repository is an Astro 5 SSR site that turns Telegram channels into a microblog.
- Use this file as the main repo-specific guide for coding agents working in this project.
- Prefer small, surgical changes that match the existing code style and structure.
- Assume server-rendered HTML is the default; client-side JavaScript is intentionally minimal.
2. Instruction Sources
- Root
AGENTS.mdis the maintained agent guide for this repository. - No
.cursor/rules/**,.cursorrules, or.github/copilot-instructions.mdfiles were found. - If Cursor or Copilot rules are added later, merge them into this file.
CLAUDE.mdis an older short copy; prefer this file when they disagree.
3. Project Snapshot
- Package manager:
pnpmonly. - Preferred Node version:
v22. - Framework:
astro@5. - Lint stack:
eslint@9+@antfu/eslint-config+eslint-plugin-astro+eslint-plugin-format. - Styling: Tailwind CSS v4 via
@tailwindcss/vite.
4. Repository Map
src/pages/: Astro pages and API-style route handlers.src/components/: reusable UI pieces and page fragments.src/layouts/: page shells likebase.astro.src/lib/: Telegram fetching, parsing, env access, proxying, and shared logic.src/types.ts: shared domain interfaces.dist/,.astro/, andnode_modules/: generated output; do not hand-edit.
5. Core Commands
pnpm install
pnpm dev
pnpm start
pnpm build
pnpm preview
pnpm lint:fix
pnpm eslint <path>is the supported focused lint command.- Use
pnpm astro ...only when a task specifically needs extra Astro CLI behavior.
6. Testing Reality
- There is currently no automated test runner in this repo.
- There is no
pnpm testscript. - No Vitest, Jest, Playwright, or Cypress config files are present.
- No
*.test.*or*.spec.*files are present.
Single-test guidance
- There is currently no supported "run a single test" command.
- If asked to run a single test, say so explicitly instead of inventing a command.
- Use
pnpm eslint <path>for a narrow static check. - Use
pnpm build && pnpm previewplus manual route verification for behavior checks.
7. Recommended Validation
- Small refactor or one-file logic change:
pnpm eslint <file>thenpnpm lint. - UI or route change:
pnpm lint, thenpnpm build, thenpnpm preview. - Feed, metadata, or sitemap change: verify
/rss.xml,/rss.json, and/sitemap.xmlmanually in preview. - Telegram parsing or proxy change: validate home, one post page, RSS output, and the relevant
/static/...path. - Env/config change: update docs and validate behavior with representative env values.
8. Formatting Rules
- Follow ESLint as the formatting source of truth; do not fight the auto-fixer.
- Indentation: 2 spaces.
- Line endings: LF.
- Charset: UTF-8.
- Quotes: single quotes.
- Semicolons are typically omitted.
- Trailing commas should follow linter/formatter output.
- Do not do unrelated whitespace churn.
9. Imports
- Use
import typefor type-only imports. - Keep side-effect imports explicit, e.g. CSS, locale packs, and Prism language loaders.
- No path aliases are configured in
tsconfig.json; use relative imports. - Let ESLint decide final import ordering; run
pnpm lint:fixafter adding or moving imports. - Avoid unused imports.
10. Naming Conventions
- Keep route filenames aligned with Astro routing:
index.astro,[id].astro,[...url].ts,rss.xml.ts, etc. - Reusable new Astro components should prefer
PascalCase.astro. - Preserve neighboring conventions when editing older lowercase Astro files like
header.astro,item.astro, orbase.astro. - New helper modules should use descriptive kebab-case names when that matches existing utilities.
- Environment variables use uppercase snake case.
- Shared interfaces and types use PascalCase names.
11. Types
- Prefer explicit interfaces for shared domain shapes in
src/types.ts. - Keep shared type definitions centralized instead of re-declaring them across files.
- Prefer narrow unions when the allowed values are known, e.g.
'text' | 'service'. - Avoid
any; useunknown, proper interfaces, or generics. - Type exported handlers and helpers when practical, e.g.
APIRoute, explicit return types, or typed props. - In Astro files, keep prop shapes obvious near the top of frontmatter.
12. Astro and UI Patterns
- Keep page frontmatter focused on loading data and preparing view state.
- Push reusable logic into
src/lib/instead of repeating it inside pages. - Use
Astro.localsfor request-scoped values set by middleware. - API-style routes in
src/pages/*.tsshould returnResponse/Response.json, not Express-like objects. - Prefer semantic HTML and accessible labels.
- Keep browser-side JS near zero; the current deliberate exception is the Telegram comments widget.
- Do not add
client:*directives or inline scripts unless the feature genuinely requires them. - Tailwind utility classes are used heavily in
.astrofiles. - For long class strings, follow the existing pattern of extracting them into constants above the markup.
- Reuse existing visual tokens and accessible structures instead of inventing near-duplicates.
13. Error Handling
- Fail fast for required server-side configuration, e.g. throw when mandatory env values are missing.
- In request handlers, catch unknown errors only when you can convert them into an explicit HTTP response.
- When catching, narrow with
instanceof Errorbefore reading.message. - Do not silently swallow fetch or parsing failures.
- Keep error messages actionable and specific.
14. External Fetching, Parsing, and HTML Safety
- Telegram fetching and parsing live in
src/lib/telegram/index.ts; keep new scraping logic there. - Preserve the static proxy whitelist behavior in
src/lib/static-proxy.tsunless the task explicitly changes the security model. - When proxying or forwarding requests, be careful with headers and target validation.
set:htmlis already used in a few places; only feed it sanitized or internally generated HTML.- If introducing new HTML transformations for feeds or pages, sanitize external content first.
- Avoid mutating cached data objects in-place when extending cached flows.
15. Env and Config Notes
- Never commit real secrets or tokens.
- Update
.env.examplewhen introducing, removing, or renaming env variables. - Update README docs when env behavior changes.
- Prefer actual code usage over stale README text if they conflict.
- Important current code-level env names include
CHANNEL,LOCALE,TIMEZONE,TELEGRAM_HOST,STATIC_PROXY,COMMENTS,REACTIONS,NOINDEX,NOFOLLOW,RSS_BEAUTIFY,TAGS,LINKS,NAVS,HEADER_INJECT, andFOOTER_INJECT. - Note that
PODCASRTis the current code-level env key inheader.astro; keep compatibility in mind unless intentionally correcting it everywhere.
16. Build and Deployment Notes
astro.config.mjsselects adapters for Vercel, Cloudflare Pages, Netlify, Node, and EdgeOne.- The app is configured with
output: 'server'. - Do not change adapter logic casually; deployment behavior depends on environment detection.
- If you touch build configuration, run
pnpm buildbefore finishing.
17. Working Style
- Inspect nearby files before editing to match local conventions.
- Prefer updating existing patterns over introducing new abstractions.
- Keep comments sparse and explain why, not what.
- If a task would benefit from automated tests, note that the repo currently lacks a test harness instead of pretending one exists.
- If you add a real test runner in the future, update
package.json, this file, and the single-test instructions together.