aidevops 3.25.0 → 3.25.1

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
@@ -58,7 +58,7 @@ The result: an AI operations platform that manages projects across every busines
58
58
  [![Copyright](https://img.shields.io/badge/Copyright-Marcus%20Quinn%202025--2026-blue.svg)](https://github.com/marcusquinn)
59
59
 
60
60
  <!-- Release & Version Info -->
61
- [![Version](https://img.shields.io/badge/Version-3.25.0-blue.svg)](https://github.com/marcusquinn/aidevops/releases)
61
+ [![Version](https://img.shields.io/badge/Version-3.25.1-blue.svg)](https://github.com/marcusquinn/aidevops/releases)
62
62
  [![npm version](https://img.shields.io/npm/v/aidevops)](https://www.npmjs.com/package/aidevops)
63
63
  [![Homebrew](https://img.shields.io/badge/homebrew-marcusquinn%2Ftap-orange)](https://github.com/marcusquinn/homebrew-tap)
64
64
  [![GitHub repository](https://img.shields.io/badge/github-repository-181717.svg?logo=github)](https://github.com/marcusquinn/aidevops)
package/VERSION CHANGED
@@ -1 +1 @@
1
- 3.25.0
1
+ 3.25.1
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.25.0
8
+ # Version: 3.25.1
9
9
 
10
10
  set -euo pipefail
11
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aidevops",
3
- "version": "3.25.0",
3
+ "version": "3.25.1",
4
4
  "description": "AI DevOps Framework - AI-assisted development workflows, code quality, and deployment automation",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -221,14 +221,14 @@ function ConversationSidebar({ conversationMode, selectedLocalRepoIndex, setConv
221
221
  {conversationMode === "people" ? <PeopleChannelList /> : <>
222
222
  <button className="new-session-button" disabled title="Creating sessions needs an audited OpenCode write route." type="button">{text.newSession}</button>
223
223
  <section className="repo-session-selector" aria-label={text.localRepoSelector}>
224
- <button aria-label="Previous local repo" disabled={!canSelectPreviousRepo} onClick={() => setSelectedLocalRepoIndex(Math.max(0, selectedLocalRepoIndex - 1))} type="button"><FiChevronLeft /></button>
224
+ <button aria-label="Previous local repo" className="selector-step-button" disabled={!canSelectPreviousRepo} onClick={() => setSelectedLocalRepoIndex(Math.max(0, selectedLocalRepoIndex - 1))} type="button"><FiChevronLeft aria-hidden="true" /></button>
225
225
  <label>
226
226
  <span>{text.localRepos}</span>
227
227
  <select onChange={(event) => setSelectedLocalRepoIndex(Number.parseInt(event.currentTarget.value, 10))} value={Math.min(selectedLocalRepoIndex, Math.max(0, repos.length - 1))}>
228
228
  {repos.length === 0 ? <option value={0}>No local repos</option> : repos.map((repo, index) => <option key={repo.path_ref} value={index}>{repo.name}</option>)}
229
229
  </select>
230
230
  </label>
231
- <button aria-label="Next local repo" disabled={!canSelectNextRepo} onClick={() => setSelectedLocalRepoIndex(Math.min(repos.length - 1, selectedLocalRepoIndex + 1))} type="button"><FiChevronRight /></button>
231
+ <button aria-label="Next local repo" className="selector-step-button" disabled={!canSelectNextRepo} onClick={() => setSelectedLocalRepoIndex(Math.min(repos.length - 1, selectedLocalRepoIndex + 1))} type="button"><FiChevronRight aria-hidden="true" /></button>
232
232
  </section>
233
233
  <section className="sidebar-group session-history-list">
234
234
  <h2>{text.sessionHistory}</h2>
@@ -386,8 +386,20 @@ function SidebarFooter({ accentHue, fontPreference, fontSizePreference, setAccen
386
386
  const [appearanceOpen, setAppearanceOpen] = useState(true);
387
387
  const AppearanceChevron = appearanceOpen ? FiChevronDown : FiChevronUp;
388
388
  const selectedFontFamily = fontFamilyForPreference(fontPreference);
389
+ const fontIndex = Math.max(0, fontOptions.findIndex((option) => option.value === fontPreference));
389
390
  const fontSizeIndex = Math.max(0, fontSizeOptions.findIndex((option) => option.value === fontSizePreference));
391
+ const canSelectPreviousFont = fontIndex > 0;
392
+ const canSelectNextFont = fontIndex < fontOptions.length - 1;
390
393
  const [hueInput, setHueInput] = useState(() => String(accentHue));
394
+ const setFontByIndex = (index: number) => {
395
+ const nextFont = fontOptions[index]?.value;
396
+
397
+ if (nextFont === undefined) {
398
+ return;
399
+ }
400
+
401
+ setFontPreference(nextFont);
402
+ };
391
403
  const updateAccentHue = (value: number) => {
392
404
  if (!Number.isFinite(value)) {
393
405
  return;
@@ -486,20 +498,25 @@ function SidebarFooter({ accentHue, fontPreference, fontSizePreference, setAccen
486
498
  {fontSizeOptions.map((option) => <span className={option.value === fontSizePreference ? "active" : ""} key={option.value}>{option.label}</span>)}
487
499
  </div>
488
500
  </div>
489
- <label className="font-control">
490
- <span>{text.font}</span>
491
- <select
492
- onChange={(event) => setFontPreference(event.currentTarget.value as FontPreference)}
493
- style={{ fontFamily: selectedFontFamily }}
494
- value={fontPreference}
495
- >
496
- {fontOptions.map((option) => (
497
- <option key={option.value} style={{ fontFamily: option.fontFamily }} value={option.value}>
498
- {option.label}
499
- </option>
500
- ))}
501
- </select>
502
- </label>
501
+ <div className="font-control">
502
+ <span id="appearance-font-selector-label">{text.font}</span>
503
+ <div className="selector-with-stepper font-selector-row">
504
+ <button aria-label="Previous font" className="selector-step-button" disabled={!canSelectPreviousFont} onClick={() => setFontByIndex(fontIndex - 1)} type="button"><FiChevronLeft aria-hidden="true" /></button>
505
+ <select
506
+ aria-labelledby="appearance-font-selector-label"
507
+ onChange={(event) => setFontPreference(event.currentTarget.value as FontPreference)}
508
+ style={{ fontFamily: selectedFontFamily }}
509
+ value={fontPreference}
510
+ >
511
+ {fontOptions.map((option) => (
512
+ <option key={option.value} style={{ fontFamily: option.fontFamily }} value={option.value}>
513
+ {option.label}
514
+ </option>
515
+ ))}
516
+ </select>
517
+ <button aria-label="Next font" className="selector-step-button" disabled={!canSelectNextFont} onClick={() => setFontByIndex(fontIndex + 1)} type="button"><FiChevronRight aria-hidden="true" /></button>
518
+ </div>
519
+ </div>
503
520
  </div>
504
521
  : null}
505
522
  </section>
@@ -383,16 +383,41 @@ code {
383
383
  grid-template-columns: auto minmax(0, 1fr) auto;
384
384
  }
385
385
 
386
- .repo-session-selector button {
386
+ .selector-with-stepper {
387
+ align-items: center;
388
+ display: grid;
389
+ gap: 8px;
390
+ grid-template-columns: auto minmax(0, 1fr) auto;
391
+ }
392
+
393
+ .repo-session-selector .selector-step-button,
394
+ .selector-step-button {
387
395
  align-items: center;
388
396
  background: var(--surface-muted);
389
397
  border: 1px solid var(--border);
390
398
  border-radius: 999px;
391
399
  color: var(--text-secondary);
392
400
  display: inline-flex;
393
- height: 34px;
401
+ height: 40px;
394
402
  justify-content: center;
395
- width: 34px;
403
+ }
404
+
405
+ .selector-step-button {
406
+ padding: 0;
407
+ width: 40px;
408
+ }
409
+
410
+ .selector-step-button:hover:not(:disabled),
411
+ .selector-step-button:focus-visible {
412
+ border-color: color-mix(in srgb, var(--accent) 40%, transparent);
413
+ color: var(--accent);
414
+ outline: none;
415
+ }
416
+
417
+ .selector-step-button svg {
418
+ height: 18px;
419
+ stroke-width: 2.5;
420
+ width: 18px;
396
421
  }
397
422
 
398
423
  .repo-session-selector label {
@@ -413,6 +438,7 @@ code {
413
438
  border: 1px solid var(--border);
414
439
  border-radius: 10px;
415
440
  color: var(--text-primary);
441
+ min-height: 40px;
416
442
  min-width: 0;
417
443
  padding: 8px;
418
444
  }
@@ -754,11 +780,16 @@ code {
754
780
  border: 1px solid var(--border);
755
781
  border-radius: 12px;
756
782
  color: var(--text-primary);
783
+ min-height: 40px;
757
784
  min-width: 0;
758
785
  padding: 9px 10px;
759
786
  width: 100%;
760
787
  }
761
788
 
789
+ .font-selector-row {
790
+ align-items: center;
791
+ }
792
+
762
793
  .app-inset {
763
794
  display: grid;
764
795
  grid-template-rows: auto minmax(0, 1fr);
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.25.0
15
+ # Version: 3.25.1
16
16
  #
17
17
  # Quick Install:
18
18
  # npm install -g aidevops && aidevops update (recommended)