Skip to content

release: v0.3#2

Merged
Kyonax merged 5 commits intomasterfrom
dev
Apr 15, 2026
Merged

release: v0.3#2
Kyonax merged 5 commits intomasterfrom
dev

Conversation

@Kyonax
Copy link
Copy Markdown
Owner

@Kyonax Kyonax commented Apr 15, 2026

Checklist (check if it applies)

  • Contains testing instructions
  • Requires environment / credential changes
  • Requires special deployment steps
  • Has unit / integration tests
  • Touches licensing, security, or CI
  • License headers on new files (LICENSING.org)
  • Attribution preserved on modified files
  • Lint passes (npm run lint)
  • Security rules followed (SECURITY.org)
  • No credentials committed
  • All GitHub Checks have passed (no Pre-Check Failed label applied by CI)
  • CHANGELOG.org updated (release PRs only)
  • Version bumped (release PRs only)

What does this PR do?

Ships RECKIT v0.3 to master. Fast-forwards the default branch to the cut already reviewed and merged into dev via #1. Contents are identical — three feature commits plus one merge commit, no further code changes on dev since that merge.

As the repo maintainer, I want an explicit release PR that gates the dev to master cut on the CHANGELOG + version workflow and gives a canonical point to tag, so that every release on master has a matching git tag and a GitHub Release entry.

Design / Reference: Reviewer notes + demo assets in #1. v0.3 entry in CHANGELOG.org.

Implementation

[NEW] new file · [MOD] modified file · [DEL] removed · [MOV] renamed or relocated

Scope identical to #1. Nothing added on dev after that merge. Grouped summary for the release reviewer:

  • Vue 3 + Vite app (src/) — bootstrap, router, global SCSS, config + version modules
  • SCSS 7-1 architecture (src/app/scss/**, 10 files) + SpaceMono Nerd Font (4 TTFs)
  • Composables (src/shared/composables/, 4) — use-obs-websocket, use-recording-status, use-audio-analyzer, use-scene-name
  • HUD components (src/shared/components/, 6 new, 1 deleted) — corner-bracket, hud-frame, status-indicator, recording-timer, overlay-card, preview-modal
  • Shared widgets (src/shared/widgets/, 2) — audio-meter, live-readout
  • CAM-LOG overlay at /@kyonax_on_tech/cam-person + ITEM-EXPLAIN declared in the registry (status: planned)
  • Landing page (src/views/home.vue) — sticky frosted meta bar, brand tabs, responsive 3-col card grid, search + status chips, preview modal
  • Vitest suite (src/**/*.test.js, 2 files / 17 tests) — version pipeline + overlays registry schema

File-by-file breakdown and decision log lives in #1.

Release

Version: v0.3 (was v0.1 on master)

  • [MOD] package.json"version" bumped from 0.1.0 to 0.3.0
  • [MOD] README.org#+VERSION:, ASCII logo footer, and shields.io badge all bumped to v0.3
  • [MOD] CHANGELOG.org — new [v0.3] entry + TODO refreshed (added INFRASTRUCTURE > TESTING and landing-widgets-section follow-ups)

Technical Details

  • Merge strategy for feat(v0.3): Vue app, CAM-LOG overlay, landing index, shared widgets #1 (feature branch into dev)

    • Chose: rebase and merge (linear history, 3 distinct commits preserved on dev)
    • Over: squash (collapses the commit story) or a merge commit (adds a merge node to dev)
    • Why: The three commits tell a coherent story — v0.3 release, CI unblock, test infra — and rebase keeps each as its own annotatable point in dev's history.
    • Trade-off: Reviewers of the merged history read the commits individually rather than seeing a single squashed summary.
  • Merge strategy for this PR (dev into master)

    • Chose: merge commit
    • Over: rebase or squash
    • Why: Leaves an unambiguous "v0.3 release merged from dev" marker on master's first-parent history. git log --first-parent master then reads as a list of releases.
    • Trade-off: One extra merge commit per release — intended cost.
  • Tag format

    • Chose: vX.Y (e.g. v0.3)
    • Over: vX.Y.Z (e.g. v0.3.0)
    • Why: Matches the runtime display (VERSION_TAG derived by src/shared/version.js), the README.org badge, and keeps the 0.x pre-release era tidy. Patch releases (v0.3.1) can extend the pattern when they happen.
    • Trade-off: A true patch release breaks the two-segment pattern; acceptable until a 1.x cut.

