Skip to content

Backlog phase 2: Java gRPC, single-app mode, bfs update/gen/registry, MCP arch-gate, stack-graph P4, docs - #299

Merged
Marve10s merged 14 commits into
Developmentfrom
ibrahim/backlog-remaining
Jul 5, 2026
Merged

Backlog phase 2: Java gRPC, single-app mode, bfs update/gen/registry, MCP arch-gate, stack-graph P4, docs#299
Marve10s merged 14 commits into
Developmentfrom
ibrahim/backlog-remaining

Conversation

@Marve10s

@Marve10s Marve10s commented Jul 5, 2026

Copy link
Copy Markdown
Owner

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)) — grpc as a javaApi value: 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 compileJava and mvn compile BUILD 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). New bfs gen resource <name> generates + registers a CRUD sub-router (TS + trpc/orpc), idempotent + dry-run, graceful-unsupported elsewhere. gen resource post + check-types passes across all 5 scaffold packages.

  • chore(release): 1.1.8 #17 Upgrade engine bfs update (feat(cli)) — records a bts.lock.json baseline 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), --check CI 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 a MIGRATION.md checklist. 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: astroIntegration now rides on the Astro part's settings, 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)) — new workspaceShape: monorepo | single-app (default monorepo, byte-identical). A qualifying thin-self app (backend self + 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 pass install+build+tsc; self-nuxt deferred.

Verification

  • turbo test (lint + full test + build) green on the final branch.
  • Template snapshots byte-identical for existing (monorepo) combos.
  • gRPC verified via real gradle + maven builds; bfs gen/bfs update/bfs registry verified 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).

Marve10s added 8 commits July 5, 2026 17:32
…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).
@vercel

vercel Bot commented Jul 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
better-fullstack-web Ready Ready Preview, Comment Jul 5, 2026 10:12pm

@github-actions github-actions Bot added size:XXL 1,000+ effective changed lines (test files excluded in mixed PRs). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Jul 5, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread packages/types/src/defaults.ts
Comment thread apps/cli/src/helpers/core/registry-handler.ts
Comment thread apps/cli/src/helpers/core/registry-handler.ts
…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).
Marve10s added 2 commits July 6, 2026 00:20
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.
@Marve10s
Marve10s merged commit 60b3374 into Development Jul 5, 2026
20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL 1,000+ effective changed lines (test files excluded in mixed PRs). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant