Skip to content

feat(app): add 'app create' command (page-money default) - #6

Merged
ZacxDev merged 1 commit into
mainfrom
zach/app-create
Jun 21, 2026
Merged

feat(app): add 'app create' command (page-money default)#6
ZacxDev merged 1 commit into
mainfrom
zach/app-create

Conversation

@ZacxDev

@ZacxDev ZacxDev commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

What

Adds civitai app create [name] [dir] — a friendly, batteries-included scaffolder that is a thin superset of app init, defaulting to the rich page-money SDK template instead of init's no-build static default.

page-money is a Vite + React + TypeScript full-page (W10) money-path block wired to the published App SDK (estimate → consent → submit → poll → Buzz spend), with a mock-host dev harness and a unit test. create <name> gives you a project that is immediately npm install && npm run dev:harness-runnable, test-green, and civitai app validate-clean out of the box.

How

  • Shared helper, no logic fork. Factored the scaffold body out of app_init.go into runAppScaffold(...) (plus a printScaffoldResult output helper). Both init and create call it — slug/display derivation, positional/--dir resolution + conflict check, render, self-validation via validate.Dir, refuse-non-empty-dir, and harness-aware next-steps all live in one place.
  • create defaults --template to page-money; init keeps its static default. Every other flag (--dir, --name, -t/--template, --from) behaves identically; --from's "not yet wired" error is preserved on both.
  • init stays registered and behaviorally unchanged (back-compat alias). create is the documented happy path: app group examples + README updated (quickstart + command-reference table).

Tests

  • New internal/cmd/app_create_cmd_test.go: create defaults to page-money (correct files + budgeted-scope manifest + dev:harness next-step), --template override works, slug derivation from a free-form display name, refuse-non-empty-dir, --from errors.
  • Regression guards: init still defaults to static, and init --template page-money still works (proves the shared-helper refactor didn't change init).
  • go build ./..., go vet ./..., go test ./... all green (43 cmd tests, 16 scaffold tests pass).

Out of scope (Phase 2)

Per the task, this does not modify the template's test files or wire in the SDK createMockHost — that's a deliberate follow-up gated on the SDK publish (@civitai/blocks-react PR #50). This PR is just the create command + the shared-helper refactor; templates were left untouched.

🤖 Generated with Claude Code

`civitai app create` is a friendly, batteries-included scaffolder — a thin
superset of `app init` that defaults --template to the rich `page-money` SDK
template (vs init's no-build `static` default). All other flags
(--dir/--name/--template/--from) behave identically.

Both commands now share a single `runAppScaffold` helper (extracted from
app_init.go) covering slug/display derivation, dir resolution, rendering,
self-validation, and harness-aware next-steps output — no logic fork.

`init` is kept registered + behaviorally unchanged (back-compat alias);
`create` is the documented happy path (app group examples + README).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@ZacxDev
ZacxDev merged commit 7778b51 into main Jun 21, 2026
1 of 2 checks passed
@ZacxDev
ZacxDev deleted the zach/app-create branch June 21, 2026 12:49
ZacxDev added a commit that referenced this pull request Aug 5, 2026
…im that was measured wrong (#204)

The canonical handoff doc on `main` had gone stale in the way that costs the
next session real time: it still listed shipped work as pending, and carried one
confident claim that measurement disproved.

🔴 THE DEDUP ADVICE WAS WRONG AND WOULD HAVE SHIPPED A BROKEN METRIC. The doc
said \"per-mount, so unique views need query-side dedup\". `blockInstanceId` is
NOT per-mount — it is `page_apb_<ULID>`, roughly one per PLACEMENT. Measured on
prod: 124 rows carried 28 distinct `blockInstanceId` across 27 distinct
`appBlockId`, ~1:1 with the app, so deduping on it reports ~1 unique viewer per
app. Corrected in place, with the measurement, because the wrong version was
specific and plausible enough to be followed.

Brought current:

- Follow-ups #6 and #5 marked DONE (civitai#3613 + cli#195, civitai#3626), plus
  cli#193/#194 and civitai#3627. The DONE table goes 8 -> 15 PRs.
- `preview / component-tests` is no longer an open question: it reported success
  on #3606 and every subsequent PR (1259/1259), verified by reading the locator
  at each PR's head SHA rather than inferring from timing.
- Deploy/verify status now records that the feature was verified IN PRODUCTION,
  not merely deployed — with the caveat that 20ms against ~125 rows in one
  partition proves the query is correct today, not that partition pruning holds
  at scale.
- Records how to actually READ the preview component log (it lives in the Tekton
  taskrun, not behind the GitHub status URL), and that the taskrun reports
  Succeeded even when the suite fails because the step is report-only.
- The pins rot recurred within a day exactly as predicted — cli#203 re-bumped
  both pins on 2026-08-05 — so that is now documented as a standing property of
  the repo, not an incident to diagnose a third time.
- Adds the marketplace search-debounce flake (338ms measured against its own
  300ms budget) as a latent issue for whoever owns that test.

A security finding from this stream was reported privately per SECURITY.md. The
mechanism is deliberately NOT in this doc — only the operational consequence,
and a pointer to ask security before changing the ingest path.

Docs-only; `make ci` green and `gofmt -s -l .` prints nothing.


Claude-Session: https://claude.ai/code/session_017vvMdxcMKJP9ripQLEiPm9

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
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.

1 participant