Tuckmark
Tuckmark 是一个 agent-native label printing workspace,统一承载打印机发现、能力探测、模板渲染、批量预览、位图打印,以及 CLI、MCP、HTTP 和 Web surfaces(README.md)。
- TypeScript web
- React app
- Storybook component QA
- Playwright e2e
- MCP server
- Developer utility
- Progressive web app
- Application icon
- PR label release
- Release failure notification
- Quality gates
- Worktree bootstrap
目录
技术栈
运行与交付
- CI 工作流
- ci-main.yml
- ci-pr.yml
- label-gate.yml
- notify-release-failure.yml
- pages.yml
- release.yml
- 能力标记
- bun_lock
- github_actions
- package_json
- pnpm_lock
依赖与工具
- package.json
- 开发依赖
- @biomejs/biome
- @commitlint/cli
- @commitlint/config-conventional
- @types/node
- 项目脚本
- build
- build:packages
- build:web
- build:web:pages
配置与质量
- 配置文件
- .env.example
- .env.local.example
- .gitignore
- .gitmodules
其他信息
- Package manager
bun@1.3.14
{
"ci_workflows": [
"ci-main.yml",
"ci-pr.yml",
"label-gate.yml",
"notify-release-failure.yml",
"pages.yml",
"release.yml"
],
"configs_root": [
".env.example",
".env.local.example",
".gitignore",
".gitmodules",
"biome.json",
"lefthook.yml",
"package.json",
"pnpm-lock.yaml",
"pnpm-workspace.yaml",
"tsconfig.base.json"
],
"markers_present": [
"bun_lock",
"github_actions",
"package_json",
"pnpm_lock"
],
"package_json": {
"deps_dev": [
"@biomejs/biome",
"@commitlint/cli",
"@commitlint/config-conventional",
"@types/node",
"bwip-js",
"lefthook",
"playwright",
"tsx",
"typescript",
"vitest"
],
"scripts": [
"build",
"build:packages",
"build:web",
"build:web:pages",
"check",
"dev:cli",
"dev:data:prepare",
"dev:mcp",
"dev:preview",
"dev:server",
"dev:storybook",
"dev:web",
"format",
"format:check",
"lint",
"practice:agent-templates",
"prepare",
"preview:web:pages",
"setup",
"test"
]
},
"package_manager": "bun@1.3.14"
}Purpose
Tuckmark 是一个 agent-native label printing workspace,统一承载打印机发现、能力探测、模板渲染、批量预览、位图打印,以及 CLI、MCP、HTTP 和 Web surfaces(README.md)。它位于 detonger 之上:Tuckmark 负责产品级模板、库存与运行时边界,detonger submodule 负责更低层的传输和控制;本项目不把物理打印能力隐式暴露给任意 Agent,server-side print 仍需显式开关和 capability checks(README.md、docs/specs/m2ksq-tuckmark-bun-pages-release-contract-initialization/SPEC.md)。
Taxonomy
- Tags: TypeScript web, React app, Storybook component QA, Playwright e2e, MCP server, Developer utility, Progressive web app, Application icon, PR label release, Release failure notification, Quality gates, Worktree bootstrap
- Why / evidence: 这些 tags 来自 checked-out repo 和 catalog record。主要证据包括
package.json、pnpm-workspace.yaml、apps/web/package.json、apps/web/playwright.config.ts、apps/web/src/app.stories.tsx、packages/mcp/、.github/quality-gates.json、.github/workflows/label-gate.yml、.github/workflows/release.yml,以及lefthook.yml、scripts/setup.ts、scripts/sync-worktree-resources.ts、scripts/test-worktree-bootstrap.ts和docs/specs/m2ksq-tuckmark-bun-pages-release-contract-initialization/SPEC.md。Topic token 的大小写以对应技术/工作流的官方写法为准;slug 只作为稳定 ID,不直接充当项目标题。
Repository map
packages/core维护共享领域模型、渲染、artifact storage 和detongerintegration;packages/server提供 HTTP API;packages/cli和packages/mcp暴露操作与 Agent-facing surfaces。apps/web是正式 Web app,同时产出 browser-static Pages bundle;plugins/inventory保存库存和 data-directory template domain。detonger以 git submodule 形式存在。scripts/setup.ts负责初始化 submodule、安装 hooks 和同步本地资源;.github/则拆出 CI、质量门禁、Pages 与 durable release pipeline。
Runtime and delivery
Tuckmark 以 Bun workspace 为主要本地工具链,package.json 的 setup、dev:preview、dev:server、dev:web、dev:storybook、test、check 和 build scripts 区分完整产品预览、单独 Web、组件工作和 Pages 发布。默认 dev:preview 同时启动 packages/server 与 apps/web,并为当前 worktree 解析独立的 DEVD instance 和 data directory;正式用户数据不会被隐式复制(README.md、scripts/dev-preview.ts、scripts/dev-data-prepare.ts)。
lefthook.yml 的 post-checkout command 调用 scripts/sync-worktree-resources.ts,pre-commit 负责 format,commit-msg 负责 commitlint。scripts/test-worktree-bootstrap.ts 创建真实 linked worktree,重复执行资源同步并验证 .env.local 的缺失文件恢复,因此这里的 Worktree bootstrap 是 repo-owned、幂等、copy-missing 的 readiness contract,而不是某个维护者的口头步骤(lefthook.yml、scripts/test-worktree-bootstrap.ts)。
发布面使用 PR labels 作为 release intent,mainline release 由 durable snapshot 生成 bundles、release notes 和 Pages deployment(.github/pr-label-release.json、.github/quality-gates.json、.github/workflows/release.yml、.github/workflows/pages.yml)。
Architecture notes
产品运行时区分 server-http 与 browser-static 两条 surface。Web 端通过显式 API abstraction 连接 server,browser-static 则使用相对 asset URL、PWA manifest、service worker 和版本探针维护离线 shell 与非阻塞更新(docs/specs/m2ksq-tuckmark-bun-pages-release-contract-initialization/SPEC.md、apps/web/src/pwa-lifecycle.ts、apps/web/public/)。模板、库存、设置、备份和 archive 由 DEVD 权威拥有;Web、native CLI 与 Agent Import 通过 named IPC 或 /api/data 进入同一数据边界,避免从 Web 或 Agent 直接猜测本地 data directory(README.md、packages/server/、packages/ipc/)。
打印路径保持隔离:browser-direct path 由浏览器渲染并通过 Web Bluetooth 发送,service-api path 由 server 与 detonger 控制硬件,二者使用不同的显式开关(README.md、apps/web/src/browser-direct-path.ts)。
Workflow and quality gates
bun run check 串联 lint、format check、typecheck、各 package tests、Web tests 与 build;Web 还维护 Vitest、Playwright 和 Storybook interaction/a11y surface(package.json、apps/web/package.json、apps/web/src/*.test.tsx、apps/web/src/*.stories.tsx)。CI 把 PR、main、label gate、release、Pages 和 release failure notification 拆成独立 workflow,并以 .github/quality-gates.json 声明 required checks。Worktree smoke 是独立的 repo-local contract test,不应被普通 Web e2e 替代(scripts/test-worktree-bootstrap.ts、.github/workflows/ci-pr.yml)。
Reusable decisions
- 对多 package Bun workspace,用单一
scripts/setup.ts先初始化 submodule,再安装 hooks 和同步缺失本地资源;让新 linked worktree 可重复执行,而不是依赖当前目录是否碰巧有缓存。 - 生产数据、template archive 和 DEVD instance 通过明确 IPC/data-directory contract 隔离;开发 preview 可以使用 worktree-specific disposable data,但不默认复制正式用户数据(
README.md、scripts/dev-data-prepare.ts)。 - browser-static 的 launch shell、service-worker version cache 和 release metadata 应作为一个 install/runtime contract 维护,而不是把 Pages 当成普通静态文件上传。
- application icon 作为 browser-static 安装面的一部分,应从 canonical mark 派生 regular、maskable 与 Apple 资产,并在发布 bundle 中让 URL 与内容代际一起更新;平台圆角和阴影不应预烘焙进通用源图。
- Worktree bootstrap 只做 copy-missing、幂等同步和必要初始化;已有
.env.local或 worktree-local data 不应被覆盖(scripts/sync-worktree-resources.ts、scripts/test-worktree-bootstrap.ts)。
Risks and open questions
detonger是 submodule,fresh checkout 若未运行git submodule update --init --recursive会缺少底层控制能力;setup 失败应明确暴露,不应伪装成 Web-only 可用(scripts/setup.ts、README.md)。- browser-direct 与 service-api 两条打印路径拥有不同的权限和硬件前提,新增功能不能把一个路径的成功当作另一个路径的验证(
README.md)。 - Pages/browser-static 的 service worker、版本探针和离线缓存是高风险交付面;发布、回滚和 cache readiness 需要继续由 Playwright/Storybook 证据锁住(
docs/specs/m2ksq-tuckmark-bun-pages-release-contract-initialization/SPEC.md)。
Evidence index
README.mdpackage.jsonpnpm-workspace.yamllefthook.ymlscripts/setup.tsscripts/sync-worktree-resources.tsscripts/test-worktree-bootstrap.tsapps/web/package.jsonapps/web/public/manifest.webmanifestapps/web/src/pwa-lifecycle.tsapps/web/src/pwa/docs/specs/m2ksq-tuckmark-bun-pages-release-contract-initialization/SPEC.md.github/quality-gates.json.github/workflows/ci-pr.yml.github/workflows/release.yml
相关内容
Application icon
主题Application icon 记录的是一个产品在安装、主屏、任务栏、Dock 或浏览器应用窗口里被识别时所使用的图标 contract。它区分产品的原始 mark、给普通上下文使用的 regular any icon、可被平台裁切的 maskable icon、Apple touch icon,以及原生 app bundle 图标;它不把这些角色混成一张“看起来像应用图标”的 PNG。
Playwright e2e
主题Playwright e2e 指仓库把真实浏览器里的关键用户流程当成正式质量门禁,而不是“顺手写了几条页面脚本”。它强调的是产品行为验证:路由、认证、交互链路、浏览器 API、嵌入式控制台或多 runtime 页面组合,必须在接近真实使用路径的浏览器环境里被证明可用(projects/blog-26.md、projects/proxy-broker.md、projects/octo-rill.
PR label release
主题PR label release 是逐 PR 的产品发布协议:PR labels 只提供经过 gate 验证的发布操作与发布阶段;最高的合格 final vX.Y.Z Git release tag 是唯一数字版本基线,VERSION 只锁定 trusted preparation 已决定的精确产品版本。label 不能计算、覆盖或为版本提供 fallback。
Quality gates
主题Quality gates 表示仓库把“什么叫可以合并、什么叫可以发布”写成了显式、可审计的契约,并通过本地脚本、CI workflows、review/signature policy、GitHub required checks 或同类机制把它执行出来。它关注的是 gate contract,而不是某一门具体技术。 这个 Topic 用来回答“仓库怎样防止低质量或不完整的改动穿过默认分支”。
React app
主题React app 标记 React 是主要用户界面、管理台、控制台或嵌入式操作面 runtime。这里关心的是 route、component tree、client state、表单流、dashboard 交互和前端构建后的真实运行边界,而不是“项目依赖里有 React”。 这个 Topic 用来回答“用户实际操作的是不是一个 React runtime,以及它在系统里承担什么职责”。
README content contract
主题README content contract 是面向项目入口文档的可审查规范:README 先让目标读者理解产品、边界和下一步,再提供可复现的 Quick Start、集成 contract、交付语义、文档真相源、许可证入口、有限产品 preview,以及有来源的 Logo 和 Badge 入口。
Release failure notification
主题Release failure notification 指一个仓库为所有“预期成功但最终以 failure 结束”的交付 workflow 建立显式、可审查的告警路径。范围包括 release、deploy、CI、Docs Pages 和 required gate,但必须由 checked-in allowlist 声明;成功、skipped、cancelled 和通知 workflow 自身不属于通知条件。
Storybook component QA
主题Storybook component QA 表示仓库把 Storybook 当作组件级文档、状态枚举、视觉检查或 interaction smoke 的稳定入口。它不等同于 Storybook accessibility:只有项目明确引入 a11y addon 或等价 Axe sweep 时,才同时打 accessibility Topic。这个拆分用于避免“只要有 Storybook 就叫 a11y”的误判。
TypeScript web
主题TypeScript web 表示项目把 TypeScript 作为一个或多个 Web surface 的主语言,并围绕它建立 workspace scripts、typecheck、bundler、lint/format、env contract 和前端构建门禁。这里的主语不是“仓库里出现了 .ts 文件”,而是 TypeScript 已经决定了维护者怎样启动、构建、校验和交付实际 Web surface。
Worktree bootstrap
主题Worktree bootstrap 表示仓库把 linked worktree 的“首次进入可开发状态”当成正式 contract 来维护,而不是依赖维护者记忆、散落且无统一入口的手工 checklist,或假定只有主工作区才值得被照顾。