aidevops 3.8.93 → 3.8.95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/VERSION CHANGED
@@ -1 +1 @@
1
- 3.8.93
1
+ 3.8.95
package/aidevops.sh CHANGED
@@ -5,7 +5,7 @@
5
5
  # AI DevOps Framework CLI
6
6
  # Usage: aidevops <command> [options]
7
7
  #
8
- # Version: 3.8.93
8
+ # Version: 3.8.95
9
9
 
10
10
  set -euo pipefail
11
11
 
@@ -1382,11 +1382,14 @@ _help_commands() {
1382
1382
  echo " opencode-sandbox Test OpenCode versions in isolation (install/run/check/clean)"
1383
1383
  echo " approve <cmd> Cryptographic issue/PR approval (setup/issue/pr/verify/status)"
1384
1384
  echo " security [cmd] Full security assessment (posture + hygiene + supply chain)"
1385
+ echo " contributions External contributions inbox (bare: status | seed/scan/stop/restart/install/uninstall)"
1385
1386
  echo " ip-check <cmd> IP reputation checks (check/batch/report/providers)"
1387
+ echo " review-gate <cmd> Configure review_gate.rate_limit_behavior (list/set/unset)"
1386
1388
  echo " secret <cmd> Manage secrets (set/list/run/init/import/status)"
1387
1389
  echo " config <cmd> Feature toggles (list/get/set/reset/path/help)"
1388
1390
  echo " stats <cmd> LLM usage analytics (summary/models/projects/costs/trend)"
1389
1391
  echo " tabby <cmd> Manage Tabby terminal profiles (sync/status/zshrc/help)"
1392
+ echo " parent-status <N> Show decomposition state of parent-task issue #N (alias: ps)"
1390
1393
  echo " detect Find and register aidevops projects"
1391
1394
  echo " uninstall Remove aidevops from your system"
1392
1395
  echo " version Show version information"
@@ -1747,12 +1750,20 @@ main() {
1747
1750
  model-accounts-pool | map) _dispatch_helper "oauth-pool-helper.sh" "oauth-pool-helper.sh" "$@" ;;
1748
1751
  client-format) _cmd_client_format "$@" ;;
1749
1752
  opencode-sandbox | oc-sandbox) _dispatch_helper "opencode-sandbox-helper.sh" "opencode-sandbox-helper.sh" "$@" ;;
1753
+ review-gate | review_gate) _dispatch_helper "review-gate-config-helper.sh" "review-gate-config-helper.sh" "$@" ;;
1750
1754
  secret | secrets) _dispatch_helper "secret-helper.sh" "secret-helper.sh" "$@" ;;
1751
1755
  approve) _dispatch_helper "approval-helper.sh" "approval-helper.sh" "$@" ;;
1752
1756
  signing) _dispatch_helper "signing-setup.sh" "signing-setup.sh" "$@" ;;
1757
+ contributions | contrib)
1758
+ # Bare `aidevops contributions` defaults to status (most common use).
1759
+ # Other subcommands (seed, scan, stop, restart, install, uninstall) forward verbatim.
1760
+ [[ $# -eq 0 ]] && set -- status
1761
+ _dispatch_helper "contribution-watch-helper.sh" "contribution-watch-helper.sh" "$@"
1762
+ ;;
1753
1763
  stats | observability) _dispatch_helper "observability-helper.sh" "observability-helper.sh" "$@" ;;
1754
1764
  tabby) _dispatch_helper "tabby-helper.sh" "tabby-helper.sh" "$@" ;;
1755
1765
  init-routines) _dispatch_helper "init-routines-helper.sh" "init-routines-helper.sh" "$@" ;;
1766
+ parent-status | ps) _dispatch_helper "parent-status-helper.sh" "parent-status-helper.sh" "$@" ;;
1756
1767
  config | configure) _dispatch_config "$@" ;;
1757
1768
  uninstall | remove) cmd_uninstall ;;
1758
1769
  version | v | -v | --version) cmd_version ;;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aidevops",
3
- "version": "3.8.93",
3
+ "version": "3.8.95",
4
4
  "description": "AI DevOps Framework - AI-assisted development workflows, code quality, and deployment automation",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,6 +9,11 @@
9
9
  # Keep pulse workers alive long enough for opus-tier dispatches.
10
10
  PULSE_STALE_THRESHOLD_SECONDS=1800
11
11
 
12
+ # Cron expression: top of every hour. Shared by stats-wrapper,
13
+ # contribution-watch, and profile-readme schedulers — keep DRY so a
14
+ # future cadence shift only touches one place.
15
+ CRON_HOURLY="0 * * * *"
16
+
12
17
  # Resolve the modern bash binary path for use in launchd ProgramArguments.
13
18
  # Launchd bypasses the shebang when ProgramArguments specifies an explicit
14
19
  # interpreter, so we must resolve the path at plist generation time.
@@ -263,12 +268,14 @@ PULSE_STALE_THRESHOLD=${PULSE_STALE_THRESHOLD_SECONDS}"
263
268
  }
264
269
 
265
270
  # Read supervisor.pulse_interval_seconds from settings.json.
266
- # Falls back to 120 if the file is missing, the key is absent, or jq is unavailable.
271
+ # Falls back to 180 if the file is missing, the key is absent, or jq is unavailable.
267
272
  # Clamps to the validated range [30, 3600].
268
273
  # GH#18018: previously this was hardcoded as "120" in _install_supervisor_pulse.
274
+ # t2744: default raised 120 → 180 to reduce GraphQL pressure (33% fewer cycles)
275
+ # on multi-repo setups where per-cycle cost chronically exceeds 5000/hr.
269
276
  _read_pulse_interval_seconds() {
270
277
  local _settings_file="$HOME/.config/aidevops/settings.json"
271
- local _interval=120
278
+ local _interval=180
272
279
 
273
280
  if command -v jq >/dev/null 2>&1 && [[ -f "$_settings_file" ]]; then
274
281
  local _raw
@@ -495,6 +502,13 @@ _build_pulse_headless_env_xml() {
495
502
  # Generate the full pulse launchd plist XML content.
496
503
  # Args: $1=pulse_label, $2=wrapper_script, $3=opencode_bin
497
504
  # Prints the complete plist XML to stdout.
505
+ #
506
+ # StartInterval is read from supervisor.pulse_interval_seconds in
507
+ # settings.json via _read_pulse_interval_seconds (default 180 — t2744).
508
+ # Previously this was hardcoded as 120, meaning macOS users could not
509
+ # tune the pulse cadence via settings (Linux/cron path always honoured
510
+ # the setting). The hardcoding is now removed; the macOS path matches
511
+ # the Linux path's behaviour.
498
512
  _generate_pulse_plist_content() {
499
513
  local pulse_label="$1"
500
514
  local wrapper_script="$2"
@@ -519,6 +533,11 @@ _generate_pulse_plist_content() {
519
533
  local _xml_bash_bin
520
534
  _xml_bash_bin=$(_xml_escape "$(_resolve_modern_bash)")
521
535
 
536
+ # Resolve the configured pulse interval (settings.json, with default).
537
+ # Already validated to [30, 3600] inside _read_pulse_interval_seconds.
538
+ local _pulse_interval_sec
539
+ _pulse_interval_sec=$(_read_pulse_interval_seconds)
540
+
522
541
  cat <<PLIST
523
542
  <?xml version="1.0" encoding="UTF-8"?>
524
543
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@@ -532,7 +551,7 @@ _generate_pulse_plist_content() {
532
551
  <string>${_xml_wrapper_script}</string>
533
552
  </array>
534
553
  <key>StartInterval</key>
535
- <integer>120</integer>
554
+ <integer>${_pulse_interval_sec}</integer>
536
555
  <key>StandardOutPath</key>
537
556
  <string>${_xml_home}/.aidevops/logs/pulse-wrapper.log</string>
538
557
  <key>StandardErrorPath</key>
@@ -579,12 +598,21 @@ _install_pulse_launchd() {
579
598
  # Write the plist (always regenerated to pick up config changes)
580
599
  _generate_pulse_plist_content "$pulse_label" "$wrapper_script" "$opencode_bin" >"$pulse_plist"
581
600
 
601
+ # Resolve interval for the user-facing message (matches what the plist contains).
602
+ local _interval_sec _interval_label
603
+ _interval_sec=$(_read_pulse_interval_seconds)
604
+ if (( _interval_sec % 60 == 0 )); then
605
+ _interval_label="$((_interval_sec / 60)) min"
606
+ else
607
+ _interval_label="${_interval_sec}s"
608
+ fi
609
+
582
610
  # shell-portability: ignore next — _install_pulse_launchd is macOS-only (launchd)
583
611
  if launchctl load "$pulse_plist"; then
584
612
  if [[ "$_pulse_installed" == "true" ]]; then
585
- print_info "Supervisor pulse updated (launchd config regenerated)"
613
+ print_info "Supervisor pulse updated (launchd config regenerated, every ${_interval_label})"
586
614
  else
587
- print_info "Supervisor pulse enabled (launchd, every 2 min)"
615
+ print_info "Supervisor pulse enabled (launchd, every ${_interval_label})"
588
616
  fi
589
617
  else
590
618
  print_warning "Failed to load supervisor pulse LaunchAgent"
@@ -940,7 +968,10 @@ _uninstall_pulse() {
940
968
  # Setup stats-wrapper scheduler — runs quality sweep and health issue updates
941
969
  # separately from the pulse (t1429). Only installed when the supervisor
942
970
  # pulse is enabled (stats are useless without it).
943
- # macOS: launchd plist (every 15 min) | Linux: systemd timer or cron (every 15 min)
971
+ # macOS: launchd plist (hourly) | Linux: systemd timer or cron (hourly)
972
+ # t2744: interval raised from 15 min → hourly. Stats UI is not realtime,
973
+ # the four-times-an-hour cadence drove ~200-400 GraphQL points/hr of pure
974
+ # overhead on multi-repo setups.
944
975
  setup_stats_wrapper() {
945
976
  local _pulse_lower="$1"
946
977
  # Use effective pulse state (PULSE_ENABLED) if available; fall back to consent string.
@@ -974,7 +1005,7 @@ setup_stats_wrapper() {
974
1005
  <string>${_xml_stats_script}</string>
975
1006
  </array>
976
1007
  <key>StartInterval</key>
977
- <integer>900</integer>
1008
+ <integer>3600</integer>
978
1009
  <key>StandardOutPath</key>
979
1010
  <string>${_xml_stats_home}/.aidevops/logs/stats.log</string>
980
1011
  <key>StandardErrorPath</key>
@@ -995,7 +1026,7 @@ setup_stats_wrapper() {
995
1026
  PLIST
996
1027
  )
997
1028
  if _launchd_install_if_changed "$stats_label" "$stats_plist" "$stats_plist_content"; then
998
- print_info "Stats wrapper enabled (launchd, every 15 min)"
1029
+ print_info "Stats wrapper enabled (launchd, every hour)"
999
1030
  else
1000
1031
  print_warning "Failed to load stats wrapper LaunchAgent"
1001
1032
  fi
@@ -1003,12 +1034,12 @@ PLIST
1003
1034
  _install_scheduler_linux \
1004
1035
  "$stats_systemd" \
1005
1036
  "aidevops: stats-wrapper" \
1006
- "*/15 * * * *" \
1037
+ "$CRON_HOURLY" \
1007
1038
  "\"${stats_script}\"" \
1008
- "900" \
1039
+ "3600" \
1009
1040
  "$stats_log" \
1010
1041
  "" \
1011
- "Stats wrapper enabled (every 15 min)" \
1042
+ "Stats wrapper enabled (every hour)" \
1012
1043
  "Failed to install stats wrapper scheduler" \
1013
1044
  "true" \
1014
1045
  "false"
@@ -1503,7 +1534,7 @@ _install_cw_linux() {
1503
1534
  _install_scheduler_linux \
1504
1535
  "$cw_systemd" \
1505
1536
  "aidevops: contribution-watch" \
1506
- "0 * * * *" \
1537
+ "$CRON_HOURLY" \
1507
1538
  "\"${cw_script}\" scan" \
1508
1539
  "3600" \
1509
1540
  "${_cw_log_dir}/contribution-watch.log" \
@@ -1670,7 +1701,7 @@ _install_profile_readme_scheduler() {
1670
1701
  _install_scheduler_linux \
1671
1702
  "$pr_systemd" \
1672
1703
  "aidevops: profile-readme-update" \
1673
- "0 * * * *" \
1704
+ "$CRON_HOURLY" \
1674
1705
  "\"${pr_script}\" update" \
1675
1706
  "3600" \
1676
1707
  "$pr_log" \
package/setup.sh CHANGED
@@ -12,7 +12,7 @@ shopt -s inherit_errexit 2>/dev/null || true
12
12
  # AI Assistant Server Access Framework Setup Script
13
13
  # Helps developers set up the framework for their infrastructure
14
14
  #
15
- # Version: 3.8.93
15
+ # Version: 3.8.95
16
16
  #
17
17
  # Quick Install:
18
18
  # npm install -g aidevops && aidevops update (recommended)