You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The first end-to-end tracer bullet through the content authoring stack. Sets up the validation infrastructure and ships the simplest content type (tool) plus the publish workflow, so we can demo "create a tool → validate → open a PR" from a single Claude Code session.
This slice is interview-only — no Notion integration yet (that's slice #2).
Concretely:
Add deps to package.json: zod, gray-matter, glob, vitest.
Create scripts/asset-path-resolver.js — pure function (type, slug, variant?) → relativePath.
Create scripts/validate-content.js — orchestrator, wired to pnpm validate. In this slice, validates only the tools/ directory.
Create scripts/__tests__/ and add Vitest config. Tests for tool.schema.js and asset-path-resolver.js.
Create .claude/skills/new-tool/SKILL.md — interview-only flow (slug, name, category with autocomplete-and-warn, optional iconUrl via drag&drop path).
Create .claude/skills/publish-content/SKILL.md — strict preconditions (clean tree, on main, up to date), branches content/<type>-<slug>, runs pnpm sync-assets, runs pnpm validate, commits feat(<type>): add <slug>, pushes, opens PR via gh with the templated body from Content authoring skills: Notion → markdown → PR via Claude Code #21.
Acceptance criteria
pnpm install succeeds with the new deps.
pnpm test runs Vitest and passes for the tool schema + asset path resolver.
pnpm validate exits 0 on the current state of tools/ (or surfaces existing inconsistencies with clear messages).
Invoking the new-tool skill in Claude Code with no Notion URL triggers the interview flow and writes a syntactically valid tools/<slug>.md.
Invoking publish-content from a clean main opens a PR with branch content/tool-<slug>, conventional commit, and the templated PR body.
Invoking publish-content from a dirty tree or wrong branch refuses with a clear message.
Parent
#21
What to build
The first end-to-end tracer bullet through the content authoring stack. Sets up the validation infrastructure and ships the simplest content type (
tool) plus the publish workflow, so we can demo "create a tool → validate → open a PR" from a single Claude Code session.This slice is interview-only — no Notion integration yet (that's slice #2).
Concretely:
package.json:zod,gray-matter,glob,vitest.scripts/schemas/tool.schema.js— Zod schema fortoolfrontmatter (name,category,iconUrl?).scripts/asset-path-resolver.js— pure function(type, slug, variant?) → relativePath.scripts/validate-content.js— orchestrator, wired topnpm validate. In this slice, validates only thetools/directory.scripts/__tests__/and add Vitest config. Tests fortool.schema.jsandasset-path-resolver.js..claude/skills/new-tool/SKILL.md— interview-only flow (slug, name, category with autocomplete-and-warn, optionaliconUrlvia drag&drop path)..claude/skills/publish-content/SKILL.md— strict preconditions (clean tree, onmain, up to date), branchescontent/<type>-<slug>, runspnpm sync-assets, runspnpm validate, commitsfeat(<type>): add <slug>, pushes, opens PR viaghwith the templated body from Content authoring skills: Notion → markdown → PR via Claude Code #21.Acceptance criteria
pnpm installsucceeds with the new deps.pnpm testruns Vitest and passes for the tool schema + asset path resolver.pnpm validateexits 0 on the current state oftools/(or surfaces existing inconsistencies with clear messages).new-toolskill in Claude Code with no Notion URL triggers the interview flow and writes a syntactically validtools/<slug>.md.publish-contentfrom a cleanmainopens a PR with branchcontent/tool-<slug>, conventional commit, and the templated PR body.publish-contentfrom a dirty tree or wrong branch refuses with a clear message.Blocked by
None - can start immediately.