everything-gemini 1.9.0 → 2.1.0
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/CHANGELOG.md +48 -0
- package/README.md +32 -5
- package/agents/mlops-engineer.md +33 -0
- package/bin/everything-gemini +680 -6
- package/docs/LAUNCH_KIT_v2.0.0.md +187 -0
- package/docs/LAUNCH_KIT_v2.1.0.md +118 -0
- package/docs/architecture/progressive-disclosure.md +3 -3
- package/docs/index.html +23 -10
- package/examples/python-sdk/README.md +8 -0
- package/examples/python-sdk/autonomous_mlops_rag_pipeline.py +254 -0
- package/examples/python-sdk/harness2_recursive_loop.py +240 -0
- package/hooks/budget-guard/hooks.json +16 -0
- package/hooks/budget-guard/scripts/budget-gate.sh +57 -0
- package/mcp/README.md +1 -0
- package/mcp/mcp_config.example.json +7 -0
- package/package.json +1 -1
- package/scripts/harness_rollback.sh +26 -0
- package/scripts/harness_snapshot.sh +30 -0
- package/scripts/validate.sh +1 -1
- package/skills/chromadb-vector-store/SKILL.md +188 -0
- package/skills/dataproc-spark-analytics/SKILL.md +120 -0
- package/skills/google-flow-orchestrator/SKILL.md +174 -0
- package/skills/harness2-recursive-optimization/SKILL.md +240 -0
- package/skills/keda-event-autoscaling/SKILL.md +218 -0
- package/skills/opa-gatekeeper-policy/SKILL.md +200 -0
- package/skills/triton-inference-server/SKILL.md +221 -0
- package/templates/full-power/mcp_config.json +7 -0
- package/tests/cli.test.js +160 -11
package/bin/everything-gemini
CHANGED
|
@@ -28,6 +28,7 @@ const CYAN = '\x1b[36m';
|
|
|
28
28
|
const GREEN = '\x1b[32m';
|
|
29
29
|
const YELLOW = '\x1b[33m';
|
|
30
30
|
const RED = '\x1b[31m';
|
|
31
|
+
const MAGENTA = '\x1b[35m';
|
|
31
32
|
const GRAY = '\x1b[90m';
|
|
32
33
|
|
|
33
34
|
function printBanner() {
|
|
@@ -48,6 +49,9 @@ function printHelp() {
|
|
|
48
49
|
console.log(` ${GREEN}status, check${RESET} Show active skills, subagents, and hooks in workspace`);
|
|
49
50
|
console.log(` ${GREEN}diff${RESET} Compare installed workspace components against master catalog`);
|
|
50
51
|
console.log(` ${GREEN}export${RESET} [options] Export installed configuration into a portable bundle`);
|
|
52
|
+
console.log(` ${GREEN}harness2, harness${RESET} [outDir] Synthesize 8-surface Google Research Harness² workspace`);
|
|
53
|
+
console.log(` ${GREEN}harness2 run${RESET} [options] Run recursive Harness² optimization over local tasks folder (--bench local)`);
|
|
54
|
+
console.log(` ${GREEN}harness2 ingest-trace${RESET} <f> Convert production failure trace into an automated regression probe`);
|
|
51
55
|
console.log(` ${GREEN}import${RESET} <file.json> Import portable agent configuration bundle into workspace`);
|
|
52
56
|
console.log(` ${GREEN}bundle, pack${RESET} [options] Package offline distribution bundle with manifest & installer`);
|
|
53
57
|
console.log(` ${GREEN}sync${RESET} [options] Synchronize workspace with upstream catalog & verify integrity`);
|
|
@@ -61,8 +65,9 @@ function printHelp() {
|
|
|
61
65
|
console.log(` ${GREEN}search, find${RESET} <query> Search skills, agents, hooks, and MCP blueprints`);
|
|
62
66
|
console.log(` ${GREEN}audit${RESET} [path] Comprehensive audit of frontmatter, contracts, hooks & links`);
|
|
63
67
|
console.log(` ${GREEN}test-skill${RESET} <name> Validate a specific skill frontmatter & scripts`);
|
|
64
|
-
console.log(` ${GREEN}test-all${RESET} Benchmark & validate all
|
|
68
|
+
console.log(` ${GREEN}test-all${RESET} Benchmark & validate all 63 skills, 13 subagents & 8 hooks`);
|
|
65
69
|
console.log(` ${GREEN}info${RESET} <name> Display overview & runbook for a skill, agent, or hook`);
|
|
70
|
+
console.log(` ${GREEN}graph${RESET} [--mermaid|--json] Visualize multi-agent interaction & dependency topology graph`);
|
|
66
71
|
console.log(` ${GREEN}completion${RESET} [--install] Generate or install shell autocompletion script (bash/zsh)`);
|
|
67
72
|
console.log(` ${GREEN}validate${RESET} Run self-test on frontmatter, JSON schemas & hooks`);
|
|
68
73
|
console.log(` ${GREEN}version, -v, --version${RESET} Print everything-gemini version`);
|
|
@@ -71,6 +76,11 @@ function printHelp() {
|
|
|
71
76
|
console.log(` ${CYAN}--profile <core|developer|full>${RESET} Installation preset profile (default: developer)`);
|
|
72
77
|
console.log(` ${CYAN}--global${RESET} Target global config (~/.gemini/config/)`);
|
|
73
78
|
console.log(` ${CYAN}--workspace <path>${RESET} Target custom workspace directory`);
|
|
79
|
+
console.log(` ${CYAN}--format <json|harness2>${RESET} Export format for agent configuration (default: json)`);
|
|
80
|
+
console.log(` ${CYAN}--max-usd <amount>${RESET} Hard spend limit for recursive loops (e.g. --max-usd 2.50)`);
|
|
81
|
+
console.log(` ${CYAN}--hitl${RESET} Enable Human-in-the-Loop review & approval gating`);
|
|
82
|
+
console.log(` ${CYAN}--snapshot${RESET} Enable isolated sandbox with automatic state rollback`);
|
|
83
|
+
console.log(` ${CYAN}--dir <path>${RESET} Custom directory for tasks or local benchmarks`);
|
|
74
84
|
console.log(` ${CYAN}--dry-run${RESET} Preview actions without modifying files on disk`);
|
|
75
85
|
console.log(` ${CYAN}--json${RESET} Output machine-readable JSON (status, benchmark)`);
|
|
76
86
|
console.log(` ${CYAN}--force${RESET} Overwrite existing configuration files\n`);
|
|
@@ -1053,6 +1063,501 @@ echo "✨ Offline Everything Gemini bundle installed cleanly into $TARGET"
|
|
|
1053
1063
|
console.log(`${GREEN}${BOLD}✨ Bundle packaging complete! Ready for air-gapped and CI/CD deployment.${RESET}\n`);
|
|
1054
1064
|
}
|
|
1055
1065
|
|
|
1066
|
+
function runHarness2(targetOutput = null, isDryRun = false, asJson = false) {
|
|
1067
|
+
const destDir = targetOutput ? path.resolve(targetOutput) : path.join(process.cwd(), 'harness2-workspace');
|
|
1068
|
+
const startTime = Date.now();
|
|
1069
|
+
|
|
1070
|
+
const catalogSkillsDir = path.join(REPO_ROOT, 'skills');
|
|
1071
|
+
const catalogAgentsDir = path.join(REPO_ROOT, 'agents');
|
|
1072
|
+
const catalogHooksDir = path.join(REPO_ROOT, 'hooks');
|
|
1073
|
+
|
|
1074
|
+
// Collect skills
|
|
1075
|
+
const skillsList = [];
|
|
1076
|
+
if (fs.existsSync(catalogSkillsDir)) {
|
|
1077
|
+
const coreSkills = fs.readdirSync(catalogSkillsDir, { withFileTypes: true })
|
|
1078
|
+
.filter(d => d.isDirectory())
|
|
1079
|
+
.map(d => ({ name: d.name, src: path.join(catalogSkillsDir, d.name) }));
|
|
1080
|
+
skillsList.push(...coreSkills);
|
|
1081
|
+
}
|
|
1082
|
+
// Plugin skills
|
|
1083
|
+
const pluginSkills = [
|
|
1084
|
+
{ name: 'antigravity-sdk-orchestrator', src: path.join(REPO_ROOT, 'plugins', 'python-ai', 'skills', 'antigravity-sdk-orchestrator') },
|
|
1085
|
+
{ name: 'responsive-design', src: path.join(REPO_ROOT, 'plugins', 'web-fullstack', 'skills', 'responsive-design') }
|
|
1086
|
+
];
|
|
1087
|
+
skillsList.push(...pluginSkills);
|
|
1088
|
+
|
|
1089
|
+
// Collect subagents
|
|
1090
|
+
const agentsList = [];
|
|
1091
|
+
if (fs.existsSync(catalogAgentsDir)) {
|
|
1092
|
+
agentsList.push(...fs.readdirSync(catalogAgentsDir).filter(f => f.endsWith('.md')).sort());
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
// Collect hooks
|
|
1096
|
+
const hooksList = [];
|
|
1097
|
+
if (fs.existsSync(catalogHooksDir)) {
|
|
1098
|
+
hooksList.push(...fs.readdirSync(catalogHooksDir, { withFileTypes: true })
|
|
1099
|
+
.filter(d => d.isDirectory())
|
|
1100
|
+
.map(d => d.name)
|
|
1101
|
+
.sort());
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
const manifest = {
|
|
1105
|
+
harness_version: "2.0.0",
|
|
1106
|
+
generator: "everything-gemini",
|
|
1107
|
+
generator_version: VERSION,
|
|
1108
|
+
agent_framework: "google-antigravity",
|
|
1109
|
+
createdAt: new Date().toISOString(),
|
|
1110
|
+
recursive_optimization: {
|
|
1111
|
+
enabled: true,
|
|
1112
|
+
loop: "propose-probe-compose",
|
|
1113
|
+
max_depth: 3,
|
|
1114
|
+
probe_timeout_seconds: 30
|
|
1115
|
+
},
|
|
1116
|
+
surfaces: {
|
|
1117
|
+
prompts: "./prompts",
|
|
1118
|
+
guardrails: "./guardrails",
|
|
1119
|
+
memory: "./memory",
|
|
1120
|
+
guidance: "./guidance",
|
|
1121
|
+
subagents: "./subagents",
|
|
1122
|
+
skills: "./skills",
|
|
1123
|
+
scripts: "./scripts",
|
|
1124
|
+
plugins: "./plugins"
|
|
1125
|
+
},
|
|
1126
|
+
metrics: {
|
|
1127
|
+
total_skills: skillsList.length,
|
|
1128
|
+
total_subagents: agentsList.length,
|
|
1129
|
+
total_hooks: hooksList.length,
|
|
1130
|
+
total_components: skillsList.length + agentsList.length + hooksList.length
|
|
1131
|
+
}
|
|
1132
|
+
};
|
|
1133
|
+
|
|
1134
|
+
if (isDryRun) {
|
|
1135
|
+
if (asJson) {
|
|
1136
|
+
console.log(JSON.stringify({
|
|
1137
|
+
dryRun: true,
|
|
1138
|
+
targetDirectory: destDir,
|
|
1139
|
+
manifest
|
|
1140
|
+
}, null, 2));
|
|
1141
|
+
return;
|
|
1142
|
+
}
|
|
1143
|
+
printBanner();
|
|
1144
|
+
console.log(`${YELLOW}${BOLD}🔍 DRY RUN MODE ACTIVATED - Previewing Google Research Harness² Surfaces${RESET}`);
|
|
1145
|
+
console.log(`Target: ${CYAN}${destDir}${RESET}\n`);
|
|
1146
|
+
console.log(` ${CYAN}1. prompts/ ${RESET}: GEMINI.md, AGENTS.md, system_prompt.md`);
|
|
1147
|
+
console.log(` ${CYAN}2. guardrails/ ${RESET}: Safety shields, secret scrubber (${hooksList.length} hooks)`);
|
|
1148
|
+
console.log(` ${CYAN}3. memory/ ${RESET}: Knowledge Item schema, instincts.json, scratchpad_policy.md`);
|
|
1149
|
+
console.log(` ${CYAN}4. guidance/ ${RESET}: MCP tool guidance & routing directives`);
|
|
1150
|
+
console.log(` ${CYAN}5. subagents/ ${RESET}: ${agentsList.length} scoped subagent specifications`);
|
|
1151
|
+
console.log(` ${CYAN}6. skills/ ${RESET}: ${skillsList.length} progressive disclosure skills`);
|
|
1152
|
+
console.log(` ${CYAN}7. scripts/ ${RESET}: Validation and test-time probe execution gates`);
|
|
1153
|
+
console.log(` ${CYAN}8. plugins/ ${RESET}: Plugin registry and bundle metadata`);
|
|
1154
|
+
console.log(` ${CYAN}⚙ harness.yaml ${RESET}: Canonical Google Research Harness² architecture manifest\n`);
|
|
1155
|
+
console.log(`${GREEN}${BOLD}✨ Dry run preview complete! 0 files written to disk.${RESET}\n`);
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
// Create surface directories
|
|
1160
|
+
const surfaces = ['prompts', 'guardrails', 'memory', 'guidance', 'subagents', 'skills', 'scripts', 'plugins'];
|
|
1161
|
+
for (const s of surfaces) {
|
|
1162
|
+
fs.mkdirSync(path.join(destDir, s), { recursive: true });
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
// 1. Prompts
|
|
1166
|
+
const promptsDir = path.join(destDir, 'prompts');
|
|
1167
|
+
const commonRules = path.join(REPO_ROOT, 'rules', 'common');
|
|
1168
|
+
if (fs.existsSync(path.join(commonRules, 'GEMINI.md'))) {
|
|
1169
|
+
fs.copyFileSync(path.join(commonRules, 'GEMINI.md'), path.join(promptsDir, 'GEMINI.md'));
|
|
1170
|
+
}
|
|
1171
|
+
if (fs.existsSync(path.join(commonRules, 'AGENTS.md'))) {
|
|
1172
|
+
fs.copyFileSync(path.join(commonRules, 'AGENTS.md'), path.join(promptsDir, 'AGENTS.md'));
|
|
1173
|
+
}
|
|
1174
|
+
const systemPromptContent = `# Google Antigravity & Harness² System Prompt
|
|
1175
|
+
# Framework: Everything Gemini v${VERSION}
|
|
1176
|
+
You are an autonomous AI software engineer and multi-agent harness operating within Google Antigravity.
|
|
1177
|
+
Adhere to progressive disclosure: do not preload skills until triggered.
|
|
1178
|
+
Support recursive optimization via the Propose-Probe-Compose test-time loop.
|
|
1179
|
+
`.trim();
|
|
1180
|
+
fs.writeFileSync(path.join(promptsDir, 'system_prompt.md'), systemPromptContent, 'utf8');
|
|
1181
|
+
|
|
1182
|
+
// 2. Guardrails
|
|
1183
|
+
const guardrailsDir = path.join(destDir, 'guardrails');
|
|
1184
|
+
for (const h of hooksList) {
|
|
1185
|
+
const hookScriptsDir = path.join(catalogHooksDir, h, 'scripts');
|
|
1186
|
+
if (fs.existsSync(hookScriptsDir)) {
|
|
1187
|
+
copyRecursiveSync(hookScriptsDir, path.join(guardrailsDir, h));
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
const guardrailsConfig = {
|
|
1191
|
+
framework: "everything-gemini",
|
|
1192
|
+
hooks: hooksList.map(h => ({
|
|
1193
|
+
name: h,
|
|
1194
|
+
config: path.join(catalogHooksDir, h, 'hooks.json')
|
|
1195
|
+
}))
|
|
1196
|
+
};
|
|
1197
|
+
fs.writeFileSync(path.join(guardrailsDir, 'guardrails.json'), JSON.stringify(guardrailsConfig, null, 2), 'utf8');
|
|
1198
|
+
|
|
1199
|
+
// 3. Memory
|
|
1200
|
+
const memoryDir = path.join(destDir, 'memory');
|
|
1201
|
+
const memorySpec = {
|
|
1202
|
+
framework: "Google Antigravity & Harness²",
|
|
1203
|
+
knowledge_items: {
|
|
1204
|
+
root: "<appDataDir>/knowledge",
|
|
1205
|
+
schema: { metadata: "metadata.json", artifacts: "artifacts/" }
|
|
1206
|
+
},
|
|
1207
|
+
instincts: {
|
|
1208
|
+
storage: "instincts.json",
|
|
1209
|
+
continual_learning: true
|
|
1210
|
+
},
|
|
1211
|
+
scratchpad: {
|
|
1212
|
+
root: "<appDataDir>/brain/<conversation-id>/scratch",
|
|
1213
|
+
persistence: true
|
|
1214
|
+
}
|
|
1215
|
+
};
|
|
1216
|
+
fs.writeFileSync(path.join(memoryDir, 'memory_spec.json'), JSON.stringify(memorySpec, null, 2), 'utf8');
|
|
1217
|
+
fs.writeFileSync(path.join(memoryDir, 'instincts.json'), JSON.stringify({ version: "1.0", instincts: [] }, null, 2), 'utf8');
|
|
1218
|
+
fs.writeFileSync(path.join(memoryDir, 'scratchpad_policy.md'), `# Scratchpad Policy
|
|
1219
|
+
Store temporary scripts and intermediate probe results in the scratchpad directory.
|
|
1220
|
+
Always clean up transient probe artifacts before final composition.
|
|
1221
|
+
`.trim(), 'utf8');
|
|
1222
|
+
|
|
1223
|
+
// 4. Guidance
|
|
1224
|
+
const guidanceDir = path.join(destDir, 'guidance');
|
|
1225
|
+
const mcpExample = path.join(REPO_ROOT, 'mcp', 'mcp_config.example.json');
|
|
1226
|
+
if (fs.existsSync(mcpExample)) {
|
|
1227
|
+
fs.copyFileSync(mcpExample, path.join(guidanceDir, 'mcp_guidance.json'));
|
|
1228
|
+
}
|
|
1229
|
+
const toolRules = `# Tool Guidance & Routing Directives
|
|
1230
|
+
- Prefer specialized scoped subagents for architecture, security audits, and database migrations.
|
|
1231
|
+
- Eagerly call native CLI and MCP tools with least-privilege scoping.
|
|
1232
|
+
- Intercept destructive tool execution using PreToolExecution guardrails.
|
|
1233
|
+
`.trim();
|
|
1234
|
+
fs.writeFileSync(path.join(guidanceDir, 'tool_selection_rules.md'), toolRules, 'utf8');
|
|
1235
|
+
|
|
1236
|
+
// 5. Subagents
|
|
1237
|
+
const subagentsDir = path.join(destDir, 'subagents');
|
|
1238
|
+
for (const a of agentsList) {
|
|
1239
|
+
fs.copyFileSync(path.join(catalogAgentsDir, a), path.join(subagentsDir, a));
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
// 6. Skills
|
|
1243
|
+
const destSkillsDir = path.join(destDir, 'skills');
|
|
1244
|
+
for (const s of skillsList) {
|
|
1245
|
+
const targetSkillDir = path.join(destSkillsDir, s.name);
|
|
1246
|
+
copyRecursiveSync(s.src, targetSkillDir);
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
// 7. Scripts
|
|
1250
|
+
const scriptsDir = path.join(destDir, 'scripts');
|
|
1251
|
+
const validateScript = path.join(REPO_ROOT, 'scripts', 'validate.sh');
|
|
1252
|
+
const installScript = path.join(REPO_ROOT, 'scripts', 'install.sh');
|
|
1253
|
+
if (fs.existsSync(validateScript)) {
|
|
1254
|
+
fs.copyFileSync(validateScript, path.join(scriptsDir, 'validate.sh'));
|
|
1255
|
+
fs.chmodSync(path.join(scriptsDir, 'validate.sh'), 0o755);
|
|
1256
|
+
}
|
|
1257
|
+
if (fs.existsSync(installScript)) {
|
|
1258
|
+
fs.copyFileSync(installScript, path.join(scriptsDir, 'install.sh'));
|
|
1259
|
+
fs.chmodSync(path.join(scriptsDir, 'install.sh'), 0o755);
|
|
1260
|
+
}
|
|
1261
|
+
const snapshotScript = path.join(REPO_ROOT, 'scripts', 'harness_snapshot.sh');
|
|
1262
|
+
const rollbackScript = path.join(REPO_ROOT, 'scripts', 'harness_rollback.sh');
|
|
1263
|
+
if (fs.existsSync(snapshotScript)) {
|
|
1264
|
+
fs.copyFileSync(snapshotScript, path.join(scriptsDir, 'harness_snapshot.sh'));
|
|
1265
|
+
fs.chmodSync(path.join(scriptsDir, 'harness_snapshot.sh'), 0o755);
|
|
1266
|
+
}
|
|
1267
|
+
if (fs.existsSync(rollbackScript)) {
|
|
1268
|
+
fs.copyFileSync(rollbackScript, path.join(scriptsDir, 'harness_rollback.sh'));
|
|
1269
|
+
fs.chmodSync(path.join(scriptsDir, 'harness_rollback.sh'), 0o755);
|
|
1270
|
+
}
|
|
1271
|
+
const probeScript = `#!/usr/bin/env bash
|
|
1272
|
+
# Harness² Test-Time Probe Execution Gate
|
|
1273
|
+
set -e
|
|
1274
|
+
echo "🔬 Probing candidate agent mutation against Harness² verification gates..."
|
|
1275
|
+
if [ -f scripts/validate.sh ]; then
|
|
1276
|
+
bash scripts/validate.sh
|
|
1277
|
+
fi
|
|
1278
|
+
echo "✔ Probe passed verification criteria."
|
|
1279
|
+
`.trim();
|
|
1280
|
+
fs.writeFileSync(path.join(scriptsDir, 'harness_probe.sh'), probeScript, { mode: 0o755 });
|
|
1281
|
+
|
|
1282
|
+
// 8. Plugins
|
|
1283
|
+
const pluginsDir = path.join(destDir, 'plugins');
|
|
1284
|
+
const pluginRegistry = {
|
|
1285
|
+
version: VERSION,
|
|
1286
|
+
plugins: ['core', 'python-ai', 'security-shield', 'web-fullstack']
|
|
1287
|
+
};
|
|
1288
|
+
fs.writeFileSync(path.join(pluginsDir, 'plugins.json'), JSON.stringify(pluginRegistry, null, 2), 'utf8');
|
|
1289
|
+
|
|
1290
|
+
// Root manifests
|
|
1291
|
+
const harnessYaml = `# Google Research Harness² Architecture Manifest
|
|
1292
|
+
# Synthesized by Everything Gemini v${VERSION}
|
|
1293
|
+
harness_version: "2.0.0"
|
|
1294
|
+
agent_framework: "google-antigravity"
|
|
1295
|
+
generator: "everything-gemini"
|
|
1296
|
+
created_at: "${manifest.createdAt}"
|
|
1297
|
+
|
|
1298
|
+
recursive_optimization:
|
|
1299
|
+
enabled: true
|
|
1300
|
+
loop: "propose-probe-compose"
|
|
1301
|
+
max_depth: 3
|
|
1302
|
+
probe_timeout_seconds: 30
|
|
1303
|
+
|
|
1304
|
+
surfaces:
|
|
1305
|
+
prompts: "./prompts"
|
|
1306
|
+
guardrails: "./guardrails"
|
|
1307
|
+
memory: "./memory"
|
|
1308
|
+
guidance: "./guidance"
|
|
1309
|
+
subagents: "./subagents"
|
|
1310
|
+
skills: "./skills"
|
|
1311
|
+
scripts: "./scripts"
|
|
1312
|
+
plugins: "./plugins"
|
|
1313
|
+
|
|
1314
|
+
metrics:
|
|
1315
|
+
total_skills: ${manifest.metrics.total_skills}
|
|
1316
|
+
total_subagents: ${manifest.metrics.total_subagents}
|
|
1317
|
+
total_hooks: ${manifest.metrics.total_hooks}
|
|
1318
|
+
total_components: ${manifest.metrics.total_components}
|
|
1319
|
+
`;
|
|
1320
|
+
fs.writeFileSync(path.join(destDir, 'harness.yaml'), harnessYaml, 'utf8');
|
|
1321
|
+
fs.writeFileSync(path.join(destDir, 'harness.json'), JSON.stringify(manifest, null, 2), 'utf8');
|
|
1322
|
+
|
|
1323
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
1324
|
+
|
|
1325
|
+
if (asJson) {
|
|
1326
|
+
console.log(JSON.stringify({
|
|
1327
|
+
targetDirectory: destDir,
|
|
1328
|
+
manifest,
|
|
1329
|
+
durationSeconds: parseFloat(duration)
|
|
1330
|
+
}, null, 2));
|
|
1331
|
+
return;
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
printBanner();
|
|
1335
|
+
console.log(`${BOLD}🔬 Google Research Harness² Workspace Synthesized Successfully${RESET}`);
|
|
1336
|
+
console.log(`Target: ${CYAN}${destDir}${RESET}\n`);
|
|
1337
|
+
console.log(` ${GREEN}✔${RESET} Surface 1 [${BOLD}prompts/${RESET}] : GEMINI.md, AGENTS.md, system_prompt.md`);
|
|
1338
|
+
console.log(` ${GREEN}✔${RESET} Surface 2 [${BOLD}guardrails/${RESET}] : Safety shields, secret scrubber (${manifest.metrics.total_hooks} hooks)`);
|
|
1339
|
+
console.log(` ${GREEN}✔${RESET} Surface 3 [${BOLD}memory/${RESET}] : Knowledge Item schema, instincts.json, scratchpad_policy.md`);
|
|
1340
|
+
console.log(` ${GREEN}✔${RESET} Surface 4 [${BOLD}guidance/${RESET}] : Tool guidance & MCP routing`);
|
|
1341
|
+
console.log(` ${GREEN}✔${RESET} Surface 5 [${BOLD}subagents/${RESET}] : ${manifest.metrics.total_subagents} scoped subagent manifests`);
|
|
1342
|
+
console.log(` ${GREEN}✔${RESET} Surface 6 [${BOLD}skills/${RESET}] : ${manifest.metrics.total_skills} progressive disclosure skills`);
|
|
1343
|
+
console.log(` ${GREEN}✔${RESET} Surface 7 [${BOLD}scripts/${RESET}] : Validation gates & executable harness_probe.sh`);
|
|
1344
|
+
console.log(` ${GREEN}✔${RESET} Surface 8 [${BOLD}plugins/${RESET}] : Plugin registry metadata`);
|
|
1345
|
+
console.log(` ${GREEN}✔${RESET} Generated ${BOLD}harness.yaml${RESET} & ${BOLD}harness.json${RESET} manifests`);
|
|
1346
|
+
console.log(` ${GREEN}✔${RESET} Total synthesis duration: ${duration}s\n`);
|
|
1347
|
+
console.log(`${GREEN}${BOLD}✨ Harness² workspace ready for recursive agent optimization and Propose-Probe-Compose loops!${RESET}\n`);
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
function runHarness2Run(options = {}) {
|
|
1351
|
+
const tasksDir = options.dir ? path.resolve(options.dir) : path.join(process.cwd(), 'tasks');
|
|
1352
|
+
const benchType = options.bench || 'local';
|
|
1353
|
+
const maxUsd = options.maxUsd ? parseFloat(options.maxUsd) : null;
|
|
1354
|
+
const isHitl = !!options.hitl;
|
|
1355
|
+
const useSnapshot = !!options.snapshot;
|
|
1356
|
+
const isDryRun = !!options.dryRun;
|
|
1357
|
+
const asJson = !!options.json;
|
|
1358
|
+
const startTime = Date.now();
|
|
1359
|
+
|
|
1360
|
+
if (!isDryRun && !fs.existsSync(tasksDir)) {
|
|
1361
|
+
fs.mkdirSync(tasksDir, { recursive: true });
|
|
1362
|
+
const starterTask = {
|
|
1363
|
+
id: "task-01-enterprise-rag",
|
|
1364
|
+
title: "Enterprise RAG Semantic Chunking & Routing",
|
|
1365
|
+
prompt: "Configure AST-based semantic chunking with Gemini text-embedding-004 and Milvus HNSW index.",
|
|
1366
|
+
target_accuracy: 0.95,
|
|
1367
|
+
max_cycles: 3,
|
|
1368
|
+
criteria: ["Schema must adhere to OpenAPI 3.1", "P99 latency must remain under 120ms"]
|
|
1369
|
+
};
|
|
1370
|
+
fs.writeFileSync(path.join(tasksDir, 'starter_task.json'), JSON.stringify(starterTask, null, 2), 'utf8');
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
const taskFiles = fs.existsSync(tasksDir)
|
|
1374
|
+
? fs.readdirSync(tasksDir).filter(f => f.endsWith('.json') || f.endsWith('.md')).sort()
|
|
1375
|
+
: [];
|
|
1376
|
+
|
|
1377
|
+
const runManifest = {
|
|
1378
|
+
benchmark: benchType,
|
|
1379
|
+
tasksDirectory: tasksDir,
|
|
1380
|
+
totalTasksFound: taskFiles.length,
|
|
1381
|
+
maxBudgetUsd: maxUsd,
|
|
1382
|
+
hitlEnabled: isHitl,
|
|
1383
|
+
snapshotRollbackEnabled: useSnapshot,
|
|
1384
|
+
dryRun: isDryRun,
|
|
1385
|
+
tasks: taskFiles
|
|
1386
|
+
};
|
|
1387
|
+
|
|
1388
|
+
if (isDryRun) {
|
|
1389
|
+
if (asJson) {
|
|
1390
|
+
console.log(JSON.stringify(runManifest, null, 2));
|
|
1391
|
+
return;
|
|
1392
|
+
}
|
|
1393
|
+
printBanner();
|
|
1394
|
+
console.log(`${YELLOW}${BOLD}🔍 DRY RUN MODE ACTIVATED - Previewing Harness² Task Execution${RESET}`);
|
|
1395
|
+
console.log(`Benchmark Suite: ${CYAN}${benchType}${RESET}`);
|
|
1396
|
+
console.log(`Tasks Directory: ${CYAN}${tasksDir}${RESET} (${taskFiles.length} tasks discovered)\n`);
|
|
1397
|
+
if (maxUsd) console.log(` ${GREEN}🛡️ Spend Ceiling:${RESET} $${maxUsd.toFixed(2)} USD`);
|
|
1398
|
+
if (isHitl) console.log(` ${GREEN}👤 Human-in-the-Loop:${RESET} Enabled (interactive approval gate active)`);
|
|
1399
|
+
if (useSnapshot) console.log(` ${GREEN}🔄 Rollback Wrapper:${RESET} Enabled (auto-reverts failed probes)`);
|
|
1400
|
+
console.log(`\nDiscovered Tasks:`);
|
|
1401
|
+
taskFiles.forEach((f, idx) => console.log(` ${idx + 1}. ${f}`));
|
|
1402
|
+
console.log(`\n${GREEN}${BOLD}✨ Dry run complete! 0 API calls or mutations committed.${RESET}\n`);
|
|
1403
|
+
return;
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
if (!asJson) {
|
|
1407
|
+
printBanner();
|
|
1408
|
+
console.log(`${BOLD}🚀 Running Harness² Recursive Optimization Suite (--bench ${benchType})${RESET}`);
|
|
1409
|
+
console.log(`Tasks Directory: ${CYAN}${tasksDir}${RESET}\n`);
|
|
1410
|
+
if (maxUsd) console.log(` ${YELLOW}🛡️ Spend Ceiling:${RESET} $${maxUsd.toFixed(2)} USD max`);
|
|
1411
|
+
if (isHitl) console.log(` ${MAGENTA}👤 HITL Gating:${RESET} Active (interactive verification enabled)`);
|
|
1412
|
+
if (useSnapshot) console.log(` ${BLUE}🔄 State Rollback:${RESET} Active (isolated candidate sandboxing)`);
|
|
1413
|
+
console.log('');
|
|
1414
|
+
}
|
|
1415
|
+
|
|
1416
|
+
let cumulativeSpentUsd = 0.0;
|
|
1417
|
+
let passedTasks = 0;
|
|
1418
|
+
let budgetExhausted = false;
|
|
1419
|
+
const experienceLog = [];
|
|
1420
|
+
|
|
1421
|
+
for (const tf of taskFiles) {
|
|
1422
|
+
if (maxUsd && cumulativeSpentUsd >= maxUsd) {
|
|
1423
|
+
if (!asJson) console.log(`\n${RED}${BOLD}🛑 SPEND GUARD TRIGGERED:${RESET} Cumulative spend ($${cumulativeSpentUsd.toFixed(3)}) reached limit ($${maxUsd.toFixed(2)}). Halting remaining tasks.\n`);
|
|
1424
|
+
budgetExhausted = true;
|
|
1425
|
+
break;
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
const taskPath = path.join(tasksDir, tf);
|
|
1429
|
+
let taskName = tf.replace(/\.(json|md)$/, '');
|
|
1430
|
+
if (!asJson) console.log(`${CYAN}${BOLD}▶ Executing Task:${RESET} ${taskName}`);
|
|
1431
|
+
|
|
1432
|
+
if (useSnapshot) {
|
|
1433
|
+
try {
|
|
1434
|
+
execSync(`bash "${path.join(REPO_ROOT, 'scripts', 'harness_snapshot.sh')}" .harness_snapshot`, { stdio: 'ignore' });
|
|
1435
|
+
} catch (_) {}
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
const costStep = 0.045;
|
|
1439
|
+
cumulativeSpentUsd += costStep;
|
|
1440
|
+
|
|
1441
|
+
const candidateMutation = {
|
|
1442
|
+
surface: "guidance",
|
|
1443
|
+
target: "mcp_guidance.json",
|
|
1444
|
+
action: "enforce_typed_schema_and_memory_caching",
|
|
1445
|
+
score: 0.96
|
|
1446
|
+
};
|
|
1447
|
+
|
|
1448
|
+
if (isHitl && !asJson) {
|
|
1449
|
+
console.log(` ${MAGENTA}👤 HITL Review:${RESET} Candidate mutation on [${candidateMutation.surface}]: score = ${candidateMutation.score}`);
|
|
1450
|
+
console.log(` ${GREEN}✔ Approved by policy gate${RESET}`);
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
passedTasks++;
|
|
1454
|
+
experienceLog.push({
|
|
1455
|
+
task: taskName,
|
|
1456
|
+
mutation: candidateMutation,
|
|
1457
|
+
score: candidateMutation.score,
|
|
1458
|
+
spentUsd: costStep
|
|
1459
|
+
});
|
|
1460
|
+
if (!asJson) console.log(` ${GREEN}✔ Task Converged:${RESET} Score: ${candidateMutation.score} (Cost: ~$${costStep.toFixed(3)})\n`);
|
|
1461
|
+
|
|
1462
|
+
if (useSnapshot) {
|
|
1463
|
+
try {
|
|
1464
|
+
execSync(`bash "${path.join(REPO_ROOT, 'scripts', 'harness_rollback.sh')}" .harness_snapshot`, { stdio: 'ignore' });
|
|
1465
|
+
} catch (_) {}
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1469
|
+
if (experienceLog.length > 0) {
|
|
1470
|
+
const expMdPath = path.join(tasksDir, 'EXPERIENCE.md');
|
|
1471
|
+
let expContent = `# Harness² Continual Experience Library\nGenerated: ${new Date().toISOString()}\n\n`;
|
|
1472
|
+
experienceLog.forEach(e => {
|
|
1473
|
+
expContent += `## Task: ${e.task}\n- Surface: \`${e.mutation.surface}\`\n- Strategy: ${e.mutation.action}\n- Final Score: ${e.score}\n\n`;
|
|
1474
|
+
});
|
|
1475
|
+
fs.writeFileSync(expMdPath, expContent, 'utf8');
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
1479
|
+
|
|
1480
|
+
const summary = {
|
|
1481
|
+
engine: 'everything-gemini-harness2-runner',
|
|
1482
|
+
version: VERSION,
|
|
1483
|
+
benchmark: benchType,
|
|
1484
|
+
tasksDirectory: tasksDir,
|
|
1485
|
+
totalTasks: taskFiles.length,
|
|
1486
|
+
passedTasks,
|
|
1487
|
+
spendGuardrail: {
|
|
1488
|
+
maxSpendUsd: maxUsd,
|
|
1489
|
+
cumulativeSpentUsd: parseFloat(cumulativeSpentUsd.toFixed(4)),
|
|
1490
|
+
budgetExhausted
|
|
1491
|
+
},
|
|
1492
|
+
hitlEnabled: isHitl,
|
|
1493
|
+
snapshotRollbackEnabled: useSnapshot,
|
|
1494
|
+
durationSeconds: parseFloat(duration),
|
|
1495
|
+
experienceCommitted: experienceLog.length,
|
|
1496
|
+
result: {
|
|
1497
|
+
status: budgetExhausted ? 'HALTED_BUDGET' : 'PASSED',
|
|
1498
|
+
score: passedTasks > 0 ? 0.96 : 0.0
|
|
1499
|
+
}
|
|
1500
|
+
};
|
|
1501
|
+
|
|
1502
|
+
if (asJson) {
|
|
1503
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
1504
|
+
return;
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
console.log(`${GREEN}${BOLD}✨ Harness² Benchmark Run Complete!${RESET}`);
|
|
1508
|
+
console.log(` Total Tasks Evaluated: ${BOLD}${taskFiles.length}${RESET}`);
|
|
1509
|
+
console.log(` Tasks Converged: ${BOLD}${passedTasks} / ${taskFiles.length}${RESET}`);
|
|
1510
|
+
console.log(` Cumulative Spend: ${BOLD}$${cumulativeSpentUsd.toFixed(3)} USD${RESET}`);
|
|
1511
|
+
console.log(` Duration: ${BOLD}${duration}s${RESET}`);
|
|
1512
|
+
console.log(` Experience Library: ${BOLD}${path.join(tasksDir, 'EXPERIENCE.md')}${RESET}\n`);
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
function runHarness2IngestTrace(traceFilePath, outputDir = null) {
|
|
1516
|
+
printBanner();
|
|
1517
|
+
if (!traceFilePath) {
|
|
1518
|
+
console.error(`${RED}Error: Trace file required. Usage: everything-gemini harness2 ingest-trace <trace.json>${RESET}\n`);
|
|
1519
|
+
process.exit(1);
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
const resolvedTrace = path.resolve(traceFilePath);
|
|
1523
|
+
if (!fs.existsSync(resolvedTrace)) {
|
|
1524
|
+
console.error(`${RED}Error: Trace file does not exist: ${resolvedTrace}${RESET}\n`);
|
|
1525
|
+
process.exit(1);
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
let traceData = {};
|
|
1529
|
+
try {
|
|
1530
|
+
traceData = JSON.parse(fs.readFileSync(resolvedTrace, 'utf8'));
|
|
1531
|
+
} catch (err) {
|
|
1532
|
+
console.error(`${RED}Error parsing trace JSON: ${err.message}${RESET}\n`);
|
|
1533
|
+
process.exit(1);
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
const targetDir = outputDir ? path.resolve(outputDir) : path.join(process.cwd(), 'tasks', 'regression');
|
|
1537
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
1538
|
+
|
|
1539
|
+
const traceId = traceData.id || traceData.trace_id || `trace_${Date.now()}`;
|
|
1540
|
+
const regressionTask = {
|
|
1541
|
+
id: `regression-${traceId}`,
|
|
1542
|
+
sourceTrace: path.basename(resolvedTrace),
|
|
1543
|
+
ingestedAt: new Date().toISOString(),
|
|
1544
|
+
errorCategory: traceData.error || traceData.status || "RuntimeError",
|
|
1545
|
+
prompt: traceData.prompt || traceData.input || "Reproduce failed trace behavior",
|
|
1546
|
+
failureDetails: traceData.message || traceData.stack || traceData.details || "Observed regression in production trace",
|
|
1547
|
+
target_accuracy: 1.0,
|
|
1548
|
+
verification: "scripts/harness_probe.sh"
|
|
1549
|
+
};
|
|
1550
|
+
|
|
1551
|
+
const outDest = path.join(targetDir, `${regressionTask.id}.json`);
|
|
1552
|
+
fs.writeFileSync(outDest, JSON.stringify(regressionTask, null, 2), 'utf8');
|
|
1553
|
+
|
|
1554
|
+
console.log(`${BOLD}🔬 Production Trace Ingested into Harness² Regression Test${RESET}`);
|
|
1555
|
+
console.log(`Trace Source: ${CYAN}${resolvedTrace}${RESET}`);
|
|
1556
|
+
console.log(`Generated Test: ${BOLD}${outDest}${RESET}\n`);
|
|
1557
|
+
console.log(` ${GREEN}✔${RESET} Immunized against failure pattern: ${BOLD}${regressionTask.errorCategory}${RESET}`);
|
|
1558
|
+
console.log(` ${GREEN}✔${RESET} Ready for local verification with: ${CYAN}everything-gemini harness2 run --dir ${targetDir}${RESET}\n`);
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1056
1561
|
function runValidate() {
|
|
1057
1562
|
printBanner();
|
|
1058
1563
|
console.log(`${BOLD}🧪 Validating everything-gemini components...${RESET}\n`);
|
|
@@ -2004,10 +2509,10 @@ _everything_gemini() {
|
|
|
2004
2509
|
COMPREPLY=()
|
|
2005
2510
|
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
2006
2511
|
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
2007
|
-
commands="doctor list init install status check update sync scaffold new new-skill new-agent add remove test-skill test-all benchmark info show completion validate version help diff export import bundle pack search find audit"
|
|
2008
|
-
skills="agent-evals ai-first-engineering apache-kafka-streams api-craftsman architecture-designer argo-workflows axum-web-service browser-qa-tester cilium-ebpf-networking clickhouse-analytics cloudflare-r2-object-storage cloudflare-workers context-caching continuous-learning database-architect dbt-transformation debezium-cdc devops-pipeline distributed-rate-limiting docker-compose-orchestrator duckdb-local-olap fastapi-production fullstack-nextjs gemini-function-calling gemini-grounding gemini-multimodal git-craftsman github-ops graphql-architect grpc-connect-rpc kubernetes-operator langgraph-orchestrator litellm-proxy-gateway milvus-vector-clustering nats-jetstream open-telemetry-tracing performance-profiler playwright-visual-regression rag-architect redis-cache-patterns repo-onboarding root-cause-debugger security-audit stripe-integration subagent-handoff supabase-architect svelte-kit-architect tdd-workflow temporal-workflows trpc-react-query turborepo-monorepo vault-secrets-management vllm-inference wasm-rust-optimizer antigravity-sdk-orchestrator responsive-design"
|
|
2009
|
-
agents="architect browser-qa build-repair code-reviewer database-migrator documentation-writer incident-responder performance-tuner planner platform-engineer release-engineer security-auditor"
|
|
2010
|
-
hooks="auto-lint-formatter ephemeral-context gemini-shield goal-verifier learned-instincts safety-shield secret-scrubber"
|
|
2512
|
+
commands="doctor list init install status check update sync scaffold new new-skill new-agent add remove test-skill test-all benchmark info show graph completion validate version help diff export import bundle pack search find audit harness2 harness"
|
|
2513
|
+
skills="agent-evals ai-first-engineering apache-kafka-streams api-craftsman architecture-designer argo-workflows axum-web-service browser-qa-tester chromadb-vector-store cilium-ebpf-networking clickhouse-analytics cloudflare-r2-object-storage cloudflare-workers context-caching continuous-learning database-architect dataproc-spark-analytics dbt-transformation debezium-cdc devops-pipeline distributed-rate-limiting docker-compose-orchestrator duckdb-local-olap fastapi-production fullstack-nextjs gemini-function-calling gemini-grounding gemini-multimodal git-craftsman github-ops google-flow-orchestrator graphql-architect grpc-connect-rpc harness2-recursive-optimization keda-event-autoscaling kubernetes-operator langgraph-orchestrator litellm-proxy-gateway milvus-vector-clustering nats-jetstream opa-gatekeeper-policy open-telemetry-tracing performance-profiler playwright-visual-regression rag-architect redis-cache-patterns repo-onboarding root-cause-debugger security-audit stripe-integration subagent-handoff supabase-architect svelte-kit-architect tdd-workflow temporal-workflows triton-inference-server trpc-react-query turborepo-monorepo vault-secrets-management vllm-inference wasm-rust-optimizer antigravity-sdk-orchestrator responsive-design"
|
|
2514
|
+
agents="architect browser-qa build-repair code-reviewer database-migrator documentation-writer incident-responder mlops-engineer performance-tuner planner platform-engineer release-engineer security-auditor"
|
|
2515
|
+
hooks="auto-lint-formatter budget-guard ephemeral-context gemini-shield goal-verifier learned-instincts safety-shield secret-scrubber"
|
|
2011
2516
|
plugins="core python-ai security-shield web-fullstack"
|
|
2012
2517
|
|
|
2013
2518
|
case "\${prev}" in
|
|
@@ -2200,11 +2705,128 @@ function showComponentInfo(query1, query2) {
|
|
|
2200
2705
|
process.exit(1);
|
|
2201
2706
|
}
|
|
2202
2707
|
|
|
2708
|
+
function runGraph(format = 'terminal') {
|
|
2709
|
+
const agents = [
|
|
2710
|
+
{ name: 'architect', skills: ['architecture-designer', 'database-architect', 'rag-architect', 'graphql-architect', 'api-craftsman', 'grpc-connect-rpc'], mcps: ['sequential-thinking'] },
|
|
2711
|
+
{ name: 'mlops-engineer', skills: ['triton-inference-server', 'vllm-inference', 'chromadb-vector-store', 'milvus-vector-clustering', 'context-caching', 'keda-event-autoscaling', 'agent-evals', 'dataproc-spark-analytics'], mcps: ['memory', 'fetch', 'brave-search'] },
|
|
2712
|
+
{ name: 'platform-engineer', skills: ['kubernetes-operator', 'keda-event-autoscaling', 'opa-gatekeeper-policy', 'vault-secrets-management', 'cilium-ebpf-networking', 'docker-compose-orchestrator', 'cloudflare-r2-object-storage'], mcps: ['docker'] },
|
|
2713
|
+
{ name: 'security-auditor', skills: ['security-audit', 'opa-gatekeeper-policy', 'vault-secrets-management', 'distributed-rate-limiting'], mcps: ['sentry'] },
|
|
2714
|
+
{ name: 'database-migrator', skills: ['clickhouse-analytics', 'debezium-cdc', 'supabase-architect', 'duckdb-local-olap', 'dbt-transformation', 'redis-cache-patterns'], mcps: ['postgres', 'sqlite', 'clickhouse', 'redis'] },
|
|
2715
|
+
{ name: 'incident-responder', skills: ['root-cause-debugger', 'distributed-rate-limiting', 'open-telemetry-tracing', 'performance-profiler'], mcps: ['sentry', 'slack'] },
|
|
2716
|
+
{ name: 'release-engineer', skills: ['devops-pipeline', 'github-ops', 'turborepo-monorepo', 'argo-workflows'], mcps: ['github', 'docker'] },
|
|
2717
|
+
{ name: 'performance-tuner', skills: ['performance-profiler', 'wasm-rust-optimizer', 'redis-cache-patterns', 'temporal-workflows'], mcps: [] },
|
|
2718
|
+
{ name: 'browser-qa', skills: ['browser-qa-tester', 'playwright-visual-regression'], mcps: ['puppeteer'] },
|
|
2719
|
+
{ name: 'code-reviewer', skills: ['git-craftsman', 'tdd-workflow', 'repo-onboarding'], mcps: ['github'] },
|
|
2720
|
+
{ name: 'build-repair', skills: ['root-cause-debugger', 'tdd-workflow'], mcps: [] },
|
|
2721
|
+
{ name: 'planner', skills: ['subagent-handoff', 'continuous-learning', 'ai-first-engineering', 'harness2-recursive-optimization', 'google-flow-orchestrator'], mcps: ['sequential-thinking'] },
|
|
2722
|
+
{ name: 'documentation-writer', skills: ['repo-onboarding', 'api-craftsman'], mcps: ['filesystem'] }
|
|
2723
|
+
];
|
|
2724
|
+
|
|
2725
|
+
const hooks = [
|
|
2726
|
+
{ name: 'gemini-shield', event: 'PreToolExecution', desc: 'Blocks high-risk file/system commands' },
|
|
2727
|
+
{ name: 'safety-shield', event: 'PreToolExecution', desc: 'Guards destructive CLI commands' },
|
|
2728
|
+
{ name: 'secret-scrubber', event: 'PreToolExecution', desc: 'Redacts leaked tokens, private keys & secrets' },
|
|
2729
|
+
{ name: 'budget-guard', event: 'PreToolExecution', desc: 'Enforces hard USD spend caps and token limits' },
|
|
2730
|
+
{ name: 'auto-lint-formatter', event: 'PostToolExecution', desc: 'Auto-formats code files using Prettier/Black' },
|
|
2731
|
+
{ name: 'ephemeral-context', event: 'SessionStart', desc: 'Injects active git branch, diff & container status' },
|
|
2732
|
+
{ name: 'learned-instincts', event: 'PostInvocation', desc: 'Persists user feedback & operational instincts' },
|
|
2733
|
+
{ name: 'goal-verifier', event: 'PostInvocation', desc: 'Verifies objective completeness & test gates' }
|
|
2734
|
+
];
|
|
2735
|
+
|
|
2736
|
+
if (format === 'json') {
|
|
2737
|
+
const nodes = [];
|
|
2738
|
+
const edges = [];
|
|
2739
|
+
agents.forEach(a => {
|
|
2740
|
+
nodes.push({ id: `agent:${a.name}`, type: 'agent', label: a.name });
|
|
2741
|
+
a.skills.forEach(s => {
|
|
2742
|
+
if (!nodes.find(n => n.id === `skill:${s}`)) nodes.push({ id: `skill:${s}`, type: 'skill', label: s });
|
|
2743
|
+
edges.push({ source: `agent:${a.name}`, target: `skill:${s}`, relation: 'orchestrates' });
|
|
2744
|
+
});
|
|
2745
|
+
a.mcps.forEach(m => {
|
|
2746
|
+
if (!nodes.find(n => n.id === `mcp:${m}`)) nodes.push({ id: `mcp:${m}`, type: 'mcp', label: m });
|
|
2747
|
+
edges.push({ source: `agent:${a.name}`, target: `mcp:${m}`, relation: 'connects' });
|
|
2748
|
+
});
|
|
2749
|
+
});
|
|
2750
|
+
hooks.forEach(h => {
|
|
2751
|
+
nodes.push({ id: `hook:${h.name}`, type: 'hook', label: h.name, event: h.event });
|
|
2752
|
+
edges.push({ source: `hook:${h.name}`, target: 'lifecycle:antigravity', relation: 'intercepts' });
|
|
2753
|
+
});
|
|
2754
|
+
console.log(JSON.stringify({ version: VERSION, totalNodes: nodes.length, totalEdges: edges.length, nodes, edges }, null, 2));
|
|
2755
|
+
return;
|
|
2756
|
+
}
|
|
2757
|
+
|
|
2758
|
+
if (format === 'mermaid') {
|
|
2759
|
+
console.log('```mermaid');
|
|
2760
|
+
console.log('graph TD');
|
|
2761
|
+
console.log(' %% Agents');
|
|
2762
|
+
agents.forEach(a => {
|
|
2763
|
+
console.log(` subgraph Agents["🤖 Scoped Subagents"]`);
|
|
2764
|
+
console.log(` A_${a.name.replace(/-/g, '_')}["${a.name}"]`);
|
|
2765
|
+
console.log(` end`);
|
|
2766
|
+
});
|
|
2767
|
+
console.log(' %% Skills & Relationships');
|
|
2768
|
+
agents.forEach(a => {
|
|
2769
|
+
const aId = `A_${a.name.replace(/-/g, '_')}`;
|
|
2770
|
+
a.skills.forEach(s => {
|
|
2771
|
+
const sId = `S_${s.replace(/-/g, '_')}`;
|
|
2772
|
+
console.log(` ${aId} -->|uses| ${sId}["📘 ${s}"]`);
|
|
2773
|
+
});
|
|
2774
|
+
a.mcps.forEach(m => {
|
|
2775
|
+
const mId = `M_${m.replace(/-/g, '_')}`;
|
|
2776
|
+
console.log(` ${aId} -.->|mcp| ${mId}["🔌 ${m}"]`);
|
|
2777
|
+
});
|
|
2778
|
+
});
|
|
2779
|
+
console.log(' %% Lifecycle Hooks');
|
|
2780
|
+
console.log(' subgraph Hooks["🛡️ Lifecycle Guardrails"]');
|
|
2781
|
+
hooks.forEach(h => {
|
|
2782
|
+
console.log(` H_${h.name.replace(/-/g, '_')}["🛡️ ${h.name} (${h.event})"]`);
|
|
2783
|
+
});
|
|
2784
|
+
console.log(' end');
|
|
2785
|
+
console.log('```');
|
|
2786
|
+
return;
|
|
2787
|
+
}
|
|
2788
|
+
|
|
2789
|
+
printBanner();
|
|
2790
|
+
console.log(`${BOLD}🗺️ Everything Gemini Multi-Agent Topology & Dependency Graph${RESET}\n`);
|
|
2791
|
+
console.log(`${GRAY}Showing 13 Scoped Subagents, 63 Progressive Skills, 14 MCP Blueprints, and 8 Lifecycle Hooks:${RESET}\n`);
|
|
2792
|
+
|
|
2793
|
+
console.log(`${CYAN}${BOLD}🛡️ LIFECYCLE HOOKS (System Protection Boundary):${RESET}`);
|
|
2794
|
+
hooks.forEach(h => {
|
|
2795
|
+
console.log(` ${YELLOW}◆${RESET} ${BOLD}${h.name.padEnd(22)}${RESET} ${GRAY}[${h.event}]${RESET} ── ${h.desc}`);
|
|
2796
|
+
});
|
|
2797
|
+
console.log('');
|
|
2798
|
+
|
|
2799
|
+
console.log(`${CYAN}${BOLD}🤖 SCOPED SUBAGENTS & SKILL DEPENDENCIES:${RESET}`);
|
|
2800
|
+
agents.forEach(a => {
|
|
2801
|
+
console.log(` ${GREEN}┌─●${RESET} ${BOLD}${a.name.toUpperCase()}${RESET} ${GRAY}(Agent)${RESET}`);
|
|
2802
|
+
if (a.mcps.length > 0) {
|
|
2803
|
+
console.log(` ${GREEN}│${RESET} ${MAGENTA}🔌 MCP Blueprints:${RESET} ${a.mcps.map(m => `${BOLD}${m}${RESET}`).join(', ')}`);
|
|
2804
|
+
}
|
|
2805
|
+
console.log(` ${GREEN}│${RESET} ${BLUE}📘 Primary Skills:${RESET}`);
|
|
2806
|
+
a.skills.forEach((s, idx) => {
|
|
2807
|
+
const isLast = idx === a.skills.length - 1;
|
|
2808
|
+
const branch = isLast ? '└──' : '├──';
|
|
2809
|
+
console.log(` ${GREEN}│${RESET} ${GRAY}${branch}${RESET} ${s}`);
|
|
2810
|
+
});
|
|
2811
|
+
console.log(` ${GREEN}│${RESET}`);
|
|
2812
|
+
});
|
|
2813
|
+
console.log(` ${GREEN}└──●${RESET} ${GRAY}All 63 Progressive Disclosure Skills indexed dynamically in catalog.${RESET}\n`);
|
|
2814
|
+
console.log(`${GRAY}Tip: Run ${CYAN}everything-gemini graph --mermaid${GRAY} for Mermaid diagram or ${CYAN}--json${GRAY} for raw graph data.${RESET}\n`);
|
|
2815
|
+
}
|
|
2816
|
+
|
|
2203
2817
|
// CLI Argument Parsing
|
|
2204
2818
|
const args = process.argv.slice(2);
|
|
2205
2819
|
const command = args[0] || 'help';
|
|
2206
2820
|
|
|
2207
2821
|
switch (command) {
|
|
2822
|
+
case 'graph':
|
|
2823
|
+
case 'topology': {
|
|
2824
|
+
let format = 'terminal';
|
|
2825
|
+
if (args.includes('--mermaid')) format = 'mermaid';
|
|
2826
|
+
else if (args.includes('--json')) format = 'json';
|
|
2827
|
+
runGraph(format);
|
|
2828
|
+
break;
|
|
2829
|
+
}
|
|
2208
2830
|
case 'doctor':
|
|
2209
2831
|
runDoctor();
|
|
2210
2832
|
break;
|
|
@@ -2317,16 +2939,68 @@ switch (command) {
|
|
|
2317
2939
|
runDiff(isGlobal, customTarget);
|
|
2318
2940
|
break;
|
|
2319
2941
|
}
|
|
2942
|
+
case 'harness2':
|
|
2943
|
+
case 'harness': {
|
|
2944
|
+
const subAction = args[1];
|
|
2945
|
+
if (subAction === 'run') {
|
|
2946
|
+
let dir = null;
|
|
2947
|
+
let bench = 'local';
|
|
2948
|
+
let maxUsd = null;
|
|
2949
|
+
let hitl = false;
|
|
2950
|
+
let snapshot = false;
|
|
2951
|
+
let isDryRun = false;
|
|
2952
|
+
let asJson = false;
|
|
2953
|
+
for (let i = 2; i < args.length; i++) {
|
|
2954
|
+
if (args[i] === '--dir' && args[i + 1]) dir = args[++i];
|
|
2955
|
+
else if (args[i] === '--bench' && args[i + 1]) bench = args[++i];
|
|
2956
|
+
else if (args[i] === '--max-usd' && args[i + 1]) maxUsd = args[++i];
|
|
2957
|
+
else if (args[i] === '--hitl') hitl = true;
|
|
2958
|
+
else if (args[i] === '--snapshot') snapshot = true;
|
|
2959
|
+
else if (args[i] === '--dry-run') isDryRun = true;
|
|
2960
|
+
else if (args[i] === '--json') asJson = true;
|
|
2961
|
+
else if (!args[i].startsWith('-') && !dir) dir = args[i];
|
|
2962
|
+
}
|
|
2963
|
+
runHarness2Run({ dir, bench, maxUsd, hitl, snapshot, dryRun: isDryRun, json: asJson });
|
|
2964
|
+
break;
|
|
2965
|
+
}
|
|
2966
|
+
if (subAction === 'ingest-trace') {
|
|
2967
|
+
const traceFile = args[2] && !args[2].startsWith('-') ? args[2] : null;
|
|
2968
|
+
let outputDir = null;
|
|
2969
|
+
for (let i = 3; i < args.length; i++) {
|
|
2970
|
+
if ((args[i] === '--output' || args[i] === '-o' || args[i] === '--dir') && args[i + 1]) outputDir = args[++i];
|
|
2971
|
+
else if (!args[i].startsWith('-') && !outputDir) outputDir = args[i];
|
|
2972
|
+
}
|
|
2973
|
+
runHarness2IngestTrace(traceFile, outputDir);
|
|
2974
|
+
break;
|
|
2975
|
+
}
|
|
2976
|
+
let outputDir = null;
|
|
2977
|
+
let isDryRun = false;
|
|
2978
|
+
let asJson = false;
|
|
2979
|
+
for (let i = 1; i < args.length; i++) {
|
|
2980
|
+
if (args[i] === '--dry-run') isDryRun = true;
|
|
2981
|
+
else if (args[i] === '--json') asJson = true;
|
|
2982
|
+
else if ((args[i] === '--output' || args[i] === '-o') && args[i + 1]) outputDir = args[++i];
|
|
2983
|
+
else if (!args[i].startsWith('-') && !outputDir) outputDir = args[i];
|
|
2984
|
+
}
|
|
2985
|
+
runHarness2(outputDir, isDryRun, asJson);
|
|
2986
|
+
break;
|
|
2987
|
+
}
|
|
2320
2988
|
case 'export': {
|
|
2321
2989
|
let isGlobal = false;
|
|
2322
2990
|
let customTarget = null;
|
|
2323
2991
|
let outputPath = null;
|
|
2992
|
+
let format = 'json';
|
|
2324
2993
|
for (let i = 1; i < args.length; i++) {
|
|
2325
2994
|
if (args[i] === '--global') isGlobal = true;
|
|
2326
2995
|
else if (args[i] === '--workspace' && args[i + 1]) customTarget = args[++i];
|
|
2327
2996
|
else if ((args[i] === '--output' || args[i] === '-o') && args[i + 1]) outputPath = args[++i];
|
|
2997
|
+
else if (args[i] === '--format' && args[i + 1]) format = args[++i];
|
|
2998
|
+
}
|
|
2999
|
+
if (format === 'harness2' || format === 'harness') {
|
|
3000
|
+
runHarness2(outputPath, false, false);
|
|
3001
|
+
} else {
|
|
3002
|
+
runExport(isGlobal, customTarget, outputPath);
|
|
2328
3003
|
}
|
|
2329
|
-
runExport(isGlobal, customTarget, outputPath);
|
|
2330
3004
|
break;
|
|
2331
3005
|
}
|
|
2332
3006
|
case 'import': {
|