Skip to content

Develop - #15

Merged
davidcreated merged 8 commits into
mainfrom
develop
Jul 23, 2026
Merged

Develop#15
davidcreated merged 8 commits into
mainfrom
develop

Conversation

@davidcreated

@davidcreated davidcreated commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

Type of change

  • Bug fix
  • New feature
  • Docs
  • Internal / refactor

Checklist

  • This repo's checks pass locally (format, analyze, tests — see CONTRIBUTING)
  • Added / updated tests where it makes sense
  • Added / updated docs and the CHANGELOG.md (if the repo has one)
  • PR targets the develop branch

Summary by CodeRabbit

  • New Features

    • Added Go project detection and automated dependency, analysis, test, and build checks.
    • Added web/Node project detection with framework, monorepo, and package-manager support.
    • Added upload support for npm, iOS, and Android artifacts, including dry-run previews.
    • Added automated cross-platform releases with Homebrew and Scoop distribution.
  • Bug Fixes

    • Improved Yarn Berry installation handling.
    • Expanded ignored directories during project scanning.
  • Documentation

    • Updated the changelog, roadmap, and milestone tracking for Go, web, and upload support.

Add internal/detect with marker-file detectors for Flutter (vs pure Dart; app/module/plugin), React Native (bare, Expo managed, Expo prebuild), native Android (app vs library, KMP flag), and native iOS (Xcode/SPM/Podfile). A depth-limited prune-on-detect scanner with skip lists and a containment sweep attributes android/ios folders to their Flutter or RN parent and surfaces each monorepo project once. Add the Cobra-based anvil detect command (table and --json, with --path and --depth). 16 fixture-tree tests cover the edge cases (node_modules exclusion, monorepo, KMP, plugin example pruning). Also apply the no-emojis, no-dash-connectors, minimal-comments style across docs and record it in CLAUDE.md.
feat(detect): stack detection engine and anvil detect
* feat(build): guided build lifecycle and anvil build

Add the driver contract (internal/driver) and drivers for Flutter, React Native, native Android, native iOS, Swift (SPM), and Kotlin/JVM, with --flavor threaded into build and test steps. Add the runner (internal/pipeline) that streams combined output, captures exit codes, classifies results, collects artifacts, and fail-fasts. Add internal/tui with a Bubble Tea view and a plain non-TTY renderer, and the anvil build command (--path/--target/--flavor/--release/--dry-run/--plain). Refine detection so Gradle is not always Android and Package.swift is Swift, adding Swift and Kotlin stacks. Tests cover driver steps, the runner via a real subprocess, and the plain renderer.

* fix: remove unused dirExists helper (staticcheck U1000)
Add a Sign phase and the anvil sign command plus anvil build --sign. internal/sign generates a PKCS12 keystore with keytool, writes key.properties, wires Gradle signingConfigs, writes an iOS ExportOptions.plist, and gitignores the secrets. iOS sign steps live on the Flutter (flutter build ipa), React Native, and native iOS (xcodebuild archive + exportArchive) drivers; Android signs at build time via the wired Gradle config. Passwords come from prompts (huh) or environment, never the repo, and --dry-run makes no changes. Tests cover live keystore generation (keytool), Gradle wiring idempotence, gitignore, ExportOptions, and step argv.
Add internal/upload with an Uploader interface and three targets: iOS via xcrun altool (App Store Connect/TestFlight), Android via the Google Play Publisher API (insert edit, upload bundle, assign track, commit) using a service-account JWT, and npm via npm publish. Credentials resolve from flag, env, or a base64 env decoded to a 0600 temp file, and are refused if they live inside the repo. anvil upload is a dry run unless --yes. Add GoReleaser (.goreleaser.yaml) and a tag-triggered release workflow that build cross-platform binaries and publish a GitHub release plus Homebrew cask and Scoop manifests. Tests cover credential resolution, the in-repo refusal, and each uploader's Validate/Describe.
Add Go and web/Node as detectors and drivers, reusing the existing contract with no new dependencies. Go: go.mod detection (app vs library via a main-package scan); go mod download, go vet + gofmt -l (Analyze classified as failed on non-empty output), go test, go build. Web/Node: framework detection (Next, Nuxt, SvelteKit, Angular, Vite, CRA, Vue, Svelte, Astro, Remix, Gatsby); deps by lockfile (with Yarn Berry --immutable), lint, test (jest/vitest/script with CI=true), build via the package.json script. Monorepo roots (workspaces, pnpm-workspace.yaml, lerna, nx) are descended into rather than claimed, and a single-package Turbo repo is a leaf. Detector order appends Go then Web (Web last, most permissive).
@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6e924772-0dba-479e-a723-7c06e8170346

📥 Commits

Reviewing files that changed from the base of the PR and between 635a012 and 4fd964e.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (23)
  • .github/workflows/release.yml
  • .goreleaser.yaml
  • CHANGELOG.md
  • cmd/upload.go
  • docs/ROADMAP.md
  • go.mod
  • internal/detect/detect.go
  • internal/detect/go.go
  • internal/detect/goweb_test.go
  • internal/detect/reactnative.go
  • internal/detect/web.go
  • internal/driver/go.go
  • internal/driver/goweb_test.go
  • internal/driver/reactnative.go
  • internal/driver/registry.go
  • internal/driver/web.go
  • internal/upload/android.go
  • internal/upload/creds.go
  • internal/upload/ios.go
  • internal/upload/npm.go
  • internal/upload/upload.go
  • internal/upload/upload_test.go
  • tasks/todo.md

📝 Walkthrough

Walkthrough

The change adds Go and web/Node project detection and build drivers, an upload command with iOS, Android, and npm backends, credential handling, and tag-triggered GoReleaser release automation. Tests cover detection, driver behavior, credentials, validation, and dry-run descriptions.

Changes

Go and web breadth

Layer / File(s) Summary
Go and web project detection
internal/detect/*
Go modules and web projects are detected and classified, with framework, tooling, workspace-root, and traversal handling covered by tests.
Go and web build drivers
internal/driver/*
Go and web drivers emit phase-specific commands, classify analysis results, select package managers, support Yarn Berry, and are wired through the driver registry.

Artifact upload

Layer / File(s) Summary
Upload contracts and credential resolution
internal/upload/upload.go, internal/upload/creds.go, go.mod
Platform upload interfaces and credential sources are defined, including temporary base64 credentials and in-repository path rejection.
Platform upload implementations
internal/upload/{ios,android,npm}.go
iOS, Android, and npm uploaders validate configuration, describe actions, and execute platform-specific publishing flows.
Upload command orchestration
cmd/upload.go, internal/upload/upload_test.go
The CLI selects platforms, supports dry runs, stages credentials, handles interruption, and tests uploader validation and descriptions.

Release automation and project records

Layer / File(s) Summary
GoReleaser release pipeline
.github/workflows/release.yml, .goreleaser.yaml
Version-tag pushes invoke GoReleaser to build cross-platform archives and publish GitHub, Homebrew, and Scoop outputs.
Documentation and milestone records
CHANGELOG.md, docs/ROADMAP.md, tasks/todo.md
Project records document Go/web support, upload scope, release distribution, and milestone status.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

Comment @coderabbitai help to get the list of available commands.

@davidcreated
davidcreated merged commit 99035c4 into main Jul 23, 2026
10 of 11 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request Jul 24, 2026
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