aidevops 3.22.0 → 3.22.2

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.22.0-blue.svg)](https://github.com/marcusquinn/aidevops/releases)
61
+ [![Version](https://img.shields.io/badge/Version-3.22.2-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.22.0
1
+ 3.22.2
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.22.0
8
+ # Version: 3.22.2
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.22.0",
3
+ "version": "3.22.2",
4
4
  "description": "AI DevOps Framework - AI-assisted development workflows, code quality, and deployment automation",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -360,6 +360,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, WKNavigationDelegate,
360
360
  private let defaultAccentHue: CGFloat = 123
361
361
  private let mainWindowFrameAutosaveName = "aidevops-main-window"
362
362
  private let titlebarHeight: CGFloat = 24
363
+ private let serviceQueue = DispatchQueue(label: "sh.aidevops.gui.services")
364
+ private var servicesStopped = false
363
365
 
364
366
  func applicationDidFinishLaunching(_ notification: Notification) {
365
367
  configureMenu()
@@ -378,6 +380,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, WKNavigationDelegate,
378
380
  return .terminateNow
379
381
  }
380
382
 
383
+ func applicationWillTerminate(_ notification: Notification) {
384
+ saveMainWindowFrame()
385
+ stopServices()
386
+ }
387
+
381
388
  func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
382
389
  if !flag {
383
390
  openDashboard(nil)
@@ -818,8 +825,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate, WKNavigationDelegate,
818
825
  }
819
826
 
820
827
  private func startServicesAndLoadApp() {
821
- DispatchQueue.global(qos: .userInitiated).async {
828
+ serviceQueue.async {
829
+ if self.servicesStopped {
830
+ return
831
+ }
822
832
  let result = self.runServiceHelper()
833
+ if self.servicesStopped {
834
+ return
835
+ }
823
836
  DispatchQueue.main.async {
824
837
  if result.ok {
825
838
  self.loadAppURL()
@@ -835,7 +848,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, WKNavigationDelegate,
835
848
  }
836
849
 
837
850
  private func stopServices() {
838
- _ = runServiceHelper(arguments: ["stop"])
851
+ serviceQueue.sync {
852
+ if servicesStopped {
853
+ return
854
+ }
855
+ servicesStopped = true
856
+ _ = runServiceHelper(arguments: ["stop"])
857
+ }
839
858
  }
840
859
 
841
860
  private func runServiceHelper(arguments: [String]) -> (ok: Bool, message: String) {
@@ -41,32 +41,12 @@ export const statusFixture: GuiStatusData = {
41
41
  },
42
42
  ],
43
43
  navigation: [
44
- {
45
- id: "overview",
46
- label: "Overview",
47
- description: "Local setup, update, and API health.",
48
- },
49
- {
50
- id: "agents",
51
- label: "Agents",
52
- description: "Read-only file explorer for deployed agent files.",
53
- },
54
- {
55
- id: "config",
56
- label: "Config",
57
- description: "Read-only file explorer for aidevops config.",
58
- },
59
- {
60
- id: "git",
61
- label: "Local Repos",
62
- description: "Read-only local git workspace browser.",
63
- },
64
- {
65
- id: "security",
66
- label: "Secrets",
67
- description: "Secret-reference-only trust boundary.",
68
- },
69
- ],
44
+ ["overview", "Overview", "Local setup, update, and API health."],
45
+ ["agents", "Agents", "Read-only file explorer for deployed agent files."],
46
+ ["config", "Config", "Read-only file explorer for aidevops config."],
47
+ ["git", "Local Repos", "Read-only local git workspace browser."],
48
+ ["security", "Secrets", "Secret-reference-only trust boundary."],
49
+ ].map(([id, label, description]) => ({ id, label, description })),
70
50
  settings: {
71
51
  path_ref: "~/.config/aidevops/settings.json",
72
52
  health: "unchecked",
@@ -64,6 +64,22 @@ const surfaceIcons: Record<SurfaceIconName, IconType> = {
64
64
  users: FiUsers,
65
65
  };
66
66
 
67
+ export function hueFromInputValue(value: string): number | null {
68
+ const trimmedValue = value.trim();
69
+
70
+ if (trimmedValue.length === 0) {
71
+ return null;
72
+ }
73
+
74
+ const hue = Number(trimmedValue);
75
+
76
+ if (!Number.isInteger(hue)) {
77
+ return null;
78
+ }
79
+
80
+ return Math.min(359, Math.max(0, hue));
81
+ }
82
+
67
83
  export function SurfaceGlyph({ icon }: { icon: SurfaceIconName }) {
68
84
  const Icon = surfaceIcons[icon];
69
85
 
@@ -271,10 +287,14 @@ function SidebarFooter({ accentHue, fontPreference, fontSizePreference, setAccen
271
287
  };
272
288
  const updateHueInput = (value: string) => {
273
289
  setHueInput(value);
274
- if (value.trim().length === 0) {
290
+
291
+ const nextHue = hueFromInputValue(value);
292
+
293
+ if (nextHue === null) {
275
294
  return;
276
295
  }
277
- updateAccentHue(Number.parseInt(value, 10));
296
+
297
+ updateAccentHue(nextHue);
278
298
  };
279
299
 
280
300
  useEffect(() => {
@@ -265,13 +265,11 @@ export const fontOptions: FontOption[] = [
265
265
  { value: "Ubuntu Mono", label: "Ubuntu Mono", fontFamily: '"Ubuntu Mono", Menlo, Monaco, Consolas, monospace' },
266
266
  ];
267
267
 
268
- export const fontSizeOptions: FontSizeOption[] = [
269
- { value: "xs", label: "xs", cssSize: "14px" },
270
- { value: "s", label: "s", cssSize: "15px" },
271
- { value: "m", label: "m", cssSize: "16px" },
272
- { value: "lg", label: "lg", cssSize: "17px" },
273
- { value: "xl", label: "xl", cssSize: "18px" },
274
- ];
268
+ export const fontSizeOptions: FontSizeOption[] = (["xs", "s", "m", "lg", "xl"] as const).map((size, index) => ({
269
+ value: size,
270
+ label: size,
271
+ cssSize: `${14 + index}px`,
272
+ }));
275
273
 
276
274
  export const navGroups: SurfaceNavGroup[] = [
277
275
  {
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.22.0
15
+ # Version: 3.22.2
16
16
  #
17
17
  # Quick Install:
18
18
  # npm install -g aidevops && aidevops update (recommended)