Skip to content

Build farish — AI 3D model generator (web app, API, specs, CI) - #2

Draft
jack-nsheaps[bot] wants to merge 151 commits into
mainfrom
claude/ai-3d-model-generator-XjoUi
Draft

jack-nsheaps[bot] wants to merge 151 commits into
mainfrom
claude/ai-3d-model-generator-XjoUi

Conversation

@jack-nsheaps

@jack-nsheaps jack-nsheaps Bot commented May 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Builds initial farish project scaffolding (web app, API, specs, CI)
  • Preserves 4 legacy in_progress task records from 2026-05-21 as YAML in .claude/tasks/legacy/

Test plan

  • Review legacy task YAML files under .claude/tasks/legacy/
  • Verify all existing functionality from prior commits is intact

claude added 30 commits May 21, 2026 02:19
Verbatim capture of the prompt that started the farish project, plus
kickoff notes (target repo, dev branch, environment constraints). Per
.claude/rules/always-keep-improving.md this file is reviewed before,
during, and after every task.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Register the agents and ai-mktpl marketplaces plus 15 enabled plugins,
set bypassPermissions as the default permission mode, and add a
SessionStart hook (.claude/hooks/session-start.sh) that onboards web
sessions by installing the toolchain and dependencies once their
manifests exist.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Captures how to install Claude Code marketplaces and plugins for this
repo, including that the claude plugin CLI authenticates through the
local git proxy and can access private nsheaps repos (whereas a
sub-agent's WebFetch cannot).

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Establishes the project's working discipline: review INITIAL_PROMPT.md
each task, commit config/skill/hook changes immediately, atomic
conventional commits, the behavior-modification priority order
(hooks > skills > agents > scripts > rules), and the recurring
audit-verify-improve cycle.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Capture six requirements the user added after the original prompt:
repo-config-as-code via the repository-settings app, Renovate extending
nsheaps/renovate-config, Vercel (free plan) for any backend, awareness
of nsheaps/.github cross-repo sync, PR dry-run CI gating, and Mermaid
diagrams in documentation. Also logs the task-utils write-gate
incompatibility with Claude Code on the web.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Set TASK_UTILS_REQUIRE_TASK=0 so the task-utils require-task-in-progress
hook does not block Write/Edit tools in this environment, where the
TaskCreate/TaskUpdate tools are not enabled. The hook honors this opt-out
as of task-utils v0.1.1 (nsheaps/agents).

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Confirms Claude Code marketplace sources cannot be pinned to a non-default
branch — the ref field in extraKnownMarketplaces is silently ignored.
Documents the marketplace-source vs plugin-source distinction and the
merge-to-main workaround.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Set CLAUDE_CODE_ENABLE_TASKS, CLAUDE_CODE_ENABLE_BACKGROUND_PLUGIN_REFRESH,
CLAUDE_AUTO_BACKGROUND_TASKS, CLAUDE_CODE_DISABLE_CRON=0,
CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=0, CLAUDE_CODE_EXIT_AFTER_STOP_DELAY,
and FORCE_AUTOUPDATE_PLUGINS so the next session can use the Task tools,
background tasks/cron, and forced plugin auto-update.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Compile the farish site's page inventory into docs/pages/INDEX.md
(prompt steps 5-7): 11 pages across Discover/Create/Account/System, each
tagged browser-only vs backend-dependent, with a Mermaid sitemap. Search
folded into Explore on review; no separate onboarding or login page.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Create an empty docs/pages/<slug>/SPEC.md for each of the 11 pages in
docs/pages/INDEX.md (prompt step 8). Files are intentionally empty —
they are filled in once docs/pages/PAGE-SPEC.md defines their shape.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Add docs/pages/PAGE-SPEC.md (prompt step 10): the schema every
docs/pages/<slug>/SPEC.md must follow — required frontmatter, 13 ordered
sections, format rules (Mermaid diagrams, footnote citations), and
good/bad examples for the States and Data sections.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Add agents-local and ai-mktpl-local directory-source marketplaces
(pointing at the local /home/user/agents and /home/user/ai-mktpl
checkouts on the dev branch) and repoint the agents/ai-mktpl plugins'
enabledPlugins entries at them. The GitHub-source agents/ai-mktpl
marketplaces are left declared; official-marketplace plugins unchanged.
This lets farish use in-development branch versions of the plugins.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Drop the mise toolchain-install block — that duplicates the mise
plugin's own SessionStart hook. Add a best-effort fetch + ff-only pull
of the local marketplace checkouts (/home/user/agents, /home/user/ai-mktpl)
so the directory-source marketplaces stay current with their branch.
Route bun install through `mise exec` so bun resolves on a first run.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
A context:fork skill capturing the adversarial-debate pattern: when not
fully confident in a decision or next step, dispatch an Agent whose job
is to disprove it, and proceed only once the claim survives the attack.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Marketplace sources cannot be branch-pinned (the ref field is ignored),
but registering a local git checkout kept on the target branch as a
directory-source marketplace achieves the goal. Update the
branch-pinning research with the working strategy and the fetch/pull
caveat; add the empirical local-marketplace-setup findings.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Adds .claude/skills/spec-writing/SKILL.md with a 7-step numbered procedure
that drives step 12 (one run per page). Adds three focused subskills:
- spec-writing-draft-outline: scaffold frontmatter + bullet-note placeholders
- spec-writing-write-section: fill one section with polished prose/tables
- spec-writing-review: validate completed spec against PAGE-SPEC.md

Each skill is a small ordered list; format rules and examples defer to
docs/pages/PAGE-SPEC.md rather than inlining them.
Ignore local-only Claude Code artifacts: settings.local.json (may hold
secrets), .claude/tmp/ (disposable working files), and .claude/worktrees/
(sub-agent git worktrees — local working areas, never committed). Task
records under .claude/tasks/ are intentionally NOT ignored — they are a
committed, git-tracked artifact.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Task records under .claude/tasks/ are a committed, git-tracked artifact
(the task-utils MCP server auto-commits them by design). Track the
step-12 page-specs task record.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Add the orchestration task record to farish/.claude/tasks/ — the
committed flat task store. Task records belong in the repo (the
task-utils MCP server auto-commits them by design); my prior records
were wrongly kept in the legacy ~/.claude/tasks/<session>/ location.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
claude and others added 20 commits May 21, 2026 17:16
Captures all changes made in step 32: new mock-data generators,
Generate page demo mode, per-page mock data integration, cross-page
consistency fixes, and mise run check result (PASS).

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
The screenshots job runs raw `nx run web:e2e` and the deploy job runs
raw `nx run web:build`, but jdx/mise-action exports PATH before
`bun install` creates node_modules — so `nx` was not found (exit 127),
failing the screenshots job (and blocking the Pages deploy). Export
node_modules/.bin to $GITHUB_PATH in both jobs, matching tilt-ci.yml.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
The deploy-pages job failed — GitHub Pages is not yet enabled on the
repo. Set actions/configure-pages enablement:true so the first deploy
turns Pages on (source = GitHub Actions). Also add an if:failure()
diagnostics step to the deploy job that commits step outcomes to
ci-debug/, mirroring the screenshots job.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Adds TypeScript interfaces and ROUTE constants for all 8 API endpoints
specified in docs/api/: ModelCard, GetModelResponse, CreateModelResponse,
GetLeaderboardResponse/LeaderboardItem, GetUserProfileResponse,
ListUserModelsResponse/UserModelCard, SubmitRatingResponse,
ModelParams, ApiValidationError. Keeps ModelSummary with a deprecation
notice for backward compatibility with existing mock-data consumers.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Adds mockModelCards() which produces ModelCard[] matching the step-33
API contract (authorName/authorId/authorUsername, ratingAvg, viewCount,
createdAt). Keeps mockModelSummaries() with a deprecation notice for
existing browser-app consumers. Re-exports mockModelCards from index.ts.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
… helpers

Replaces exact-string path matching with a matchPath() function that
extracts :param segments. Updates RouteHandler to receive extracted params
as its second argument (existing zero-param handlers remain compatible).
Adds extractBearerToken() for auth-required routes, noContent() for 204
fire-and-forget responses, and Response passthrough so handlers can return
a Response directly.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Registers the full set of spec endpoints from docs/api/:
- GET  /models          — paginated gallery with sort/limit/page validation
- POST /models          — create model (auth required, returns 201 stub)
- GET  /models/:id      — single model record (mockModelDetail seeded by id)
- POST /models/:id/views — record view (204 No Content, optional auth)
- PUT  /models/:id/rating — upsert rating (auth required, validates stars 1–5)
- GET  /leaderboard     — ranked list (validates board/period params)
- GET  /users/:username — creator profile (seeded by username)
- GET  /users/:username/models — user model list with pagination

All routes return deterministic mock data via @farish/mock-data; no real
data storage (that is step 35). Route ordering in index.ts ensures
/users/:username/models is matched before /users/:username.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
…tep 33)

