Bootstrap orchestration repo #1

Merged
araemer merged 19 commits from bootstrap-orchestration-repo into main 2026-09-19 06:21:45 +00:00
Owner

Summary

  • Add @recipe/contract ts-rest package covering all 11 API resource domains (auth, recipes, compact-recipes, tags, comments, ratings, users, meal-plans, images, ai, passkeys, health) — zero TypeScript errors, no Zod, plain interfaces matching the actual backend DTOs
  • Add CLAUDE.md with cross-repo context, full workflow pipeline, gate rules, and all settled cross-cutting decisions (error envelope, pagination, mutation conventions, optimistic locking, etc.)
  • Add .claude/agents/po.md and .claude/agents/architect.md encoding the PO and cross-cutting architect roles
  • Add .claude/skills/plan-feature.md, implement-feature.md, review-feature.md with explicit human sign-off gates at each workflow phase
  • Add docs/features/, docs/adr/, docs/plans/ directory scaffold

What's out of scope (follow-up work)

  • Per-repo agent definitions in recipe-backend and recipe-app (architect, planner, implementer, reviewer)
  • Installing @recipe/contract in sibling repos (npm install file:../recipe-platform/api-contract)
  • .claude/settings.json (requires explicit permission grant for broad Read/Bash rules)

🤖 Generated with Claude Code

## Summary - Add `@recipe/contract` ts-rest package covering all 11 API resource domains (auth, recipes, compact-recipes, tags, comments, ratings, users, meal-plans, images, ai, passkeys, health) — zero TypeScript errors, no Zod, plain interfaces matching the actual backend DTOs - Add `CLAUDE.md` with cross-repo context, full workflow pipeline, gate rules, and all settled cross-cutting decisions (error envelope, pagination, mutation conventions, optimistic locking, etc.) - Add `.claude/agents/po.md` and `.claude/agents/architect.md` encoding the PO and cross-cutting architect roles - Add `.claude/skills/plan-feature.md`, `implement-feature.md`, `review-feature.md` with explicit human sign-off gates at each workflow phase - Add `docs/features/`, `docs/adr/`, `docs/plans/` directory scaffold ## What's out of scope (follow-up work) - Per-repo agent definitions in `recipe-backend` and `recipe-app` (`architect`, `planner`, `implementer`, `reviewer`) - Installing `@recipe/contract` in sibling repos (`npm install file:../recipe-platform/api-contract`) - `.claude/settings.json` (requires explicit permission grant for broad Read/Bash rules) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
- Add @recipe/contract ts-rest package covering all 11 API domains
- Add CLAUDE.md with cross-repo context, workflow pipeline, and settled decisions
- Add .claude/agents for PO and cross-cutting architect roles
- Add .claude/skills for plan-feature, implement-feature, review-feature workflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Migrates all JSDoc from recipe-backend DTOs and resource files into the
contract package. Every interface, field, enum value, and route now carries
documentation. Also adds a documentation standard rule to CLAUDE.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Agent now surfaces open questions, presents options with tradeoffs, and
waits for explicit user agreement before writing any ADR or contract change.
Removes the assumption that specs are always complete and unambiguous.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Moves settled cross-cutting decisions from CLAUDE.md and architect agent
into docs/api-conventions.md. CLAUDE.md uses @import; architect reads it
by path. Single source of truth, composable for future agents.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PO now discusses and researches before writing, mirrors architect's
three-phase pattern. Adds docs/features/template.md with use cases and
processes as first-class sections alongside ACs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds .claude/config.example.md (committed template) and .claude/config.md
(gitignored, filled in per developer). CLAUDE.md @imports the config so
agents and skills resolve repo paths at runtime. Adds ONBOARDING.md with
setup instructions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove branch naming and commit instructions from the platform skill —
those belong in each repo's own CLAUDE.md and are picked up automatically.
Terminal action is now opening a PR against stage, not just committing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Zero-padded three-digit prefix on all spec filenames, plan filenames, branch
names, and commit messages so every artifact in the pipeline traces back to
the originating business spec.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Plans belong with the code they describe. Backend plans live in
recipe-backend/docs/plans/, frontend plans in recipe-app/docs/plans/.
The platform spawning pattern passes paths relative to each repo's
working directory, so no cross-repo path juggling is needed.

