From d4d95671c8250291887a13bc78f211716979a296 Mon Sep 17 00:00:00 2001 From: Ahmed ABOUELLEIL Date: Thu, 18 Jun 2026 11:57:37 +0300 Subject: [PATCH] chore: add CI, contributor templates, and launch polish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ci: add GitHub Actions workflow (pnpm 11 / Node 20) gating typecheck → lint → test → build on push to main and every PR - github: add PR template + bug/feature issue forms + config - docs: add project CLAUDE.md binding PR/issue authoring to the templates - env: document NEXT_PUBLIC_SITE_URL so OG/Twitter cards resolve on deploy - reward: set 50-star milestone to a free hosted version (landing + README) - readme: add CI status badge Co-Authored-By: Claude Opus 4.8 --- .env.example | 6 +++ .github/ISSUE_TEMPLATE/bug_report.yml | 56 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 6 +++ .github/ISSUE_TEMPLATE/feature_request.yml | 35 ++++++++++++++ .github/pull_request_template.md | 28 +++++++++++ .github/workflows/ci.yml | 45 +++++++++++++++++ CLAUDE.md | 21 ++++++++ README.md | 4 +- app/page.tsx | 5 +- 9 files changed, 202 insertions(+), 4 deletions(-) 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 create mode 100644 .github/workflows/ci.yml create mode 100644 CLAUDE.md diff --git a/.env.example b/.env.example index adc2103..a14eb49 100644 --- a/.env.example +++ b/.env.example @@ -7,6 +7,12 @@ OPENROUTER_API_KEY= # (any current OpenRouter model id, e.g. anthropic/claude-opus-4.8, anthropic/claude-haiku-4.5) OPENROUTER_MODEL=anthropic/claude-sonnet-4.6 +# Public base URL of your deployment. Used to build absolute Open Graph / Twitter +# card image URLs so link previews render correctly when the site is shared. +# Set this if you host a landing page; leave blank for local use (falls back to +# http://localhost:3000). +NEXT_PUBLIC_SITE_URL= + # The folder-analysis route reads your local filesystem, so it's disabled in # production builds by default. `pnpm dev` works out of the box. Only set this to # "true" if you run a PRODUCTION build (pnpm build && pnpm start) on your own diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..0d15b9f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,56 @@ +name: 🐛 Bug report +description: Something isn't working as expected +labels: ["bug"] +body: + - type: markdown + attributes: + value: Thanks for filing a bug! The more detail you give, the faster it gets fixed. + - type: textarea + id: what-happened + attributes: + label: What happened? + description: A clear and concise description of the bug. + placeholder: When I…, Launch Kit… + validations: + required: true + - type: textarea + id: repro + attributes: + label: Steps to reproduce + placeholder: | + 1. Go to… + 2. Click… + 3. See error + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What did you expect to happen instead? + validations: + required: true + - type: dropdown + id: provider + attributes: + label: Generation provider + options: + - mock + - openrouter + - not sure + validations: + required: true + - type: input + id: environment + attributes: + label: Environment + description: OS, Node version, pnpm version, and browser. + placeholder: macOS 15 · Node 20 · pnpm 11 · Chrome 130 + validations: + required: true + - type: textarea + id: logs + attributes: + label: Logs / screenshots + description: Terminal or browser-console output. Redact any API keys before pasting. + render: shell diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..626bd6e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,6 @@ +# Nudge contributors toward the structured templates above. +blank_issues_enabled: false +contact_links: + - name: 💬 Question or idea + url: https://github.com/AhmedFr/launch-kit/discussions + about: For questions and open-ended ideas, start a Discussion instead of an issue. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..15adfb3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,35 @@ +name: ✨ Feature request +description: Suggest an idea or improvement +labels: ["enhancement"] +body: + - type: textarea + id: problem + attributes: + label: What problem does this solve? + description: The use case or pain point behind the request. + validations: + required: true + - type: textarea + id: solution + attributes: + label: Proposed solution + description: What would you like Launch Kit to do? + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: Other approaches or workarounds you've thought about. + - type: dropdown + id: area + attributes: + label: Area + options: + - Generation / prompts + - Platform previews + - Runs dashboard + - Wizard / folder analysis + - Export + - Docs + - Other diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..7e96429 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,28 @@ + + +## What & why + + + +## How it was tested + + + +- [ ] `pnpm test` +- [ ] `pnpm typecheck` +- [ ] `pnpm lint` +- [ ] `pnpm build` + +## Checklist + +- [ ] Follows the single-responsibility / per-component folder structure +- [ ] No secrets, API keys, or `.env` values committed +- [ ] README / docs updated if behavior or configuration changed +- [ ] Screenshots included for UI changes + +## Screenshots / notes + + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..37ba46b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +# Cancel superseded runs on the same branch/PR to save CI minutes. +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + verify: + name: Typecheck · Lint · Test · Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + with: + version: 11 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Typecheck + run: pnpm typecheck + + - name: Lint + run: pnpm lint + + - name: Test + run: pnpm test + + - name: Build + run: pnpm build diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..f23f87e --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,21 @@ +# Launch Kit — project instructions + +## Pull requests & issues — ALWAYS use the templates + +When opening a PR or issue in this repo, you MUST populate it from the templates in +`.github/`, never ad-hoc or single-line text. + +- **Pull requests** → use `.github/pull_request_template.md`. Fill in every section: + _What & why_, _How it was tested_ (tick only the checks you actually ran), _Checklist_, + and _Screenshots / notes_. Create with `gh pr create --body-file ` (or `--body`) + using a body derived from that template. +- **Bug reports** → follow `.github/ISSUE_TEMPLATE/bug_report.yml`. +- **Feature requests** → follow `.github/ISSUE_TEMPLATE/feature_request.yml`. + +If a section genuinely doesn't apply, write `n/a` — do not delete it. Never open a PR or +issue with an empty body. + +## Before opening a PR + +Run and pass all four: `pnpm test && pnpm typecheck && pnpm lint && pnpm build` — the same +gates CI enforces (`.github/workflows/ci.yml`). diff --git a/README.md b/README.md index 5c74ed7..e3e0298 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Point Launch Kit at a project folder. It reads your README and drafts **launch‑ready posts — written natively for [Product Hunt, Hacker News, Reddit, and AppSumo](#-one-repo-every-audience)**. Runs 100% on your machine. Bring your own [OpenRouter](https://openrouter.ai) key. +[![CI](https://img.shields.io/github/actions/workflow/status/AhmedFr/launch-kit/ci.yml?branch=main&style=for-the-badge&logo=githubactions&logoColor=white&label=CI&color=E2563C&labelColor=1c1c1c)](https://github.com/AhmedFr/launch-kit/actions/workflows/ci.yml) [![GitHub stars](https://img.shields.io/github/stars/AhmedFr/launch-kit?style=for-the-badge&logo=github&color=E2563C&labelColor=1c1c1c)](https://github.com/AhmedFr/launch-kit/stargazers) [![License: MIT](https://img.shields.io/badge/License-MIT-E2563C?style=for-the-badge&labelColor=1c1c1c)](./LICENSE) [![Next.js](https://img.shields.io/badge/Next.js-16-1c1c1c?style=for-the-badge&logo=nextdotjs)](https://nextjs.org) @@ -75,8 +76,7 @@ Launch Kit reads files from disk, so it's built to run **on your machine** — y ## ⭐ Star milestone - -> **⭐ Hit 50 stars and I'll add [your reward].** If Launch Kit saves you a launch, a star genuinely helps. +> **⭐ Hit 50 stars and I'll ship a free hosted version** — Launch Kit running in your browser, no clone and no API key required. If Launch Kit saves you a launch, a star genuinely helps. ## 🛠️ Tech stack diff --git a/app/page.tsx b/app/page.tsx index dd0b28f..c0f000a 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -146,10 +146,11 @@ export default function Landing() {

Your next launch is one folder away

- {/* STARS MILESTONE — replace the reward with whatever you want to ship at 50 ⭐ */} + {/* STARS MILESTONE — reward at 50 ⭐ */}

⭐ Hit 50 stars and I'll - add [your reward here]. + ship a free hosted version — Launch Kit in your + browser, no clone and no API key.