Extends routes.test.ts with test suites for all 8 new endpoint stubs:
route descriptor, payload shape, error paths, determinism. Extends
server.integration.test.ts with HTTP smoke tests for every endpoint
including error responses and route-ordering verification.
Total: 63 tests passing.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
The deploy-pages job kept failing with the deployment step skipped,
meaning a step before it failed. The job used a non-canonical action
combo: upload-pages-artifact@v4 + deploy-pages@v4.

GitHub's official Pages starter workflow (actions/starter-workflows
pages/static.yml) pairs upload-pages-artifact@v3 with deploy-pages@v5 —
that is the known-good combination. Align to it.

Also add an `id:` to every deploy-job step so the failure-diagnostics
step can name the exact failing step via toJSON(steps), and probe the
Pages REST API in the diagnostics so a configure-pages enablement
failure is distinguishable from an artifact/deploy failure.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Remove TASK_UTILS_REQUIRE_TASK=0. The opt-out was added when the
built-in TaskCreate tool was unavailable in Claude Code web; the
task-utils MCP server now provides task_create/task_update, so the
PreToolUse write-gate can enforce "must have an in-progress task"
again.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
Enable the 1pass plugin (settings.json) and configure it
(plugins.settings.yaml) to install the op CLI and inject the
github--app--jack GitHub App credentials from the AI-Jack 1Password
vault. The github-app plugin then mints an installation token on
SessionStart — GitHub access without the user authorizing personally.

Also pin TASK_UTILS_TASK_DIR to the repo's .claude/tasks so the
write-gate hook and the task-utils MCP server resolve the task store
to the repo (CLAUDE_PROJECT_DIR is unset in this environment, so the
default pwd-based resolution pointed at /home/user instead).

Seeds the YAML task store: 1.yaml (this work), 2.yaml (break-glass
gate idea).

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
claude added 2 commits May 23, 2026 18:43
Convert all 10 .claude/tasks/*.json task files to YAML format
to match the task-utils v0.1.4 flat store convention.

Round-trip integrity verified for each file (jq -c sort → yq -c sort match).
Worktree JSON files (gitignored) also removed: farish worktrees
(agent-a3c7993ecd572692f, agent-acf0c941487e005ce) and agents
worktree (agent-a4d5e0f7fb20e6088) had their .json replaced with .yaml.

No task data lost; all fields preserved.

https://claude.ai/code/session_01AiWbZuSU6UCjuXnrBBFk9p
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.

2 participants