@hybridlabor-api/aos 4.4.2-beta.9 → 4.5.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.
Files changed (53) hide show
  1. package/.claude/hooks/memb-inject.mjs +135 -40
  2. package/.claude/workflows/startcycle-dispatch.mjs +318 -3
  3. package/README.de.md +10 -10
  4. package/README.md +10 -10
  5. package/README.pt.md +10 -10
  6. package/bin/aos-dashboard.mjs +8 -2
  7. package/installer.js +317 -12
  8. package/package.json +1 -1
  9. package/skills/global_config/aos-setup/SKILL.md +7 -9
  10. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +43 -1
  11. package/skills/global_config/openwiki-skill/scripts/install_daemon.ps1 +107 -18
  12. package/skills/global_config/openwiki-skill/scripts/install_daemon.sh +7 -0
  13. package/.agents/skills/firecrawl/SKILL.md +0 -149
  14. package/.agents/skills/firecrawl/rules/install.md +0 -82
  15. package/.agents/skills/firecrawl/rules/security.md +0 -26
  16. package/.agents/skills/firecrawl-agent/SKILL.md +0 -58
  17. package/.agents/skills/firecrawl-build/SKILL.md +0 -39
  18. package/.agents/skills/firecrawl-build-interact/SKILL.md +0 -68
  19. package/.agents/skills/firecrawl-build-onboarding/SKILL.md +0 -103
  20. package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +0 -39
  21. package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +0 -20
  22. package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +0 -17
  23. package/.agents/skills/firecrawl-build-scrape/SKILL.md +0 -69
  24. package/.agents/skills/firecrawl-build-search/SKILL.md +0 -69
  25. package/.agents/skills/firecrawl-crawl/SKILL.md +0 -59
  26. package/.agents/skills/firecrawl-download/SKILL.md +0 -70
  27. package/.agents/skills/firecrawl-interact/SKILL.md +0 -84
  28. package/.agents/skills/firecrawl-map/SKILL.md +0 -51
  29. package/.agents/skills/firecrawl-scrape/SKILL.md +0 -69
  30. package/.agents/skills/firecrawl-search/SKILL.md +0 -60
  31. package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +0 -10
  32. package/mcps/after-effects-mcp/build/index.js +0 -840
  33. package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +0 -153
  34. package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +0 -218
  35. package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +0 -71
  36. package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +0 -147
  37. package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +0 -114
  38. package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +0 -115
  39. package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +0 -192
  40. package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +0 -90
  41. package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +0 -50
  42. package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +0 -1773
  43. package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +0 -160
  44. package/mcps/computer-use-mcp/dist/client.d.ts +0 -150
  45. package/mcps/computer-use-mcp/dist/client.js +0 -136
  46. package/mcps/computer-use-mcp/dist/entrypoint.d.ts +0 -16
  47. package/mcps/computer-use-mcp/dist/entrypoint.js +0 -26
  48. package/mcps/computer-use-mcp/dist/native.d.ts +0 -212
  49. package/mcps/computer-use-mcp/dist/native.js +0 -50
  50. package/mcps/computer-use-mcp/dist/server.d.ts +0 -32
  51. package/mcps/computer-use-mcp/dist/server.js +0 -342
  52. package/mcps/computer-use-mcp/dist/session.d.ts +0 -101
  53. package/mcps/computer-use-mcp/dist/session.js +0 -2372
