Skip to content

feat(token-forge): implement P1-005 safe exports - #3

Merged
margrop merged 1 commit into
mainfrom
agent/p1-005-safe-exports
Jul 25, 2026
Merged

margrop merged 1 commit into
mainfrom
agent/p1-005-safe-exports

Conversation

@margrop

@margrop margrop commented Jul 25, 2026

Copy link
Copy Markdown
Owner

What

实现 P1-005 的完全本地 Markdown / GitHub Issue 草稿导出:

  • 新增 token-forge-export-v1 Schema 和合成 fixture;
  • 从验证后的 Token Forge v1 计划生成完整 Markdown;
  • 为每个任务生成可单独复制的 Issue 标题和正文,并提供合集 Markdown;
  • 增加允许字段脱敏、Secret 拒绝、文件路径移除、Markdown/HTML 转义、GitHub mention/Issue 引用中和及 UTF-8 大小上限;
  • 抽取并强化通用 Markdown 下载文件名净化,供现有 ExportActions 使用;
  • 同步 Token Forge、UI、Schema、根 README 和 TODO 文档。

明确不包含 GitHub API 写操作、Token Forge 正式页面、真实 Analytics、网络、存储或部署。

Tracking

  • TODO/Issue: P1-005
  • Lab: Token Forge

Verification

ASTRO_TELEMETRY_DISABLED=1 npm run validate
PASS: Prettier, ESLint, TypeScript, 10 test files / 112 tests, Astro build, 20 static contracts

npx vitest run apps/web/src/lib/export-safety.test.ts apps/web/src/lib/token-forge-exports.test.ts
PASS: 22/22

Product and safety

  • 有无需登录、无需 AI 的合成样例路径
  • 确定性结果与 AI 解释明确区分
  • 输入不会进入 URL、日志、Analytics 或测试快照
  • AI 请求已最小化、脱敏、限流并可降级(本 PR 不新增 AI 请求)
  • 移动端和键盘关键路径已验证(本 PR 无新页面;现有静态合同仍通过)
  • 相关文章、文档、Schema 和 lab.json 已同步(无文章或 lab.json 状态变更)
  • 没有新增未说明依赖、存储或生产写操作

Cost / privacy / accessibility

导出完全本地且不消耗 AI Token。单个 Issue 正文上限 64 KiB,完整计划和 Issue 合集各 128 KiB。标识符和文件路径脱敏,Secret 失败关闭;固定安全文件名可由现有复制/下载组件消费。没有新增依赖、存储、Analytics、网络或 UI。

Known limitations

  • 尚未接入 /token-forge/ 正式页面;
  • 不自动创建 GitHub Issue,也不请求 GitHub Token;
  • 导出器不接收仓库原文,任意普通句子的源码回显仍依赖 P1-004 检测;
  • 真实浏览器剪贴板和下载回归留给 P1-006 页面接入。

@margrop
margrop marked this pull request as ready for review July 25, 2026 06:02
@margrop
margrop merged commit 9e92256 into main Jul 25, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant