Skip to content

chore(release): promote main to release - #107

Open
github-actions[bot] wants to merge 11 commits into
releasefrom
main
Open

chore(release): promote main to release#107
github-actions[bot] wants to merge 11 commits into
releasefrom
main

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated promotion PR. Merge with a merge commit (do NOT squash) so the feat:/fix: commits reach release intact — semantic-release reads them to cut the stable version + tag. Squashing collapses them into one non-conventional commit and no release is cut.

spencer-osbrjp and others added 11 commits July 24, 2026 11:08
- backends (hono/elysia) expose read-only GET /health-check; with an ORM
  selected it runs a DB query and returns rows to confirm wiring
- default backend PORT 8000 (was 3001)
- success screen shows web/api localhost URLs
- add clean.sh dev helper to remove scaffolded folder

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lean.sh feedback

- hono dev:server uses tsx --env-file-if-exists=.env so DATABASE_URL loads
  on Node (Bun/drizzle-kit/prisma already auto-load .env)
- success screen shows a dedicated 'Local URLs:' section instead of an
  inline comment on the dev command
- clean.sh reports what it removed (or that nothing existed)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- AGENTS.md is now stack-aware: real commands, dev URLs, monorepo map,
  ORM/DB workflow (incl. db:seed), and /health-check for the chosen combo
- add .claude/settings.json permission allowlist (package manager, docker
  compose for server DBs, wrangler for Cloudflare, read-only git)
- add .claude/commands: /verify, /format-fix, /new-component
- add db:seed script + seed fixtures for drizzle and prisma (guards D1);
  bundles tsx as the seed runner
- fix: drizzle sqlite client stripped the file: URL scheme so better-sqlite3
  opens the right path — the same DATABASE_URL now works for drizzle-kit and
  the runtime (previously /health-check and db:seed failed on sqlite)

Verified end-to-end on a live sqlite project: install → db:generate →
db:migrate → db:seed → GET /health-check returns the seeded rows.

Closes #108

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…skill (#109)

1. CI scaffold-smoke job: create → install → db setup → seed → boot API →
   curl /health-check, for sqlite drizzle & prisma (no Docker). Catches
   runtime breakage go test can't — the class of bug that shipped as the
   sqlite file: URL issue.
2. Render/invariant test (pkg/render_test.go): scaffolds combos in-process
   and asserts no unrendered template residue, valid JSON, and targeted
   content (sqlite file: strip, /health-check, db:seed, .mcp.json presence).
3. .mcp.json (Playwright MCP) scaffolded at project root when --test
   playwright, so agents can drive the running app.
4. contrib/osbr-devtools/scaffold-advisor: portable SKILL.md mapping a
   plain-English brief to a bungkus-cli create command (for osbr devtools;
   not a live skill here).

Also: AGENTS.md now warns that prisma's db:migrate is interactive and shows
the non-interactive alternatives, so agents don't hang.

Verified both sqlite loops end-to-end (drizzle + prisma): seed inserts rows
and /health-check returns them.

Closes #109

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Redundant with the bungkus-scaffold skill in osbrjp/DevTools (the single home),
which reads flags live from `--help` instead of hardcoding them.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Every project generated with --audit lhci inherited a workflow that ran a
full audit twice per change, with no concurrency guard and three repeated
audits per run. Measured on a real repo built from this template:
Lighthouse was 65 of ~82 Actions minutes across 100 runs, and per-step
timings put 62 of 89 seconds inside `lhci autorun` itself.

- pull_request only. GitHub runs it against the merge result rather than
  the branch head, so the post-merge run on main re-audited a tree that
  had already passed. That duplicate was half the spend.
- concurrency group with cancel-in-progress, so several pushes in quick
  succession no longer each run a full audit to completion.
- paths-ignore for markdown, LICENSE and .github — kept deliberately
  conservative, since a generated project's layout is unknown here.
- numberOfRuns 3 -> 1. The generated gate is performance >= 0.5, far too
  loose for run-to-run variance to flip, so the median of three was paying
  ~45s per run for precision nothing consumed.
- Added an accessibility assertion, since Lighthouse computes that
  category anyway and the template was discarding it. `warn`, not
  `error`: a new blocking gate at an unknown score would fail the first
  PR of every freshly scaffolded project.
- Dropped branches dev/staging/test, which the template created but never
  scaffolds.

workflow_dispatch keeps a manual trigger for any ref. No schedule — a
cron in a scaffold would silently spend minutes in repos that may never
look at it.

Verified by building the CLI and scaffolding for real, not by reading the
template: pnpm and bun variants both render valid YAML, `${{ github.ref }}`
and the secrets expression survive Go templating intact, and no
unrendered `{{ . }}` tags remain in either output.
ci(templates): stop scaffolding a Lighthouse workflow that burns minutes
…#114)

A PR that only touches static page files cannot change any other route's
Lighthouse score, so the scaffolded workflow now diffs the PR against its
base and passes just those routes to lhci autorun via --collect.url.
Shared files, dynamic routes, underscore partials, and non-HTML endpoints
fall back to the full lighthouserc URL list; Vite bases (single-URL SPAs)
keep the plain autorun.

Closes #113

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat: add command — apply preset templates to an existing repo

`bungkus-cli add <option>` renders a registry option's templates into an
existing project without ever overwriting a file, and additively merges its
deps/scripts into package.json via an order- and byte-preserving JSON merge.
PM is detected from packageManager/lockfiles (walking up to the repo root),
base from package.json dependency signatures; --pm/--base/--deploy override.

Closes #116

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: relocate .github/** to the git root and detect deploy target in add

Workflow templates rendered by `add` are redirected to the nearest ancestor
with .git — GitHub only reads workflows at the repo root, so running add
inside apps/web no longer produces dead workflow files. DetectProject also
infers the deploy target from an existing wrangler config so
`add cloudflare-pages` followed by `add github-actions` needs no flags.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: harden add against data loss and wrong-package injection

Adversarial review findings on the add command:
- package.json is replaced atomically (temp + rename); a crash or full disk
  can no longer truncate it
- the merge is validated before any template file is rendered, so a
  malformed package.json aborts cleanly instead of half-applying
- duplicate JSON keys are refused instead of silently dropping a value
- rewrites reuse the file's own indent unit and newline style
- cross-cutting rules only contribute the delta the added option causes
  (no more stray vite devDep on every pnpm+astro add)
- add github-actions ships the deploy target's wrangler/deploy packages
- deploy detection requires a positive marker instead of guessing workers
- the git-root walk (workflow relocation + lockfile search) stops at
  unrelated ancestor repos and never leaves dir without a usable root

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
New registry-driven "desktop" category exposed as --desktop tauri on create
and a Desktop panel in the TUI. Scaffolds src-tauri/ (Cargo.toml,
tauri.conf.json wired to the base's dev server and dist output, capabilities,
neutral RGBA icon set) around any of the 7 bases; nuxt switches to SSG
(ssr: false + generate). bump now scans the desktop category so the
@tauri-apps/cli pin stays fresh.

Closes #117

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…121)

* fix: generated eslint config only imports what package.json installs

The eslint.config.mjs template imported globals, typescript-eslint, and the
react plugins unconditionally while the registry entry shipped only
eslint + @eslint/js — the react-plugin dep rule fired for vite-react alone,
so every other base failed its first pre-push lint with missing packages.

- globals + typescript-eslint move into the registry eslint entry
  (unconditional import -> unconditional dependency)
- react plugin imports are now conditional on the base's react integration,
  and the dep rule tracks the same condition (astro-react included)
- the files glob drops vue/astro extensions no shipped parser can handle

TestGeneratedConfigImportsAreInstalled guards the whole class: for every
representative combo, each package imported by a generated top-level config
file must be installed by the generated package.json.

Closes #118

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: repair inverted GetIntegration nil check and IsVueInt comparison

GetIntegration returned an error whenever the registry WAS loaded (and
would nil-deref when it wasn't), so IsReactInt/IsVueInt always returned
false — the eslint template's react branch could never fire, and IsVueInt
additionally compared against "react". Fixed both, guarded the nil entry,
and pinned every base's IsReactInt/IsVueInt plus the positive react-plugin
wiring (config imports AND installed deps) in tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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