Testing Coverage

Test runner: Vitest @ 4.1.x with happy-dom and @vue/test-utils
Command: npm run test

Automated tests

Test file Covers Tests Status
src/shared/version.test.js semver shape, VERSION_TAG derivation (v<major>.<minor>) 3
src/shared/data/overlays.test.js registry non-emptiness, unique ids, required-field schema, status vocab, use_cases[] type, path format, canvas dims, no em dashes 14

Total: 17 tests across 2 files, all passing.

Quality gates (run on every PR)

Gate Source Status
Lint eslint.config.mjs via npm run lint ✅ 0 errors
Unit tests vite.config.js via npm run test ✅ 17 passing
Security scan ci.yml ✅ dangerous-pattern / hardcoded-secret / insecure-URL scans pass
License headers ci.yml *.js, *.mjs, *.html, *.css, *.vue, *.scss all have MPL header
Protected files ci.yml ✅ warning only (CHANGELOG.org + README.org intentionally modified for release)
Pre-Check Failed label pre-check-label job in ci.yml ✅ label absent — all gates green
Release checks release.yml ✅ README #+VERSION: bumped, CHANGELOG updated

How to test this PR

v0.3 release (dev into master)
├─ Pre-merge sanity
│   └─ 7 checks · no Pre-Check Failed label
│
└─ Post-merge verification
    ├─ tag v0.3
    ├─ GitHub Release page
    └─ README badges

Pre-merge sanity

Prereqs: #1 already merged into dev.

  1. Open the Checks tab on this PR.
    Expected: 7 green checks: ESLint, Security Scan, License Headers, Protected Files, Unit Tests, Pre-Check Label, Release Checks.
  2. Inspect the PR's labels.
    Expected: Release is present; Pre-Check Failed is absent.
  3. Confirm the diff only contains files already reviewed in feat(v0.3): Vue app, CAM-LOG overlay, landing index, shared widgets #1gh pr diff 2 --repo Kyonax/reckit --name-only | wc -l
    Expected: Same file list as feat(v0.3): Vue app, CAM-LOG overlay, landing index, shared widgets #1 (47 paths, including the binary SpaceMono TTFs).

Post-merge verification

Prereqs: this PR merged via merge commit.

  1. Sync local mastergit checkout master && git pull origin master
    Expected: HEAD is the merge commit; git log --first-parent master shows the release merge.
  2. Tag the release — git tag -a v0.3 -m "RECKIT v0.3" && git push origin v0.3
    Expected: Tag appears at https://github.com/Kyonax/reckit/releases/tag/v0.3.
  3. Visit https://github.com/Kyonax/reckit.
    Expected: README version badge reads v0.3; ASCII logo footer reads ░v0.3.
  4. Build and run from masternpm ci && npm run build && npm run dev
    Expected: Vite boots on localhost:5173; header tag reads RECKIT v0.3; CAM-LOG overlay at /@kyonax_on_tech/cam-person renders the same as on the feature branch.

Special Deployment Requirements

  1. Release tag (CRITICAL) — after merge, run git tag -a v0.3 -m "RECKIT v0.3" && git push origin v0.3. Without the tag, the GitHub Releases page will not show v0.3.
  2. GitHub Release notes (REQUIRED) — publish with gh release create v0.3 --title "RECKIT v0.3" --notes-file <v0.3-changelog-section> so the release is discoverable from the repo's releases page.
  3. Branch protection on master and dev (RECOMMENDED) — add required status checks (CI / * + Release Checks / *) before the next release so future merges cannot skip the gates.
  4. OBS environment (OPTIONAL for maintainers) — to validate the overlay on master, OBS Studio ≥ 32.1.1 with CEF + WebSocket on port 4455 and a Mic/Aux audio input.

Documentation

Demo assets (desktop + mobile landing page captures, CAM-LOG overlay recording in OBS, preview modal screenshot) live on #1. This PR ships the same code under a release label — no additional media to attach.