package/README.md CHANGED
@@ -10,17 +10,17 @@
10
10
  [![GitHub stars](https://img.shields.io/github/stars/hybridlabor-api/aos?style=flat&color=gold)](https://github.com/hybridlabor-api/aos/stargazers)
11
11
  [![last commit](https://img.shields.io/github/last-commit/hybridlabor-api/aos.svg)](https://github.com/hybridlabor-api/aos/commits/main)
12
12
 
13
- [![skills](https://img.shields.io/badge/skills-183%20curated-brightgreen.svg)](docs/skills_table.md)
13
+ [![skills](https://img.shields.io/badge/skills-184%20curated-brightgreen.svg)](docs/skills_table.md)
14
14
  [![MCPs](https://img.shields.io/badge/local%20MCPs-19-brightgreen.svg)](mcps/)
15
15
  [![harnesses](https://img.shields.io/badge/harnesses-9%20supported-blueviolet.svg)](#-installation)
16
16
  [![runtime](https://img.shields.io/badge/node-20+-blue.svg)](https://github.com/hybridlabor-api/aos)
17
17
  [![SkillSpector](https://img.shields.io/badge/NVIDIA%20SkillSpector-CLEAN-76B900?logo=nvidia&logoColor=white)](https://github.com/NVIDIA/SkillSpector)
18
18
 
19
- > **Supercharging AI coding agents with 183 hyper-curated skills, 21 local MCP wrappers, and a runnable multi-agent dispatcher graph.**
19
+ > **Supercharging AI coding agents with 184 hyper-curated skills, 19 local MCP wrappers, and a runnable multi-agent dispatcher graph.**
20
20
 
21
- Welcome to **BDB Agent OS — AOS**: 183 curated skills, 19 local MCP wrappers, an optional Hardware & PCB design module, and a dispatcher graph that turns all of it into a real multi-agent build pipeline, not just a prompt library. Point it at a goal and it plans, builds, reviews, and ships through seven coordinated agent nodes — with a mechanically enforced gate before anything actually goes live.
21
+ Welcome to **BDB Agent OS — AOS**: 184 curated skills, 19 local MCP wrappers, an optional Hardware & PCB design module, and a dispatcher graph that turns all of it into a real multi-agent build pipeline, not just a prompt library. Point it at a goal and it plans, builds, reviews, and ships through seven coordinated agent nodes — with a mechanically enforced gate before anything actually goes live.
22
22
 
23
- **Current release:** `v4.4.2` (beta channel) — see the NPM badge above for the exact published version.
23
+ **Current release:** `v4.5.0` — see the NPM badge above for the exact published version.
24
24
 
25
25
  It is harness-neutral by design, not "optimized for one tool with others as an afterthought": the dispatcher graph runs on Claude Code's Dynamic Workflows, the same skills and MCP configuration install natively into **Google Antigravity, ChatGPT Codex / Codex CLI, Claude Desktop, Cursor, Aider, Roo Code, Cline, and Windsurf**, and the lightweight `/startcycle-graph-user` variant falls back to Claude Code's own subagents on any machine that has none of the above installed.
26
26
 
@@ -98,16 +98,16 @@ separately if you want the same routing available outside a `/startcycle` run.
98
98
  ## Overview
99
99
 
100
100
  This repo ships three things: a curated skill library for coding agents, an
101
- installer that wires them (plus 21 local MCP wrappers) into whichever harness
101
+ installer that wires them (plus 19 local MCP wrappers) into whichever harness
102
102
  you use, and a dispatcher graph that orchestrates them as a multi-agent
103
103
  build pipeline. See [AOS: The Dispatcher Graph](#-aos-the-dispatcher-graph)
104
104
  below for how the pipeline itself works.
105
105
 
106
106
  ---
107
107
 
108
- ## 🌟 183 Optimized Skills
108
+ ## 🌟 184 Optimized Skills
109
109
 
110
- We started with a massive pool of over 1,400 raw AI skills. After rigorous testing, filtering, and refinement, we've distilled them down to a hyper-curated set of **183 Optimized Skills** (featuring a native OpenWiki documentation engine, the **memB local semantic memory brain**, and **Universal Agent Harness synchronization**).
110
+ We started with a massive pool of over 1,400 raw AI skills. After rigorous testing, filtering, and refinement, we've distilled them down to a hyper-curated set of **184 Optimized Skills** (featuring a native OpenWiki documentation engine, the **memB local semantic memory brain**, and **Universal Agent Harness synchronization**).
111
111
 
112
112
  These skills are precision-engineered to ensure agents waste no time on redundant tasks and instead operate with maximum agency, strict architectural constraints, and robust context awareness.
113
113
 
@@ -138,7 +138,7 @@ While heavily optimized for the creative tech industry, these skills are deeply
138
138
 
139
139
  ## 🗂️ The Complete Skill Library
140
140
 
141
- 147 skills across 15 domains, collapsed by default so this section does not require endless scrolling to get past. Click any category to expand it.
141
+ 184 skills across 15 domains, collapsed by default so this section does not require endless scrolling to get past. Click any category to expand it.
142
142
 
143
143
  <details>
144
144
  <summary><strong>🎨 Frontend & UI/UX Design</strong> — 20 skills</summary>
@@ -482,11 +482,11 @@ BDBrainstorm combines multi-agent brainstorming, the `/grill-me` slash command,
482
482
 
483
483
  ---
484
484
 
485
- ## 🔌 21 Local MCP Wrappers
485
+ ## 🔌 19 Local MCP Wrappers
486
486
 
487
487
  ![BDB Architecture Sketch](assets/bdb_architecture_sketch.jpg)
488
488
 
489
- Rather than relying on skeletal python mocks or broken remote APIs, this repository bundles **21 local MCP wrappers** (in the `mcps/` directory). These are built/warmed automatically and allow your AI assistant to read, write, and execute commands within the industry's leading creative software.
489
+ Rather than relying on skeletal python mocks or broken remote APIs, this repository bundles **19 local MCP wrappers** (in the `mcps/` directory). These are built/warmed automatically and allow your AI assistant to read, write, and execute commands within the industry's leading creative software.
490
490
 
491
491
  <details>
492
492
  <summary><strong>🎨 Adobe Creative Cloud (Illustrator, Photoshop, After Effects, Premiere Pro)</strong></summary>
package/README.pt.md CHANGED
@@ -20,12 +20,12 @@
20
20
  [![NPM Version](https://img.shields.io/npm/v/@hybridlabor-api/aos.svg)](https://www.npmjs.com/package/@hybridlabor-api/aos)
21
21
  [![runtime](https://img.shields.io/badge/node-20+-blue.svg)](https://github.com/hybridlabor-api/aos)
22
22
  [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
23
- [![skills](https://img.shields.io/badge/skills-183%20curadas-brightgreen.svg)](https://github.com/hybridlabor-api/aos)
23
+ [![skills](https://img.shields.io/badge/skills-184%20curadas-brightgreen.svg)](https://github.com/hybridlabor-api/aos)
24
24
  [![SkillSpector](https://img.shields.io/badge/NVIDIA%20SkillSpector-CLEAN-76B900?logo=nvidia&logoColor=white)](https://github.com/NVIDIA/SkillSpector)
25
25
 
26
- > **Potencializando agentes de código de IA com 183 skills hipercuradas, 19 wrappers MCP locais e um grafo dispatcher de multi-agentes executável.**
26
+ > **Potencializando agentes de código de IA com 184 skills hipercuradas, 19 wrappers MCP locais e um grafo dispatcher de multi-agentes executável.**
27
27
 
28
- Bem-vindo ao **BDB Agent OS — AOS**: 183 skills curadas, 19 wrappers MCP locais e um grafo dispatcher que os transforma em um verdadeiro pipeline de build multi-agente, não apenas uma biblioteca de prompts. Aponte para um objetivo e ele planeja, constrói, revisa e implementa através de sete nós de agentes coordenados — com um portão imposto mecanicamente antes que qualquer coisa vá ao ar.
28
+ Bem-vindo ao **BDB Agent OS — AOS**: 184 skills curadas, 19 wrappers MCP locais e um grafo dispatcher que os transforma em um verdadeiro pipeline de build multi-agente, não apenas uma biblioteca de prompts. Aponte para um objetivo e ele planeja, constrói, revisa e implementa através de sete nós de agentes coordenados — com um portão imposto mecanicamente antes que qualquer coisa vá ao ar.
29
29
 
30
30
  É neutro em relação ao harness por design, não "otimizado para uma ferramenta com outras como reflexão tardia": o grafo dispatcher é executado no Dynamic Workflows do Claude Code, as mesmas skills e configuração MCP são instaladas nativamente no **Google Antigravity, ChatGPT Codex / Codex CLI, Claude Desktop, Cursor, Aider, Roo Code, Cline e Windsurf**, e a variante leve `/startcycle-graph-user` recorre aos próprios subagentes do Claude Code em qualquer máquina que não tenha nenhum dos acima instalados.
31
31
 
@@ -81,14 +81,14 @@ Nenhum destes vem dentro deste pacote — são plugins do Claude Code independen
81
81
  ## Visão Geral
82
82
 
83
83
  Este repositório entrega três coisas: uma biblioteca curada de skills para agentes de código, um
84
- instalador que conecta eles (mais 21 wrappers MCP locais) em qualquer harness
84
+ instalador que conecta eles (mais 19 wrappers MCP locais) em qualquer harness
85
85
  que você use, e um grafo dispatcher que os orquestra como um pipeline de
86
86
  build multi-agente. Veja [AOS: O Grafo Dispatcher](#-aos-o-grafo-dispatcher)
87
87
  abaixo para entender como o próprio pipeline funciona.
88
88
 
89
- ## 🌟 183 Skills Otimizadas
89
+ ## 🌟 184 Skills Otimizadas
90
90
 
91
- Começamos com um conjunto massivo de mais de 1.400 skills de IA brutas. Após rigorosos testes, filtragem e refinamento, destilamo-las em um conjunto hipercurado de **183 Skills Otimizadas** (apresentando um motor nativo de documentação OpenWiki, o **cérebro de memória semântica local memB** e agora a **sincronização Universal Agent Harness na v4.0.0**).
91
+ Começamos com um conjunto massivo de mais de 1.400 skills de IA brutas. Após rigorosos testes, filtragem e refinamento, destilamo-las em um conjunto hipercurado de **184 Skills Otimizadas** (apresentando um motor nativo de documentação OpenWiki, o **cérebro de memória semântica local memB** e agora a **sincronização Universal Agent Harness na v4.0.0**).
92
92
 
93
93
  Essas skills são projetadas com precisão para garantir que os agentes não percam tempo com tarefas redundantes e, em vez disso, operem com máxima autonomia, restrições arquitetônicas rígidas e robusta consciência de contexto.
94
94
 
@@ -97,7 +97,7 @@ Em vez de deixar os agentes vagando por instruções genéricas, o nível superi
97
97
  - **`godmode-engineering`**: Impõe Domain-Driven Design, verificações rígidas de TypeScript, Clean Architecture e depuração sistemática.
98
98
  - **`godmode-ui-ux`**: O padrão de ouro do frontend. Impõe princípios "Anti-Slop" da BDB, acessibilidade e dinâmicas de movimento fluidas.
99
99
  - **`godmode-shipping`**: O guardião final para lançamentos em produção. Impõe Spec-Driven Development, verificações pré-lançamento e rollbacks seguros.
100
- - **`godmode-eventtech`**: O livro de regras supremo para o BDB Creator Engine, governando 3D, Mídia e 21 wrappers MCP de tecnologia criativa.
100
+ - **`godmode-eventtech`**: O livro de regras supremo para o BDB Creator Engine, governando 3D, Mídia e 19 wrappers MCP de tecnologia criativa.
101
101
  - **`godmode-3d-creation`**: Controla o pipeline 3D agêntico (TripoSR, TRELLIS) para modelos generativos e estruturas CAD.
102
102
  - **`godmode-media-creation`**: Orquestra a produção automatizada de vídeo, narrativa e loops de geração do ComfyUI.
103
103
 
@@ -121,7 +121,7 @@ Abaixo está a visão geral completa de todas as skills curadas de agentes inclu
121
121
  |------------|-------------|
122
122
  | `godmode-3d-creation` | Skill mestre de orquestração para todas as tarefas de geração, modelagem e reconstrução 3D. Atua como o cérebro 3D para a BDB Creator Extension. |
123
123
  | `godmode-engineering` | BDB Engineering Godmode. Impõe Domain-Driven Design rigoroso, estrito TypeScript, Clean Architecture e triagem sistemática de depuração em 5 etapas. |
124
- | `godmode-eventtech` | BDB EventTech Godmode. O livro de regras supremo para o BDB Creator Engine, governando Godmode-3D, Godmode-Media e os 21 wrappers MCP de tecnologia criativa. |
124
+ | `godmode-eventtech` | BDB EventTech Godmode. O livro de regras supremo para o BDB Creator Engine, governando Godmode-3D, Godmode-Media e os 19 wrappers MCP de tecnologia criativa. |
125
125
  | `godmode-media-creation` | Skill mestre de orquestração para todas as tarefas de criação de mídia (Vídeo, Áudio, Imagem, Motion Design). Atua como o cérebro para a BDB Creator Extension. |
126
126
  | `godmode-shipping` | BDB Shipping Godmode. O guardião final para lançamentos em produção. Impõe Spec-Driven Development, rigorosas verificações pré-lançamento, feature flags e estratégias de rollback. |
127
127
  | `godmode-ui-ux` | BDB UI/UX Godmode. O padrão de ouro absoluto para design frontend. Impõe princípios Anti-Slop, acessibilidade corporativa, dinâmicas de movimento fluidas e geração de design orientada a dados em todos os harnesses de agentes. |
@@ -425,11 +425,11 @@ O BDBrainstorm combina brainstorming multi-agente, o comando slash `/grill-me`,
425
425
 
426
426
  ---
427
427
 
428
- ## 🔌 21 Integrações Locais de MCPP
428
+ ## 🔌 19 Integrações Locais de MCPs
429
429
 
430
430
  ![BDB Architecture Sketch](assets/bdb_architecture_sketch.jpg)
431
431
 
432
- Em vez de depender de mocks rudimentares em python ou APIs remotas com falhas, este repositório empacota **21 wrappers MCP locais** (no diretório `mcps/`). Eles são construídos/preparados automaticamente e permitem que seu assistente de IA leia, escreva e execute comandos nos principais softwares criativos do mercado.
432
+ Em vez de depender de mocks rudimentares em python ou APIs remotas com falhas, este repositório empacota **19 wrappers MCP locais** (no diretório `mcps/`). Eles são construídos/preparados automaticamente e permitem que seu assistente de IA leia, escreva e execute comandos nos principais softwares criativos do mercado.
433
433
 
434
434
  <details>
435
435
  <summary><strong>🎨 Adobe Creative Cloud (Illustrator, Photoshop, After Effects, Premiere Pro)</strong></summary>
@@ -603,6 +603,12 @@ server.listen(PORT, '127.0.0.1', () => {
603
603
  const url = `http://127.0.0.1:${PORT}`;
604
604
  console.log(`AOS Dashboard v${AOS_VERSION || '?'}: ${url} (Strg-C beendet)`);
605
605
  if (!OPEN) return;
606
- const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
607
- execFile(opener, [url], () => { /* no browser is not an error */ });
606
+ if (process.platform === 'win32') {
607
+ spawn('cmd.exe', ['/c', 'start', '', url], { detached: true, stdio: 'ignore' })
608
+ .on('error', () => { /* no browser or spawn error is not fatal */ })
609
+ .unref();
610
+ } else {
611
+ const opener = process.platform === 'darwin' ? 'open' : 'xdg-open';
612
+ execFile(opener, [url], () => { /* no browser is not an error */ });
613
+ }
608
614
  });
package/installer.js CHANGED
@@ -1996,6 +1996,91 @@ async function installSynapse() {
1996
1996
  }
1997
1997
  }
1998
1998
 
1999
+ async function installOpenWikiVisualizer() {
2000
+ if (DRY_RUN) {
2001
+ log.step('[dry-run] would register the OpenWiki Visualizer background daemon (Port 4321)');
2002
+ return;
2003
+ }
2004
+ if (!hasExecutable('openwiki')) {
2005
+ log.warn('Skipping OpenWiki Visualizer setup: the openwiki CLI was not found on PATH. Install it with: npm install -g openwiki@latest');
2006
+ return;
2007
+ }
2008
+ // launchd starts agents with a minimal PATH that never includes npm's global
2009
+ // bin dir, so resolve the absolute binary path now instead of relying on PATH at boot.
2010
+ let openwikiBin = 'openwiki';
2011
+ try {
2012
+ const lookup = process.platform === 'win32' ? 'where openwiki' : 'command -v openwiki';
2013
+ openwikiBin = execSync(lookup, { encoding: 'utf8' }).split(/\r?\n/)[0].trim() || 'openwiki';
2014
+ } catch (e) { logDebug(e, 'openwiki path lookup'); }
2015
+
2016
+ if (process.platform === 'darwin') {
2017
+ const plistPath = path.join(homeDir, 'Library', 'LaunchAgents', 'com.bdb.openwiki-visualize.plist');
2018
+ const plistContent = `<?xml version="1.0" encoding="UTF-8"?>
2019
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
2020
+ <plist version="1.0">
2021
+ <dict>
2022
+ <key>Label</key>
2023
+ <string>com.bdb.openwiki-visualize</string>
2024
+ <key>ProgramArguments</key>
2025
+ <array>
2026
+ <string>${openwikiBin}</string>
2027
+ <string>visualize</string>
2028
+ <string>--port</string>
2029
+ <string>4321</string>
2030
+ <string>--no-open</string>
2031
+ </array>
2032
+ <key>WorkingDirectory</key>
2033
+ <string>${homeDir}</string>
2034
+ <key>RunAtLoad</key>
2035
+ <true/>
2036
+ <key>KeepAlive</key>
2037
+ <true/>
2038
+ <key>StandardOutPath</key>
2039
+ <string>${path.join(homeDir, '.openwiki', 'visualize.stdout.log')}</string>
2040
+ <key>StandardErrorPath</key>
2041
+ <string>${path.join(homeDir, '.openwiki', 'visualize.stderr.log')}</string>
2042
+ </dict>
2043
+ </plist>`;
2044
+ try {
2045
+ fs.mkdirSync(path.join(homeDir, '.openwiki'), { recursive: true });
2046
+ fs.writeFileSync(plistPath, plistContent);
2047
+ execSync(`launchctl unload "${plistPath}" 2>/dev/null || true`, { stdio: 'ignore' });
2048
+ execSync(`launchctl load -w "${plistPath}" 2>/dev/null || true`, { stdio: 'ignore' });
2049
+ const isListening = await verifyDaemonListening(4321, 'OpenWiki Visualizer');
2050
+ if (isListening) {
2051
+ log.success('OpenWiki Visualizer LaunchAgent active (Port 4321)');
2052
+ } else {
2053
+ log.warn('OpenWiki Visualizer daemon did not respond on Port 4321 within timeout. You may need to start it manually or check for port conflicts.');
2054
+ }
2055
+ } catch (e) { logDebug(e, 'openwiki visualizer plist setup'); }
2056
+ } else if (process.platform === 'win32') {
2057
+ const startupDir = path.join(process.env.APPDATA || path.join(homeDir, 'AppData', 'Roaming'), 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup');
2058
+ fs.mkdirSync(startupDir, { recursive: true });
2059
+ const visualizerLogDir = path.join(homeDir, '.openwiki');
2060
+ fs.mkdirSync(visualizerLogDir, { recursive: true });
2061
+ const stdoutLog = path.join(visualizerLogDir, 'visualize.stdout.log');
2062
+ const stderrLog = path.join(visualizerLogDir, 'visualize.stderr.log');
2063
+ const batPath = path.join(visualizerLogDir, 'run-openwiki-visualize.bat');
2064
+ const runCmd = `"${openwikiBin}" visualize --port 4321 --no-open`;
2065
+ const batContent = `@echo off\r\ncd /d "${homeDir}"\r\n${runCmd} >> "${stdoutLog}" 2>> "${stderrLog}"\r\n`;
2066
+ const vbsPath = path.join(startupDir, 'com.bdb.openwiki-visualize.vbs');
2067
+ const vbsContent = `Set WshShell = CreateObject("WScript.Shell")\r\nWshShell.CurrentDirectory = "${homeDir}"\r\nWshShell.Run """${batPath}""", 0, False\r\n`;
2068
+ try {
2069
+ fs.writeFileSync(batPath, batContent, 'utf-8');
2070
+ fs.writeFileSync(vbsPath, vbsContent, 'utf-8');
2071
+ spawn('wscript.exe', [vbsPath], { detached: true, stdio: 'ignore' }).unref();
2072
+ // Same reasoning as the Synapse Windows path: wscript -> WshShell.Run is
2073
+ // multiple layers of indirection, so allow the generous 12s budget here too.
2074
+ const isListening = await verifyDaemonListening(4321, 'OpenWiki Visualizer', 12000);
2075
+ if (isListening) {
2076
+ log.success('OpenWiki Visualizer Windows Background Service registered & started (Port 4321)');
2077
+ } else {
2078
+ log.warn(`OpenWiki Visualizer Windows daemon did not respond on Port 4321 within timeout. Check ${stderrLog} for the actual error before assuming it's just slow to start.`);
2079
+ }
2080
+ } catch (e) { logDebug(e, 'windows openwiki visualizer daemon setup'); }
2081
+ }
2082
+ }
2083
+
1999
2084
  async function installCreatorExtension() {
2000
2085
  const creatorDir = path.join(moduleBasePath(), 'bdb-dev-creator-extension');
2001
2086
  if (!downloadOrUpdateModule('@hybridlabor-api/bdb-dev-creator-extension', creatorDir, 'BDB Creator Extension')) {
@@ -3090,11 +3175,44 @@ function injectHarnessRules() {
3090
3175
  // most (a fresh install got it; every machine that already had AOS did not).
3091
3176
  function installGlobalHooks() {
3092
3177
  const hooksSrc = path.join(srcDir, '.claude', 'hooks');
3178
+ const workflowsSrc = path.join(srcDir, '.claude', 'workflows');
3179
+
3180
+ // 1. Claude Code
3093
3181
  if (fs.existsSync(hooksSrc)) {
3094
3182
  copyDirRecursiveSync(hooksSrc, path.join(homeDir, '.claude', 'hooks'));
3095
3183
  log.step(`Installed hooks to ${path.join(homeDir, '.claude', 'hooks')}`);
3096
3184
  }
3185
+ if (fs.existsSync(workflowsSrc)) {
3186
+ copyDirRecursiveSync(workflowsSrc, path.join(homeDir, '.claude', 'workflows'));
3187
+ }
3097
3188
  mergeBdbSettingsHooks(path.join(homeDir, '.claude', 'settings.json'));
3189
+
3190
+ // 2. Google Antigravity
3191
+ const agyHooksDir = path.join(geminiDir, 'config', 'hooks');
3192
+ const agyWorkflowsDir = path.join(geminiDir, 'config', 'workflows');
3193
+ if (fs.existsSync(hooksSrc)) {
3194
+ copyDirRecursiveSync(hooksSrc, agyHooksDir);
3195
+ log.step(`Installed hooks to ${agyHooksDir}`);
3196
+ }
3197
+ if (fs.existsSync(workflowsSrc)) {
3198
+ copyDirRecursiveSync(workflowsSrc, agyWorkflowsDir);
3199
+ }
3200
+ mergeAntigravityHooks(path.join(geminiDir, 'config', 'hooks.json'));
3201
+ if (fs.existsSync(path.join(geminiDir, 'antigravity-cli'))) {
3202
+ mergeAntigravityHooks(path.join(geminiDir, 'antigravity-cli', 'hooks.json'));
3203
+ }
3204
+
3205
+ // 3. OpenAI Codex CLI
3206
+ const codexHooksDir = path.join(homeDir, '.codex', 'hooks');
3207
+ const codexWorkflowsDir = path.join(homeDir, '.codex', 'workflows');
3208
+ if (fs.existsSync(hooksSrc)) {
3209
+ copyDirRecursiveSync(hooksSrc, codexHooksDir);
3210
+ log.step(`Installed hooks to ${codexHooksDir}`);
3211
+ }
3212
+ if (fs.existsSync(workflowsSrc)) {
3213
+ copyDirRecursiveSync(workflowsSrc, codexWorkflowsDir);
3214
+ }
3215
+ mergeCodexTomlHooks(path.join(homeDir, '.codex', 'config.toml'));
3098
3216
  }
3099
3217
 
3100
3218
  // Merge the BDB hooks -- the two gates plus the memB ambient-memory hook --
@@ -3173,12 +3291,161 @@ function mergeBdbSettingsHooks(settingsPath, { projectLocal = false } = {}) {
3173
3291
  }
3174
3292
 
3175
3293
  try {
3294
+ fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
3176
3295
  fs.writeFileSync(settingsPath, JSON.stringify(buildMerged(existing), null, 2) + '\n');
3177
3296
  } catch (e) {
3178
3297
  log.warn(`Could not write ${settingsPath}: ${e.message}`);
3179
3298
  }
3180
3299
  }
3181
3300
 
3301
+ // Merge the BDB hooks into Google Antigravity's hooks.json (.agents/hooks.json or
3302
+ // ~/.gemini/config/hooks.json), preserving user-defined foreign hooks.
3303
+ function mergeAntigravityHooks(hooksPath, { projectLocal = false } = {}) {
3304
+ const bdbHookScripts = ['go-gate.mjs', 'graph-gate.mjs', 'memb-inject.mjs', 'startcycle-dispatch.mjs'];
3305
+ const isBdbEntry = (entry) => {
3306
+ const cmds = (entry && Array.isArray(entry.hooks) ? entry.hooks : [entry])
3307
+ .map((h) => (h && typeof h.command === 'string' ? h.command : (typeof h === 'string' ? h : '')))
3308
+ .join(' ');
3309
+ return bdbHookScripts.some((name) => cmds.includes(name));
3310
+ };
3311
+
3312
+ const baseDir = path.dirname(hooksPath);
3313
+ const hooksDir = projectLocal ? path.join(currentDir, '.agents', 'hooks') : path.join(baseDir, 'hooks');
3314
+ const workflowsDir = projectLocal ? path.join(currentDir, '.agents', 'workflows') : path.join(baseDir, 'workflows');
3315
+ const globalHooksDir = projectLocal ? path.join(homeDir, '.gemini', 'config', 'hooks') : hooksDir;
3316
+
3317
+ const bdbHooks = {
3318
+ PreToolUse: [
3319
+ {
3320
+ matcher: "run_command|Bash",
3321
+ hooks: [{ type: "command", command: `node "${path.join(hooksDir, 'go-gate.mjs')}"`, timeout: 10000 }]
3322
+ }
3323
+ ],
3324
+ Stop: [
3325
+ {
3326
+ hooks: [{ type: "command", command: `node "${path.join(hooksDir, 'graph-gate.mjs')}"`, timeout: 10000 }]
3327
+ }
3328
+ ],
3329
+ PreInvocation: [
3330
+ {
3331
+ hooks: [
3332
+ { type: "command", command: `node "${path.join(globalHooksDir, 'memb-inject.mjs')}"`, timeout: 8000 },
3333
+ { type: "command", command: `node "${path.join(workflowsDir, 'startcycle-dispatch.mjs')}"`, timeout: 30000 }
3334
+ ]
3335
+ }
3336
+ ]
3337
+ };
3338
+
3339
+ const buildMerged = (existing) => {
3340
+ const merged = existing && typeof existing === 'object' ? existing : {};
3341
+ merged.hooks = merged.hooks && typeof merged.hooks === 'object' ? merged.hooks : {};
3342
+ for (const [event, entries] of Object.entries(bdbHooks)) {
3343
+ const foreignEntries = (Array.isArray(merged.hooks[event]) ? merged.hooks[event] : [])
3344
+ .filter((e) => !isBdbEntry(e));
3345
+ merged.hooks[event] = [...foreignEntries, ...entries];
3346
+ }
3347
+ return merged;
3348
+ };
3349
+
3350
+ let existing = null;
3351
+ if (fs.existsSync(hooksPath)) {
3352
+ existing = readJsonFile(hooksPath);
3353
+ if (!existing) {
3354
+ const backupCopy = `${hooksPath}.corrupt_${timestamp}.bak`;
3355
+ const sideCarPath = `${hooksPath}.bdb-new.json`;
3356
+ let backupWritten = true;
3357
+ try {
3358
+ fs.copyFileSync(hooksPath, backupCopy);
3359
+ } catch (copyError) {
3360
+ backupWritten = false;
3361
+ log.warn(`Could not create the hooks backup: ${copyError.message}`);
3362
+ }
3363
+ try {
3364
+ fs.writeFileSync(sideCarPath, JSON.stringify(buildMerged(null), null, 2) + '\n');
3365
+ } catch (writeError) {
3366
+ log.warn(`Could not write ${path.basename(sideCarPath)}: ${writeError.message}`);
3367
+ }
3368
+ log.warn(`${path.basename(hooksPath)} is not valid JSON - hook merge skipped, nothing overwritten.`);
3369
+ if (backupWritten) log.warn(`Backup copy: ${backupCopy}`);
3370
+ log.warn(`BDB-wired hooks: ${sideCarPath}`);
3371
+ return;
3372
+ }
3373
+ }
3374
+
3375
+ try {
3376
+ fs.mkdirSync(path.dirname(hooksPath), { recursive: true });
3377
+ fs.writeFileSync(hooksPath, JSON.stringify(buildMerged(existing), null, 2) + '\n');
3378
+ } catch (e) {
3379
+ log.warn(`Could not write ${hooksPath}: ${e.message}`);
3380
+ }
3381
+ }
3382
+
3383
+ // Merge the BDB hooks into ChatGPT Codex CLI's config.toml (~/.codex/config.toml or
3384
+ // .codex/config.toml), ensuring [features] hooks = true and preserving existing
3385
+ // non-BDB settings, comments, and MCP servers.
3386
+ function mergeCodexTomlHooks(configTomlPath, { projectLocal = false } = {}) {
3387
+ const baseDir = path.dirname(configTomlPath);
3388
+ const hooksDir = projectLocal ? path.join(currentDir, '.codex', 'hooks') : path.join(baseDir, 'hooks');
3389
+ const workflowsDir = projectLocal ? path.join(currentDir, '.codex', 'workflows') : path.join(baseDir, 'workflows');
3390
+ const globalHooksDir = projectLocal ? path.join(homeDir, '.codex', 'hooks') : hooksDir;
3391
+
3392
+ const tomlSnippet = [
3393
+ '# AOS:HOOKS:START',
3394
+ '[[hooks.PreToolUse]]',
3395
+ 'matcher = "^(Bash|run_command)$"',
3396
+ '[[hooks.PreToolUse.hooks]]',
3397
+ 'type = "command"',
3398
+ `command = ${JSON.stringify(`node "${path.join(hooksDir, 'go-gate.mjs')}"`)}`,
3399
+ 'timeout = 30',
3400
+ '',
3401
+ '[[hooks.Stop]]',
3402
+ '[[hooks.Stop.hooks]]',
3403
+ 'type = "command"',
3404
+ `command = ${JSON.stringify(`node "${path.join(hooksDir, 'graph-gate.mjs')}"`)}`,
3405
+ 'timeout = 30',
3406
+ '',
3407
+ '[[hooks.UserPromptSubmit]]',
3408
+ '[[hooks.UserPromptSubmit.hooks]]',
3409
+ 'type = "command"',
3410
+ `command = ${JSON.stringify(`node "${path.join(globalHooksDir, 'memb-inject.mjs')}"`)}`,
3411
+ 'timeout = 30',
3412
+ '',
3413
+ '[[hooks.UserPromptSubmit]]',
3414
+ '[[hooks.UserPromptSubmit.hooks]]',
3415
+ 'type = "command"',
3416
+ `command = ${JSON.stringify(`node "${path.join(workflowsDir, 'startcycle-dispatch.mjs')}"`)}`,
3417
+ 'timeout = 30',
3418
+ '# AOS:HOOKS:END'
3419
+ ].join('\n');
3420
+
3421
+ let content = fs.existsSync(configTomlPath) ? fs.readFileSync(configTomlPath, 'utf8') : '';
3422
+
3423
+ // Ensure [features] hooks = true
3424
+ const hasHooksFeature = /(?:hooks|codex_hooks)\s*=\s*true/m.test(content);
3425
+ if (!hasHooksFeature) {
3426
+ if (/^\[features\]/m.test(content)) {
3427
+ content = content.replace(/^\[features\]/m, '[features]\nhooks = true');
3428
+ } else {
3429
+ content = `[features]\nhooks = true\n\n${content.trimStart()}`;
3430
+ }
3431
+ }
3432
+
3433
+ // Replace existing AOS:HOOKS block or append
3434
+ const hookBlockRegex = /# AOS:HOOKS:START[\s\S]*?# AOS:HOOKS:END/;
3435
+ if (hookBlockRegex.test(content)) {
3436
+ content = content.replace(hookBlockRegex, tomlSnippet);
3437
+ } else {
3438
+ content = `${content.trimEnd()}\n\n${tomlSnippet}\n`;
3439
+ }
3440
+
3441
+ try {
3442
+ fs.mkdirSync(path.dirname(configTomlPath), { recursive: true });
3443
+ fs.writeFileSync(configTomlPath, content, { mode: 0o600 });
3444
+ } catch (e) {
3445
+ log.warn(`Could not write ${configTomlPath}: ${e.message}`);
3446
+ }
3447
+ }
3448
+
3182
3449
  // Tier 9 (Local Project Harness): drop the dispatcher contract into the
3183
3450
  // CURRENT PROJECT only -- no writes to $HOME, no global skill/MCP sync, and
3184
3451
  // this runs as an early return BEFORE any global install step. A bare
@@ -3191,22 +3458,29 @@ function mergeBdbSettingsHooks(settingsPath, { projectLocal = false } = {}) {
3191
3458
  // non-interactively via `--project-harness` (combine with -y for CI).
3192
3459
  function installProjectHarness() {
3193
3460
  const projectClaudeDir = path.join(currentDir, '.claude');
3194
- installStep(`create ${projectClaudeDir}`, () => {
3461
+ const projectAgentsDir = path.join(currentDir, '.agents');
3462
+ const projectCodexDir = path.join(currentDir, '.codex');
3463
+
3464
+ installStep(`create harness directories`, () => {
3195
3465
  fs.mkdirSync(projectClaudeDir, { recursive: true });
3466
+ fs.mkdirSync(projectAgentsDir, { recursive: true });
3467
+ fs.mkdirSync(projectCodexDir, { recursive: true });
3196
3468
  }, 'The harness copies below will most likely fail as well.');
3197
3469
 
3198
3470
  installStep('copy .agents/ contract into project', () => {
3199
3471
  const agentsSrc = path.join(srcDir, '.agents');
3200
3472
  if (!fs.existsSync(agentsSrc)) throw new Error(`missing payload: ${agentsSrc}`);
3201
- copyDirRecursiveSync(agentsSrc, path.join(currentDir, '.agents'));
3202
- log.step(`Copied .agents/ contract to ${path.join(currentDir, '.agents')}`);
3473
+ copyDirRecursiveSync(agentsSrc, projectAgentsDir);
3474
+ log.step(`Copied .agents/ contract to ${projectAgentsDir}`);
3203
3475
  }, 'graph.md / state.schema.json may be missing in the project.');
3204
3476
 
3205
3477
  installStep('copy dispatcher workflows into project', () => {
3206
3478
  const workflowsSrc = path.join(srcDir, '.claude', 'workflows');
3207
3479
  if (fs.existsSync(workflowsSrc)) {
3208
3480
  copyDirRecursiveSync(workflowsSrc, path.join(projectClaudeDir, 'workflows'));
3209
- log.step(`Copied dispatcher workflows to ${path.join(projectClaudeDir, 'workflows')}`);
3481
+ copyDirRecursiveSync(workflowsSrc, path.join(projectAgentsDir, 'workflows'));
3482
+ copyDirRecursiveSync(workflowsSrc, path.join(projectCodexDir, 'workflows'));
3483
+ log.step(`Copied dispatcher workflows to project harnesses`);
3210
3484
  }
3211
3485
  }, '/startcycle dispatch degrades to graph.md as a manual guide.');
3212
3486
 
@@ -3214,7 +3488,9 @@ function installProjectHarness() {
3214
3488
  const hooksSrc = path.join(srcDir, '.claude', 'hooks');
3215
3489
  if (fs.existsSync(hooksSrc)) {
3216
3490
  copyDirRecursiveSync(hooksSrc, path.join(projectClaudeDir, 'hooks'));
3217
- log.step(`Copied hooks to ${path.join(projectClaudeDir, 'hooks')}`);
3491
+ copyDirRecursiveSync(hooksSrc, path.join(projectAgentsDir, 'hooks'));
3492
+ copyDirRecursiveSync(hooksSrc, path.join(projectCodexDir, 'hooks'));
3493
+ log.step(`Copied hooks to project harnesses`);
3218
3494
  }
3219
3495
  }, 'go-gate / graph-gate enforcement stays inactive in this project.');
3220
3496
 
@@ -3226,9 +3502,11 @@ function installProjectHarness() {
3226
3502
  }
3227
3503
  }, 'The dispatcher runs, but its agent-file pointers resolve to nothing.');
3228
3504
 
3229
- installStep('wire project .claude/settings.json to local hooks', () => {
3505
+ installStep('wire project harnesses to local hooks', () => {
3230
3506
  mergeBdbSettingsHooks(path.join(projectClaudeDir, 'settings.json'), { projectLocal: true });
3231
- log.step(`Wired project hooks in ${path.join(projectClaudeDir, 'settings.json')}`);
3507
+ mergeAntigravityHooks(path.join(projectAgentsDir, 'hooks.json'), { projectLocal: true });
3508
+ mergeCodexTomlHooks(path.join(projectCodexDir, 'config.toml'), { projectLocal: true });
3509
+ log.step(`Wired project hooks in Claude, Antigravity, and Codex configurations`);
3232
3510
  }, 'The gate hooks exist but are not auto-wired for this project.');
3233
3511
 
3234
3512
  log.success(`Project harness installed to ${currentDir}`);
@@ -3348,6 +3626,7 @@ function generateAndOpenLaunchpad() {
3348
3626
  <meta charset="UTF-8">
3349
3627
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
3350
3628
  <title>BDB Agent OS – Launchpad</title>
3629
+ <link rel="icon" type="image/svg+xml" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjEwMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiNGRkZGRkYiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNFN0U3RUEiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48Y2lyY2xlIGN4PSIyNTYiIGN5PSIyNTYiIHI9IjI0NiIgZmlsbD0iIzBhMGEwYSIgc3Ryb2tlPSIjOWIzMGM0IiBzdHJva2Utd2lkdGg9IjEyIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAsNjgpIj48cGF0aCBmaWxsPSJ1cmwoI2EpIiBkPSJNMTgxLjYzLjA1YzEwMS4zOS0yLjQ3LDE4NC41Niw4MC4wOSwxOTAuMTQsMTc5LjkzLDUuNTMsOTkuMDMtNjYuMTYsMTg1LjQyLTE2NS4xMSwxOTUuNDYtODcuMzksOC44Ni0xNzEuMS00NS41Ni0xOTcuNjctMTI4Ljk2Qy0yOC43NCwxMjguMDMsNTYuNzgsMy4xLDE4MS42My4wNWgwWk0xNzcuNSwyMS4zQzY5LjA5LDI1LjMxLTcuMTYsMTI5LjYyLDIxLjc2LDIzNC41MmMxOC43Miw2Ny44OCw4MS41NiwxMTYuNywxNTEuNTMsMTIxLjMyLDEwNi4yMSw3LjAzLDE5NS42LTgxLjYzLDE3OS42OC0xODkuMDYtMTIuNTQtODQuNjUtODkuODEtMTQ4LjY2LTE3NS40Ny0xNDUuNDloMFoiLz48ZyBmaWxsPSIjRkZGRkZGIj48cGF0aCBkPSJNMTQ3LjY5LDEyMC4wNWMxMi4wNC4zNiwyNC42NC0uNzIsMzYuNjItLjA3LDI0LjI5LDEuMzIsNDEuMzcsMjAuMTMsNDIuOTEsNDMuOTktLjY5LDE2LjM1LjU3LDMzLjQyLS4yOCw0OS42OS0xLjMxLDI1LjQyLTE4LjU1LDQzLjc1LTQ0LjAyLDQ1LjY0LTkuNTkuNzItMjAuMTQuNjktMjkuNzguODQtNC45Ny4wOC05LjkuNjgtMTAuMzctNS42NnMuNDMtOS40MS4zNC0xNC4wM2MxMi42NS0xMS44NCwxNC43NS0zMS4xNyw0Ljc1LTQ1LjQxLS42My0uOS0yLjI2LTIuMzQtMi42Mi0zLjE3cy0uNDYtMTIuNTgtLjI2LTE0LjM3LDEuMS0zLjUyLDEuNDYtNS4xNmMxLjIxLTUuNDIsMS4wNi0xMS4yNi0uMzktMTYuNjItLjQxLTEuNTQtMS40OC0zLjU2LTEuNjMtNC45OS0uNDctNC4yOC0uMTQtOS42Ny0uMjYtMTQuMDgtLjExLTMuNTYtLjg0LTguNDMtLjU3LTExLjg2czEuMzItNC4zNSw0LjA4LTQuNzVoMFoiLz48cGF0aCBkPSJNMjMyLjY2LDEzMi40NmM5LjUzLjM2LDE5Ljc0LS43MiwyOS4xOS0uMDgsMjIuNjQsMS41MiwzMy45MiwyOC41OCwyMS45Myw0Ny4wNS0xLjQ5LDIuMy00LjMyLDQuNDctMy44NSw3LjQyLjQ3LDIuOTUsNS42NCw2LjIxLDcuNDIsOC4zLDExLjg4LDEzLjk2LDguNDEsMzUuNjktNi45MSw0NS40OS03Ljg1LDUuMDItMTQuNjksNC40My0yMy41Niw0Ljg2LTcuNjcuMzctMTYuMjQsMS4wNS0yMy45MS42NloiLz48cGF0aCBkPSJNOTAuNTksMTMzLjAzYzguODQtLjQ0LDI1LjI0LTEuMDgsMzMuMjMsMS45MiwxOC4wNyw2Ljc3LDIzLjk5LDI5Ljk2LDEzLjU2LDQ1LjctMS42LDIuNDEtNC41Miw0LjQ0LTMuMjgsNy43NS42OSwxLjg1LDUuNDEsNS40Miw3LjAzLDcuMzEsMTEuODYsMTMuODIsOC43NywzNS4yMy02LjI1LDQ1LjMzLTE1LjAyLDEwLjEtMjMuMzEsNS4yNy0zNC40NCw1LjU2WiIvPjwvZz48L2c+PC9zdmc+">
3351
3630
  <link rel="preconnect" href="https://fonts.googleapis.com">
3352
3631
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
3353
3632
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
@@ -3388,11 +3667,7 @@ function generateAndOpenLaunchpad() {
3388
3667
  margin-bottom: 6px;
3389
3668
  }
3390
3669
  .logo-mark { width: 36px; height: 36px; flex-shrink: 0; }
3391
- .logo-badge {
3392
- background: linear-gradient(135deg, #ffffff 0%, #c77dea 60%, #9b30c4 100%);
3393
- -webkit-background-clip: text;
3394
- -webkit-text-fill-color: transparent;
3395
- }
3670
+ .logo-badge { color: #ffffff; }
3396
3671
  .tagline { color: var(--text-muted); font-size: 14px; font-weight: 400; }
3397
3672
  .grid { display: flex; flex-direction: column; gap: 12px; }
3398
3673
  .card {
@@ -3600,6 +3875,30 @@ function generateAndOpenLaunchpad() {
3600
3875
  <span class="status-dot" id="dot-remote" title="Checking..."></span>
3601
3876
  </div>
3602
3877
  </a>
3878
+ <a class="card" href="http://127.0.0.1:4321" target="_blank">
3879
+ <div class="card-content">
3880
+ <div class="card-icon"><svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
3881
+ <defs><linearGradient id="grad-openwiki" x1="50%" y1="0%" x2="50%" y2="100%"><stop offset="0%" stop-color="#FFFFFF"/><stop offset="100%" stop-color="#51116F"/></linearGradient></defs>
3882
+ <rect x="26" y="16" width="48" height="68" rx="4" fill="url(#grad-openwiki)" opacity="0.9"/>
3883
+ <line x1="36" y1="32" x2="64" y2="32" stroke="#0a0a0a" stroke-width="2.5" opacity="0.5"/>
3884
+ <line x1="36" y1="42" x2="64" y2="42" stroke="#0a0a0a" stroke-width="2.5" opacity="0.5"/>
3885
+ <line x1="36" y1="52" x2="52" y2="52" stroke="#0a0a0a" stroke-width="2.5" opacity="0.5"/>
3886
+ <circle cx="70" cy="68" r="14" fill="#0a0a0a" stroke="#FFFFFF" stroke-width="2"/>
3887
+ <circle cx="65" cy="64" r="2.5" fill="#FFFFFF"/><circle cx="74" cy="63" r="2.5" fill="#FFFFFF"/><circle cx="70" cy="72" r="2.5" fill="#FFFFFF"/>
3888
+ <line x1="65" y1="64" x2="74" y2="63" stroke="#FFFFFF" stroke-width="1.2" opacity="0.7"/>
3889
+ <line x1="65" y1="64" x2="70" y2="72" stroke="#FFFFFF" stroke-width="1.2" opacity="0.7"/>
3890
+ <line x1="74" y1="63" x2="70" y2="72" stroke="#FFFFFF" stroke-width="1.2" opacity="0.7"/>
3891
+ </svg></div>
3892
+ <div class="card-info">
3893
+ <h2>OpenWiki</h2>
3894
+ <p>Grounded Documentation & Evidence Graph</p>
3895
+ </div>
3896
+ </div>
3897
+ <div class="card-meta">
3898
+ <span class="port-pill">:4321</span>
3899
+ <span class="status-dot" id="dot-openwiki" title="Checking..."></span>
3900
+ </div>
3901
+ </a>
3603
3902
  </div>
3604
3903
  <div class="footer">
3605
3904
  <span>Autostart Daemons • 127.0.0.1</span>
@@ -3618,6 +3917,7 @@ function generateAndOpenLaunchpad() {
3618
3917
  checkHealth('http://127.0.0.1:7781', 'dot-synapse');
3619
3918
  checkHealth('http://127.0.0.1:3101', 'dot-ao');
3620
3919
  checkHealth('http://127.0.0.1:9080', 'dot-remote');
3920
+ checkHealth('http://127.0.0.1:4321', 'dot-openwiki');
3621
3921
  }
3622
3922
  checkAllHealth();
3623
3923
  setInterval(checkAllHealth, 5000);
@@ -3845,6 +4145,7 @@ async function runQuickUpdate(installState) {
3845
4145
  const creds = await promptCredentials(paths.targetMcpDir);
3846
4146
  if (creds !== BACK) {
3847
4147
  await installOpenWikiDaemon(creds.gemini, paths.targetSkillDir, { provider: creds.openwikiProvider, model: creds.openwikiModel, baseUrl: creds.openwikiBaseUrl });
4148
+ await installOpenWikiVisualizer();
3848
4149
  }
3849
4150
  }
3850
4151
 
@@ -4257,6 +4558,7 @@ async function main() {
4257
4558
  }
4258
4559
 
4259
4560
  await installOpenWikiDaemon(creds.gemini, primaryTarget.targetSkillDir, { provider: creds.openwikiProvider, model: creds.openwikiModel, baseUrl: creds.openwikiBaseUrl });
4561
+ await installOpenWikiVisualizer();
4260
4562
  await installTokenSaver(primaryTarget.platformValue);
4261
4563
 
4262
4564
  const installedModulesForPrompt = (installState && installState.installedModules) || [];
@@ -4297,6 +4599,9 @@ module.exports = {
4297
4599
  detectPlatforms,
4298
4600
  markPlatformsExplicit,
4299
4601
  mergeBdbSettingsHooks,
4602
+ mergeAntigravityHooks,
4603
+ mergeCodexTomlHooks,
4604
+ mergeCodexHooks: mergeCodexTomlHooks,
4300
4605
  installGlobalHooks,
4301
4606
  installProjectHarness,
4302
4607
  mirrorMcpServersTo,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hybridlabor-api/aos",
3
- "version": "4.4.2-beta.9",
3
+ "version": "4.5.1",
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
  "engines": {