@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.
- package/.claude/hooks/memb-inject.mjs +135 -40
- package/.claude/workflows/startcycle-dispatch.mjs +318 -3
- package/README.de.md +10 -10
- package/README.md +10 -10
- package/README.pt.md +10 -10
- package/bin/aos-dashboard.mjs +8 -2
- package/installer.js +317 -12
- package/package.json +1 -1
- package/skills/global_config/aos-setup/SKILL.md +7 -9
- package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +43 -1
- package/skills/global_config/openwiki-skill/scripts/install_daemon.ps1 +107 -18
- package/skills/global_config/openwiki-skill/scripts/install_daemon.sh +7 -0
- package/.agents/skills/firecrawl/SKILL.md +0 -149
- package/.agents/skills/firecrawl/rules/install.md +0 -82
- package/.agents/skills/firecrawl/rules/security.md +0 -26
- package/.agents/skills/firecrawl-agent/SKILL.md +0 -58
- package/.agents/skills/firecrawl-build/SKILL.md +0 -39
- package/.agents/skills/firecrawl-build-interact/SKILL.md +0 -68
- package/.agents/skills/firecrawl-build-onboarding/SKILL.md +0 -103
- package/.agents/skills/firecrawl-build-onboarding/references/auth-flow.md +0 -39
- package/.agents/skills/firecrawl-build-onboarding/references/project-setup.md +0 -20
- package/.agents/skills/firecrawl-build-onboarding/references/sdk-installation.md +0 -17
- package/.agents/skills/firecrawl-build-scrape/SKILL.md +0 -69
- package/.agents/skills/firecrawl-build-search/SKILL.md +0 -69
- package/.agents/skills/firecrawl-crawl/SKILL.md +0 -59
- package/.agents/skills/firecrawl-download/SKILL.md +0 -70
- package/.agents/skills/firecrawl-interact/SKILL.md +0 -84
- package/.agents/skills/firecrawl-map/SKILL.md +0 -51
- package/.agents/skills/firecrawl-scrape/SKILL.md +0 -69
- package/.agents/skills/firecrawl-search/SKILL.md +0 -60
- package/mcps/RhinoMCP/cc-plugin/.claude/settings.json +0 -10
- package/mcps/after-effects-mcp/build/index.js +0 -840
- package/mcps/after-effects-mcp/build/scripts/applyEffect.jsx +0 -153
- package/mcps/after-effects-mcp/build/scripts/applyEffectTemplate.jsx +0 -218
- package/mcps/after-effects-mcp/build/scripts/createComposition.jsx +0 -71
- package/mcps/after-effects-mcp/build/scripts/createShapeLayer.jsx +0 -147
- package/mcps/after-effects-mcp/build/scripts/createSolidLayer.jsx +0 -114
- package/mcps/after-effects-mcp/build/scripts/createTextLayer.jsx +0 -115
- package/mcps/after-effects-mcp/build/scripts/getLayerInfo.jsx +0 -192
- package/mcps/after-effects-mcp/build/scripts/getProjectInfo.jsx +0 -90
- package/mcps/after-effects-mcp/build/scripts/listCompositions.jsx +0 -50
- package/mcps/after-effects-mcp/build/scripts/mcp-bridge-auto.jsx +0 -1773
- package/mcps/after-effects-mcp/build/scripts/setLayerProperties.jsx +0 -160
- package/mcps/computer-use-mcp/dist/client.d.ts +0 -150
- package/mcps/computer-use-mcp/dist/client.js +0 -136
- package/mcps/computer-use-mcp/dist/entrypoint.d.ts +0 -16
- package/mcps/computer-use-mcp/dist/entrypoint.js +0 -26
- package/mcps/computer-use-mcp/dist/native.d.ts +0 -212
- package/mcps/computer-use-mcp/dist/native.js +0 -50
- package/mcps/computer-use-mcp/dist/server.d.ts +0 -32
- package/mcps/computer-use-mcp/dist/server.js +0 -342
- package/mcps/computer-use-mcp/dist/session.d.ts +0 -101
- package/mcps/computer-use-mcp/dist/session.js +0 -2372
package/README.md
CHANGED
|
@@ -10,17 +10,17 @@
|
|
|
10
10
|
[](https://github.com/hybridlabor-api/aos/stargazers)
|
|
11
11
|
[](https://github.com/hybridlabor-api/aos/commits/main)
|
|
12
12
|
|
|
13
|
-
[](docs/skills_table.md)
|
|
14
14
|
[](mcps/)
|
|
15
15
|
[](#-installation)
|
|
16
16
|
[](https://github.com/hybridlabor-api/aos)
|
|
17
17
|
[](https://github.com/NVIDIA/SkillSpector)
|
|
18
18
|
|
|
19
|
-
> **Supercharging AI coding agents with
|
|
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**:
|
|
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.
|
|
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
|
|
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
|
-
## 🌟
|
|
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 **
|
|
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
|
-
|
|
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
|
-
## 🔌
|
|
485
|
+
## 🔌 19 Local MCP Wrappers
|
|
486
486
|
|
|
487
487
|

|
|
488
488
|
|
|
489
|
-
Rather than relying on skeletal python mocks or broken remote APIs, this repository bundles **
|
|
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
|
[](https://www.npmjs.com/package/@hybridlabor-api/aos)
|
|
21
21
|
[](https://github.com/hybridlabor-api/aos)
|
|
22
22
|
[](LICENSE)
|
|
23
|
-
[](https://github.com/hybridlabor-api/aos)
|
|
24
24
|
[](https://github.com/NVIDIA/SkillSpector)
|
|
25
25
|
|
|
26
|
-
> **Potencializando agentes de código de IA com
|
|
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**:
|
|
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
|
|
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
|
-
## 🌟
|
|
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 **
|
|
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
|
|
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
|
|
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
|
-
## 🔌
|
|
428
|
+
## 🔌 19 Integrações Locais de MCPs
|
|
429
429
|
|
|
430
430
|

|
|
431
431
|
|
|
432
|
-
Em vez de depender de mocks rudimentares em python ou APIs remotas com falhas, este repositório empacota **
|
|
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>
|
package/bin/aos-dashboard.mjs
CHANGED
|
@@ -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
|
-
|
|
607
|
-
|
|
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
|
-
|
|
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,
|
|
3202
|
-
log.step(`Copied .agents/ contract to ${
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
3505
|
+
installStep('wire project harnesses to local hooks', () => {
|
|
3230
3506
|
mergeBdbSettingsHooks(path.join(projectClaudeDir, 'settings.json'), { projectLocal: true });
|
|
3231
|
-
|
|
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.
|
|
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": {
|