Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
20b6220
docs(cli): fix usage string to match actual invocation path
May 15, 2026
0fa74b5
feat(cli): parity with dashboard + all report command
May 15, 2026
e81567b
feat(cli): refactor for testability, type safety, and PEP8 alignment
May 15, 2026
a3707b3
fix(scanner): handle null last_ended_at in watermark JSON
May 15, 2026
390321f
feat(skill): cronalytics agent skill for terminal diagnostics
May 16, 2026
1c30815
feat: v1.1.0 CLI + Skill release prep
May 16, 2026
1ef4e0b
fix(install): align all install paths with Hermes-native tools
May 16, 2026
2d95886
fix(install): remove pip install path — namespace collision risk
May 17, 2026
a58b0e9
feat: restructure into cronalytics/ package namespace
May 17, 2026
59632da
chore: embed commit hash in plugin version for diagnostics
May 17, 2026
c32face
feat: auto-link skill into ~/.hermes/skills/ on plugin load
May 17, 2026
5492ec4
fix: use get_hermes_home() from hermes_constants instead of Path.home()
May 17, 2026
a46660d
fix: symlink entire skill directory, not just SKILL.md file
May 17, 2026
9a64f9a
chore: remove unused skills/software-development dir, keep pyproject.…
May 17, 2026
515ab28
fix: use relative imports in root __init__.py for Hermes plugin loader
May 17, 2026
dd3766e
chore: update CHECKPOINT.md to 515ab28 — document missed absolute-imp…
May 17, 2026
b59f342
fix(config): resolve PLUGIN_DIR via HERMES_HOME instead of __file__\n…
May 17, 2026
3234da6
fix: eliminate Path.home() fallbacks — read HERMES_HOME env var first
May 17, 2026
991f203
feat(cli): add sync subcommand + skill update for agent self-healing
May 17, 2026
2026a94
feat(cli): add argcomplete for bash/zsh tab completion
May 17, 2026
1e0a1a9
docs(skill): add shell completion setup instructions
May 17, 2026
2b1fb03
chore: CHECKPOINT.md to 1e0a1a9 — argcomplete + sync subcommand
May 17, 2026
a3574ab
refactor(sync): only show inserted count, suppress stale skipped noise
May 17, 2026
dac7b34
refactor(scanner): add per-operation timing diagnostics to run_sync
May 17, 2026
e4dd45b
refactor(scanner): strip diagnostic timings, keep perf_counter fix
May 17, 2026
e111ddc
refactor: tighten SKILL.md — drop duplicates, condense, -28% chars
May 17, 2026
7cb672b
remove: skill auto-link from register() — did not work as expected, w…
May 18, 2026
fac46d8
docs: audit and align all docs for v1.1.0 release
May 18, 2026
2c905a0
docs: audit and align all docs for v1.1.0 release
May 18, 2026
088b07c
docs: add CHANGELOG.md and RELEASE_NOTES.md; fix manifest version
May 18, 2026
509cb38
docs: add CHANGELOG.md and RELEASE_NOTES.md to README index
May 18, 2026
35bed5d
docs: checkpoint session state for docs audit
May 18, 2026
d6d32f8
demos: add 5 VHS CLI demo recordings for v1.1.0 release
May 18, 2026
c0005ca
docs: move vhs demos under docs/ as peer to screenshots
May 18, 2026
f7048b0
feat: switch demos to synthetic fact.db + CLI job_name enrichments
May 18, 2026
813cd50
docs: sanitize job IDs, fix .gitignore, clean test count claims
May 18, 2026
d4f7fc0
fix: 3 bugs + dashboard runs limit + docs + skill semantics
May 18, 2026
5f7619b
fix: rename outcome filter 'both' → 'all' + audit skill references
May 19, 2026
09e5558
docs: comprehensive audit and alignment with source truth
May 20, 2026
e802e4d
docs: finalize DESIGN.md and data-model.md with Phase 2.5 metadata an…
May 20, 2026
d96d81b
docs: document CLI 'all' orchestration and move deep metrics to Exper…
May 20, 2026
bcf33f6
docs: clarify [N] vs [No agent] badges and technical mode differences
May 20, 2026
4db1f71
docs: use bare 'cronalytics' command in README examples
May 20, 2026
098e84a
docs: document WAL concurrency, path resolution priority, localStorag…
May 20, 2026
73b2406
docs: finalize troubleshooting with path priority and queue diagnostics
May 20, 2026
3df630e
docs: fix broken code block nesting in README
May 20, 2026
2747c45
docs: manual refinements to README.md
May 20, 2026
e51c17f
docs: update project checkpoints with audit outcomes
May 20, 2026
75e4168
docs: update skill install method to local cp with references
May 20, 2026
8270dfd
docs: user-provided refinements to README and skill installation
May 20, 2026
1da4dfb
docs: flatten skills directory and update path references
May 20, 2026
b2d696a
docs: bump skill version to 1.1.0
May 20, 2026
6ae0a19
docs: restructure skills to /skills/cronalytics for installer compati…
May 20, 2026
a015dd5
docs: correct hermes skills install path to target the subdirectory
May 20, 2026
53d9755
docs: formalize GitHub CLI as alternate skill install method in README
May 20, 2026
1f3e92c
docs: add manual skill load hint '/cronalytics' to README
May 20, 2026
d823254
docs: finalize README with manual skill load guidance and structure
May 20, 2026
9a15fc7
docs: update checkpoint with skill structure and install refinements
May 21, 2026
dd0e3ac
docs: add cronalytics overview infographic spec and analysis
May 21, 2026
42d8a01
docs: move infographics to scratchpad and finalize audit
May 21, 2026
66ba1ad
docs: sync checkpoint for merge
May 21, 2026
67fd719
docs: simplify README with Getting Started table and move upgrade pat…
May 21, 2026
d190c0d
docs: move break-system-packages to a footnote
May 21, 2026
0160a36
docs: sweep and standardize pip commands with Arch btw footnote
May 21, 2026
d15d88b
docs: remove redundant local-install method from INSTALL.md
May 21, 2026
c06f20c
docs: use correct dashboard stop/start sequence for upgrade
May 21, 2026
fbbcafb
docs: implement robust restart sequence with sleep 2 and port release…
May 21, 2026
7a2ae2f
docs: sync troubleshooting items and cross-link from upgrade guide
8bit64k May 21, 2026
2671963
docs: prioritize Usage & Workflows in README pathways
8bit64k May 21, 2026
f412d24
docs refinement.
8bit64k May 21, 2026
8210d99
additional docs refinements.
8bit64k May 21, 2026
8c43796
docs refinements.
8bit64k May 21, 2026
ab0c508
fix: update gitignore for venv and caches
8bit64k May 21, 2026
b1fdd16
fix: untrack internal planning docs (final cleanup)
8bit64k May 21, 2026
36657bb
docs: sync latest local refinements to -uat
8bit64k May 21, 2026
13f9680
doc refinements.
8bit64k May 21, 2026
7529f57
doc refinements fixed typo.
8bit64k May 21, 2026
a1ef215
feat: rename all estimated cost fields to clarify estimated vs actual
8bit64k May 22, 2026
619d3bd
feat(dashboard): estimated badge, column alignment, sort arrow fix
8bit64k May 22, 2026
5654a5a
feat(cli): estimated cost qualifier on models and trends help text
8bit64k May 22, 2026
9be7244
feat: merge cost-field-rename into cli-terminal-access for v1.1.0 rel…
8bit64k May 22, 2026
b7d3cd9
feat(i18n): externalize all dashboard UI strings to en + es catalog
8bit64k May 22, 2026
4080748
fix(dashboard): rename "Avg Time" -> "Avg Duration" for consistency
8bit64k May 22, 2026
9d9d389
merge: pull Avg Duration fix from cli-terminal-access into i18n branch
8bit64k May 22, 2026
dc7dbdd
fix(i18n): sync avg_time catalog with upstream "Avg Duration" rename
8bit64k May 22, 2026
f7bbc1c
fix(i18n): restore "Outcomes" label rendering in OutcomeToggle
8bit64k May 22, 2026
83a4038
fix(i18n): drop "Est." from Spanish leader card headline to match Eng…
8bit64k May 22, 2026
21a7478
feat(dashboard): icon-only refresh button
8bit64k May 22, 2026
6f611f5
feat(dashboard): hide DaySelector label on narrow toolbar
8bit64k May 22, 2026
b4bf848
feat(dashboard): remove Days label + icon-only refresh
8bit64k May 23, 2026
cf7d71c
feat(facts): gate trend comparison on DB age, not run count
8bit64k May 23, 2026
61e2877
merge: pull trend DB-age gating + toolbar fixes from cli-terminal-access
8bit64k May 23, 2026
49ce0e4
feat(i18n): add Chinese (zh) translation catalog
8bit64k May 23, 2026
cac6229
feat(i18n): finalize es, zh-CN, and zh-TW via multi-model consensus
8bit64k May 23, 2026
d36af70
docs: formalize i18n protocol for implementation and consensus
8bit64k May 23, 2026
3673e32
chore: create AGENTS.md to enforce i18n and implementation standards
8bit64k May 23, 2026
c1956b9
docs: update design, features, usage, and release notes for i18n launch
8bit64k May 23, 2026
5ff43fe
fix(i18n): update bridge logic to support regional variants (zh-CN/zh…
8bit64k May 23, 2026
aeca67b
chore: enforce "Estimated Cost" nomenclature in AGENTS.md and skills
8bit64k May 23, 2026
52cd1fe
docs: implement Product Glossary and tiered i18n protocol
8bit64k May 23, 2026
b10ffa7
fix(dashboard): fix [object Object] bug in run detail footer
8bit64k May 23, 2026
862ad3c
doc review and improvement.
8bit64k May 23, 2026
9491efe
docs: doc review fixes — 9 documents reviewed and corrected
8bit64k May 24, 2026
3cfeb75
docs: remove "first plugin" claims regarding i18n
8bit64k May 24, 2026
41a05df
doc clean up
8bit64k May 24, 2026
604f512
docs: add document contracts, slim README sections to link out
8bit64k May 24, 2026
f811e83
docs: trim README 'A Closer Look', fix FEATURES.md typo, update USAGE.md
8bit64k May 24, 2026
0243e4f
docs: convert documentation index to clickable links
8bit64k May 24, 2026
faa0ad3
docs: add FAQ — 20 common questions across cost, visibility, metrics,…
8bit64k May 24, 2026
6c4d582
docs: expand FAQ with all 10 noob questions — agent vs no-agent, 250-…
8bit64k May 25, 2026
ea250c2
docs: seed FAQ links throughout README and USAGE — cost, jobs, pace, …
8bit64k May 25, 2026
53e17c4
docs: fix FAQ — remove unverified analytics/insights claims
8bit64k May 25, 2026
cc0fb2e
docs: drop unverified multi-profile install advice — only default pro…
8bit64k May 25, 2026
264edf6
docs: remove duplicate analytics-tab FAQ, add 'estimated' qualifier t…
8bit64k May 25, 2026
815323a
docs: add community infrastructure — issue/PR templates, expanded CON…
8bit64k May 25, 2026
71f84f4
docs: fix README — 'all' command does not support --json
8bit64k May 25, 2026
b8582da
docs: fix BRIEF stale product name, add CODE_OF_CONDUCT.md
8bit64k May 25, 2026
8e5f4bf
small change
8bit64k May 25, 2026
f1a18fe
fix(usage): fix important-notes anchor link — trailing hyphen from ⚠️…
8bit64k May 25, 2026
ee971a9
fix(usage): correct anchor — URL-encode VS16 after ⚠️ emoji
8bit64k May 25, 2026
43d0751
docs(readme): add Hermes Agent supported badge (blueviolet)
8bit64k May 25, 2026
8c449b4
ci: add GitHub Actions workflow (pytest + ruff + mypy) + CI badge
8bit64k May 25, 2026
ffba33a
ci: fix ruff, mypy, and pytest - all 149 pass clean
8bit64k May 25, 2026
557366d
ci: suppress N999 for __init__.py (repo checkout dir name)
8bit64k May 25, 2026
4720e04
chore: update remotes + badges to cronalytics_uat (hyphen → underscore)
8bit64k May 25, 2026
9577e88
fix(i18n): Pace → 执行率/執行率 per Glossary — not literal 'rhythm'
8bit64k May 25, 2026
d8bbd63
docs: map three interfaces to tagline — Dashboard: Observe, CLI: Meas…
8bit64k May 25, 2026
254d055
wip: readme edits
8bit64k May 25, 2026
8c3e05a
added readme banner
8bit64k May 25, 2026
eccef6d
docs: tighten README — hero-first layout, getting started table, shar…
8bit64k May 25, 2026
d62bb85
fix(ui): leaderboard Top Cost — remove text-overflow on cost value, f…
8bit64k May 25, 2026
b7c7dad
fix(ui): leaderboard Top Cost — match Summary card pattern, no overfl…
8bit64k May 25, 2026
2618e09
docs: replace mini-tour GIF with 3x4 screenshot grid (all 12 shots)
8bit64k May 25, 2026
c4e5786
docs: remove YouTube link — screenshots cover it
8bit64k May 25, 2026
a6b59de
fix(i18n): leaderboard expanded row — avg_duration → avg_time key; es…
8bit64k May 25, 2026
7176b7e
fix(i18n): add missing 'result' key to es, zh-CN, zh-TW catalogs
8bit64k May 25, 2026
5424317
fix(i18n): add missing 'time' column key to es, zh-CN, zh-TW (was fal…
8bit64k May 25, 2026
58a98cc
docs: add acknowledgments — Gaby (Spanish review) + everyone who cont…
8bit64k May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
name: Bug Report
about: Report a bug in Cronalytics
title: "[Bug] "
labels: bug
assignees: ""
---

## Describe the bug

A clear and concise description of what the bug is.

## To Reproduce

Steps to reproduce the behavior:

1. Run `cronalytics ...`
2. Open the dashboard and click ...
3. See error

## Expected behavior

A clear and concise description of what you expected to happen.

## What actually happened

The error message, incorrect behavior, or unexpected output.

## Environment

- **Cronalytics version:** [e.g., 1.1.0]
- **Hermes Agent version:** [e.g., 0.10.0]
- **OS:** [e.g., Arch Linux, macOS 14]
- **Browser (if dashboard issue):** [e.g., Firefox 126, Chrome 125]
- **Install method:** [e.g., `hermes plugins install`, pip install]

## Additional context

Add any other context: screenshots, `facts.db` excerpts (no secrets!), relevant cron job definitions, or logs from `hermes logs --gateway`.
27 changes: 27 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
name: Feature Request
about: Suggest an idea for Cronalytics
title: "[Feature] "
labels: enhancement
assignees: ""
---

## Is your feature request related to a problem?

A clear and concise description of what the problem is. Ex: "I can't see my cron jobs from a non-default profile."

## Describe the solution you'd like

A clear and concise description of what you want to happen.

## Describe alternatives you've considered

A clear and concise description of any alternative solutions or workarounds you've tried.

## How would you use this?

Describe the workflow or use case this feature would enable for you.

## Additional context

Add any other context, references, or screenshots.
22 changes: 22 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
## Description

What does this PR do? Link the issue it fixes (e.g., `Fixes #123`).

## Type of change

- [ ] Bug fix (non-breaking change fixing an issue)
- [ ] New feature (non-breaking change adding functionality)
- [ ] Breaking change (fix or feature that would break existing behavior)
- [ ] Documentation update
- [ ] Chore (build, CI, tooling, cleanup)

## Checklist

- [ ] I have read [CONTRIBUTING.md](../CONTRIBUTING.md)
- [ ] Tests pass: `python -m pytest tests/ -v --tb=short`
- [ ] Lint clean: `ruff check .`
- [ ] Type check clean: `mypy cronalytics/ dashboard/plugin_api.py`
- [ ] Dashboard builds: `cd dashboard && node build.js`
- [ ] Docs updated (if applicable): `docs/` or `dev/` files reflect the change
- [ ] `CHECKPOINT.md` updated with decisions and verification notes (rebase will drop it)
- [ ] I am targeting `master` (or `release/X.Y` for hotfixes)
36 changes: 36 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: CI

on:
push:
branches: [master, feat/*]
pull_request:
branches: [master]

jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.11", "3.12"]

steps:
- uses: actions/checkout@v4

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install . ruff mypy pytest httpx pytest-github-actions-annotate-failures

- name: Lint with ruff
run: ruff check .

- name: Type check with mypy
run: mypy cronalytics/

- name: Test with pytest
run: pytest
18 changes: 14 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Python artifacts
__pycache__/
*.venv/
venv/
ENV/
.mypy_cache/
.ruff_cache/
*.py[cod]
*$py.class
*.egg-info/
Expand All @@ -25,6 +30,13 @@ scratchpad/
# Auto-checkpoint state (generated at runtime)
cronalytics-checkpoint.json
CHECKPOINT.md

# Internal planning docs — not for public repo
PLAN.md
AGENTS.md
dev/AGENTS.md
dev/LAUNCH_PLAN.md
dev/LAUNCH_POSTS.md
# Test artifacts
.pytest_cache/
.coverage
Expand All @@ -38,8 +50,6 @@ htmlcov/

# Node artifacts (dashboard build)
node_modules/
**/node_modules/
*.backup*
*.bak
facts.db-shm
facts.db-wal
CHECKPOINT.md
*.bak
72 changes: 72 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Changelog

All notable changes to Cronalytics.

---

## v1.1.0 (2026-05-26)

### Added

- **Terminal CLI** — `cronalytics` command (via `pip install -e`) with 7 subcommands: `summary`, `jobs`, `runs`, `models`, `trends`, `health`, `all`. Full `--json` output on every data command except `all`. `--days`, `--outcome`, `--mode` filters across all commands. Leader Board spotlight in `summary`. Job name resolution from `jobs.json`.
- **Agent Diagnostic Skill** — Built-in `cronalytics` skill with structured 7-step diagnostic workflow (time window verification → baseline health → job-level drill → per-run investigation → failure pattern → model economics → trend validation). Confidence-graded anomaly detection (HIGH / MEDIUM / LOW) with supporting evidence requirements. "Known Ways to Fool Yourself" guardrails (age-gating, script job awareness, variance checks). Cross-references `jobs.json` for scheduling context and silent failure detection.
- **Test suite expanded to 149 tests** (83 original + 66 CLI tests) — all passing, `ruff` + `mypy` clean (note: `mypy` excludes `ingester.py`, `scanner.py`, `__init__.py`, and `dashboard/`; `disallow_untyped_defs = false`).
- **Multilingual/Localization Support (i18n)**: coverage for [en, es, zh-CN, zh-TW]

### Changed

- **Package restructure** — Flat root modules moved into `cronalytics/` namespace package. Enables safe `pip install` without `site-packages` name collisions.
- **CLI positioning** — CLI is now documented as an optional pip add-on to the dashboard plugin, not a standalone product. Requires the plugin's `facts.db` to function.
- **Skill install** — No longer auto-linked by plugin; must be installed manually via `hermes skills install`.
- **Trend Spikes:** Gated arrows behind 1.75x history window to prevent false alarms.
- **UI Uniformity:** Consistent naming ("Avg Duration") and modernized icon-only refresh.

---

## v1.0.1 (2026-05-13)

### Added

- **Leader Board '% of total'** — spotlight cards show the leader's share of the window total (e.g. "42% of total cost")

### Changed

- **Cost card: suppressed Actual** — partial `actual_cost_usd` coverage creates misleading comparisons. The line now reads `Actual: —` until provider billing data coverage is reliable.

### Fixed

- **Backend fix** — synthetic script-only rows now insert `NULL` for `actual_cost_usd` (was 0.0), eliminating phantom `$0.00` aggregates.

---

## v1.0.0 (2026-05-12)

### Added

- Dashboard: Summary Board, Leader Board, Per-Model Breakdown, Jobs Breakdown table
- Sortable 8-column jobs table with expandable detail rows
- Job Detail Modal with full run history, sticky headers, inherited sorting
- Outcome toggle (All/Success/Failure) with conditional Cost card colors
- Mode toggle (All/Agent/No agent) with script job visibility
- Pace, Nominal, and Trend projections with educational modals
- Reconciliation scanner with watermark-based backfill
- Bootstrap scanner on plugin load (catches post-restart gaps)
- 83 pytest tests covering facts, parser, scanner, schedule, ingester, plugin API
- Lint/type check: `ruff` + `mypy` clean
- Keyboard-accessible cards and table headers (a11y)
- Large-font theme resilience
- API validation layer (JSDoc typedefs + runtime guards)

---

## v0.1.0

### Added

- Initial release: real-time ingestion, fact DB, reconciliation scanner, dashboard API, React frontend with summary cards, jobs table, cost-by-model, sync button.

---

*Plugin path: `~/.hermes/plugins/cronalytics/`*
*Fact DB: `~/.hermes/plugins/cronalytics/facts.db`*
*API base: `/api/plugins/cronalytics/`*
41 changes: 41 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment:

- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior:

- The use of sexualized language or imagery, and sexual attention or advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting

## Enforcement Responsibilities

Project maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project maintainers. All complaints will be reviewed and investigated promptly and fairly.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
37 changes: 37 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,49 @@
3. Tag the release (e.g., `v1.0.1`)
4. Merge or cherry-pick the fix into `master` so it doesn't regress in the next release

## How to Contribute

1. **Fork the repo** and clone your fork.
2. **Create a branch** — `feature/my-feature` or `fix/bug-description`.
3. **Make your changes.** Keep commits focused and atomic.
4. **Run the test suite:** `python -m pytest tests/ -v --tb=short`
5. **Lint and type check:** `ruff check . && mypy cronalytics/ dashboard/plugin_api.py`
6. **Build the dashboard:** `cd dashboard && node build.js`
7. **Open a pull request** against `master` (or `release/X.Y` for hotfixes).

## Pull Requests

- All changes to `master` and `release/*` branches require PR review.
- `release/*` branches require at least 1 approving review.
- Keep commits focused and atomic. Squash fixups before merge if the branch is noisy.
- Use the [Pull Request Template](.github/PULL_REQUEST_TEMPLATE.md) — it gives reviewers the context they need.

## Reporting Bugs

Please use the [Bug Report](https://github.com/8bit64k/cronalytics/issues/new?template=bug_report.md) template. A good bug report includes:

- What you did (exact steps or commands)
- What you expected to happen
- What actually happened (error message, incorrect output)
- Your environment (Cronalytics version, Hermes version, OS, browser)

The more specific you are, the faster we can reproduce and fix it.

## Feature Requests

Use the [Feature Request](https://github.com/8bit64k/cronalytics/issues/new?template=feature_request.md) template. Tell us the problem you're trying to solve, not just the solution you want. Context helps us find the right fix.

## Development Environment

See [`dev/DEV_SETUP.md`](dev/DEV_SETUP.md) for build, test, and plugin setup instructions.

## Code Review

Reviewers will check for:

- Tests pass and cover the change
- Docs reflect new or changed behavior
- Lint and type checks are clean
- The change follows existing patterns and conventions in the codebase

If your PR is large, open it as a draft and ask for early feedback. Small, incremental PRs review faster and merge sooner.
Loading
Loading