Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions .agents/skills/innoseed-apply/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
---
name: innoseed-apply
description: Change InnOSeed /apply form fields, tag encode/decode mirrors, interviewers, and Feishu Bitable-related apply payload handling. Use when editing src/content/apply.ts, pages/Apply.tsx, api/apply.ts, scripts/test-tag-codes.mjs, INTERVIEWERS, or tagcode interoperability.
---

# InnOSeed Apply

`/apply` 表单、个性标签 encode/decode、面试官名单、以及三处镜像对齐的可执行流程。上线走 `innoseed-deploy`;招新**文案**若在 `site.ts` 的 Recruit 块,走 `innoseed-content`。

## 何时触发

- 改表单字段 / 步骤 UI(`Apply.tsx` + `apply.ts` 类型与选项)
- 改 `encodeTagCode` / `decodeTagCode` / `encodeApplyCode` / `decodeApplyCode`
- 改 `INTERVIEWERS` 或需要同步 `INTERVIEWER_MAP` env
- 改 `api/apply.ts` 的 `ApplyRequest` / 服务端校验 / Bitable 写入路径
- 改 `scripts/test-tag-codes.mjs` 镜像或 `pnpm test:tag-codes` 失败

## 必读文件

| 文件 | 为何 |
| --- | --- |
| `src/content/apply.ts` | **浏览器侧单源**:categories / tags / INTERVIEWERS / encode·decode |
| `api/apply.ts` | Vercel Function;**不能**跨文件 import 浏览器模块,故含 inlined 副本 + `ApplyRequest` |
| `scripts/test-tag-codes.mjs` | Node 手写镜像;`pnpm test:tag-codes` 验三处对齐 |
| `src/pages/Apply.tsx` (+ CSS) | 4 步 UI / step state |
| `e2e/apply.spec.js` | mock `/api/apply`,勿打真后端 |
| `aliyun-fc/` | 飞书 Bitable 反向解码 webhook(只在此子目录维护) |

## 提醒(详见 AGENTS.md)

- payload 不可信:server-side **必须** re-derive tag indices。
- `INTERVIEWER_MAP` 等 secret 只进 Vercel env,不进前端。
- `applyHandle(request)` 签名不要为「图方便」改掉。
- `api/apply.ts` 顶部的 `// mirror of src/content/apply.ts#...` 注释链保持可读。

## 分步流程

### 改表单字段 / 选项 / 类型

1. 改 `src/content/apply.ts`(`ApplyTag` / `APPLY_CATEGORIES` / 相关类型)。
2. 同步 `src/pages/Apply.tsx` 的 UI 与校验文案。
3. 同步 `api/apply.ts` 的 `ApplyRequest`(及任何 inlined 选项副本)。
4. 若选项下标语义变了,更新 `scripts/test-tag-codes.mjs` 样例与断言。
5. 跑 `pnpm test:tag-codes` + apply e2e。

### 改 encode / decode(最高风险)

这两个(四函数)逻辑是**单源意图**,被三处消费:

1. `src/content/apply.ts` — 浏览器
2. `api/apply.ts` — Vercel Function(inlined 副本)
3. `scripts/test-tag-codes.mjs` — Node 手写镜像

**改一处 → 必须同步另两处。** 格式契约(勿无故破坏旧 code 可读性):

- Tag code:`categoryIndex:tagIndices...` 段用 `;` 连接 → base64(`btoa` / `Buffer` 双运行时)
- Apply code:`{ivCode}|{base64TagCode}`;无面试官时 iv 占位 `_`

改完:

```bash
pnpm test:tag-codes
```

必要时同步 `aliyun-fc/` 若 webhook 内还有解码副本(先读该目录现有实现,勿假设无副本)。

### 改面试官 roster

1. 只改 `src/content/apply.ts` 的 `INTERVIEWERS`(并同步 `api/apply.ts` 的 inlined 列表)。
2. roster 的 code / 飞书 Person 映射变了 → 更新 Vercel 上的 `INTERVIEWER_MAP` env(**不要**写进仓库)。
3. 跑 `pnpm test:tag-codes`(含 iv 组合样例时)+ `pnpm test:e2e`(apply spec)。

### 接 / 改飞书 Bitable

1. 读 `api/apply.ts` 顶部注释列出的目标(Bitable / Airtable / Vercel KV / Notion);**Bitable 首选**。
2. 保持 `applyHandle(request)` 入口稳定。
3. 反向解码与多选字段写入优先落在 `aliyun-fc/`,不要把 FC 逻辑塞进前端。

## 本任务验证子集

```bash
pnpm typecheck
pnpm exec tsc -p tsconfig.node.json
pnpm build
pnpm test:tag-codes
pnpm test:e2e
```

- apply 相关 UI 断言以 `e2e/apply.spec.js` 为准(已 mock API)。
70 changes: 70 additions & 0 deletions .agents/skills/innoseed-content/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
name: innoseed-content
description: Edit InnOSeed landing copy, SEO meta, NAV_LINKS, section anchors, and MINICAMP content in site.ts / index.html. Use when changing Chinese site copy, Hero/Footer/Recruit text, navigation entries, og tags, or Mini Camp page content (not host/DNS — that is innoseed-deploy).
---

# InnOSeed Content

文案 / SEO / 导航 / section 锚点 / Mini Camp **内容块**的可执行流程。视觉 token 走 `innoseed-visual`;子域名 host 走 `innoseed-deploy`。

## 何时触发

- 改 `src/content/site.ts` 里的文案常量(Hero / Manifesto / Pillars / Members / Events / Recruit / Footer / MINICAMP 等)
- 改 `NAV_LINKS` 或新增/重命名 section 锚点
- 改 SEO:`META`、`index.html` head、`og:*` / `meta description`
- 改 Mini Camp **页面文案/结构数据**(不是 DNS / hostname)

## 必读文件

| 文件 | 为何 |
| --- | --- |
| `src/content/site.ts` | **唯一文案源**(`TAGLINE` / `META` / `NAV_LINKS` / 各 section / `MINICAMP`) |
| `index.html` | 静态 head:`og:description` / `meta description` / preload;改 Hero 文案时常要同步 |
| `AGENTS.md` §5 | 路由表与现有锚点列表 |
| `e2e/_shared.js` + 对应 viewport spec | 锚点 / 「渲染存在」回归 |
| `src/hooks/usePageMeta.ts`(若存在) | 路由级 meta 注入 |

## 提醒(详见 AGENTS.md)

- 文案只改 `site.ts`,不要在组件里散落硬编码中文(已有 `TAGLINE` 等提取约定)。
- 新锚点必须:组件 `id` + `NAV_LINKS` + e2e 仍过。
- 涉及 `spec.md` 视觉契约的改动转 `innoseed-visual`;PR 标题加 `[spec]`。

## 分步流程

### 改普通文案

1. 在 `site.ts` 找到对应导出(`HERO` / `RECRUIT` / `FOOTER` / `EVENTS` / `MINICAMP` …)。
2. 若改的是 Hero / 品牌一句话:同步 `index.html` 的 `og:description` / `meta description`,并核对 `META`。
3. 若改 Recruit 时间线 / FAQ:确认只在 `site.ts`(及 Recruit 组件读取处),不要复制第二份。
4. 跑本任务验证子集。

### 改导航 / 新增 section 锚点

1. 在目标 section 组件根节点加稳定 `id`(与现有风格一致)。
2. 更新 `NAV_LINKS`(label + href,如 `#pillars`)。
3. 确认首页实际渲染该 section(`App.tsx` 组装顺序)。
4. 跑 `pnpm test:e2e`,确认 `checkNavSmoothScroll` 与各 viewport「渲染存在」断言仍绿。
5. 现有锚点:`#top` `#manifesto` `#pillars` `#members` `#events` `#recruit`。

### 改 SEO meta

1. `site.ts` 的 `META`(及路由用到的 title/description 字段)。
2. `index.html` head 静态标签(首屏 / 无 JS 爬虫可见部分)。
3. 若某路由用 `usePageMeta` / JSON-LD,核对该路由的 `og:url` / `og:title` / `og:description`。
4. 不要引入新的第三方 SEO CDN。

### 改 Mini Camp 内容

1. 改 `site.ts` 的 `MINICAMP` 块与 `pages/MiniCamp.tsx` / 相关 CSS。
2. **不要**在本 skill 里改 DNS、`verify-subdomain`、hostname 分支 —— 那是 `innoseed-deploy`。
3. 主站 chrome vs 子域名 chrome 的行为回归:若只改文案,e2e 即可;若改了 host 分支,转 deploy skill 跑 `pnpm verify:subdomain`。

## 本任务验证子集

```bash
pnpm typecheck && pnpm build && pnpm test:e2e
```

- 改了锚点 / 新 section → 确认对应 viewport spec 有「渲染存在」覆盖。
- 不要删 `e2e/_shared.js` 断言来「跳过」。
Loading
Loading