DIAGRAM — Release flow

Cut path for v0.3: feature branch lands on dev, dev lands on master via this PR, master gets tagged and published.

websocket-cam-person
│  (rebase, Kyonax/reckit#1)
│
├─ dev
│  │  (merge commit, this PR, Kyonax/reckit#2)
│  │
│  └─ master
│      ├─ git tag -a v0.3
│      └─ gh release create v0.3

Kyonax and others added 4 commits April 15, 2026 02:57
Ship the first fully working build of RECKIT as a Vue 3 + Vite app.
Routes per brand, a live CAM-LOG overlay wired to OBS WebSocket, a
landing page index of all browser sources with search and preview,
and a shared-widgets split so future brands can drop in audio /
readout primitives.

- Vue 3 + Vite 6 + Vue Router 4 + obs-websocket-js 5 + sass at src/
- SCSS 7-1 architecture (abstracts / base / layout / components),
  x25 typo scale, hud-label-base mixin, brand theming via
  CSS custom properties
- Composables: use-obs-websocket (singleton), use-recording-status,
  use-audio-analyzer, use-scene-name
- CAM-LOG at /@kyonax_on_tech/cam-person: HUD frame, dynamic
  SES::<scene>::T<NN> label, recording timer, audio meter bound to
  Mic/Aux, live diagnostic readout
- Landing page at /: sticky frosted meta bar, brand tabs, responsive
  3-column card grid, name/size/tags/requires search filter, status
  chips, preview modal with canvas-aspect iframe, postMessage
  trigger buttons
- Shared widgets (src/shared/widgets/): audio-meter (self-contained
  OBS visualizer) and live-readout (text display with refresh_ms
  throttle) — drop into any brand, theme via --clr-primary-100
- Overlay card: **bold** emphasis markers in descriptions parsed
  without v-html; use_cases[] keyword tags rendered as chips and
  included in the search haystack
- Version centralization: package.json is canonical; Vite injects
  __APP_VERSION__ at build time; src/shared/version.js exports
  VERSION + VERSION_TAG; UI imports VERSION_TAG (no hardcoded v0.x)
- .gitignore hardened (editor state, OS junk, secret-file
  extensions, build caches, !.env.example negation for template)
- README + package.json bumped to v0.3; CHANGELOG [v0.3] entry

Modified-by: Cristian D. Moreno (Kyonax) <kyonax25@gmail.com>
Three CI jobs were failing on the v0.3 release PR. Fix each
root cause and improve error reporting so future failures pin
to a file and line instead of printing bare messages.

ESLint (npm ci failure):
- Regenerate package-lock.json against package.json@0.3.0 via
  `npm install --package-lock-only` (318 packages pinned,
  0 vulnerabilities).
- Remove package-lock.json from .gitignore. It is now
  committed; new comment warns not to re-add it. This is what
  `npm ci` requires.

Security Scan (false positive in eslint.config.mjs):
- The dangerous-call grep was matching the literal string
  'Use DOM APIs instead of document.write().' inside the
  ESLint rule that *bans* document.write — the rule's own
  description was tripping the rule. Add
  --exclude=eslint.config.mjs to the dangerous-pattern scan
  (the config legitimately documents the banned patterns).
- Add --exclude-dir=node_modules/dist/.cache guards so the
  scan behaves identically whether or not build output
  exists.
- Emit real `::error file=<path>,line=<N>::` annotations per
  hit so errors pin to the exact source location on the PR
  diff. Also print human-readable
  `[category] file:line :: content` lines to the raw log so
  the failure is obvious without expanding annotations.

License Headers (no file path in the raw log):
- Echo `[MISSING HEADER] <file>` per hit and print a summary
  block at the end listing every failing path. Annotations
  also pin to `line=1` for inline display.
- Extend the check to *.vue and *.scss for coverage parity
  with the rest of the source tree.

Headers added to unblock the widened license check:
- index.html: MPL block before DOCTYPE (HTML5-safe —
  comments before DOCTYPE do not trigger quirks mode).
- eslint.config.mjs: MPL block prepended so
  `Cristian D. Moreno` lands on line 2 (was on line 7,
  outside the first-5-lines window the check reads).
- 10 SCSS files (src/app/scss/main.scss + every 7-1 partial):
  MPL block prepended to each.

Verified locally with CI-equivalent filters: dangerous-calls
grep clean, license sweep clean, `npm run lint` 0 errors,
`npm run build` clean (~980ms).

Modified-by: Cristian D. Moreno (Kyonax) <kyonax25@gmail.com>
Three independent-but-related improvements to the CI pipeline.

1. Unit-test infrastructure. Vitest wired into the existing
   Vite config with happy-dom and @vue/test-utils. Two
   initial test files cover the version pipeline
   (VERSION / VERSION_TAG derivation) and the overlays
   registry schema (required fields, unique ids, status vocab,
   use_cases[] type, em-dash ban, path format, canvas dims).
   17 tests total. ESLint taught about Vitest globals on
   *.test.{js,mjs} / *.spec.{js,mjs} / __tests__/**.

2. Pre-Check Failed label sync. New aggregator job at the
   end of ci.yml reads every prior gate's result via needs:
   and toggles the GitHub "Pre-Check Failed" label with
   `gh pr edit --add-label` / `--remove-label`.
   `if: always()` ensures the label syncs even when a prior
   gate hard-fails. Requires `issues: write` +
   `pull-requests: write` on the workflow, both added to the
   top-level permissions block.

3. Broader triggers. Dropped the `branches: [master, dev]`
   filter so every pull_request fires CI regardless of
   target — a sub-PR into `feat-cam-person` is now gated the
   same as a PR into dev. Added a `push` trigger for
   feat-* / feat/** / feature/** / fix-* / fix/** branches so
   developers get feedback before opening a PR. Concurrency
   group keyed on `head_ref || ref` with
   `cancel-in-progress: true` dedups push-vs-PR double runs
   and cancels stale runs on rapid pushes.

PR template's Testing Coverage section rewritten to the
two-table format (#### Automated tests + #### Quality gates)
so the template reflects the actual post-Vitest state, and
the checklist's "All GitHub Checks have passed" item now
explicitly references the label.

CHANGELOG.org TODO refreshed with an INFRASTRUCTURE > TESTING
follow-up tracking broader coverage (composables, widgets,
landing page computed logic) once the foundation lands.

Verified locally: `npm run lint` 0 errors (6 documented
false-positive warnings), `npm run test` 17 passing,
`npm run build` ~1.0s clean.

Modified-by: Cristian D. Moreno (Kyonax) <kyonax25@gmail.com>
feat(v0.3): Vue app, CAM-LOG overlay, landing index, shared widgets
@github-actions
Copy link
Copy Markdown

Protected Files Modified

The following protected files were changed in this PR:

  • CHANGELOG.org was modified

Please ensure these changes are intentional and have been reviewed carefully.

@Kyonax Kyonax self-assigned this Apr 15, 2026
@Kyonax Kyonax added the Release The PR is doing a Version bump label Apr 15, 2026
Modified-by: Cristian D. Moreno (Kyonax) <kyonax25@gmail.com>
@github-actions
Copy link
Copy Markdown

Protected Files Modified

One or more files in the protected set were changed in this PR. Each category below explains why the file matters.

Governance

  • .github/PULL_REQUEST_TEMPLATE.md was modified

CODEOWNERS / SECURITY / PR template changes affect how every future PR is reviewed. Review carefully.

Supply Chain

  • package.json was modified
  • package-lock.json was modified

Dependency or lockfile changes. Verify the diff (no unexpected packages, no version downgrades).

CI / Security Config

  • .github/workflows/ci.yml was modified
  • eslint.config.mjs was modified

Workflow / lint config. A quiet edit here can disable gates — diff against origin carefully.

Build / Config

  • vite.config.js was modified
  • .gitignore was modified
  • .env.example was modified

Build or gitignore config. Verify the build still passes and no ignored paths were accidentally un-ignored.

Release Artifact

  • CHANGELOG.org was modified
  • README.org was modified

Release-tracking files. Expected on release PRs; flag on non-release PRs.

@Kyonax Kyonax merged commit e175993 into master Apr 15, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Release The PR is doing a Version bump

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant