Files
snowflake-notes/AGENTS.md
T

93 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS 指南(本仓库)
本仓库用于搭建一套基于 Astro 的内部学习博客站点。目标:TypeScript 严格(拒绝 any)、代码与文档统一格式化、内容格式可扩展(不仅限于 Markdown),图片优先走外部 OSS,不建议把图片直接提交进仓库。
## 工作流原则
- 语言与文档:优先中文说明;代码与注释保持简洁明确。
- TypeScript 严格:启用 `strict``noImplicitAny`ESLint 禁止 `any`
- 格式化:统一使用 Prettier(含 Astro、Markdown);提交前请执行 `pnpm format` 或启用编辑器保存自动格式化。
- 类型与检查:强制显式函数返回类型,禁止隐式 any;建议在 CI 中执行 `pnpm typecheck``pnpm lint`
- 目录结构:见下文“项目结构”。
- 内容来源:默认支持 `md`/`mdx`,并预留可扩展的内容加载层(如将来支持 Typst 等)。
- 图片与静态资源:默认不入库。通过环境变量配置外部 OSS 图床地址,在组件中统一引用。
- `ref/` 目录仅作临时参考:不纳入版本管理与检查(已在 `.gitignore`、TS 与 ESLint 忽略)。
## 项目结构(约定)
- `src/pages`:页面路由(如首页、文章详情)。
- `src/layouts`:页面与文章的布局模版。
- `src/components`:通用组件(如 `Img.astro`)。
- `src/content`Astro Content Collections 与文章内容(`posts`)。
- `src/lib/content`:内容加载抽象层,便于未来扩展除 Markdown 以外的格式。
- `public`:公开静态资源(尽量不要放图片)。
## TypeScript 与 ESLint
- `tsconfig.json` 开启:`strict: true``noImplicitAny: true``noFallthroughCasesInSwitch: true` 等。
- ESLint(使用 Flat Config):统一使用根目录 `eslint.config.js`,不要新增 `.eslintrc.*` 文件;启用 `@typescript-eslint/no-explicit-any: error` 等类型感知规则,并结合 Astro 插件。
## 格式化
- Prettier 统一代码、Astro 与 Markdown 的格式。
- 命令:`pnpm format` 全量格式化,`pnpm format:check` 校验。
## 内容与多格式扩展
- 文章位于 `src/content/posts`,默认使用 Astro Content Collections`config.ts`)定义元数据 Schema。
- 已提供 `src/lib/content` 抽象:
- 通过扩展“加载器(loader)”注册新的后缀(如 `.typ`)。
- 新增格式时,请实现接口并在注册表中添加映射,无需改动现有渲染逻辑。
## 图片与外部 OSS 配置
- 使用 `PUBLIC_MEDIA_BASE_URL` 指定外部图床(OSS/CDN)前缀。
- 组件 `src/components/Img.astro` 会根据配置拼接完整图片地址。
- 若必须本地存放,建议放置在 `public/images/`,但该目录默认已在 `.gitignore` 中忽略。
## 开发与运行(建议)
- 包管理器:使用 `pnpm`(无需指定具体版本)。
- 常用脚本:
- `pnpm dev` 启动本地开发(热更新)。
- `pnpm build` 产出静态文件。
- `pnpm preview` 预览构建结果。
- `pnpm lint` 代码检查;`pnpm typecheck` 类型检查;`pnpm format` 统一格式化。
### 开始工作前(必做)
- 同步最新代码:`git fetch --all --prune && git pull --rebase`
- 浏览近期提交:`git log --oneline --decorate --graph -n 20`
- 关注分支差异:`git diff --stat origin/$(git rev-parse --abbrev-ref HEAD)...HEAD`
- 若锁文件变更:`pnpm install`(保持本地依赖与团队一致)
- 新任务建议开分支:`git switch -c feature/<topic>`;提交信息用中文清晰描述变更意图
### 类型生成与 Astro 同步(重要)
- Astro 的高保真类型来自 `.astro/types.d.ts`,由 `astro dev``astro sync` 生成。
- Node 要求:`>= 18.20.8`(建议 `>= 20`)。Node 版本不足会导致 `astro sync` 失败,类型退化为 `any`(如 `getCollection(...args: any[]): any`)。
- 操作规范:
- 在“非沙盒/本机环境”执行:`pnpm astro sync``pnpm dev`,以生成 `.astro/types.d.ts`
- 如在沙盒内执行需要更高权限,请先申请再运行,或直接在沙盒外执行。
- 若类型仍不生效:删除 `.astro/` 后重跑 `pnpm sync`;确保编辑器使用工作区 TypeScript 版本。
### 依赖版本策略
- 版本范围由 pnpm 写入:不要在 `package.json` 手写 `latest` 或具体版本号。
- 默认使用 caret 范围(`^x.x.x`):
- 新增依赖:`pnpm add <pkg>`(由 pnpm 写入 `^` 范围)。
- 升级依赖:`pnpm up <pkg> -L`(按范围更新到可用最新)。
- Node 版本:`>=20`(见 `package.json``engines.node`)。
- CI 构建建议使用:`pnpm install --frozen-lockfile` 保证可重复。
## 代码提交规范(简要)
- 小步提交,信息清晰:`feat: ...` / `fix: ...` / `docs: ...` / `chore: ...` 等。
- 不提交大体积二进制与图片,图片走外部 OSS。
## 注意事项
- 任何需要引入新内容格式,请优先在 `src/lib/content` 添加 loader,而不是在页面层做分支判断。
- 若需新增全局配置项,请优先考虑使用 `PUBLIC_` 前缀暴露给客户端,或通过服务器端/构建时注入。
- 路由与 getStaticPaths:对 rest 参数页面(如 `src/pages/posts/[...slug].astro`),`params.slug` 必须是字符串(包含斜杠的完整路径),不能返回数组;推荐将 `getStaticPaths` 放在独立的 TS 文件并显式标注类型(见 `src/pages/posts/getStaticPaths.ts`)。