Skip to content

chore(repo): normalize fork to mirror-only upstream#10

Merged
Jesssullivan merged 36 commits intomainfrom
chore/normalize-fork-mirror
Apr 16, 2026
Merged

chore(repo): normalize fork to mirror-only upstream#10
Jesssullivan merged 36 commits intomainfrom
chore/normalize-fork-mirror

Conversation

@Jesssullivan
Copy link
Copy Markdown

Summary

  • fast-forward the fork toward canonical upstream package/module/build metadata
  • keep the fork validation-only by preserving a local publish blocker and release-validation workflow
  • remove mutable install behavior from fork CI and validate Bazel package metadata in the mirror lane

Why

The fork should remain a mirror/integration surface, not a second release authority for .

Refs Jesssullivan#57

Jesssullivan and others added 30 commits April 5, 2026 20:19
Removed: src/middleware/ (33 files), modal-app.py, Dockerfile,
live tests, playwright deps. Version 0.3.1 to 0.4.0.
Scraper belongs in acuity-middleware, not the scheduling library.
Deprecated since extract-business.ts + middleware wizard steps
replaced all scraper functionality.

BREAKING: AcuityScraper, createScraperAdapter, scrapeServicesOnce,
scrapeAvailabilityOnce removed from @tummycrypt/scheduling-kit/adapters.
- MODULE.bazel: bzlmod config with rules_js 2.9.1, rules_ts 3.8.4, SWC, pnpm 9
- BUILD.bazel: svelte-package build, npm_package, 6 subpackage ts_project
  targets (core, adapters, payments, reconciliation, lib, testing), vitest,
  svelte-check typecheck
- .bazelrc: build/CI/debug/release configs with disk cache
- .bazelversion: pin to 8.1.1
- .npmrc: hoist=false (required by rules_js)
* chore: bump version to 0.5.0

* refactor!: remove acuity-scraper adapter

Scraper belongs in acuity-middleware, not the scheduling library.
Deprecated since extract-business.ts + middleware wizard steps
replaced all scraper functionality.

BREAKING: AcuityScraper, createScraperAdapter, scrapeServicesOnce,
scrapeAvailabilityOnce removed from @tummycrypt/scheduling-kit/adapters.

* build: add Bazel 8 configuration with subpackage targets

- MODULE.bazel: bzlmod config with rules_js 2.9.1, rules_ts 3.8.4, SWC, pnpm 9
- BUILD.bazel: svelte-package build, npm_package, 6 subpackage ts_project
  targets (core, adapters, payments, reconciliation, lib, testing), vitest,
  svelte-check typecheck
- .bazelrc: build/CI/debug/release configs with disk cache
- .bazelversion: pin to 8.1.1
- .npmrc: hoist=false (required by rules_js)
build: add Bazel 8 + cleanup for v0.5.0
When payeeEmail is set in VenmoAdapterConfig, the PayPal order
creation includes payee.email_address in purchase_units. This
routes payments directly to the practitioner's PayPal account
without requiring their API credentials.

Ref: PayPal "Pay another account" docs
…e-email

feat(venmo): payee-email routing for practitioner payments
…van#19)

* fix(ci): use @Jesssullivan scope for GitHub Packages mirror

* feat(venmo): add returnUrl/cancelUrl to experience_context

PayPal requires return_url and cancel_url in the Venmo payment source
experience_context for proper popup handling. Without them, PayPal may
force additional buyer verification loops or block the popup flow.

New optional fields on VenmoAdapterConfig: returnUrl, cancelUrl.
* fix(ci): use @Jesssullivan scope for GitHub Packages mirror

* feat(venmo): add returnUrl/cancelUrl to experience_context

PayPal requires return_url and cancel_url in the Venmo payment source
experience_context for proper popup handling. Without them, PayPal may
force additional buyer verification loops or block the popup flow.

New optional fields on VenmoAdapterConfig: returnUrl, cancelUrl.

* chore: bump to 0.5.2 (PayPal return URLs)
…livan#21-Jesssullivan#27) (Jesssullivan#28)

New @tummycrypt/scheduling-kit/onboarding subpackage:

Interfaces:
- CredentialStore: app-provided key-value storage (PG, Redis, etc.)
- EncryptionProvider: app-provided encryption (AES, Vault, etc.)
- StripeConnectConfig, StripeAccountStatus, WebhookSetupResult types

Stripe:
- buildStripeAuthorizeUrl() + exchangeStripeCode() — Connect OAuth
- getStripeAccountStatus() — account onboarding status
- validateStripeKeys() — key validation against Stripe API
- createStripeWebhook() + deleteStripeWebhooks() — webhook CRUD

PayPal:
- validatePayPalCredentials() — OAuth token validation
- createPayPalWebhook() — webhook creation

Build:
- Bazel //src/onboarding target (deps: :core, :payments, effect)
- Package.json ./onboarding export

Pattern: library defines interfaces + helpers, application provides
CredentialStore implementation. Same pattern as HomegrownAdapter's
getDb callback — scheduling-kit doesn't know about databases.

Closes Jesssullivan#21, Jesssullivan#22, Jesssullivan#23, Jesssullivan#24, Jesssullivan#27. Partial Jesssullivan#25, Jesssullivan#26.
…esssullivan#26) (Jesssullivan#30)

- createAdapterFactory(): settings-driven singleton with cache,
  promise dedup, reset, and disable lifecycle
- 21 tests: Stripe OAuth URL, key validation, account status,
  PayPal credential validation, factory lifecycle (cache, reset,
  disable, store passthrough)
- Updated vitest.config.ts to include onboarding test glob

