From 2690fc483b240a84cc0744c45a40cef25ab54d56 Mon Sep 17 00:00:00 2001 From: Vitrora Date: Tue, 21 Jul 2026 09:19:55 +0530 Subject: [PATCH 1/8] docs: add release, versioning, and community templates design Spec for Changesets lockstep releases, release.yml npm publish, and core GitHub issue/PR templates. --- .../2026-07-21-release-ci-community-design.md | 251 ++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 docs/superpowers/specs/2026-07-21-release-ci-community-design.md diff --git a/docs/superpowers/specs/2026-07-21-release-ci-community-design.md b/docs/superpowers/specs/2026-07-21-release-ci-community-design.md new file mode 100644 index 0000000..4e92242 --- /dev/null +++ b/docs/superpowers/specs/2026-07-21-release-ci-community-design.md @@ -0,0 +1,251 @@ +# Release automation, versioning, and community templates + +**Date:** 2026-07-21 +**Status:** Approved +**Repo:** `formsreach-sdk` (pnpm monorepo) +**Approach:** Changesets fixed monorepo (Approach A) + +## Summary + +Add deliberate versioning and npm publishing via Changesets (lockstep across packages), a GitHub Actions release workflow, and core GitHub community templates (bug report, feature request, PR template). Existing CI quality gates stay as-is. + +## Goals + +1. Lockstep semver for `@formsreach/js`, `@formsreach/react`, and `@formsreach/vue` +2. PR-based releases: contributors add changesets; maintainers merge a Version PR to bump, changelog, tag, and publish +3. CI publishes public packages to npm on successful release (unpkg follows npm for the CDN file) +4. Structured bug and feature issue forms plus a short PR checklist +5. Keep existing `ci.yml` checks (format, lint, build, test, typecheck); add a separate release workflow only + +## Non-goals + +- Independent per-package versioning +- Fully automatic bump/publish from Conventional Commits alone (commitlint stays for messages only) +- Canary / snapshot publishes +- Dependabot, Node version matrix, or CI hardening beyond today’s job +- CODE_OF_CONDUCT, SECURITY.md, or a full CONTRIBUTING.md (later) +- Dual-publish to GitHub Packages +- npm trusted publishing / OIDC (classic `NPM_TOKEN` first) +- Auto-merge of the Version Packages PR +- Single root `CHANGELOG.md` as the primary changelog (per-package changelogs via Changesets) + +## Locked decisions + +| Topic | Decision | +|---|---| +| Version strategy | Lockstep (fixed Changesets group) | +| Release style | PR-based Changesets | +| Publish | CI publishes to npm on Version PR merge | +| Changelogs | Per-package `CHANGELOG.md` (Changesets default) | +| Quality CI | Unchanged check list; release is a separate workflow | +| Community templates | Bug form, feature form, issue config, PR template | +| Blank issues | Allowed (`blank_issues_enabled: true`) | +| Auth for npm | Repo secret `NPM_TOKEN` | + +## Architecture + +``` +packages/js|react|vue (published, fixed versions) + ▲ + │ version / changelog / publish +.changeset/config.json + .changeset/*.md + ▲ + │ release.yml (push to main) +changesets/action + → open/update "Version Packages" PR + → or publish when no pending changesets after version commit + +.github/workflows/ci.yml # quality only (unchanged steps) +.github/ISSUE_TEMPLATE/* # bug + feature + config +.github/pull_request_template.md +``` + +### File layout + +| Path | Role | +|---|---| +| `.changeset/config.json` | Fixed package group, `baseBranch: main`, `access: public`, changelog | +| `.changeset/*.md` | Per-PR release intent (from `pnpm changeset`) | +| `packages/*/package.json` | Version source of truth (kept equal by fixed mode) | +| `packages/*/CHANGELOG.md` | Generated/updated by `changeset version` | +| Root `package.json` | `private: true`; scripts only; not published | +| `.github/workflows/ci.yml` | Existing format/lint/build/test/typecheck | +| `.github/workflows/release.yml` | Version PR + `changeset publish` | +| `.github/ISSUE_TEMPLATE/bug_report.yml` | Bug issue form | +| `.github/ISSUE_TEMPLATE/feature_request.yml` | Feature issue form | +| `.github/ISSUE_TEMPLATE/config.yml` | Chooser + optional product contact link | +| `.github/pull_request_template.md` | Short PR checklist | + +### Changesets config (behavioral requirements) + +- **Fixed group:** `@formsreach/js`, `@formsreach/react`, `@formsreach/vue` always share one version; highest bump in a release wins for the group. +- **`access`:** `public` +- **`baseBranch`:** `main` +- **`updateInternalDependencies`:** `patch` so react/vue pick up the published `@formsreach/js` version after release. +- **Commit / ignore:** Do not publish the private root workspace package; only `packages/*`. +- **Linked vs fixed:** Use **fixed** (not merely linked) so versions never diverge. + +### Root scripts to add + +```json +"changeset": "changeset", +"version-packages": "changeset version", +"release": "pnpm build && changeset publish" +``` + +- `changeset` — interactive (local) +- `version-packages` — mainly used by CI / maintainers +- `release` — build packages then publish; used by `release.yml` publish path + +Dev dependency: `@changesets/cli` at the monorepo root. + +## Versioning rules + +1. All three packages always have the same `version` string after any Version PR. +2. Bumps are only from changeset files (`patch` / `minor` / `major`), not from commit message parsing. +3. Local deps stay `workspace:*` in source; publish rewrites to concrete versions. +4. Packages currently sit at `0.1.0` and are not yet on npm. The first public ship must go through a normal changeset + Version PR so changelogs and tags exist. Use a changeset summary such as "Initial public release" with an intentional bump (recommended: `minor` → `0.2.0`, or `patch` → `0.1.1`). Do not add a dummy changeset for tooling-only PRs; wait until something is meant to ship. +5. Git tags: accept Changesets’ default per-package tags (e.g. `@formsreach/js@0.1.1`) at matching versions. No monorepo-only `vX.Y.Z` tag in this pass. +6. Conventional Commits remain enforced by commitlint for history quality only. + +## Release flow + +### Contributor path + +1. Implement the change. +2. If the change affects published package behavior or public API: run `pnpm changeset`, select bump level and summary, commit the new `.changeset/*.md` file. +3. Open PR. Template checklist includes “Changeset added if this affects published packages.” +4. `ci.yml` runs; no publish. + +Tooling-only, docs-only, or internal-only PRs need no changeset unless a version bump is intentional. + +### Maintainer / CI path + +1. On each push to `main`, `release.yml` runs with concurrency limited to one release job. +2. If pending changesets exist: `changesets/action` creates or updates the **Version Packages** PR (bumps fixed packages together, updates per-package `CHANGELOG.md`, removes consumed changesets). +3. Maintainer reviews changelog wording on the Version PR and merges. +4. On the subsequent push to `main` (version commit, no pending changesets): action runs publish: + - `pnpm install --frozen-lockfile` + - `pnpm release` (build + `changeset publish`) with `NPM_TOKEN` +5. Tags and npm packages published; unpkg serves `@formsreach/js` CDN file from npm. + +### `release.yml` requirements + +| Item | Requirement | +|---|---| +| Trigger | `push` branches: `[main]` | +| Runner | `ubuntu-latest` | +| Toolchain | pnpm 9, Node 22, frozen lockfile (align with `ci.yml`) | +| Permissions | `contents: write`, `pull-requests: write` (for Version PR + tags) | +| Concurrency | Single group (e.g. `release`) so parallel main pushes do not race | +| Core | `changesets/action@v1` with publish command invoking root `pnpm release` | +| Secrets | `NPM_TOKEN` for npm; `GITHUB_TOKEN` (default) for PRs/tags | + +### Failure / edge cases + +| Case | Expected behavior | +|---|---| +| Version PR open; more changesets merge to main | Next release run updates the Version PR | +| No changesets on main | Workflow succeeds as no-op | +| Publish fails | Fix credentials/permissions and re-run; avoid hand-editing versions unless recovering from a partial publish | +| Feature PR red CI | No release impact; Version PR should also pass the same CI | + +## Community templates + +### Bug report (`bug_report.yml`) + +Required or structured fields: + +1. Description (required) +2. Package (dropdown: `@formsreach/js`, `@formsreach/react`, `@formsreach/vue`, unclear) +3. Version (required) +4. Environment (browser / Node / framework) +5. Steps to reproduce (required) +6. Expected vs actual +7. Minimal repro link (optional) + +Apply label `bug` via the form when supported. + +### Feature request (`feature_request.yml`) + +1. Problem / use case (required) +2. Proposed solution (required) +3. Alternatives considered (optional) +4. Affected packages (multi-select same package list) + +Apply label `enhancement` via the form when supported. + +### Config (`config.yml`) + +- `blank_issues_enabled: true` +- Contact link to https://formsreach.com labeled for product/account help (keeps non-SDK support out of the issue tracker) + +### PR template (`pull_request_template.md`) + +Short markdown: + +- Summary section +- Checklist: tests if behavior changed; `pnpm check` / CI green; changeset if published packages affected; docs/README if public API or usage changed + +## Documentation updates (light) + +- Root `README.md`: brief “Contributing” / “Releasing” notes — issue templates, `pnpm changeset` for package changes, Version PR + npm publish overview; link to Changesets docs. +- Root `AGENTS.md`: one line that user-facing package changes need a changeset. + +No full CONTRIBUTING.md in this pass. + +## Maintainer ops (one-time and ongoing) + +### One-time + +1. Ensure npm identity can publish under `@formsreach` (org or user scope). +2. Create GitHub Actions secret `NPM_TOKEN` with publish rights. +3. Confirm readiness for first public `0.1.0` (or next) publish of all three packages. +4. After this work merges: only open a Version PR when a real changeset lands with a shippable change. + +### Ongoing + +1. Treat Version Packages PR as a normal review (edit changelog text if needed before merge). +2. After merge, confirm release job success and npm (and unpkg for js CDN). +3. Prefer re-running the workflow over manual version edits when publish fails. + +## Implementation outline + +1. Add `@changesets/cli`; init `.changeset/config.json` with fixed packages and public access. +2. Add root scripts: `changeset`, `version-packages`, `release`. +3. Add `.github/workflows/release.yml` with changesets/action and concurrency. +4. Leave `.github/workflows/ci.yml` check steps unchanged. +5. Add issue forms + config + PR template. +6. Update README and AGENTS.md lightly. +7. Document `NPM_TOKEN` requirement (README or release note in this spec’s ops section is enough). +8. Verify: dry-run mental path — `pnpm changeset` creates file; config validates; workflow YAML is valid. Full publish verification requires the secret and is a post-merge maintainer step. + +## Success criteria + +- [ ] `.changeset/config.json` fixes the three packages together; `access: public`; `baseBranch: main` +- [ ] `pnpm changeset` works from repo root +- [ ] `release.yml` opens/updates Version PR when changesets exist; publishes when appropriate after Version PR merge +- [ ] `ci.yml` still runs format:check, lint, build, test, typecheck only for quality +- [ ] Bug + feature issue forms, config.yml, and PR template exist +- [ ] README (and AGENTS one-liner) document changesets + release +- [ ] Root package remains private and is never published +- [ ] No Dependabot, canaries, or extra community policy files in this pass + +## Risks + +| Risk | Mitigation | +|---|---| +| Contributors forget changesets | PR template checklist; review habit; no bump until someone adds one | +| `NPM_TOKEN` missing/expired | Document secret; failed publish job is the signal | +| Partial multi-package publish | Prefer single `changeset publish`; recover carefully without inventing divergent versions | +| Fixed mode surprise (all packages bump) | Document lockstep in README; correct for tightly coupled SDKs | + +## Alternatives considered + +| Approach | Why not chosen | +|---|---| +| release-please | Less explicit per-PR release intent; user preferred Changesets | +| semantic-release / fully automatic | Hands-off notes; user wanted PR-based control | +| Independent package versions | Extra complexity; packages are coupled via `@formsreach/js` | +| Manual-only version scripts | Easy to drift in a monorepo | +| Root-only CHANGELOG | Diverges from Changesets defaults; per-package is clearer for npm consumers | From 9784446df7153cd746b8e1bcf9b00d47aa956667 Mon Sep 17 00:00:00 2001 From: Vitrora Date: Tue, 21 Jul 2026 09:22:59 +0530 Subject: [PATCH 2/8] docs: add release, CI community templates implementation plan Task-by-task plan for Changesets, release.yml, and issue/PR templates. --- .../plans/2026-07-21-release-ci-community.md | 582 ++++++++++++++++++ 1 file changed, 582 insertions(+) create mode 100644 docs/superpowers/plans/2026-07-21-release-ci-community.md diff --git a/docs/superpowers/plans/2026-07-21-release-ci-community.md b/docs/superpowers/plans/2026-07-21-release-ci-community.md new file mode 100644 index 0000000..dd2d432 --- /dev/null +++ b/docs/superpowers/plans/2026-07-21-release-ci-community.md @@ -0,0 +1,582 @@ +# Release Automation, Versioning, and Community Templates Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add Changesets lockstep versioning, a GitHub Actions release workflow that opens Version PRs and publishes to npm, plus bug/feature issue forms and a PR template. + +**Architecture:** `@changesets/cli` at the monorepo root with a fixed package group for `@formsreach/js`, `@formsreach/react`, and `@formsreach/vue`. Contributors add `.changeset/*.md` files on PRs. `release.yml` runs `changesets/action@v1` on pushes to `main`: create/update a Version Packages PR, or build and `changeset publish` when a version commit lands. Existing `ci.yml` quality steps stay unchanged. Community templates live under `.github/`. + +**Tech Stack:** pnpm workspaces, `@changesets/cli`, `changesets/action@v1`, GitHub Actions, GitHub issue forms (YAML), npm public scope `@formsreach`. + +## Global Constraints + +- Version strategy: **lockstep** via Changesets **fixed** group (all three packages same version) +- Release style: **PR-based Changesets** (not commit-message auto-bump) +- Publish: **CI publishes** with repo secret `NPM_TOKEN` +- Changelogs: **per-package** `CHANGELOG.md` (Changesets default) +- Quality CI: **do not change** the check list in `.github/workflows/ci.yml` +- No Dependabot, canaries, CODE_OF_CONDUCT, SECURITY.md, or full CONTRIBUTING.md +- Root package stays **`private: true`** and is never published +- Spec: `docs/superpowers/specs/2026-07-21-release-ci-community-design.md` + +## File map + +| File | Responsibility | +|---|---| +| `package.json` | Root scripts `changeset`, `version-packages`, `release`; devDependency `@changesets/cli` | +| `pnpm-lock.yaml` | Lockfile after installing Changesets | +| `.changeset/config.json` | Fixed group, public access, baseBranch main | +| `.changeset/README.md` | Default Changesets stub (from init or hand-written) | +| `.github/workflows/release.yml` | Version PR + npm publish | +| `.github/workflows/ci.yml` | **Unchanged** quality workflow | +| `.github/ISSUE_TEMPLATE/bug_report.yml` | Bug issue form | +| `.github/ISSUE_TEMPLATE/feature_request.yml` | Feature issue form | +| `.github/ISSUE_TEMPLATE/config.yml` | Blank issues + product contact link | +| `.github/pull_request_template.md` | PR checklist including changeset | +| `README.md` | Contributing / releasing notes | +| `AGENTS.md` | One-line changeset convention | + +--- + +### Task 1: Install Changesets and configure fixed packages + +**Files:** +- Modify: `package.json` +- Modify: `pnpm-lock.yaml` +- Create: `.changeset/config.json` +- Create: `.changeset/README.md` + +**Interfaces:** +- Produces: root scripts `changeset`, `version-packages`, `release`; `.changeset/config.json` with fixed group; working `pnpm exec changeset status` (or empty status) + +- [ ] **Step 1: Install `@changesets/cli` at workspace root** + +```bash +pnpm add -D -w @changesets/cli +``` + +Expected: `package.json` `devDependencies` includes `@changesets/cli`; lockfile updates. + +- [ ] **Step 2: Add root scripts** + +In root `package.json`, add these three scripts alongside existing ones (do not remove `prepare`, `check`, etc.): + +```json +"changeset": "changeset", +"version-packages": "changeset version", +"release": "pnpm build && changeset publish" +``` + +Full `scripts` object after edit: + +```json +{ + "prepare": "husky", + "build": "pnpm -r --filter \"./packages/**\" build", + "test": "pnpm -r --filter \"./packages/**\" test", + "typecheck": "pnpm -r --filter \"./packages/**\" typecheck", + "lint": "eslint \"packages/**/*.{ts,tsx}\" --max-warnings 0", + "format": "prettier --write \"packages/**/*.{ts,tsx,json,md}\" \"*.md\" \".github/**/*.{yml,yaml}\"", + "format:check": "prettier --check \"packages/**/*.{ts,tsx,json,md}\" \"*.md\" \".github/**/*.{yml,yaml}\"", + "check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build", + "changeset": "changeset", + "version-packages": "changeset version", + "release": "pnpm build && changeset publish" +} +``` + +- [ ] **Step 3: Create `.changeset/config.json`** + +```json +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [ + ["@formsreach/js", "@formsreach/react", "@formsreach/vue"] + ], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} +``` + +- [ ] **Step 4: Create `.changeset/README.md`** + +```markdown +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`. + +We answer common questions about [changesets here](https://github.com/changesets/changesets/blob/main/docs/common-questions.md). + +You can find the [full documentation for changesets here](https://github.com/changesets/changesets). + +## For maintainers + +1. On user-facing package changes, run `pnpm changeset` and commit the new file under `.changeset/`. +2. Merging to `main` opens or updates a **Version Packages** PR. +3. Merging that PR bumps versions, updates package changelogs, and publishes to npm (requires `NPM_TOKEN`). +``` + +- [ ] **Step 5: Verify Changesets sees the packages** + +```bash +pnpm exec changeset status +``` + +Expected: exits 0; reports no changesets (or empty pending list) and does not error on missing packages. If it errors about missing packages, fix package `name` fields in `packages/*/package.json` (they must be `@formsreach/js`, `@formsreach/react`, `@formsreach/vue`). + +- [ ] **Step 6: Commit** + +```bash +git add package.json pnpm-lock.yaml .changeset/config.json .changeset/README.md +git commit -m "chore: add changesets with lockstep fixed packages" +``` + +--- + +### Task 2: Release GitHub Actions workflow + +**Files:** +- Create: `.github/workflows/release.yml` +- Do **not** modify: `.github/workflows/ci.yml` check steps + +**Interfaces:** +- Consumes: root scripts `version-packages`, `release` from Task 1 +- Produces: workflow that on `main` either opens Version PR or publishes + +- [ ] **Step 1: Create `.github/workflows/release.yml`** + +```yaml +name: Release + +on: + push: + branches: [main] + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 9 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + registry-url: https://registry.npmjs.org + + - run: pnpm install --frozen-lockfile + + - name: Create Release Pull Request or Publish + uses: changesets/action@v1 + with: + version: pnpm run version-packages + publish: pnpm run release + title: Version Packages + commit: "chore: version packages" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} +``` + +Notes for implementers: + +- `cancel-in-progress: false` avoids cancelling a mid-publish job when another push lands. +- `NODE_AUTH_TOKEN` is what `setup-node` + `registry-url` use for npm auth during `changeset publish`. +- Full end-to-end publish cannot be verified without `NPM_TOKEN` in the GitHub repo; that is a maintainer ops step after merge. + +- [ ] **Step 2: Confirm `ci.yml` is untouched in behavior** + +Read `.github/workflows/ci.yml`. It must still run only: + +1. `pnpm install --frozen-lockfile` +2. `pnpm format:check` +3. `pnpm lint` +4. `pnpm -r --filter "./packages/**" build` +5. `pnpm -r --filter "./packages/**" test` +6. `pnpm -r --filter "./packages/**" typecheck` + +Do not add publish or changesets steps to `ci.yml`. + +- [ ] **Step 3: Commit** + +```bash +git add .github/workflows/release.yml +git commit -m "ci: add changesets release workflow for version PR and npm publish" +``` + +--- + +### Task 3: Issue forms and PR template + +**Files:** +- Create: `.github/ISSUE_TEMPLATE/bug_report.yml` +- Create: `.github/ISSUE_TEMPLATE/feature_request.yml` +- Create: `.github/ISSUE_TEMPLATE/config.yml` +- Create: `.github/pull_request_template.md` + +**Interfaces:** +- Produces: GitHub issue chooser with Bug + Feature; PR body checklist with changeset item + +- [ ] **Step 1: Create `.github/ISSUE_TEMPLATE/config.yml`** + +```yaml +blank_issues_enabled: true +contact_links: + - name: FormsReach product / account help + url: https://formsreach.com + about: Questions about the FormsReach product, dashboard, or account — not SDK bugs. +``` + +- [ ] **Step 2: Create `.github/ISSUE_TEMPLATE/bug_report.yml`** + +```yaml +name: Bug report +description: Report a problem with a FormsReach SDK package +title: "[bug]: " +labels: ["bug"] +body: + - type: textarea + id: description + attributes: + label: Description + description: What went wrong? + validations: + required: true + - type: dropdown + id: package + attributes: + label: Package + options: + - "@formsreach/js" + - "@formsreach/react" + - "@formsreach/vue" + - unclear / multiple + validations: + required: true + - type: input + id: version + attributes: + label: Package version + description: e.g. 0.1.0 + placeholder: 0.1.0 + validations: + required: true + - type: textarea + id: environment + attributes: + label: Environment + description: Browser, Node, React/Vue/Next/Nuxt versions as relevant + placeholder: | + Browser: Chrome 131 + Framework: Next.js 15 / React 19 + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce + description: Minimal steps that trigger the bug + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual behavior + validations: + required: true + - type: input + id: repro + attributes: + label: Minimal reproduction (optional) + description: Link to a repo, CodeSandbox, StackBlitz, etc. + validations: + required: false +``` + +- [ ] **Step 3: Create `.github/ISSUE_TEMPLATE/feature_request.yml`** + +```yaml +name: Feature request +description: Propose an improvement to a FormsReach SDK package +title: "[feat]: " +labels: ["enhancement"] +body: + - type: textarea + id: problem + attributes: + label: Problem / use case + description: What problem are you trying to solve? + validations: + required: true + - type: textarea + id: solution + attributes: + label: Proposed solution + description: How should this work? + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: Other approaches you tried or considered + validations: + required: false + - type: dropdown + id: packages + attributes: + label: Affected packages + multiple: true + options: + - "@formsreach/js" + - "@formsreach/react" + - "@formsreach/vue" + - unclear / multiple + validations: + required: true +``` + +- [ ] **Step 4: Create `.github/pull_request_template.md`** + +```markdown +## Summary + + + +## Checklist + +- [ ] Tests added/updated if behavior changed +- [ ] `pnpm check` passes locally (or CI is green) +- [ ] Changeset added if this affects published packages (`pnpm changeset`) +- [ ] Docs/README updated if public API or usage changed +``` + +- [ ] **Step 5: Format GitHub YAML/Markdown if needed** + +```bash +pnpm exec prettier --write ".github/**/*.{yml,yaml,md}" +``` + +Expected: Prettier rewrites if needed; no errors. + +- [ ] **Step 6: Commit** + +```bash +git add .github/ISSUE_TEMPLATE .github/pull_request_template.md +git commit -m "chore: add bug/feature issue forms and PR template" +``` + +--- + +### Task 4: Document releasing and changesets + +**Files:** +- Modify: `README.md` +- Modify: `AGENTS.md` + +**Interfaces:** +- Consumes: scripts and workflows from Tasks 1–3 +- Produces: contributors know when to run `pnpm changeset`; maintainers know Version PR + `NPM_TOKEN` + +- [ ] **Step 1: Append Contributing and Releasing sections to `README.md`** + +After the existing `## Monorepo` section (and before `## Examples`), insert: + +```markdown +## Contributing + +- Use the GitHub issue templates for bugs and feature requests. +- Open a PR against `main`. The PR template includes a short checklist. +- For changes that affect published packages (`@formsreach/js`, `@formsreach/react`, `@formsreach/vue`), run `pnpm changeset`, choose a bump type, and commit the new file under `.changeset/`. +- Packages version in **lockstep** (same version across all three). +- See [Changesets](https://github.com/changesets/changesets) for details. + +Git hooks (Husky): Conventional Commits on `commit-msg`; lint-staged on `pre-commit`; full `pnpm check` on `pre-push`. +``` + +Then **remove** the standalone line that currently only describes hooks after the monorepo bash block (the line starting with `Git hooks (Husky):`) so hooks are documented once inside Contributing — **or** keep the monorepo bash block as-is and only add new sections without duplicating hooks. Prefer: leave the monorepo bash block unchanged; add `## Contributing` and `## Releasing` after it; delete the old single-line hooks sentence if it would duplicate Contributing. + +Insert `## Releasing` after Contributing: + +```markdown +## Releasing + +1. Merge PRs that include changesets into `main`. +2. The **Release** workflow opens or updates a **Version Packages** PR (bumps all packages together, updates each package `CHANGELOG.md`). +3. Review and merge the Version Packages PR. +4. The same workflow publishes to npm (`pnpm release` → build + `changeset publish`). + +**Maintainer setup (one-time):** add a GitHub Actions secret `NPM_TOKEN` with publish access to the `@formsreach` npm scope. First public ship should use a real changeset (e.g. "Initial public release") via a Version PR — not a tooling-only dummy bump. +``` + +Keep `## Examples` and `## License` after these sections. + +- [ ] **Step 2: Add changeset convention to `AGENTS.md`** + +In the `## Conventions` bullet list, add: + +```markdown +- User-facing changes to published packages require a Changeset (`pnpm changeset`); packages version in lockstep +``` + +- [ ] **Step 3: Format docs** + +```bash +pnpm exec prettier --write README.md AGENTS.md +``` + +- [ ] **Step 4: Commit** + +```bash +git add README.md AGENTS.md +git commit -m "docs: document changesets, lockstep releases, and NPM_TOKEN" +``` + +--- + +### Task 5: End-to-end local verification + +**Files:** +- None permanently (temporary changeset may be created then deleted) + +**Interfaces:** +- Verifies Tasks 1–4 without requiring npm publish + +- [ ] **Step 1: Run full quality gate** + +```bash +pnpm check +``` + +Expected: format:check, lint, typecheck, test, build all pass. + +- [ ] **Step 2: Dry-run a changeset (then discard)** + +```bash +pnpm changeset add --empty +``` + +If interactive, prefer non-interactive empty changeset if supported; otherwise create a temporary file manually: + +Create `.changeset/verify-pipeline.md`: + +```markdown +--- +"@formsreach/js": patch +"@formsreach/react": patch +"@formsreach/vue": patch +--- + +Temporary verification changeset — delete before merge if not shipping. +``` + +Then: + +```bash +pnpm exec changeset status +``` + +Expected: lists the pending changeset and the three packages. + +Remove the temporary file if this PR should not open a Version PR on merge: + +```bash +rm .changeset/verify-pipeline.md +``` + +Do **not** commit a verification-only changeset unless intentionally shipping. + +- [ ] **Step 3: Validate workflow YAML parses** + +```bash +python3 -c "import yaml,sys; yaml.safe_load(open('.github/workflows/release.yml')); yaml.safe_load(open('.github/workflows/ci.yml')); print('ok')" +``` + +If PyYAML is missing: + +```bash +pnpm exec prettier --check ".github/workflows/*.yml" +``` + +Expected: no parse/format errors. + +- [ ] **Step 4: Confirm issue template files exist** + +```bash +test -f .github/ISSUE_TEMPLATE/bug_report.yml \ + && test -f .github/ISSUE_TEMPLATE/feature_request.yml \ + && test -f .github/ISSUE_TEMPLATE/config.yml \ + && test -f .github/pull_request_template.md \ + && test -f .changeset/config.json \ + && test -f .github/workflows/release.yml \ + && echo "all present" +``` + +Expected: `all present` + +- [ ] **Step 5: Final commit only if Step 2 left unintended files** + +If the working tree is dirty with verification artifacts, remove them. If docs/scripts need a fix from verification, commit: + +```bash +git status +# fix if needed, then: +# git add … && git commit -m "fix: address release setup verification" +``` + +- [ ] **Step 6: Maintainer checklist (document in PR description, not code)** + +After this work is on `main`: + +1. Add GitHub secret `NPM_TOKEN` (publish rights for `@formsreach`). +2. Confirm npm scope access. +3. First real ship: open a PR with `pnpm changeset` ("Initial public release"), merge, merge Version Packages PR, confirm npm + unpkg. + +--- + +## Spec coverage checklist + +| Spec requirement | Task | +|---|---| +| Fixed lockstep Changesets config | Task 1 | +| Root scripts `changeset` / `version-packages` / `release` | Task 1 | +| `release.yml` with changesets/action, concurrency, NPM_TOKEN | Task 2 | +| `ci.yml` checks unchanged | Task 2 Step 2 | +| Bug + feature forms + config + PR template | Task 3 | +| README + AGENTS docs | Task 4 | +| Local verify; publish needs secret post-merge | Task 5 | +| No Dependabot / canaries / extra community files | All tasks (omitted) | + +## Success criteria (from spec) + +- [ ] `.changeset/config.json` fixes the three packages; `access: public`; `baseBranch: main` +- [ ] `pnpm changeset` works from repo root +- [ ] `release.yml` opens/updates Version PR when changesets exist; publishes after Version PR merge +- [ ] `ci.yml` still only quality gates +- [ ] Bug + feature issue forms, config.yml, PR template exist +- [ ] README and AGENTS document changesets + release +- [ ] Root package remains private +- [ ] No Dependabot, canaries, or extra policy files in this pass From 612e7942a752c9e7bb2bc120c9c019f34222068b Mon Sep 17 00:00:00 2001 From: Vitrora Date: Tue, 21 Jul 2026 09:23:53 +0530 Subject: [PATCH 3/8] chore: ignore .worktrees for local isolation --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 60cf11b..50e15fe 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,6 @@ coverage .claude/ .grok/ .cursor/ + +# Git worktrees (local isolation) +.worktrees/ From b905997dd71d5a726b869cdbe15609e31e54eaad Mon Sep 17 00:00:00 2001 From: Vitrora Date: Tue, 21 Jul 2026 09:25:52 +0530 Subject: [PATCH 4/8] chore: add changesets with lockstep fixed packages --- .changeset/README.md | 13 + .changeset/config.json | 13 + package.json | 6 +- pnpm-lock.yaml | 622 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 653 insertions(+), 1 deletion(-) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..561ee24 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,13 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`. + +We answer common questions about [changesets here](https://github.com/changesets/changesets/blob/main/docs/common-questions.md). + +You can find the [full documentation for changesets here](https://github.com/changesets/changesets). + +## For maintainers + +1. On user-facing package changes, run `pnpm changeset` and commit the new file under `.changeset/`. +2. Merging to `main` opens or updates a **Version Packages** PR. +3. Merging that PR bumps versions, updates package changelogs, and publishes to npm (requires `NPM_TOKEN`). diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..d607410 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [ + ["@formsreach/js", "@formsreach/react", "@formsreach/vue"] + ], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/package.json b/package.json index d48cb21..ae26d1a 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,10 @@ "lint": "eslint \"packages/**/*.{ts,tsx}\" --max-warnings 0", "format": "prettier --write \"packages/**/*.{ts,tsx,json,md}\" \"*.md\" \".github/**/*.{yml,yaml}\"", "format:check": "prettier --check \"packages/**/*.{ts,tsx,json,md}\" \"*.md\" \".github/**/*.{yml,yaml}\"", - "check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build" + "check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build", + "changeset": "changeset", + "version-packages": "changeset version", + "release": "pnpm build && changeset publish" }, "lint-staged": { "packages/**/*.{ts,tsx}": [ @@ -28,6 +31,7 @@ }, "license": "MIT", "devDependencies": { + "@changesets/cli": "^2.31.1", "@commitlint/cli": "^19", "@commitlint/config-conventional": "^19", "@eslint/js": "^9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6b3c98..baa13d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: devDependencies: + '@changesets/cli': + specifier: ^2.31.1 + version: 2.31.1(@types/node@22.20.1) '@commitlint/cli': specifier: ^19 version: 19.8.1(@types/node@22.20.1)(typescript@5.9.3) @@ -122,10 +125,69 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} + + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.31.1': + resolution: {integrity: sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w==} + hasBin: true + + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} + + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@commitlint/cli@19.8.1': resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==} engines: {node: '>=v18'} @@ -547,6 +609,15 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -560,6 +631,24 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + '@rollup/rollup-android-arm-eabi@4.62.2': resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} cpu: [arm] @@ -694,6 +783,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@22.20.1': resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} @@ -835,6 +927,10 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -858,12 +954,19 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -875,6 +978,10 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + brace-expansion@1.1.16: resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} @@ -912,6 +1019,9 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} @@ -1020,6 +1130,14 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -1030,6 +1148,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1112,6 +1234,11 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -1145,9 +1272,16 @@ packages: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -1157,6 +1291,9 @@ packages: fast-uri@3.1.4: resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1174,6 +1311,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1192,6 +1333,14 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1215,6 +1364,10 @@ packages: deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. hasBin: true + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -1231,6 +1384,13 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + happy-dom@15.11.7: resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} engines: {node: '>=18.0.0'} @@ -1239,6 +1399,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + human-id@4.2.0: + resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} + hasBin: true + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -1248,6 +1412,10 @@ packages: engines: {node: '>=18'} hasBin: true + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1306,10 +1474,18 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + is-text-path@2.0.0: resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1324,6 +1500,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.15.0: + resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==} + hasBin: true + js-yaml@4.3.0: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true @@ -1343,6 +1523,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} @@ -1374,6 +1557,10 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1426,6 +1613,10 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1451,6 +1642,10 @@ packages: mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1485,6 +1680,17 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1493,6 +1699,10 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -1501,6 +1711,17 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1525,6 +1746,10 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -1551,6 +1776,10 @@ packages: engines: {node: '>=0.10'} hasBin: true + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -1584,6 +1813,11 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + prettier@3.9.5: resolution: {integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==} engines: {node: '>=14'} @@ -1593,10 +1827,20 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + react@19.2.7: resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1621,6 +1865,10 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -1629,6 +1877,12 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -1649,6 +1903,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -1665,10 +1923,16 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -1695,6 +1959,10 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -1712,6 +1980,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -1814,6 +2086,10 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1957,11 +2233,156 @@ snapshots: dependencies: '@babel/types': 7.29.7 + '@babel/runtime@7.29.7': {} + '@babel/types@7.29.7': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@changesets/apply-release-plan@7.1.1': + dependencies: + '@changesets/config': 3.1.4 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.8.5 + + '@changesets/assemble-release-plan@6.0.10': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.8.5 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.31.1(@types/node@22.20.1)': + dependencies: + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.4 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@22.20.1) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.8.5 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.4': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.8.5 + + '@changesets/get-release-plan@4.0.16': + dependencies: + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.3': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.3.0 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.7': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.2.0 + prettier: 2.8.8 + '@commitlint/cli@19.8.1(@types/node@22.20.1)(typescript@5.9.3)': dependencies: '@commitlint/format': 19.8.1 @@ -2281,6 +2702,13 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@inquirer/external-editor@1.0.3(@types/node@22.20.1)': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 22.20.1 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2295,6 +2723,34 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.29.7 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.29.7 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + '@rollup/rollup-android-arm-eabi@4.62.2': optional: true @@ -2378,6 +2834,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/node@12.20.55': {} + '@types/node@22.20.1': dependencies: undici-types: 6.21.0 @@ -2596,6 +3054,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-colors@4.1.3: {} + ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -2612,16 +3072,26 @@ snapshots: any-promise@1.3.0: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} array-ify@1.0.0: {} + array-union@2.1.0: {} + assertion-error@2.0.1: {} balanced-match@1.0.2: {} balanced-match@4.0.4: {} + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + brace-expansion@1.1.16: dependencies: balanced-match: 1.0.2 @@ -2659,6 +3129,8 @@ snapshots: chalk@5.6.2: {} + chardet@2.2.0: {} + check-error@2.1.3: {} chokidar@4.0.3: @@ -2752,6 +3224,12 @@ snapshots: deep-is@0.1.4: {} + detect-indent@6.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 @@ -2760,6 +3238,11 @@ snapshots: emoji-regex@8.0.0: {} + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + entities@4.5.0: {} entities@7.0.1: {} @@ -2899,6 +3382,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 + esprima@4.0.1: {} + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -2933,14 +3418,28 @@ snapshots: expect-type@1.4.0: {} + extendable-error@0.1.7: {} + fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} fast-uri@3.1.4: {} + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: picomatch: 4.0.5 @@ -2953,6 +3452,11 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -2977,6 +3481,18 @@ snapshots: flatted@3.4.2: {} + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fsevents@2.3.3: optional: true @@ -2992,6 +3508,10 @@ snapshots: meow: 12.1.1 split2: 4.2.0 + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -3004,6 +3524,17 @@ snapshots: globals@15.15.0: {} + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + happy-dom@15.11.7: dependencies: entities: 4.5.0 @@ -3012,10 +3543,16 @@ snapshots: has-flag@4.0.0: {} + human-id@4.2.0: {} + human-signals@5.0.0: {} husky@9.1.7: {} + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + ignore@5.3.2: {} ignore@7.0.6: {} @@ -3053,10 +3590,16 @@ snapshots: is-stream@3.0.0: {} + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 + is-windows@1.0.2: {} + isexe@2.0.0: {} jiti@2.6.1: {} @@ -3065,6 +3608,11 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@3.15.0: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.3.0: dependencies: argparse: 2.0.1 @@ -3079,6 +3627,10 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + jsonparse@1.3.1: {} keyv@4.5.4: @@ -3120,6 +3672,10 @@ snapshots: load-tsconfig@0.2.5: {} + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -3164,6 +3720,8 @@ snapshots: merge-stream@2.0.0: {} + merge2@1.4.1: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -3190,6 +3748,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.4 + mri@1.2.0: {} + ms@2.1.3: {} mz@2.7.0: @@ -3225,6 +3785,16 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -3233,6 +3803,10 @@ snapshots: dependencies: yocto-queue: 1.2.2 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -3241,6 +3815,14 @@ snapshots: dependencies: p-limit: 4.0.0 + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -3260,6 +3842,8 @@ snapshots: path-key@4.0.0: {} + path-type@4.0.0: {} + pathe@1.1.2: {} pathe@2.0.3: {} @@ -3274,6 +3858,8 @@ snapshots: pidtree@0.6.1: {} + pify@4.0.1: {} + pirates@4.0.7: {} pkg-types@1.3.1: @@ -3298,12 +3884,25 @@ snapshots: prelude-ls@1.2.1: {} + prettier@2.8.8: {} + prettier@3.9.5: {} punycode@2.3.1: {} + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + react@19.2.7: {} + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.15.0 + pify: 4.0.1 + strip-bom: 3.0.0 + readdirp@4.1.2: {} require-directory@2.1.1: {} @@ -3319,6 +3918,8 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + reusify@1.1.0: {} + rfdc@1.4.1: {} rollup@4.62.2: @@ -3352,6 +3953,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.62.2 fsevents: 2.3.3 + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + semver@7.8.5: {} shebang-command@2.0.0: @@ -3364,6 +3971,8 @@ snapshots: signal-exit@4.1.0: {} + slash@3.0.0: {} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.3 @@ -3378,8 +3987,15 @@ snapshots: source-map@0.7.6: {} + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + split2@4.2.0: {} + sprintf-js@1.0.3: {} + stackback@0.0.2: {} std-env@3.10.0: {} @@ -3406,6 +4022,8 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-bom@3.0.0: {} + strip-final-newline@3.0.0: {} strip-json-comments@3.1.1: {} @@ -3424,6 +4042,8 @@ snapshots: dependencies: has-flag: 4.0.0 + term-size@2.2.1: {} + text-extensions@2.4.0: {} thenify-all@1.6.0: @@ -3516,6 +4136,8 @@ snapshots: unicorn-magic@0.1.0: {} + universalify@0.1.2: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 From f402c236de2da0d5c2ecd45d907fdb8f5cab196a Mon Sep 17 00:00:00 2001 From: Vitrora Date: Tue, 21 Jul 2026 09:27:11 +0530 Subject: [PATCH 5/8] ci: add changesets release workflow for version PR and npm publish --- .github/workflows/release.yml | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..357312a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,42 @@ +name: Release + +on: + push: + branches: [main] + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false + +jobs: + release: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 9 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + registry-url: https://registry.npmjs.org + + - run: pnpm install --frozen-lockfile + + - name: Create Release Pull Request or Publish + uses: changesets/action@v1 + with: + version: pnpm run version-packages + publish: pnpm run release + title: Version Packages + commit: "chore: version packages" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} From 29abd53f63608cca5dd7b89e3c29c9f3e3e9fd8a Mon Sep 17 00:00:00 2001 From: Vitrora Date: Tue, 21 Jul 2026 09:28:59 +0530 Subject: [PATCH 6/8] chore: add bug/feature issue forms and PR template --- .github/ISSUE_TEMPLATE/bug_report.yml | 67 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 ++ .github/ISSUE_TEMPLATE/feature_request.yml | 38 ++++++++++++ .github/pull_request_template.md | 10 ++++ 4 files changed, 120 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/pull_request_template.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..56e29ef --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,67 @@ +name: Bug report +description: Report a problem with a FormsReach SDK package +title: "[bug]: " +labels: ["bug"] +body: + - type: textarea + id: description + attributes: + label: Description + description: What went wrong? + validations: + required: true + - type: dropdown + id: package + attributes: + label: Package + options: + - "@formsreach/js" + - "@formsreach/react" + - "@formsreach/vue" + - unclear / multiple + validations: + required: true + - type: input + id: version + attributes: + label: Package version + description: e.g. 0.1.0 + placeholder: 0.1.0 + validations: + required: true + - type: textarea + id: environment + attributes: + label: Environment + description: Browser, Node, React/Vue/Next/Nuxt versions as relevant + placeholder: | + Browser: Chrome 131 + Framework: Next.js 15 / React 19 + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce + description: Minimal steps that trigger the bug + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual behavior + validations: + required: true + - type: input + id: repro + attributes: + label: Minimal reproduction (optional) + description: Link to a repo, CodeSandbox, StackBlitz, etc. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..66b275c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: FormsReach product / account help + url: https://formsreach.com + about: Questions about the FormsReach product, dashboard, or account — not SDK bugs. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..b50028a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,38 @@ +name: Feature request +description: Propose an improvement to a FormsReach SDK package +title: "[feat]: " +labels: ["enhancement"] +body: + - type: textarea + id: problem + attributes: + label: Problem / use case + description: What problem are you trying to solve? + validations: + required: true + - type: textarea + id: solution + attributes: + label: Proposed solution + description: How should this work? + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: Other approaches you tried or considered + validations: + required: false + - type: dropdown + id: packages + attributes: + label: Affected packages + multiple: true + options: + - "@formsreach/js" + - "@formsreach/react" + - "@formsreach/vue" + - unclear / multiple + validations: + required: true diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..0acafc0 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,10 @@ +## Summary + + + +## Checklist + +- [ ] Tests added/updated if behavior changed +- [ ] `pnpm check` passes locally (or CI is green) +- [ ] Changeset added if this affects published packages (`pnpm changeset`) +- [ ] Docs/README updated if public API or usage changed From 51f6134efaff23cd50c8312aa5041050e7709138 Mon Sep 17 00:00:00 2001 From: Vitrora Date: Tue, 21 Jul 2026 09:36:41 +0530 Subject: [PATCH 7/8] docs: document changesets, lockstep releases, and NPM_TOKEN --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index 586e45e..f4c90f3 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,25 @@ pnpm format pnpm check # format:check + lint + typecheck + test + build (also runs on pre-push) ``` +## Contributing + +- Use the GitHub issue templates for bugs and feature requests. +- Open a PR against `main`. The PR template includes a short checklist. +- For changes that affect published packages (`@formsreach/js`, `@formsreach/react`, `@formsreach/vue`), run `pnpm changeset`, choose a bump type, and commit the new file under `.changeset/`. +- Packages version in **lockstep** (same version across all three). +- See [Changesets](https://github.com/changesets/changesets) for details. + Git hooks (Husky): Conventional Commits on `commit-msg`; lint-staged on `pre-commit`; full `pnpm check` on `pre-push`. +## Releasing + +1. Merge PRs that include changesets into `main`. +2. The **Release** workflow opens or updates a **Version Packages** PR (bumps all packages together, updates each package `CHANGELOG.md`). +3. Review and merge the Version Packages PR. +4. The same workflow publishes to npm (`pnpm release` → build + `changeset publish`). + +**Maintainer setup (one-time):** add a GitHub Actions secret `NPM_TOKEN` with publish access to the `@formsreach` npm scope. First public ship should use a real changeset (e.g. "Initial public release") via a Version PR — not a tooling-only dummy bump. + ## Examples See [`examples/`](./examples) for HTML, React, Next.js, Vue, and Nuxt. From 1f3f23d95e9c1cd3f4429cc46452dac143fd1f81 Mon Sep 17 00:00:00 2001 From: Vitrora Date: Tue, 21 Jul 2026 09:44:37 +0530 Subject: [PATCH 8/8] ci: let packageManager pin pnpm version in Actions pnpm/action-setup@v4 rejects specifying both action version and package.json packageManager; use the packageManager field only. --- .github/workflows/ci.yml | 2 -- .github/workflows/release.yml | 2 -- 2 files changed, 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3ce5f2..9f3db01 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,8 +11,6 @@ jobs: steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 - with: - version: 9 - uses: actions/setup-node@v4 with: node-version: 22 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 357312a..daa3673 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,8 +18,6 @@ jobs: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 - with: - version: 9 - uses: actions/setup-node@v4 with: