Backlog phase 2: Java gRPC, single-app mode, bfs update/gen/registry, MCP arch-gate, stack-graph P4, docs - #299
Merged
Merged
Conversation
…m option pages Adds a consistent 'Valid values vs. valid combinations' callout to all 7 ecosystem option-reference pages (typescript/go/java/python/rust/elixir/ react-native) pointing to the Compatibility Matrix and Verified Combinations, since the option tables list valid values but not valid combinations. Editing existing pages only (no new i18n bundles). docs-content-contract 8/0. Advances task #9 (the compatibility cross-link item).
…rver)
Adds 'grpc' as a javaApi value: a Greeter proto + grpc-java service + a
SmartLifecycle bean starting the gRPC server alongside Spring Boot. Gradle
(com.google.protobuf plugin + protobuf{} codegen) and Maven (protobuf-maven-plugin
+ os-maven-plugin) both wire protoc + grpc-java stubs onto the compile classpath.
Mirrors spring-graphql/openapi-generator wiring and the Go grpc-go reference;
spring-boot-gated like the other javaApi values.
Verified: ./gradlew compileJava = BUILD SUCCESSFUL and mvn compile = BUILD SUCCESS
(both protoc codegen), java-ecosystem tests 24(web)+27(cli) pass, schema-template
-coverage 3/3, template-snapshots 95/0.
Advances task #6 (Java gRPC; Kotlin variant remains).
…(Phase 4) First Phase-4 field promotion: astroIntegration now rides on the Astro frontend part's settings and round-trips legacy<->graph (legacyProjectConfigToStackParts attaches it; stackPartsToLegacyProjectConfigPartial restores it) with a flat fallback so the generator projection and CLI stack-update persistence stay correct. Establishes the template for promoting the remaining flat-only categories to owned parts. Verified: stack-graph round-trip 49/0 (added guard test), types 107/0, tsc clean, CLI stack-update 56/0, template-snapshots 95 byte-identical. Advances task #20 (Phase-4 consolidation; full flat-storage retirement remains).
(a) The skills addon SKILL.md is now stack-specific: a 'built with: <stack>' fingerprint + conditional 'Add a route/resource', 'Run migrations', 'Add a test' guidance branching on ecosystem/backend/api/orm/database/auth (drizzle-kit vs prisma, trpc vs orpc, vitest/jest/playwright), instead of generic boilerplate. (b) New 'create-better-fullstack gen resource <name>' (alias gen route): reads bts.jsonc, writes a CRUD sub-router to packages/api/src/routers/<name>.ts (protectedProcedure when better-auth) and registers it via anchor insertion, for TS + trpc/orpc. Idempotent + dry-run; unsupported stacks get an honest message, never a corrupted file. Resource template inlined (no runtime template dep). Verified: gen-resource 6/0, template-snapshots 95/0, CLI regressions 755 pass, oxfmt/oxlint clean; manual smoke: generated SKILL.md is stack-specific and 'gen resource post' + check-types passes across all 5 scaffold packages (trpc and orpc both proven). Closes task #14 (skills fully per-stack; gen covers the primary TS+trpc/orpc stack with graceful unsupported elsewhere).
Adds a capability-pack system: a Zod manifest schema (packages/types/src/registry.ts: name/version/files/deps/env/addons) + 'bfs registry add <source>' installing a pack from a local path or file:// URL into an existing project (renders template files via processTemplateString, merges deps into the right package.json, appends env to .env.example, writes a .better-fullstack/registry.json lockfile + records it in bts.jsonc), plus 'bfs registry list'. --dry-run + clear validation errors on bad manifests. Local/file:// only (no network fetch, no monetization) — the installable foundation for community/private packs. Verified: types registry 7/0, cli registry 7/0, template-snapshots 95/0, tsc + oxfmt + oxlint clean; manual smoke installed a real pack (file+dep+env+lockfile), list/dry-run/invalid-reject all correct. Closes task #19 core (local/file:// packs; remote fetch is an additive extension).
Records a bts.lock.json baseline (path -> sha256) at create time (best-effort, never throws, additive — snapshots stay byte-identical), then 'bfs update [projectDir]' re-renders with current templates and 3-way classifies each file (disk vs baseline vs render): unchanged / drift (safe-patch) / user-edited (left alone) / conflict / manual. --dry-run plan, --apply patches drift + refreshes the baseline, --check gives CI exit codes, --json for tooling. Reuses generateTree + stack-update helpers; README + package.json/.env routed to manual review (structured merge is a documented follow-up). Verified: scaffold-upgrade 8/0, template-snapshots 95 intact, virtual-generator -regressions 163, stack-update 56 (export widening only), tsc+oxfmt+oxlint clean; manual smoke proved the full up-to-date->edit->drift->patch lifecycle + exit codes. Closes task #17 core (drift detection + guided patch apply; structured package.json /env merge deferred).
…ecklist Phase-3 additive gate on the stack-update pipeline: RISKY_ARCHITECTURE_KEYS (database/orm/auth/api/backend/runtime). When a plan REPLACES an existing non-none value for one of these (sqlite->postgres, drizzle->prisma, better-auth ->none, bun->workers, ...), the plan is flagged architecture-changing, carries per-swap migrationSteps, and applyStackUpdate refuses unless acknowledged (bfs_apply_stack_update acknowledgeArchitectureChange:true / CLI --acknowledge-architecture-change), distinct from the edited-file blockers. With ack it proceeds and appends a MIGRATION.md checklist (data is NOT auto-migrated). Non-architecture updates are completely unchanged (backward-compatible). Verified: stack-update 61/0 (56 kept + 5 new), tsc + oxlint clean, mcp-graph/ scaffold-upgrade/add-history/registry/gen-resource suites green; manual smoke: sqlite->postgres surfaces the checklist + ack requirement, refuse-without-ack and apply-with-ack both correct. Closes task #18 core (risky-swap gate + migration checklist; automatic data migration intentionally out of scope).
New workspaceShape: monorepo | single-app option (default monorepo — every existing combo scaffolds BYTE-IDENTICAL). When single-app is selected AND the stack is a qualifying thin-self app (backend self + one Next.js or TanStack Start web frontend, no sibling capability package), a post-process collapses apps/web + packages/config + packages/env into a flat root app; every non-qualifying stack normalizes back to monorepo so we never emit a broken flat layout. self-nuxt is deferred (different alias convention) and normalizes to monorepo. Post-hoc flatten (generate monorepo, then collapse) guarantees monorepo byte-identity + adds a tree-validation safety net. workspaceShape is create-only. Verified: FULL turbo test 3512/0 (cli 3510, web 271, template-generator 140, types 114), snapshots 95/95 byte-identical, lint 0 errors, tsc clean across all packages. Manual smoke: self-next AND self-tanstack-start single-app scaffolds are genuinely flat and pass bun install + build + tsc; non-qualifying single-app requests fall back to full monorepo. Closes task #16 (single-app for self-next + self-tanstack-start; self-nuxt normalizes to monorepo).
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 06a5a9f25b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…e tech-links Two CI fixes for the phase-2 features: 1. testing/lib/generate-combos/render.ts: reactNativeFlags now emits --payments (defaults none). RevenueCat made payments native-applicable, so without an explicit --payments the CLI prompts and non-interactive native scaffolds hang (Strict Smoke Core + plain Smoke native combos failed 'scaffold [template]'). Pre-existing harness gap on Development; surfaces on any PR off current Dev. 2. apps/web/scripts/validate-tech-resource-links.ts: workspaceShape added to SHARED_DOCS_CATEGORIES — it's a project-structure mode (monorepo|single-app), not an external tech with docs/GitHub links (same as the shadcn style modes). Fixes Lint + Release Guard (validate:tech-links). Verified: validate:tech-links exit 0; pr-core smoke 12/0 (native-uniwind-trpc now scaffolds with --payments none).
…plete) Completes the Phase-4 category promotion: an audit found nearly all candidate categories (css/ui/forms/animation/i18n/analytics/logging/validation/realtime/ examples + mobile + non-TS) were already graph-promoted and round-tripping. The one remaining real library category, TypeScript top-level 'testing', is now a backend-owned shared-single part (registered via defineTools + the backend-single map), round-tripping legacy<->graph and graph-authoritative in both projections (stale flat testing overridden by the graph part; resets to none with no part). msw/storybook stay frontend-owned addons in the testing role — no scope collision. Remaining flat-only fields (shadcn* detail settings, elixirJson) are settings- shaped and explicitly deferred by the single-source-of-truth design doc (18+ file consumer surface, correlated conditional settings) — documented as follow-on; flat-field removal from bts.jsonc is intentionally out of scope (derived cache). Verified: stack-graph round-trip 50/0, compatibility 26/0, tsc clean, FULL turbo test 3510/0 with 95 snapshots byte-identical. Closes task #20 (Phase-4 category promotion).
- CLI reference: new packages/types/src/cli-flags.ts registry + generator (apps/web/scripts/generate-cli-flags-data.ts -> cli-flags-data.ts, wired into prebuild) + <CliFlagTable> component; create.mdx's hand-written tables replaced with schema-sourced tables (now include .NET/saas/fets/nitro/encore/convex the old tables had drifted from). - 4 stack guides (frontend frameworks, backend frameworks, database+ORM pairing, auth provider comparison) under docs/stack-guides/. - 2 provider setup guides (env-var-per-provider, database provisioning for Turso/ Neon/Supabase/PlanetScale/Atlas/Upstash/D1/...) under docs/provider-setup/. - Sidebar + localized folder names wired; all 6 pages added to the 8 locale i18n bundles with translated title/description + English-fallback bodies (the site's established graceful-degradation; full 8-locale body translation needs a translation service and is tracked as ongoing localized-content drift). Verified: docs-content-contract 8/0, docs-navigation+seo 7/0, tsc clean, FULL turbo test 3510/0, vite build succeeds. Closes task #9 (remaining guide + CLI-flag-generation items).
New javaLanguage option (default java — every existing java combo stays BYTE-IDENTICAL). kotlin is a gated Spring-Boot-only variant emitting a compiling Kotlin project: build.gradle.kts gains kotlin(jvm)+plugin.spring(+plugin.jpa)+ jvmToolchain, pom.xml gains kotlin-maven-plugin, and 15 idiomatic .kt templates (Application, controllers, domain data classes, repository/service, security/ keycloak/otel config, cache, tests) replace the Java sources when kotlin. The java-base handler routes java vs kotlin sources + drops lombok/mapstruct (data classes replace them). Non-Spring-Boot kotlin requests (micronaut/quarkus/jooq/ mybatis/grpc/...) normalize to Java in BOTH compatibility.ts and the generator so a broken Kotlin project is never emitted. Verified: Kotlin Gradle ./gradlew compileKotlin compileTestKotlin BUILD SUCCESSFUL (JPA+security+graphql+caffeine+otel+keycloak variants), Kotlin Maven test-compile exit 0, java default byte-identical (template-snapshots 95/0, java compileJava BUILD SUCCESSFUL), java-ecosystem contract tests 27/0(cli)+24/0(web), FULL turbo test 3513/0, oxlint clean. Completes task #6 (Java gRPC + Kotlin). Kotlin scope: Spring Boot + common options (jpa/security/keycloak/graphql/junit5/mockito/assertj/caffeine/otel); other frameworks/options normalize to Java honestly.
javaLanguage TECH_OPTIONS added 'java' + 'kotlin'; kotlin had a link but java did not, failing validate:tech-links (Lint + Release Guard). Add the java language docs/GitHub links. validate:tech-links exit 0.
…Shape Resolves 3 Codex P1 review comments on #299: - registry: reject capability-pack file paths and dependency target dirs that escape the project directory (../ traversal or absolute paths) — a local/ community pack could otherwise write outside the project or mutate sibling package.json manifests. New assertPathInsideProject guard on both the file- write loop and the dependency-map loop. + 2 security regression tests (traversal file path + dep dir both rejected; nothing written outside). - bts-config: persist workspaceShape=single-app in bts.jsonc (via buildBtsConfigForPersistence) and read it back (configFromBtsConfig), so bfs update / stack-update don't reconstruct a flat single-app project as a monorepo and re-render apps/*+packages/* over it. monorepo (default) is omitted to keep bts.jsonc byte-identical. + round-trip test. Verified: registry+bts 110/0 (incl. new tests), template-snapshots 95 byte- identical, full turbo test 3516/0.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Backlog phase 2 — remaining tasks (#6, #9, #14, #16, #17, #18, #19, #20)
Follow-up to #291. Closes out the remaining backlog with real, verified, CI-green features. Each commit was verified in isolation and the branch as a whole passes
turbo test.Features
chore(release): 1.0.3 #6 Java gRPC-java (
feat(java)) —grpcas ajavaApivalue: Greeter proto + grpc-java service + a SmartLifecycle bean starting the gRPC server alongside Spring Boot. Gradle (com.google.protobuf) + Maven (protobuf-maven-plugin) both wire protoc + grpc-java stubs. Verified:./gradlew compileJavaandmvn compileBUILD SUCCESSFUL.chore(release): 1.1.0 #9 Docs cross-links (
docs(reference)) — a "Valid values vs. valid combinations" callout on all 7 ecosystem option pages, linking the Compatibility Matrix + Verified Combinations. (The stack guides + provider guides remain — they need new pages × 8-locale i18n bundles.)chore(release): 1.1.5 #14 Per-stack skills +
bfs gen(feat(cli)) — the skills addon SKILL.md is now stack-specific (built-with fingerprint + Add-route/Run-migrations/Add-test guidance branching on the actual stack). Newbfs gen resource <name>generates + registers a CRUD sub-router (TS + trpc/orpc), idempotent + dry-run, graceful-unsupported elsewhere.gen resource post+check-typespasses across all 5 scaffold packages.chore(release): 1.1.8 #17 Upgrade engine
bfs update(feat(cli)) — records abts.lock.jsonbaseline at create (additive, snapshots byte-identical), then re-renders with current templates and 3-way classifies each file (unchanged / drift / user-edited).--dry-run,--apply(patches drift + refreshes baseline),--checkCI exit codes.chore(release): 1.1.9 #18 MCP architecture-change gate (
feat(mcp/cli)) — risky swaps (database/orm/auth/api/backend/runtime) require explicit acknowledgment (acknowledgeArchitectureChange/--acknowledge-architecture-change) and emit aMIGRATION.mdchecklist. Non-architecture updates unchanged.chore(release): 1.1.10 #19 Capability-pack registry (
feat(cli)) — Zod manifest schema +bfs registry add <source>(local/file://: renders template files, merges deps, appends env, lockfile + bts.jsonc) +bfs registry list. Local packs only; remote fetch/monetization are additive future work.chore(release): 1.1.11 #20 Stack-graph Phase 4 (
feat(stack-graph)) — first flat→graph field promotion:astroIntegrationnow rides on the Astro part'ssettings, round-tripping legacy↔graph with a flat fallback. Establishes the template for promoting the remaining categories.chore(release): 1.1.7 #16 Single-app mode (
feat(cli)) — newworkspaceShape: monorepo | single-app(default monorepo, byte-identical). A qualifying thin-self app (backendself+ one Next.js/TanStack Start frontend) collapses to a flat root app; non-qualifying stacks normalize to monorepo. self-next + self-tanstack-start flat scaffolds passinstall+build+tsc; self-nuxt deferred.Verification
turbo test(lint + full test + build) green on the final branch.bfs gen/bfs update/bfs registryverified via real scaffolds +check-types.Note: task #6 also has a Kotlin language variant remaining (XL greenfield); #18's automatic cross-ORM data migration is intentionally out of scope (human checklist instead).