Skip to content

[Slice 1] Foundation + new-tool (interview only) + publish-content #22

@wab

Description

@wab

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:

  • Add deps to package.json: zod, gray-matter, glob, vitest.
  • Create scripts/schemas/tool.schema.js — Zod schema for tool frontmatter (name, category, iconUrl?).
  • 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.

Blocked by

None - can start immediately.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestready-for-agentScoped, dependencies clear, acceptance criteria explicit — grabbable by an AFK agent

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions