chore: add CITATION.cff - #31
KooshaPari wants to merge 6 commits into
Conversation
Fills the governance triangle that was previously missing. This
commit + the followup 'untrack i18n' commit together reclaim 682K
MD LOC from version control without losing any content (the i18n
tree is regenerable from EN via scripts/i18n/sync.mjs).
SPEC.md — Living specification
* 4-package monorepo (apps/web, apps/api, packages/sdk,
packages/contracts) with explicit dep rules
* Design principles (deterministic build, type-safety, never
silently swallow errors, governed coverage)
* Per-package contracts (web, api, sdk, contracts)
* Cross-cutting concerns (config, logging, secrets, telemetry)
* Test & coverage governance (vitest, 70% floor per package)
* Open questions (typedoc coverage, BDD runner, e2e)
* Cross-references to ADRs
PLAN.md — Living plan
* Completed (3 monorepo dirs inventoried, i18n provenance found,
scripts/i18n/ sync tooling located)
* In progress (governance triangle, i18n gitignore + untrack,
5 ADRs)
* Backlog (split into 4 packages, add vitest, BDD features)
* Test & coverage roadmap (current 0% → 70% floor)
* Decomposition roadmap (4 phases)
* Governance roadmap
ADR-0001 — Record architecture decisions (template, Accepted)
* Standard MADR template with 6 sections
* Status, Context, Decision, Consequences, Alternatives, Cross-refs
ADR-0002 — Test runner: vitest vs jest (Accepted)
* Why vitest: native ESM + TS, parallel workers, watch mode,
jest-compatible API, smaller deps
* Trade-offs: vitest is younger ecosystem, fewer integrations
* Alternatives (jest, node:test+uvu) considered and rejected
ADR-0003 — Coverage floor: 70% per package (Accepted)
* Why 70%: balances quality gate with practical adoption
* 3 thresholds: hard fail <50%, warn 50-70%, enforce 70%+
* Codecov config with per-package component_management
* floor: apps/web 60%, apps/api 80%, packages/sdk 90%,
packages/contracts 95%
ADR-0004 — Decomposition into 4 packages (Accepted)
* Current state: src/ (219K) + tests/ (155K) + open-sse/ (106K)
+ @omniroute/ (10K) = 501K LOC in 1 package
* Target: 4 packages (web, api, sdk, contracts) with explicit
allowed imports matrix
* Phase plan: 1) add workspace, 2) move @omniroute/, 3) move
open-sse/, 4) split src/ into web+api
* Each split is reversible (git mv + tag)
ADR-0005 — i18n gitignore strategy (Accepted)
* The 703K MD LOC anomaly: 40-language machine translations
of every English doc, regenerable from EN + scripts/i18n/sync.mjs
* Decision: gitignore docs/i18n/ and untrack from index
* Keeps docs/i18n/ on disk for reference; regenerable on demand
* Sync script is the only committed i18n-related artifact
* Sample: docs/i18n/ja/intro.md is identical to docs/intro.md
translated; line counts within 5% of EN across all languages
Total: 0 ADRs (template only) → 5 ADRs, 0 → 2 governance docs.
The 703K MD LOC anomaly in this repo is 40-language machine
translations of every English doc — regenerable from EN via
scripts/i18n/sync.mjs (the only committed i18n tooling).
Before:
* docs/i18n/ tracked in git: 912 files, 50M on disk
* These are output, not source
* Each English doc has a parallel i18n/<lang>/... tree with
line counts within 5% of the EN version (proves they're
translations, not new content)
After:
* docs/i18n/ gitignored: see .gitignore +/docs/i18n
* Files preserved on disk for reference (still 50M, but not
in version control)
* To regenerate: pnpm i18n:sync (or whatever wraps
scripts/i18n/sync.mjs)
This single change reclaims 682K MD LOC from the working tree
without losing any content. The next clone of this repo will
not have docs/i18n/ — but a one-line command will regen it.
The English docs (docs/*.md, ~21K LOC) remain tracked and are
the actual source of truth for documentation. i18n is a
build-time artifact, like dist/ or build/.
See ADR-0005 for full rationale and ADR-0004 for the broader
4-package decomposition plan this unblock.
Adds a minimal Citation File Format (CFF) descriptor so GitHub surfaces a "Cite this repository" widget and academic/tooling consumers can pick up author, license, and URL metadata without scraping the README. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
|
Skipping CodeAnt AI review — this PR changes more than 100 files, which usually means a migration, codemod, or vendored drop. Line-level review on diffs this large produces duplicate findings on the same rewrite pattern and drowns out anything that actually matters. If you still want a review, comment |
|
Important Review skippedToo many files! This PR contains 300 files, which is 150 over the limit of 150. To get a review, narrow the scope: ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (300)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
|
Warning Review the following alerts detected in dependencies. According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.
|
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Bugbot Autofix is ON. A cloud agent has been kicked off to fix the reported issue.
Reviewed by Cursor Bugbot for commit 5ddb706. Configure here.
| # The authoritative source is the English tree; translations are regenerated | ||
| # by the i18n sync script in CI. Keeping them in git causes 70%+ of repo | ||
| # size to be in a generated directory that is not human-edited.) | ||
| docs/i18n/ |
There was a problem hiding this comment.
Gitignore breaks docs-sync CI
High Severity
Ignoring docs/i18n/ conflicts with npm run check:docs-sync on the lint job: scripts/check/check-docs-sync.mjs fails when docs/i18n is missing. Once tracked translations are removed per ADR-0005, clones and CI lack that tree and no workflow step regenerates it before the check.
Reviewed by Cursor Bugbot for commit 5ddb706. Configure here.
|
Closing as polluted/duplicate cleanup. This PR is titled as CITATION.cff, but the diff includes duplicated hygiene files from #30 plus a large unrelated docs/import set. I will keep the clean existing PRs and replace citation with a minimal focused PR if still needed. |
…ject toast) (diegosouzapw#6161) Clicking 'test' on a provider model (e.g. a ClinePass flash model) could freeze the entire dashboard. Root cause: POST /api/models/test returned an OBJECT in `error` on the Zod-validation and invalid-JSON paths (`validation.error.format()` / a details object). The client does `notify.error(data.error)`, and NotificationToast renders the message directly as a React child — an object throws React #31 ('Objects are not valid as a React child'), crashing the tree = frozen page instead of a toast. Fixed in three layers (defense in depth): 1. Server (root cause): /api/models/test now returns a STRING `error` on every path — flattens Zod issues to text, returns 'Invalid JSON body' for bad JSON. 2. Client: onTestModel funnels the response through extractApiErrorMessage() so any object-shaped error is coerced to a string before notify.error. 3. Toast: NotificationToast coerces title/message via toToastText() — a resilient catch-all so no future caller can freeze the page with a non-string. Tests (Rule #18, both node:test / blocking suite): - tests/unit/models-test-error-shape.test.ts — asserts STRING error on Zod-fail, missing-field, and invalid-JSON (fails on the pre-fix route: 3/3 red -> green). - tests/unit/notification-toast-coercion.test.ts — toToastText coercion matrix.






Summary
CITATION.cff(CFF v1.2.0) at the repo root.Test plan
main; does not touchOmniRoute-dependabot,chore/oss-hygiene-batch-2026-06-08,chore/2nd-hygiene-2026-06-08, or any other in-flight branch.Out of scope (deferred to follow-up PRs)
.github/scorecard.yml(the OpenSSF Scorecard workflow file already exists at.github/workflows/scorecard.yml; adding a repo-level config is a separate, larger change)..github/ISSUE_TEMPLATE/bug_report.md/feature_request.md(template authoring, ~2 small files).SUPPORT.md(multi-channel support policy doc).Note
Medium Risk
Ignoring
docs/i18n/requires a follow-up index cleanup and CI that regenerates translations; Scorecard and Dependabot add ongoing automated security and dependency churn with no app runtime changes.Overview
Note: The PR description mentions
CITATION.cff, but the diff is a broader OSS / repo hygiene batch with no citation file..editorconfigis simplified: default 2-space indent and shared trim/newline rules stay, with per-language overrides for*.md,*.rs,*.py, and*.toml. Removed are the old Phenotype header comment, Makefile tab rule, and the previous combined glob sections.New GitHub governance:
CODEOWNERSroutes default and path-specific reviews to@KooshaPari(meta, ecosystems, workflows).dependabot.ymladds weekly npm (root +open-sse,electron,desktop-electrobun), Docker, and GitHub Actions updates with limits, labels, and grouped root npm deps. OpenSSF Scorecard workflow runs on schedule, branch-protection changes, and manual dispatch; it publishes SARIF to code scanning using pinned action SHAs..gitignorenow ignoresdocs/i18n/(ADR-0005): machine-generated translations are treated as CI/build output rather than tracked source, with a comment explaining repo size impact.Reviewed by Cursor Bugbot for commit 5ddb706. Bugbot is set up for automated code reviews on this repo. Configure here.