@hybridlabor-api/aos 4.4.2-beta.2 → 4.4.2-beta.3

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.
@@ -50,8 +50,21 @@ const MODULE_DIRS = ['memB', 'bdb-synapse', 'bdb-os-remote', 'bdb-dev-creator-ex
50
50
  'bdb-dev-tool-installer',
51
51
  'bdb-agent-orchestrator', // AO
52
52
  'bdb-os-agent-workspace', // AO's archived predecessor, if still lying around
53
+ 'bdb-dev-optimized-agent-skills', // AOS's own core payload cache, when a "from source" or non-npx run left one behind
53
54
  ].map((m) => h('.agents', m));
54
55
 
56
+ // installer.js's detectInstallState() treats any of these as proof AOS is
57
+ // still installed, independently of the manifest -- a leftover copy after
58
+ // this uninstall runs was reported as "Current & Up-to-date" on the very
59
+ // next launch, with the manifest already gone. Keep this list in exact sync
60
+ // with the `legacyMarkers` array in installer.js's detectInstallState().
61
+ const LEGACY_MARKERS = [
62
+ h('.agents', 'AGENTS.md'),
63
+ h('.gemini', 'config', 'skills', 'startcycle', 'SKILL.md'),
64
+ h('.agents', 'skills', 'startcycle', 'SKILL.md'),
65
+ h('.claude', 'skills', 'startcycle', 'SKILL.md'),
66
+ ];
67
+
55
68
  const sha256 = (file) => {
56
69
  try { return createHash('sha256').update(readFileSync(file)).digest('hex'); }
57
70
  catch { return null; }
@@ -77,13 +90,14 @@ function plan() {
77
90
  .filter((a) => existsSync(a.plist));
78
91
 
79
92
  const modules = MODULE_DIRS.filter(existsSync);
93
+ const legacy = LEGACY_MARKERS.filter(existsSync);
80
94
  const data = PURGE ? DATA_PATHS.filter((d) => existsSync(d.path)) : [];
81
95
 
82
- return { manifest, ours, edited, gone, agents, modules, data };
96
+ return { manifest, ours, edited, gone, agents, modules, legacy, data };
83
97
  }
84
98
 
85
99
  function describe(p) {
86
- const { manifest, ours, edited, gone, agents, modules, data } = p;
100
+ const { manifest, ours, edited, gone, agents, modules, legacy, data } = p;
87
101
 
88
102
  if (!manifest) {
89
103
  console.log('Kein Installations-Manifest unter ' + tilde(MANIFEST) + '.');
@@ -110,6 +124,11 @@ function describe(p) {
110
124
  console.log('\nModule:');
111
125
  for (const m of modules) console.log(` ${tilde(m)}`);
112
126
  }
127
+ if (legacy.length) {
128
+ console.log(`\nInstallations-Marker (${legacy.length}) -- ohne diese hält die nächste`);
129
+ console.log(' Installation AOS für bereits aktuell installiert:');
130
+ for (const l of legacy) console.log(` ${tilde(l)}`);
131
+ }
113
132
 
114
133
  console.log('\nBleibt erhalten:');
115
134
  if (!PURGE) for (const d of DATA_PATHS.filter((d) => existsSync(d.path))) console.log(` ${tilde(d.path).padEnd(18)} ${d.what}`);
@@ -140,7 +159,7 @@ function dirSize(p) {
140
159
 
141
160
  // ------------------------------------------------------------------ execute
142
161
  function execute(p) {
143
- const { ours, edited, agents, modules, data } = p;
162
+ const { ours, edited, agents, modules, legacy, data } = p;
144
163
  const stamp = new Date().toISOString().replace(/[:.]/g, '').slice(0, 15);
145
164
  let removed = 0, backed = 0;
146
165
 
@@ -161,6 +180,9 @@ function execute(p) {
161
180
  for (const m of modules) { try { rmSync(m, { recursive: true, force: true }); } catch { /* in use */ } }
162
181
  if (modules.length) console.log(` ${modules.length} Module entfernt`);
163
182
 
183
+ for (const l of legacy) { try { rmSync(l); } catch { /* already gone */ } }
184
+ if (legacy.length) console.log(` ${legacy.length} Installations-Marker entfernt`);
185
+
164
186
  // Only the BDB hook entries leave settings.json; everything else in it is
165
187
  // the user's and must survive an uninstall exactly as it survives an install.
166
188
  const settings = h('.claude', 'settings.json');
package/installer.js CHANGED
@@ -3405,15 +3405,26 @@ function generateAndOpenLaunchpad() {
3405
3405
 
3406
3406
  const filePath = path.join(os.homedir(), '.agents', 'bdb-launchpad.html');
3407
3407
  fs.writeFileSync(filePath, html, 'utf-8');
3408
+ const warnOpenFailed = (e) => log.warn(`Could not open the dashboard automatically (${e.message}). Open it yourself: ${filePath}`);
3408
3409
  try {
3410
+ let child;
3409
3411
  if (process.platform === 'darwin') {
3410
- spawn('open', [filePath], { detached: true, stdio: 'ignore' }).unref();
3412
+ child = spawn('open', [filePath], { detached: true, stdio: 'ignore' });
3411
3413
  } else if (process.platform === 'win32') {
3412
- spawn('cmd.exe', ['/c', 'start', '""', filePath], { detached: true, stdio: 'ignore' }).unref();
3414
+ // cmd.exe /c start has a title-vs-path quoting quirk when the
3415
+ // arguments come from spawn's argv array rather than a real shell --
3416
+ // on a real Windows test run it silently opened nothing, and the
3417
+ // failure was invisible: spawn() reports a bad launch asynchronously
3418
+ // via 'error', not by throwing, so the try/catch around this call
3419
+ // could never have caught it regardless of --verbose. explorer.exe
3420
+ // on a plain file path has no title argument to misparse.
3421
+ child = spawn('explorer', [filePath], { detached: true, stdio: 'ignore' });
3413
3422
  } else {
3414
- spawn('xdg-open', [filePath], { detached: true, stdio: 'ignore' }).unref();
3423
+ child = spawn('xdg-open', [filePath], { detached: true, stdio: 'ignore' });
3415
3424
  }
3416
- } catch (e) { logDebug(e, 'launchpad open'); }
3425
+ child.on('error', warnOpenFailed);
3426
+ child.unref();
3427
+ } catch (e) { warnOpenFailed(e); }
3417
3428
  }
3418
3429
 
3419
3430
  async function universalHarnessSync(primaryMcpConfigPath) {
package/lib/startup-ui.js CHANGED
@@ -83,7 +83,13 @@ function buildTelemetryCard({ installState, detections, daemonStatus = [] }) {
83
83
  'Google Antigravity': 'Antigravity',
84
84
  'ChatGPT Codex CLI': 'Codex CLI',
85
85
  'Claude Code CLI': 'Claude Code',
86
- 'Roo Code / Cline / VS Code': 'Roo / Cline',
86
+ // The underlying detection (installer.js's 'vscode' evidence) fires on
87
+ // any of: the VS Code app/CLI being present, OR a Roo/Cline extension
88
+ // glob match. Those are not the same claim -- plain VS Code with no
89
+ // Roo/Cline extension installed used to display as "Roo / Cline" here,
90
+ // asserting something that was not there. "VS Code" is the one label
91
+ // that is true in all three trigger cases.
92
+ 'Roo Code / Cline / VS Code': 'VS Code',
87
93
  'Aider CLI': 'Aider',
88
94
  'OpenCode CLI': 'OpenCode',
89
95
  'Cursor / Generic IDE': 'Cursor',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hybridlabor-api/aos",
3
- "version": "4.4.2-beta.2",
3
+ "version": "4.4.2-beta.3",
4
4
  "description": "AOS — A Curated AI AGENT OS. Optimized agent skills and add-ons like memB, OpenWiki, Heimdall Token Saver, and Godmode architectures.",
5
5
  "main": "installer.js",
6
6
  "bin": {