v1.1.0 — CLI, i18n, cost rename, docs overhaul, CI#6
Merged
Conversation
added 30 commits
May 14, 2026 22:26
- Add --outcome and --mode flags to all data commands - Show job names (from jobs.json) with [N] badge for no_agent - Show avg duration in jobs table - Show outcome ✓/✗ and job_mode [N] in runs table - Sort models by cost descending (already correct in facts.py) - Add 'all' command that chains health+summary+jobs+models+trends - Fix _JOBS_PATH to use config.HERMES_HOME for correct path resolution - Fix config.py to gracefully fallback when hermes_constants missing - Add [project.scripts] cronalytics entry in pyproject.toml
- Extract constants (box-drawing chars, banner widths, column layouts) - Add TypedDict shapes for all data payloads (SummaryData, JobData, etc.) - Split fetch_* and render_* functions (data/presentation separation) - Generic _build_table_header() and _build_separator() helpers - _json_envelope() is now pure; _db_date_range() handles DB queries - Fix argparse bug: subparser --db default=None was clobbering parent value -> changed to argparse.SUPPRESS so --db works before OR after subcommand - Add explicit sqlite3.Error / OSError handling in main() (exit code 2) - ruff clean, mypy clean (zero issues) - 54 pytest tests: formatters, data functions, rendering, integration
When watermark.json contains last_ended_at=null (reset state), float(None)
crashed with TypeError. Change wm.get('last_ended_at', 0.0) to
wm.get('last_ended_at') or 0.0 so null values fall back to 0.0.
Add regression test: test_null_watermark_regression in test_scanner_run_sync.py
- skills/devops/cronalytics/SKILL.md: structured diagnostic workflow, assessment template (Snapshot/Anomalies/Impact/Remediations), key concepts, and data source mapping aligned with CLI JSON surfaces - PLAN.md: mark skill authoring as underway; document V4 and V5 decisions with rationale
- Add Leader Board section to CLI summary output (_compute_leader_board, _job_label, _render_summary) with Top Runs/Cost/Tokens/Pace + % share - Fix --json pace stripping: JSON path now mirrors rendered path with full projections (pace, drift_ratio, scheduled_runs_*, etc.) - Add 9 CLI tests: TestJobLabel (5), TestComputeLeaderBoard (3), leader board layout constant, summary integration tests - Bump version to 1.1.0 across plugin.yaml, pyproject.toml, API, skill, and all docs - Docs sweep: README, USAGE, INSTALL, DESIGN, FEATURES, PLAN, UNINSTALL - README: Three Ways to Use (Dashboard/CLI/Skill) with philosophy - USAGE: Full CLI usage + Agent Skill sections with examples - INSTALL: pip install + skill symlink instructions - DESIGN: CLI architecture section with three-layer model - ruff clean on modified files; 149 tests passing
- pyproject.toml: Added [build-system] + [tool.setuptools] py-modules so actually works (was broken due to flat-layout auto-discovery) - docs/INSTALL.md: Rewrote with 3-tier hierarchy for plugin/CLI/skill. Primary = Hermes-native (dashboard UI, , ). Tertiary = manual copy. Removed all symlink instructions from user-facing docs. - README.md: Install section now shows first, pip as optional, shell alias as fallback. Added skill install snippet. - docs/USAGE.md: CLI section now mentions plugin path + pip + alias. - SKILL.md: CLI install section updated to match 3-tier hierarchy. Removed 'pip install -e .' and 'symlinked into' claims. - cli.py: Docstring updated with primary/secondary/tertiary labels. All symlinks removed from user-facing install docs. Windows compatibility preserved. Developer symlinks still documented in dev/DEV_SETUP.md only. 149 tests passing. ruff clean.
The flat module layout (cli.py, config.py, facts.py, etc. at repo root) means dumps generic-named files into site-packages, creating namespace collision risk with other packages. This is a non-starter. Changes: - Reverted pyproject.toml: removed [build-system], [project.scripts], and [tool.setuptools] py-modules entries. pip install no longer works. - Removed all claims from user-facing docs: README.md, docs/INSTALL.md, docs/USAGE.md, dev/DESIGN.md, skills/devops/cronalytics/SKILL.md, cli.py docstring. - Updated install hierarchy everywhere: Primary = plugin path (python ~/.hermes/plugins/cronalytics/cli.py) Secondary = shell alias No tertiary pip path. 149 tests passing. ruff clean.
Move all flat .py modules into cronalytics/ directory to enable proper pip install with namespace isolation: - Moved: cli.py, config.py, facts.py, ingester.py, logger.py, scanner.py, schedule.py -> cronalytics/ - Added: cronalytics/__init__.py - Updated root __init__.py for absolute imports - Updated dashboard/plugin_api.py _load_module() path - Updated cronalytics/cli.py bootstrap and imports - Updated cronalytics/config.py PLUGIN_DIR resolution - Updated all test imports (9 files) - All 149 tests passing
…ort regression
…\nPath(__file__).parent.parent resolves to site-packages/ when installed\nnon-editably, breaking FACT_DB, WATERMARK_FILE, and PENDING_FILE paths.\nUse HERMES_HOME / plugins / cronalytics so data files resolve correctly\nregardless of install mode (editable, non-editable, or symlinked plugin dir).
Three latent path-resolution bugs with the same root cause: 1. __init__.py:29 — _ensure_skill_linked() fallback used Path.home(), which resolves to /home/nick/.hermes/home in Hermes terminal env. 2. config.py:15 — _HERMES_HOME fallback used Path.home() with same trap. 3. cli.py:239 — _resolve_db() checked Path.home() / .hermes / plugins / ... which is now redundant (config.FACT_DB uses HERMES_HOME correctly) and wrong when HERMES_HOME points to a custom path. Removed the redundant fallback entirely. All three now read HERMES_HOME env var first, only falling back to Path.home() / .hermes when the env var is unset. See prior commits 515ab28 (relative imports) and b59f342 (PLUGIN_DIR fix) for related path-resolution issues in the same release.
- backfills cron sessions from state.db → facts.db - Returns agent/script inserted/skipped counts + elapsed time - Supports --json flag like all other subcommands - Skill updated with 'When Data Is Stale — Agent Self-Healing' workflow: agent detects stale sync, runs sync, re-queries, continues assessment - Adds sync to CLI reference table in SKILL.md
Add argcomplete>=3.0 dependency. Completion is auto-enabled when installed via pip/uv; gracefully degrades to no-op when argcomplete is absent (e.g., running cli.py directly without pip install).
Skipped counts for script sessions only grow as output files accumulate, providing no actionable signal. Show total inserted only, with agent/script breakdown when non-zero. Simpler, less alarming output.
Track query, agent ingest, and script scan phases separately. Helps identify where the 4s vs <1s discrepancy comes from. Timings exposed in return dict under 'timings_ms' key.
Remove per-phase timings_ms dict that was added for debugging. Keep time.perf_counter() fix — replaces time.time() which was causing incorrect 4s elapsed reports on wall-clock skewed systems.
…ill install skill another way
- Fix stale CLI paths post-restructure (python ~/.hermes/plugins/cronalytics/cli.py → cronalytics via pip or python -m cronalytics.cli) - Remove 'standalone' branding; CLI is an optional pip add-on, not a standalone product - Update all file layouts to show cronalytics/ package directory - Add pip install instructions with Arch footnote across README, INSTALL, USAGE - Add pip uninstall step to UNINSTALL.md - Clarify skill is manual install (not auto-enabled) - Remove .gitignored internal docs from README index (LAUNCH_PLAN, AGENTS, PLAN) - Add docs/TROUBLESHOOTING.md extracted from INSTALL.md - Fix dev/DEV_SETUP.md to remove symlink advocacy - Update FEATURES.md version header to 1.1.0, test count 83→149, shared flags - Fix DESIGN.md terminology and file layout - Remove duplicate CHECKPOINT.md from .gitignore
- Fix stale CLI paths post-restructure (python ~/.hermes/plugins/cronalytics/cli.py → cronalytics via pip or python -m cronalytics.cli) - Remove 'standalone' branding; CLI is an optional pip add-on, not a standalone product - Update all file layouts to show cronalytics/ package directory - Add pip install instructions with Arch footnote across README, INSTALL, USAGE - Add pip uninstall step to UNINSTALL.md - Clarify skill is manual install (not auto-enabled) - Remove .gitignored internal docs from README index (LAUNCH_PLAN, AGENTS, PLAN) - Add docs/TROUBLESHOOTING.md extracted from INSTALL.md - Fix dev/DEV_SETUP.md to remove symlink advocacy - Update FEATURES.md version header to 1.1.0, test count 83→149, shared flags - Fix DESIGN.md terminology and file layout - Remove duplicate CHECKPOINT.md from .gitignore
- Extract inline changelog from README into root CHANGELOG.md - Add docs/RELEASE_NOTES.md with upgrade notes and v1.1.0 narrative - Fix dashboard/manifest.json version: 0.1.0 → 1.1.0 (alignment with plugin.yaml and pyproject.toml) - Keep inline changelog in README per user request
…run limit, models breakdown, PATH, facts.db snapshot, entire history
…agent vs no-agent, 250-run limit
…file is supported
…o no-agent cost mentions
…TRIBUTING, SUPPORT.md - .github/ISSUE_TEMPLATE/bug_report.md: structured bug report form - .github/ISSUE_TEMPLATE/feature_request.md: feature request template - .github/PULL_REQUEST_TEMPLATE.md: checklist + type of change - CONTRIBUTING.md: added fork/Pipeline, bug/PR guidance, review criteria - SUPPORT.md: help guide pointing to FAQ, Usage, Troubleshooting, templates - README: Support section now links to SUPPORT.md
…ure, Skill: Optimize
…e buttons, quick start
…lexShrink badge instead
… — costo actual → costo presente
…ling back to English)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
v1.1.0 — CLI, i18n, cost rename, docs overhaul, CI
What's new
PR Checklist
Before release