Closes Jesssullivan#25, Jesssullivan#26.
* feat: adapter factory pattern + 21 onboarding tests (Jesssullivan#25, Jesssullivan#26)

- createAdapterFactory(): settings-driven singleton with cache,
  promise dedup, reset, and disable lifecycle
- 21 tests: Stripe OAuth URL, key validation, account status,
  PayPal credential validation, factory lifecycle (cache, reset,
  disable, store passthrough)
- Updated vitest.config.ts to include onboarding test glob

Closes Jesssullivan#25, Jesssullivan#26.

* chore: strip sourcemaps from npm package (2,711 .map files excluded)
…inc (Jesssullivan#45)

* feat(payments)!: converge PaymentCapabilities contract from tinyland-inc

Cherry-pick tinyland-inc/main squash (v0.7.0) onto Jesssullivan/main.
Keeps Jess's CI/publish workflows and Bazel structure.
Bumps all version references to 0.7.0.

- PaymentCapabilities, StripeCapability, VenmoCapability types
- getDefaultCapabilities() factory
- HybridCheckoutDrawer: capabilities prop replaces individual payment props
- Cash at Visit structurally removed (cash: false)

* fix(ci): skip prepublish scripts in gh packages mirror
…-artifacts

build(bazel): publish scheduling-kit from bazel artifact
Replace hardcoded hex CSS with light-dark() for 8 components:
skeleton loading shimmer, border colors, scrollbar tracks.
Ensures proper dark-mode rendering when consumed by host apps.
@Jesssullivan Jesssullivan merged commit c8f775e into main Apr 16, 2026
4 checks passed
@Jesssullivan Jesssullivan deleted the chore/normalize-fork-mirror branch April 16, 2026 19:11
@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented Apr 16, 2026

Greptile Summary

This PR fast-forwards the tinyland-inc fork to mirror-only status: the publish workflow is renamed/retooled to validate only (no actual publish step), a prepublishOnly blocker guards against accidental npm publishes, and version metadata is aligned at 0.7.1 across package.json, MODULE.bazel, and BUILD.bazel, enforced by a new check-release-metadata.mjs script. Source files and test coverage are synced from upstream.

Confidence Score: 5/5

Safe to merge — no functional regressions; all remaining findings are non-blocking P2 suggestions.

Version metadata is aligned across all three files (package.json, MODULE.bazel, BUILD.bazel at 0.7.1), the publish blocker is in place, and the validation-only workflow correctly omits any actual publish step. The two P2 findings (unpinned bazelisk, silent undefined on missing packageManager) are hardening improvements that don't affect current correctness.

No files require special attention.

Important Files Changed

Filename Overview
.github/workflows/ci.yml CI normalizes to upstream structure: per-runner pnpm cache keys, frozen lockfile install, and release-metadata validation step added. TypeScript check and lint remain continue-on-error: true.
.github/workflows/publish.yml Renamed to "Release Validation (Fork Mirror)" with no actual publish steps; validates Bazel artifact via npx --yes @bazel/bazelisk without a version pin, introducing minor non-determinism.
scripts/check-release-metadata.mjs New script cross-checks version/name across package.json, MODULE.bazel, and BUILD.bazel; the pnpm version extraction via optional chaining can silently produce undefined if packageManager is absent.
package.json Version aligned to 0.7.1, prepublishOnly blocker added, repository URL points to upstream canonical repo; exports map looks correct.
MODULE.bazel Version and pnpm_version aligned to match package.json (0.7.1 / 9.15.9). Bzlmod configuration looks correct.
BUILD.bazel npm_package version and package name aligned (0.7.1 / @tummycrypt/scheduling-kit). Subpackage targets and test targets look well-structured.
src/tests/components/client-form.test.ts Pure-logic tests reimplementing ClientForm validation; thorough coverage of field validation, phone formatting, intake fields, and ClientInfo construction.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A([push / PR / release]) --> B{Workflow}

    B -->|push or PR| C[CI — test job]
    B -->|release:published| G[Release Validation — Fork Mirror]

    C --> C1[Clean workspace]
    C1 --> C2[check-release-metadata.mjs]
    C2 --> C3[pnpm install frozen]
    C3 --> C4[TypeScript check\ncontinue-on-error]
    C4 --> C5[Lint\ncontinue-on-error]
    C5 --> C6[Unit + Integration tests]
    C6 --> C7[pnpm build]
    C7 --> D[CI — build job\nneeds: test]
    D --> D1[check-release-metadata.mjs]
    D1 --> D2[pnpm build]
    D2 --> D3[publint]

    G --> G1[check-release-metadata.mjs]
    G1 --> G2[pnpm install frozen]
    G2 --> G3[bazelisk build /pkg]
    G3 --> G4[npm pack --dry-run\nbazel-bin/pkg]
    G4 --> G5[pnpm test:unit]
    G5 --> G6[pnpm build]
    G6 --> G7[publint]
    G7 --> G8([Validation complete\nno publish])

    style G8 fill:#d4edda,stroke:#28a745
    style G fill:#fff3cd,stroke:#ffc107
Loading

Reviews (1): Last reviewed commit: "chore(repo): normalize fork to mirror-on..." | Re-trigger Greptile

run: pnpm install --frozen-lockfile

- name: Validate Bazel package artifact
run: npx --yes @bazel/bazelisk build //:pkg
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Unpinned bazelisk version

npx --yes @bazel/bazelisk always resolves to the latest published version of bazelisk. While Bazel itself is pinned (via .bazelversion or MODULE.bazel), a breaking bazelisk release could silently change how Bazel is downloaded or invoked. Pinning the version makes the step reproducible.

Suggested change
run: npx --yes @bazel/bazelisk build //:pkg
- name: Validate Bazel package artifact
run: npx --yes @bazel/bazelisk@1 build //:pkg

Or install it as a dev dependency so the lockfile pins it exactly.


const expectedVersion = packageJson.version;
const expectedPackageName = packageJson.name;
const expectedPnpmVersion = packageJson.packageManager?.replace(/^pnpm@/, '');
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Silent undefined when packageManager is absent

If packageManager is missing from package.json, expectedPnpmVersion becomes undefined. The pnpm version check then always fails with a confusing message like expected "undefined", found "9.15.9" rather than calling out the missing field. Consider an explicit guard:

Suggested change
const expectedPnpmVersion = packageJson.packageManager?.replace(/^pnpm@/, '');
const expectedPnpmVersion = packageJson.packageManager?.replace(/^pnpm@/, '');
if (!expectedPnpmVersion) {
throw new Error('packageManager field is missing or not a pnpm version in package.json');
}

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