Also extracts ADR format from the architect agent into docs/adr/template.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- settings.json: committed machine-agnostic permissions (git, npm, tsc, curl to Forgejo)
- README.md: top-level description of the repo's three purposes and workflow entry points
- docs/adr/2026-09-13-ts-rest-api-contract.md: records the decision to use ts-rest with
  plain TypeScript interfaces over OpenAPI codegen, tRPC, and Zod schemas
- ONBOARDING.md: updated settings.local.json block to cover Read permission and Forgejo
  credentials; updated feature workflow steps with NNN-slug pattern

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ADRs are immutable once accepted. The only permitted post-acceptance change
is a "Superseded by: <path>" line added to the top of the old ADR when a
new one replaces it.

- architect.md: state the rule explicitly; clarify no-op path writes no file
- plan-feature.md: repo architect prompt distinguishes return-only verdict
  (no file) from new ADR write; states the superseding rule
- docs/adr/template.md: add status comment and superseding instruction
- 2026-09-13-ts-rest-api-contract.md: add status comment to match template

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The backend PasskeyDto uses PasskeyDeviceType (singleDevice | multiDevice)
for the deviceType field. The contract had it as bare string, losing the
type safety. Adds the PasskeyDeviceType as-const enum to passkeys.ts and
re-types the field accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- docs/api-conventions.md: added "Why" rationale for every convention so the
  file serves both human readers and agents
- docs/adr/2026-09-19-contract-ci-strategy.md: records the decision to clone
  platform main in sibling CI pipelines and the reasoning that the contract
  has no stage environment
- CLAUDE.md: added "Contract has no stage" rule — GATE A approval triggers
  direct merge to main; references the new ADR

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The sibling layout is enforced by the file: reference in package.json, so
per-developer path configuration adds no value — all paths are derivable.

- Remove .claude/config.example.md and .claude/config.md from .gitignore
- Remove @.claude/config.md import from CLAUDE.md
- Replace all "path from config" and <platform-root> placeholders with
  relative sibling paths (../recipe-backend, ../recipe-app, ../recipe-platform)
  in plan-feature.md, implement-feature.md, and review-feature.md
- Update ONBOARDING.md: remove the config setup step; explain the sibling
  constraint is enforced by the file: reference, not just convention

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(platform) Add PR check pipeline and check-siblings skill
All checks were successful
/ typecheck-contract (pull_request) Successful in 13s
e1391171f8
- .forgejo/workflows/pr_check.yaml: typechecks api-contract on every PR
  targeting main — the only CI needed for a package with no runtime
- .claude/skills/check-siblings.md: checks for ../recipe-backend and
  ../recipe-app; asks per missing repo before cloning, never acts without
  explicit user consent

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docs(adr) Tighten ADR template and rewrite existing ADRs to remove prose
All checks were successful
/ typecheck-contract (pull_request) Successful in 10s
b6455b265e
Template now enforces bullets and short statements. Both existing ADRs
rewritten: no filler words, one bullet per fact, rejection reasons inline.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docs(adr) Rewrite ADRs to middle ground — full sentences, no filler words
All checks were successful
/ typecheck-contract (pull_request) Successful in 12s
dacfa781ae
Previous iteration was too terse to be understandable. This version uses
full sentences throughout but cuts filler words (however, therefore, thus)
and removes any content that is not load-bearing for understanding the decision.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docs(adr) Clarify ts-rest context — codegen is a rejected alternative, not a constraint
All checks were successful
/ typecheck-contract (pull_request) Successful in 10s
a77e598d74
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(contract) Wrap tag list responses; add list-wrapper convention
All checks were successful
/ typecheck-contract (pull_request) Successful in 10s
cb599fba12
GET /tag/all and GET /tag/enriched were the only endpoints returning plain
arrays. Both now return TagListResponse and EnrichedTagListResponse
respectively, consistent with all other list endpoints.

NOTE: backend and frontend return plain arrays today — both need updating
when onboarded to the contract (noted in the route JSDoc).

Also adds the list-wrapper convention to docs/api-conventions.md with the
rationale: a wrapper object can gain fields in future versions without a
breaking change; a plain array cannot.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
araemer/recipe-platform!1
No description provided.