aidevops 3.32.227 → 3.32.230

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/README.md CHANGED
@@ -60,7 +60,7 @@ The result: an AI operations platform that manages projects across every busines
60
60
  [![Copyright](https://img.shields.io/badge/Copyright-Marcus%20Quinn%202025--2026-blue.svg)](https://github.com/marcusquinn)
61
61
 
62
62
  <!-- Release & Version Info -->
63
- [![Version](https://img.shields.io/badge/Version-3.32.227-blue.svg)](https://github.com/marcusquinn/aidevops/releases)
63
+ [![Version](https://img.shields.io/badge/Version-3.32.230-blue.svg)](https://github.com/marcusquinn/aidevops/releases)
64
64
  [![npm version](https://img.shields.io/npm/v/aidevops)](https://www.npmjs.com/package/aidevops)
65
65
  [![Homebrew](https://img.shields.io/badge/homebrew-marcusquinn%2Ftap-orange)](https://github.com/marcusquinn/homebrew-tap)
66
66
  [![GitHub repository](https://img.shields.io/badge/github-repository-181717.svg?logo=github)](https://github.com/marcusquinn/aidevops)
@@ -105,7 +105,9 @@ the required notices and preferred credit text.
105
105
  - `aidevops runtime-bundle list` - List retained validated runtime bundles; use `rollback --bundle-id <id> --reason <text>` for an explicit audited rollback
106
106
  - `aidevops gpt56-context [enable|disable|status]` - Keep GPT-5.6 at a 300K advertised context window in OpenCode (enabled by default), so 80% auto-compaction runs near 240K before long-context pricing; disable to use native provider limits
107
107
  - `aidevops buzz [status|apply|rollback]` - Inspect or manage Buzz Desktop OpenCode ACP compatibility
108
+ - `~/.aidevops/agents/scripts/team-interface-helper.sh [providers|detect|status|doctor|plan]` - Inspect registered collaboration providers, persist read-only observations, or emit deterministic dry-run plans; no provider-write command is exposed
108
109
  - `aidevops secret` - Manage secrets (gopass encrypted, AI-safe)
110
+ - `aidevops source-access` - Manage exact-path, session-bound source-read approvals signed via sudo
109
111
  - `aidevops security` - Full security assessment (posture, secrets, supply chain)
110
112
  - `aidevops lint audit` - Audit native lint/format/typecheck commands and repo-verify hooks
111
113
  - `aidevops lint configure --dry-run` - Preview safe evidence-based lint provisioning
@@ -210,10 +212,16 @@ aidevops security scan-secrets # Plaintext credential locations only
210
212
  aidevops security scan-deps # Unpinned dependency check
211
213
  aidevops security check # Per-repo security posture assessment
212
214
  aidevops security dismiss <id> # Dismiss a security advisory after taking action
215
+ aidevops source-access status # List temporary source-read approvals
216
+ sudo -k /usr/bin/python3 -I -B /etc/aidevops/source-access/source-access-helper.py revoke <approval-id>
213
217
  ```
214
218
 
215
219
  Running `aidevops security` with no arguments is the single command that covers everything — user security posture, plaintext secret detection, supply chain IoC scanning, and active advisories.
216
220
 
221
+ When a read guard identifies only a low-confidence source-code basename match, it emits a scoped request. A maintainer can run the displayed root-broker approval command. Approvals are bound to the exact runtime session, user, Git-tracked regular source path, approved content digest, and guard reason; they expire within 12 hours and never override private-key, environment-file, credential-store, hard-link, symlink, changed-content, or untracked-file denials. The plugin redirects the approved read to a root-controlled immutable snapshot of those bytes so the live path cannot be rebound after verification; revocation removes both receipt and snapshot.
222
+
223
+ `setup.sh` and interactive `aidevops update` provision this capability automatically. Setup verifies the published signed tag, asks for one sudo confirmation, has root fetch the exact reviewed broker bytes directly over TLS, compares those downloads byte-for-byte with the signed Git objects, and then creates a dedicated root-only signing key under `/etc/aidevops/source-access`. It never executes or copies the user-writable aidevops deployment as root. The plugin also rejects approvals whenever the installed broker bytes differ from the active release. Headless updates cannot request sudo, so they leave the capability fail-closed; the next terminal `aidevops update` completes provisioning without a separate bootstrap procedure.
224
+
217
225
  **Security advisories** are delivered via `aidevops update` and shown in the session greeting until dismissed. The scanner never exposes secret values — only file locations and key names. All remediation commands should be run in a separate terminal, not inside AI chat sessions.
218
226
 
219
227
  **Supply chain hardening:** All Python dependencies are pinned to exact versions (`==`) to prevent malicious package upgrades. The `.pth` file auditor detects known supply chain attack indicators (e.g., the LiteLLM March 2026 PyPI compromise).
package/VERSION CHANGED
@@ -1 +1 @@
1
- 3.32.227
1
+ 3.32.230
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.32.227
8
+ # Version: 3.32.230
9
9
 
10
10
  set -euo pipefail
11
11
 
@@ -285,6 +285,18 @@ _run_update_setup_transaction() {
285
285
  return 0
286
286
  }
287
287
 
288
+ _run_update_source_access_reconciliation() {
289
+ local setup_script="${INSTALL_DIR}/setup.sh"
290
+
291
+ [[ -t 0 ]] || return 0
292
+ [[ -z "${AIDEVOPS_AUTO_UPDATE:-}" ]] || return 0
293
+ [[ "${AIDEVOPS_NON_INTERACTIVE:-false}" != "true" ]] || return 0
294
+ if ! AIDEVOPS_SOURCE_ACCESS_INTERACTIVE=true bash "$setup_script" --stage source-access; then
295
+ print_warning "Source-access broker provisioning remains deferred and fail-closed"
296
+ fi
297
+ return 0
298
+ }
299
+
288
300
  _update_render_changelog() {
289
301
  local old_hash="$1"
290
302
  local new_hash="$2"
@@ -435,6 +447,7 @@ cmd_update() {
435
447
  _update_fresh_install || return 1
436
448
  fi
437
449
 
450
+ _run_update_source_access_reconciliation
438
451
  _update_sync_projects "$skip_project_sync" "$(get_version)"
439
452
  if [[ "$skip_project_sync" != "$_AIDEVOPS_UPDATE_TRUE" && "$reconcile_repo_verify" == "$_AIDEVOPS_UPDATE_TRUE" ]]; then
440
453
  _update_reconcile_repo_verify
@@ -930,6 +943,7 @@ _cmd_setup_help() {
930
943
  printf '%s\n' " opencode Repair/install the OpenCode CLI only"
931
944
  printf '%s\n' " agents Deploy aidevops agents/scripts only"
932
945
  printf '%s\n' " runtime-config Reconcile generated runtime commands/configuration"
946
+ printf '%s\n' " source-access Install/verify the signed root approval broker"
933
947
  printf '%s\n' " hooks Install safety hooks only"
934
948
  printf '%s\n' " tabby Sync Tabby terminal profiles only"
935
949
  printf '%s\n' " pulse Install/refresh the pulse scheduler only"
@@ -995,7 +1009,7 @@ cmd_setup() {
995
1009
  _help_commands() {
996
1010
  echo "Commands:"
997
1011
  echo " init [features] Initialize aidevops in current project"
998
- echo " setup --scope <s> Run scoped setup/deploy (opencode, agents, hooks, tabby, pulse, gui-desktop, ai-session, full)"
1012
+ echo " setup --scope <s> Run scoped setup/deploy (opencode, agents, source-access, hooks, tabby, pulse, gui-desktop, ai-session, full)"
999
1013
  echo " init-routines Scaffold private routines repo (--org <name> | --local)"
1000
1014
  echo " upgrade-planning Upgrade TODO.md/PLANS.md to latest templates"
1001
1015
  echo " features List available features for init"
@@ -1036,6 +1050,7 @@ _help_commands() {
1036
1050
  echo " ip-check <cmd> IP reputation checks (check/batch/report/providers)"
1037
1051
  echo " review-gate <cmd> Configure review_gate merge policies (rate-limit/completion)"
1038
1052
  echo " github-app-auth GitHub App auth setup/status and API route decisions"
1053
+ echo " source-access <cmd> Session-bound, sudo-signed source-read approvals"
1039
1054
  echo " secret <cmd> Manage secrets (set/list/run/init/import/status)"
1040
1055
  echo " vault <cmd> Local encrypted Vault broker (init/unlock/lock/status/read/update)"
1041
1056
  echo " config <cmd> Feature toggles (list/get/set/reset/path/help)"
@@ -1065,6 +1080,12 @@ _help_detailed_sections() {
1065
1080
  echo " aidevops security check # Per-repo security posture assessment"
1066
1081
  echo " aidevops security dismiss <id> # Dismiss a security advisory"
1067
1082
  echo ""
1083
+ echo "Temporary source access:"
1084
+ echo " aidevops update # Install/verify broker during normal setup"
1085
+ echo " sudo -k /usr/bin/python3 -I -B /etc/aidevops/source-access/source-access-helper.py approve <id> --ttl 12h"
1086
+ echo " aidevops source-access status # List active/expired approvals"
1087
+ echo " sudo -k /usr/bin/python3 -I -B /etc/aidevops/source-access/source-access-helper.py revoke <approval-id>"
1088
+ echo ""
1068
1089
  echo "IP Reputation:"
1069
1090
  echo " aidevops ip-check check <ip> # Check IP reputation across providers"
1070
1091
  echo " aidevops ip-check batch <f> # Batch check IPs from file"
@@ -1843,6 +1864,7 @@ main() {
1843
1864
  opencode-desktop | oc-desktop) _dispatch_helper "opencode-launcher-helper.sh" "opencode-launcher-helper.sh" desktop "$@" ;;
1844
1865
  opencode-sandbox | oc-sandbox) _dispatch_helper "opencode-sandbox-helper.sh" "opencode-sandbox-helper.sh" "$@" ;;
1845
1866
  review-gate | review_gate) _dispatch_helper "review-gate-config-helper.sh" "review-gate-config-helper.sh" "$@" ;;
1867
+ source-access | source_access) _dispatch_helper "source-access-helper.sh" "source-access-helper.sh" "$@" ;;
1846
1868
  secret | secrets) _dispatch_helper "secret-helper.sh" "secret-helper.sh" "$@" ;;
1847
1869
  vault) _dispatch_helper "vault-helper.sh" "vault-helper.sh" "$@" ;;
1848
1870
  approve) _dispatch_helper "approval-helper.sh" "approval-helper.sh" "$@" ;;
package/bun.lock CHANGED
@@ -15,6 +15,7 @@
15
15
  "@types/bun": "latest",
16
16
  "@types/react": "^19.0.0",
17
17
  "@types/react-dom": "^19.0.0",
18
+ "ajv": "^8.18.0",
18
19
  "react": "^19.0.0",
19
20
  "react-dom": "^19.0.0",
20
21
  "secretlint": "^11.2.5",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aidevops",
3
- "version": "3.32.227",
3
+ "version": "3.32.230",
4
4
  "description": "AI DevOps Framework - AI-assisted development workflows, code quality, and deployment automation",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -65,10 +65,11 @@
65
65
  "vite": "^7.0.0"
66
66
  },
67
67
  "devDependencies": {
68
- "@types/react": "^19.0.0",
69
- "@types/react-dom": "^19.0.0",
70
68
  "@secretlint/secretlint-rule-preset-recommend": "^11.2.5",
71
69
  "@types/bun": "latest",
70
+ "@types/react": "^19.0.0",
71
+ "@types/react-dom": "^19.0.0",
72
+ "ajv": "^8.18.0",
72
73
  "react": "^19.0.0",
73
74
  "react-dom": "^19.0.0",
74
75
  "secretlint": "^11.2.5",
package/setup.sh CHANGED
@@ -17,7 +17,7 @@ fi
17
17
  # AI Assistant Server Access Framework Setup Script
18
18
  # Helps developers set up the framework for their infrastructure
19
19
  #
20
- # Version: 3.32.227
20
+ # Version: 3.32.230
21
21
  #
22
22
  # Quick Install:
23
23
  # npm install -g aidevops && aidevops update (recommended)
@@ -35,6 +35,7 @@ NC='\033[0m' # No Color
35
35
  CLEAN_MODE=false
36
36
  INTERACTIVE_MODE=false
37
37
  NON_INTERACTIVE="${AIDEVOPS_NON_INTERACTIVE:-false}"
38
+ SETUP_EXPLICIT_NON_INTERACTIVE="${AIDEVOPS_NON_INTERACTIVE:-false}"
38
39
  UPDATE_TOOLS_MODE=false
39
40
  SETUP_STAGE=""
40
41
  SETUP_STAGE_OPENCODE="setup_opencode_cli"
@@ -45,6 +46,7 @@ SETUP_STAGE_PULSE="setup_supervisor_pulse"
45
46
  SETUP_STAGE_GUI_DESKTOP="setup_gui_desktop_app"
46
47
  SETUP_STAGE_AI_SESSION="setup_ai_session_incremental"
47
48
  SETUP_STAGE_RUNTIME_CONFIG="reconcile_runtime_config"
49
+ SETUP_STAGE_SOURCE_ACCESS="setup_source_access_broker"
48
50
  SETUP_STAGE_OPENCODE_PLUGINS="setup_opencode_plugins"
49
51
  SETUP_STAGE_HOTFIX_CONFIG="_deploy_hotfix_config"
50
52
  SETUP_GUI_APP_NAME="aidevops.app"
@@ -372,6 +374,8 @@ source "${SETUP_IMPL_MODULES_DIR}/tool-beads.sh"
372
374
  # shellcheck disable=SC1091
373
375
  source "${SETUP_IMPL_MODULES_DIR}/config.sh"
374
376
  # shellcheck disable=SC1091
377
+ source "${SETUP_IMPL_MODULES_DIR}/source-access.sh"
378
+ # shellcheck disable=SC1091
375
379
  source "${SETUP_IMPL_MODULES_DIR}/plugins.sh"
376
380
  # shellcheck disable=SC1091
377
381
  source "${SETUP_IMPL_MODULES_DIR}/schedulers.sh"
@@ -392,6 +396,7 @@ parse_args() {
392
396
  ;;
393
397
  --non-interactive | -n)
394
398
  NON_INTERACTIVE=true
399
+ SETUP_EXPLICIT_NON_INTERACTIVE=true
395
400
  shift
396
401
  ;;
397
402
  --update | -u)
@@ -433,8 +438,9 @@ parse_args() {
433
438
  echo "Use --clean after removing or renaming agents to sync deletions."
434
439
  echo "Use --interactive to control each step individually."
435
440
  echo "Use --non-interactive for CI/CD or AI agent shells (no stdin required)."
436
- echo "Use --stage for targeted updates: opencode, agents, runtime-config, hooks, tabby, pulse, gui-desktop, ai-session, full."
437
- echo "Stage aliases: ${SETUP_STAGE_OPENCODE}, ${SETUP_STAGE_AGENTS}, ${SETUP_STAGE_RUNTIME_CONFIG}, ${SETUP_STAGE_HOOKS}, ${SETUP_STAGE_TABBY}, ${SETUP_STAGE_PULSE}, ${SETUP_STAGE_GUI_DESKTOP}, ${SETUP_STAGE_AI_SESSION}."
441
+ echo "Use --stage for targeted updates: opencode, agents, runtime-config, source-access, hooks, tabby, pulse, gui-desktop, ai-session, full."
442
+ echo "Stage aliases: ${SETUP_STAGE_OPENCODE}, ${SETUP_STAGE_AGENTS}, ${SETUP_STAGE_RUNTIME_CONFIG}, ${SETUP_STAGE_SOURCE_ACCESS}, ${SETUP_STAGE_HOOKS}, ${SETUP_STAGE_TABBY}, ${SETUP_STAGE_PULSE}, ${SETUP_STAGE_GUI_DESKTOP}, ${SETUP_STAGE_AI_SESSION}."
443
+ echo "The source-access stage may request sudo when attached to an interactive terminal."
438
444
  echo "Install ${SETUP_GUI_APP_NAME} explicitly with --stage gui-desktop or AIDEVOPS_GUI_DESKTOP_INSTALL=true."
439
445
  echo "Use --update to check for tool updates after setup completes."
440
446
  exit 0
@@ -457,6 +463,7 @@ _setup_print_stage_help() {
457
463
  printf ' opencode | %s Repair/install OpenCode CLI only\n' "$SETUP_STAGE_OPENCODE"
458
464
  printf ' agents | %s Deploy .agents scripts/prompts only\n' "$SETUP_STAGE_AGENTS"
459
465
  printf ' runtime-config | %s Reconcile generated runtime commands/configuration\n' "$SETUP_STAGE_RUNTIME_CONFIG"
466
+ printf ' source-access | %s Install/verify the signed root broker\n' "$SETUP_STAGE_SOURCE_ACCESS"
460
467
  printf ' hooks | %s Install safety hooks only\n' "$SETUP_STAGE_HOOKS"
461
468
  printf ' tabby | %s Sync Tabby profiles only\n' "$SETUP_STAGE_TABBY"
462
469
  printf ' pulse | %s Install/refresh pulse scheduler only\n' "$SETUP_STAGE_PULSE"
@@ -472,6 +479,7 @@ _setup_canonical_stage() {
472
479
  opencode | "$SETUP_STAGE_OPENCODE") printf '%s' "$SETUP_STAGE_OPENCODE" ;;
473
480
  agents | "$SETUP_STAGE_AGENTS") printf '%s' "$SETUP_STAGE_AGENTS" ;;
474
481
  runtime-config | runtime | "$SETUP_STAGE_RUNTIME_CONFIG") printf '%s' "$SETUP_STAGE_RUNTIME_CONFIG" ;;
482
+ source-access | "$SETUP_STAGE_SOURCE_ACCESS") printf '%s' "$SETUP_STAGE_SOURCE_ACCESS" ;;
475
483
  hooks | "$SETUP_STAGE_HOOKS") printf '%s' "$SETUP_STAGE_HOOKS" ;;
476
484
  tabby | "$SETUP_STAGE_TABBY") printf '%s' "$SETUP_STAGE_TABBY" ;;
477
485
  pulse | "$SETUP_STAGE_PULSE") printf '%s' "$SETUP_STAGE_PULSE" ;;
@@ -1452,6 +1460,14 @@ _setup_run_scoped_stage() {
1452
1460
  "$SETUP_STAGE_RUNTIME_CONFIG")
1453
1461
  _time_step "$SETUP_STAGE_RUNTIME_CONFIG" _setup_reconcile_runtime_config
1454
1462
  ;;
1463
+ "$SETUP_STAGE_SOURCE_ACCESS")
1464
+ if [[ "$SETUP_EXPLICIT_NON_INTERACTIVE" == "true" ]]; then
1465
+ _time_step "$SETUP_STAGE_SOURCE_ACCESS" setup_source_access_broker
1466
+ else
1467
+ AIDEVOPS_SOURCE_ACCESS_INTERACTIVE=true \
1468
+ _time_step "$SETUP_STAGE_SOURCE_ACCESS" setup_source_access_broker
1469
+ fi
1470
+ ;;
1455
1471
  "$SETUP_STAGE_HOOKS")
1456
1472
  _time_step "$SETUP_STAGE_HOOKS" setup_safety_hooks
1457
1473
  ;;
@@ -1549,6 +1565,7 @@ _setup_run_non_interactive() {
1549
1565
  _time_step "setup_opencode_desktop_launcher" setup_opencode_desktop_launcher
1550
1566
  _time_step "sync_agent_sources" sync_agent_sources
1551
1567
  _time_step "install_aidevops_cli" install_aidevops_cli || print_warning "aidevops CLI installation encountered issues; continuing configuration reconciliation"
1568
+ _time_step "setup_source_access_broker" setup_source_access_broker_nonfatal
1552
1569
  _time_step "setup_shellcheck_wrapper" setup_shellcheck_wrapper
1553
1570
  if is_feature_enabled safety_hooks 2>/dev/null; then
1554
1571
  _time_step "$SETUP_STAGE_HOOKS" setup_safety_hooks
@@ -1722,6 +1739,9 @@ _setup_run_interactive() {
1722
1739
  # Launcher verification reads the deployed VERSION, so it must follow agent
1723
1740
  # deployment on first-run interactive setup as it already does non-interactively.
1724
1741
  confirm_step "Install and verify aidevops CLI command" && install_aidevops_cli
1742
+ if confirm_step "Install the secure source-access approval broker"; then
1743
+ AIDEVOPS_SOURCE_ACCESS_INTERACTIVE=true setup_source_access_broker_nonfatal
1744
+ fi
1725
1745
  confirm_step "Sync agents from private repositories" && sync_agent_sources
1726
1746
  confirm_step "Set up routines repo (private repo for recurring operational jobs)" && setup_routines
1727
1747
  is_feature_enabled safety_hooks 2>/dev/null && confirm_step "Install Claude Code safety hooks (block destructive commands)" && setup_safety_hooks