olympus-ai 3.2.3 ā 3.3.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/.claude-plugin/plugin.json +1 -1
- package/dist/__tests__/ascent-checkpoint.test.d.ts +2 -0
- package/dist/__tests__/ascent-checkpoint.test.d.ts.map +1 -0
- package/dist/__tests__/ascent-checkpoint.test.js +261 -0
- package/dist/__tests__/ascent-checkpoint.test.js.map +1 -0
- package/dist/__tests__/config-ascent.test.d.ts +2 -0
- package/dist/__tests__/config-ascent.test.d.ts.map +1 -0
- package/dist/__tests__/config-ascent.test.js +134 -0
- package/dist/__tests__/config-ascent.test.js.map +1 -0
- package/dist/__tests__/hook-blocking.test.d.ts +8 -0
- package/dist/__tests__/hook-blocking.test.d.ts.map +1 -0
- package/dist/__tests__/hook-blocking.test.js +277 -0
- package/dist/__tests__/hook-blocking.test.js.map +1 -0
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/metrics-cli.test.d.ts +5 -0
- package/dist/__tests__/metrics-cli.test.d.ts.map +1 -0
- package/dist/__tests__/metrics-cli.test.js +24 -0
- package/dist/__tests__/metrics-cli.test.js.map +1 -0
- package/dist/__tests__/skill-auto-detection.test.d.ts +2 -0
- package/dist/__tests__/skill-auto-detection.test.d.ts.map +1 -0
- package/dist/__tests__/skill-auto-detection.test.js +255 -0
- package/dist/__tests__/skill-auto-detection.test.js.map +1 -0
- package/dist/__tests__/token-estimator.test.d.ts +5 -0
- package/dist/__tests__/token-estimator.test.d.ts.map +1 -0
- package/dist/__tests__/token-estimator.test.js +192 -0
- package/dist/__tests__/token-estimator.test.js.map +1 -0
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +83 -1
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/document-writer.d.ts.map +1 -1
- package/dist/agents/document-writer.js +38 -0
- package/dist/agents/document-writer.js.map +1 -1
- package/dist/agents/frontend-engineer.d.ts.map +1 -1
- package/dist/agents/frontend-engineer.js +16 -0
- package/dist/agents/frontend-engineer.js.map +1 -1
- package/dist/agents/olympian.d.ts.map +1 -1
- package/dist/agents/olympian.js +15 -0
- package/dist/agents/olympian.js.map +1 -1
- package/dist/cli/commands/metrics.d.ts +31 -0
- package/dist/cli/commands/metrics.d.ts.map +1 -0
- package/dist/cli/commands/metrics.js +266 -0
- package/dist/cli/commands/metrics.js.map +1 -0
- package/dist/cli/index.js +39 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +16 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/features/ascent-checkpoint/index.d.ts +48 -0
- package/dist/features/ascent-checkpoint/index.d.ts.map +1 -0
- package/dist/features/ascent-checkpoint/index.js +144 -0
- package/dist/features/ascent-checkpoint/index.js.map +1 -0
- package/dist/features/hook-logging/index.d.ts +37 -0
- package/dist/features/hook-logging/index.d.ts.map +1 -0
- package/dist/features/hook-logging/index.js +120 -0
- package/dist/features/hook-logging/index.js.map +1 -0
- package/dist/features/hook-logging/index.test.d.ts +5 -0
- package/dist/features/hook-logging/index.test.d.ts.map +1 -0
- package/dist/features/hook-logging/index.test.js +268 -0
- package/dist/features/hook-logging/index.test.js.map +1 -0
- package/dist/features/index.d.ts +3 -0
- package/dist/features/index.d.ts.map +1 -1
- package/dist/features/index.js +8 -0
- package/dist/features/index.js.map +1 -1
- package/dist/features/magic-keywords.d.ts +51 -0
- package/dist/features/magic-keywords.d.ts.map +1 -1
- package/dist/features/magic-keywords.js +172 -0
- package/dist/features/magic-keywords.js.map +1 -1
- package/dist/features/session-state/index.d.ts +50 -0
- package/dist/features/session-state/index.d.ts.map +1 -0
- package/dist/features/session-state/index.js +64 -0
- package/dist/features/session-state/index.js.map +1 -0
- package/dist/features/session-state/index.test.d.ts +5 -0
- package/dist/features/session-state/index.test.d.ts.map +1 -0
- package/dist/features/session-state/index.test.js +221 -0
- package/dist/features/session-state/index.test.js.map +1 -0
- package/dist/features/token-metrics/index.d.ts +6 -0
- package/dist/features/token-metrics/index.d.ts.map +1 -0
- package/dist/features/token-metrics/index.js +5 -0
- package/dist/features/token-metrics/index.js.map +1 -0
- package/dist/features/token-metrics/storage.d.ts +16 -0
- package/dist/features/token-metrics/storage.d.ts.map +1 -0
- package/dist/features/token-metrics/storage.js +144 -0
- package/dist/features/token-metrics/storage.js.map +1 -0
- package/dist/features/token-metrics/token-estimator.d.ts +66 -0
- package/dist/features/token-metrics/token-estimator.d.ts.map +1 -0
- package/dist/features/token-metrics/token-estimator.js +230 -0
- package/dist/features/token-metrics/token-estimator.js.map +1 -0
- package/dist/features/token-metrics/types.d.ts +63 -0
- package/dist/features/token-metrics/types.d.ts.map +1 -0
- package/dist/features/token-metrics/types.js +5 -0
- package/dist/features/token-metrics/types.js.map +1 -0
- package/dist/hooks/olympus-orchestrator/constants.d.ts +2 -0
- package/dist/hooks/olympus-orchestrator/constants.d.ts.map +1 -1
- package/dist/hooks/olympus-orchestrator/constants.js +41 -0
- package/dist/hooks/olympus-orchestrator/constants.js.map +1 -1
- package/dist/hooks/olympus-orchestrator/index.d.ts +10 -1
- package/dist/hooks/olympus-orchestrator/index.d.ts.map +1 -1
- package/dist/hooks/olympus-orchestrator/index.js +108 -14
- package/dist/hooks/olympus-orchestrator/index.js.map +1 -1
- package/dist/hooks/registrations/index.d.ts +2 -1
- package/dist/hooks/registrations/index.d.ts.map +1 -1
- package/dist/hooks/registrations/index.js +3 -1
- package/dist/hooks/registrations/index.js.map +1 -1
- package/dist/hooks/registrations/token-metrics.d.ts +11 -0
- package/dist/hooks/registrations/token-metrics.d.ts.map +1 -0
- package/dist/hooks/registrations/token-metrics.js +119 -0
- package/dist/hooks/registrations/token-metrics.js.map +1 -0
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +334 -9
- package/dist/installer/index.js.map +1 -1
- package/dist/shared/types.d.ts +16 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/scripts/.olympus/token-metrics.jsonl +1 -0
- package/scripts/dist/hooks/olympus-hooks.cjs +127 -128
- package/scripts/esbuild.hooks.mjs +1 -1
- package/.claude/CLAUDE.md +0 -66
- package/scripts/generate-logo-hybrid-v2.mjs +0 -213
- package/scripts/generate-logo-hybrid.mjs +0 -209
- package/scripts/generate-logo-infinity.mjs +0 -239
- package/scripts/generate-logo-mythology.mjs +0 -190
- package/scripts/generate-logo-orchestration.mjs +0 -228
- package/scripts/generate-logo-recraft.mjs +0 -147
- package/scripts/generate-logo-simple.mjs +0 -154
- package/scripts/generate-logo.mjs +0 -117
|
@@ -28,7 +28,7 @@ await esbuild.build({
|
|
|
28
28
|
// Prefer ESM modules over UMD/CommonJS to avoid bundling issues
|
|
29
29
|
mainFields: ['module', 'main'],
|
|
30
30
|
// Bundle all dependencies except Node.js built-ins
|
|
31
|
-
external: ['node:*', 'fs', 'path', 'os', 'crypto', 'child_process', 'util', 'stream', 'events', 'buffer', 'url', 'assert', 'http', 'https', 'net', 'tls', 'dns', 'readline', 'zlib', 'diagnostics_channel'],
|
|
31
|
+
external: ['node:*', 'fs', 'path', 'os', 'crypto', 'child_process', 'util', 'stream', 'events', 'buffer', 'url', 'assert', 'http', 'https', 'net', 'tls', 'dns', 'readline', 'zlib', 'diagnostics_channel', 'gpt-tokenizer'],
|
|
32
32
|
define: {
|
|
33
33
|
'process.env.NODE_ENV': '"production"'
|
|
34
34
|
},
|
package/.claude/CLAUDE.md
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
2
|
-
|
|
3
|
-
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
-
|
|
5
|
-
## Build Commands
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm run build # Compile TypeScript to dist/
|
|
9
|
-
npm run dev # Watch mode compilation
|
|
10
|
-
npm test # Run Vitest in watch mode
|
|
11
|
-
npm run test:run # Run tests once
|
|
12
|
-
npm run test:coverage # Run tests with coverage report
|
|
13
|
-
npm run lint # ESLint check
|
|
14
|
-
npm run format # Prettier formatting
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
### CLI Development
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
# After building, test the CLI locally
|
|
21
|
-
node dist/cli/index.js install --local # Install to ./.claude/
|
|
22
|
-
node dist/cli/index.js config # Show current config
|
|
23
|
-
node dist/cli/index.js info # Show agents & features
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Architecture
|
|
27
|
-
|
|
28
|
-
Olympus is a multi-agent orchestration system for Claude Code. It installs agents, slash commands, and hooks into the Claude Code configuration directory.
|
|
29
|
-
|
|
30
|
-
### Key Directories
|
|
31
|
-
|
|
32
|
-
- **`src/agents/`** - Agent definitions (oracle.ts, prometheus.ts, etc.). Each exports an `AgentConfig` and prompt metadata.
|
|
33
|
-
- **`src/features/`** - Core features: magic keywords, background tasks, model routing, continuation enforcement
|
|
34
|
-
- **`src/hooks/`** - Claude Code event handlers (keyword detection, persistence loops, context injection)
|
|
35
|
-
- **`src/cli/`** - CLI commands (install, config, info, update)
|
|
36
|
-
- **`src/installer/`** - Contains all agent/command/hook definitions as embedded constants (AGENT_DEFINITIONS, COMMAND_DEFINITIONS, etc.)
|
|
37
|
-
|
|
38
|
-
### Agent System
|
|
39
|
-
|
|
40
|
-
Agents are defined in `src/installer/index.ts` as the `AGENT_DEFINITIONS` constant. Each entry contains:
|
|
41
|
-
- Frontmatter (name, description, tools, model)
|
|
42
|
-
- Full agent prompt with instructions
|
|
43
|
-
|
|
44
|
-
Agents support tiered variants for model routing (e.g., `oracle`, `oracle-medium`, `oracle-low`).
|
|
45
|
-
|
|
46
|
-
### How Installation Works
|
|
47
|
-
|
|
48
|
-
The CLI's `install` command writes embedded templates from `src/installer/index.ts` to the user's Claude Code config directory:
|
|
49
|
-
- Global: `~/.claude/agents/`, `~/.claude/commands/`, etc.
|
|
50
|
-
- Local: `./.claude/agents/`, `./.claude/commands/`, etc.
|
|
51
|
-
|
|
52
|
-
### Configuration
|
|
53
|
-
|
|
54
|
-
Config files use JSONC format:
|
|
55
|
-
- User config: `~/.claude/olympus.jsonc`
|
|
56
|
-
- Project config: `./.claude/olympus.jsonc`
|
|
57
|
-
|
|
58
|
-
Schema defined in `src/shared/types.ts` using Zod.
|
|
59
|
-
|
|
60
|
-
## Testing
|
|
61
|
-
|
|
62
|
-
Tests are in `src/__tests__/`. Run a single test file:
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
npx vitest run src/__tests__/model-routing.test.ts
|
|
66
|
-
```
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Generate Olympus logo - Hybrid Version 2
|
|
5
|
-
* Alternative variation of the hybrid approach
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* node scripts/generate-logo-hybrid-v2.mjs
|
|
9
|
-
*
|
|
10
|
-
* Requires: REPLICATE_API_TOKEN in .env.local
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
14
|
-
import { fileURLToPath } from 'url';
|
|
15
|
-
import { dirname, join } from 'path';
|
|
16
|
-
|
|
17
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
-
const __dirname = dirname(__filename);
|
|
19
|
-
const projectRoot = join(__dirname, '..');
|
|
20
|
-
|
|
21
|
-
// Load .env.local manually
|
|
22
|
-
const envPath = join(projectRoot, '.env.local');
|
|
23
|
-
if (!existsSync(envPath)) {
|
|
24
|
-
console.error('ā Error: .env.local file not found');
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const envContent = readFileSync(envPath, 'utf-8');
|
|
29
|
-
const envLines = envContent.split('\n');
|
|
30
|
-
let REPLICATE_API_TOKEN = null;
|
|
31
|
-
|
|
32
|
-
for (const line of envLines) {
|
|
33
|
-
const trimmed = line.trim();
|
|
34
|
-
if (trimmed.startsWith('REPLICATE_API_TOKEN=')) {
|
|
35
|
-
REPLICATE_API_TOKEN = trimmed.split('=')[1].trim().replace(/['"]/g, '');
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (!REPLICATE_API_TOKEN) {
|
|
41
|
-
console.error('ā Error: REPLICATE_API_TOKEN not found in .env.local');
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
console.log('ā
Loaded API token from .env.local\n');
|
|
46
|
-
|
|
47
|
-
// Hybrid V2: Slightly different emphasis - more iconic, bold, memorable
|
|
48
|
-
const prompt = `
|
|
49
|
-
Minimalist iconic logo for "Olympus" - AI orchestration platform.
|
|
50
|
-
Greek mythology symbolism meets modern tech branding.
|
|
51
|
-
|
|
52
|
-
PRIMARY CONCEPT:
|
|
53
|
-
Bold geometric Mount Olympus peak (sharp angular silhouette) with a powerful stylized Zeus lightning bolt forming the vertical centerline. The lightning bolt should be integrated AS PART OF the mountain structure, not separate. Small constellation of 4 glowing points arranged symmetrically around the peak representing the divine pantheon of AI agents working in harmony.
|
|
54
|
-
|
|
55
|
-
KEY DESIGN PRINCIPLES:
|
|
56
|
-
- ICONIC: Instantly recognizable even at 32x32px favicon size
|
|
57
|
-
- BOLD: Strong shapes, confident lines, commanding presence
|
|
58
|
-
- BALANCED: Perfect symmetry like Greek architecture
|
|
59
|
-
- MEANINGFUL: Every element represents Olympus's purpose (mountain = foundation, lightning = command, stars = agents)
|
|
60
|
-
- SCALABLE: Works from favicon to billboard
|
|
61
|
-
|
|
62
|
-
VISUAL COMPOSITION:
|
|
63
|
-
- Mountain: Geometric triangle/peak with clean edges, 60% of canvas height
|
|
64
|
-
- Lightning bolt: Central vertical element, golden, merges with mountain form
|
|
65
|
-
- Stars/orbs: 4 points arranged in cross or diamond pattern around peak
|
|
66
|
-
- Negative space: Dark background lets the icon breathe
|
|
67
|
-
- Sacred geometry: Proportions follow golden ratio if possible
|
|
68
|
-
|
|
69
|
-
COLOR STRATEGY:
|
|
70
|
-
- Dominant gold (#FFD700 to #FFAA00) - Divine power, premium quality
|
|
71
|
-
- Supporting blue (#1E3A8A to #3B82F6) - Intelligence, sky/cloud infrastructure
|
|
72
|
-
- Accent cyan (#06B6D4) - Energy, lightning, code execution
|
|
73
|
-
- Highlight white/gold glow (#FEF3C7) - Stars, divine light
|
|
74
|
-
- Background dark navy (#0F172A) or transparent
|
|
75
|
-
|
|
76
|
-
STYLE REFERENCES:
|
|
77
|
-
- Geometric precision of Stripe's logo
|
|
78
|
-
- Bold simplicity of Linear's mark
|
|
79
|
-
- Memorable iconography like Vercel's triangle
|
|
80
|
-
- But with: Greek mythology soul + AI orchestration story
|
|
81
|
-
|
|
82
|
-
COMPOSITION RULES:
|
|
83
|
-
- Center-aligned, perfectly symmetrical
|
|
84
|
-
- Mountain forms stable triangular base
|
|
85
|
-
- Lightning creates vertical energy line
|
|
86
|
-
- Stars create horizontal balance points
|
|
87
|
-
- All elements connect into unified symbol
|
|
88
|
-
|
|
89
|
-
TECHNICAL SPECS:
|
|
90
|
-
- Square format (1024x1024px)
|
|
91
|
-
- Clean vector-style edges (even though PNG output)
|
|
92
|
-
- High contrast for visibility
|
|
93
|
-
- No thin lines that disappear at small sizes
|
|
94
|
-
- Test mentally: "Does this work as a 64px favicon?"
|
|
95
|
-
|
|
96
|
-
FORBIDDEN ELEMENTS:
|
|
97
|
-
- NO text, letters, typography, words
|
|
98
|
-
- NO excessive detail or texture
|
|
99
|
-
- NO photorealism or 3D effects
|
|
100
|
-
- NO cartoony or playful style
|
|
101
|
-
- NO busy backgrounds or patterns
|
|
102
|
-
|
|
103
|
-
FINAL CHECK:
|
|
104
|
-
Ask yourself: "If Zeus was a modern tech CEO launching a cloud platform for AI orchestration, what logo would he commission?" Professional. Powerful. Divine. But minimalist and modern.
|
|
105
|
-
|
|
106
|
-
VARIATION NOTES FOR V2:
|
|
107
|
-
Make this version slightly bolder and more graphic than V1. Stronger shapes, more confident composition. Think "This logo could be painted on the side of SpaceX rocket" - that level of bold simplicity.
|
|
108
|
-
`.trim();
|
|
109
|
-
|
|
110
|
-
console.log('ā” Generating Olympus Hybrid Logo V2...\n');
|
|
111
|
-
console.log('šÆ Variation: Bolder, more iconic, stronger shapes');
|
|
112
|
-
console.log('š Emphasis: Command + symmetry + memorability');
|
|
113
|
-
console.log('šļø Lightning integrated INTO mountain structure');
|
|
114
|
-
console.log('ā³ Generating with FLUX 1.1 Pro...\n');
|
|
115
|
-
|
|
116
|
-
async function generateLogo() {
|
|
117
|
-
try {
|
|
118
|
-
// Create prediction using FLUX 1.1 Pro
|
|
119
|
-
const createResponse = await fetch('https://api.replicate.com/v1/predictions', {
|
|
120
|
-
method: 'POST',
|
|
121
|
-
headers: {
|
|
122
|
-
'Authorization': `Bearer ${REPLICATE_API_TOKEN}`,
|
|
123
|
-
'Content-Type': 'application/json',
|
|
124
|
-
'Prefer': 'wait'
|
|
125
|
-
},
|
|
126
|
-
body: JSON.stringify({
|
|
127
|
-
version: 'black-forest-labs/flux-1.1-pro',
|
|
128
|
-
input: {
|
|
129
|
-
prompt: prompt,
|
|
130
|
-
aspect_ratio: '1:1',
|
|
131
|
-
output_format: 'png',
|
|
132
|
-
output_quality: 100,
|
|
133
|
-
safety_tolerance: 2,
|
|
134
|
-
prompt_upsampling: true
|
|
135
|
-
}
|
|
136
|
-
})
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
if (!createResponse.ok) {
|
|
140
|
-
const error = await createResponse.text();
|
|
141
|
-
throw new Error(`API error (${createResponse.status}): ${error}`);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const prediction = await createResponse.json();
|
|
145
|
-
console.log('š Prediction ID:', prediction.id);
|
|
146
|
-
|
|
147
|
-
// Poll for completion
|
|
148
|
-
let result = prediction;
|
|
149
|
-
while (result.status === 'starting' || result.status === 'processing') {
|
|
150
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
151
|
-
|
|
152
|
-
const pollResponse = await fetch(
|
|
153
|
-
`https://api.replicate.com/v1/predictions/${prediction.id}`,
|
|
154
|
-
{
|
|
155
|
-
headers: {
|
|
156
|
-
'Authorization': `Bearer ${REPLICATE_API_TOKEN}`,
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
result = await pollResponse.json();
|
|
162
|
-
console.log('ā³ Status:', result.status);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
if (result.status !== 'succeeded') {
|
|
166
|
-
throw new Error(`Generation failed with status: ${result.status}`);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const imageUrl = result.output;
|
|
170
|
-
console.log('\nā
Generation complete!');
|
|
171
|
-
console.log('š Image URL:', imageUrl);
|
|
172
|
-
|
|
173
|
-
// Download the image
|
|
174
|
-
console.log('\nš„ Downloading image...');
|
|
175
|
-
const imageResponse = await fetch(imageUrl);
|
|
176
|
-
const arrayBuffer = await imageResponse.arrayBuffer();
|
|
177
|
-
const buffer = Buffer.from(arrayBuffer);
|
|
178
|
-
|
|
179
|
-
// Save to docs/assets/
|
|
180
|
-
const logoPath = join(projectRoot, 'docs', 'assets', 'logo-hybrid-v2.png');
|
|
181
|
-
const timestamp = Date.now();
|
|
182
|
-
const logoWithTimestamp = join(projectRoot, 'docs', 'assets', `logo-hybrid-v2-${timestamp}.png`);
|
|
183
|
-
|
|
184
|
-
writeFileSync(logoPath, buffer);
|
|
185
|
-
writeFileSync(logoWithTimestamp, buffer);
|
|
186
|
-
|
|
187
|
-
console.log('ā
Logo saved to:', logoPath);
|
|
188
|
-
console.log('ā
Backup saved to:', logoWithTimestamp);
|
|
189
|
-
console.log('\nā” Hybrid V2 Features:');
|
|
190
|
-
console.log(' ā Bolder, more iconic shapes');
|
|
191
|
-
console.log(' ā Lightning integrated into mountain');
|
|
192
|
-
console.log(' ā Perfect symmetry (Greek architecture)');
|
|
193
|
-
console.log(' ā Designed for maximum recognition');
|
|
194
|
-
console.log('\nš Done! Your hybrid V2 logo is ready.');
|
|
195
|
-
console.log('\nš Now compare both hybrid versions:');
|
|
196
|
-
console.log(' - docs/assets/logo-hybrid.png (V1 - first hybrid)');
|
|
197
|
-
console.log(' - docs/assets/logo-hybrid-v2.png (V2 - NEW, bolder)');
|
|
198
|
-
console.log('\nNext: Choose your favorite and we\'ll finalize it!');
|
|
199
|
-
|
|
200
|
-
} catch (error) {
|
|
201
|
-
console.error('\nā Error:', error.message);
|
|
202
|
-
|
|
203
|
-
if (error.message.includes('401') || error.message.includes('authentication')) {
|
|
204
|
-
console.error('\nš” Tip: Check that your REPLICATE_API_TOKEN is correct');
|
|
205
|
-
} else if (error.message.includes('quota') || error.message.includes('billing')) {
|
|
206
|
-
console.error('\nš” Tip: Check your Replicate billing');
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
process.exit(1);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
generateLogo();
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Generate Olympus logo - Hybrid Version
|
|
5
|
-
* Merges clean modern aesthetic with Greek mythology symbolism
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* node scripts/generate-logo-hybrid.mjs
|
|
9
|
-
*
|
|
10
|
-
* Requires: REPLICATE_API_TOKEN in .env.local
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
14
|
-
import { fileURLToPath } from 'url';
|
|
15
|
-
import { dirname, join } from 'path';
|
|
16
|
-
|
|
17
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
-
const __dirname = dirname(__filename);
|
|
19
|
-
const projectRoot = join(__dirname, '..');
|
|
20
|
-
|
|
21
|
-
// Load .env.local manually
|
|
22
|
-
const envPath = join(projectRoot, '.env.local');
|
|
23
|
-
if (!existsSync(envPath)) {
|
|
24
|
-
console.error('ā Error: .env.local file not found');
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const envContent = readFileSync(envPath, 'utf-8');
|
|
29
|
-
const envLines = envContent.split('\n');
|
|
30
|
-
let REPLICATE_API_TOKEN = null;
|
|
31
|
-
|
|
32
|
-
for (const line of envLines) {
|
|
33
|
-
const trimmed = line.trim();
|
|
34
|
-
if (trimmed.startsWith('REPLICATE_API_TOKEN=')) {
|
|
35
|
-
REPLICATE_API_TOKEN = trimmed.split('=')[1].trim().replace(/['"]/g, '');
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (!REPLICATE_API_TOKEN) {
|
|
41
|
-
console.error('ā Error: REPLICATE_API_TOKEN not found in .env.local');
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
console.log('ā
Loaded API token from .env.local\n');
|
|
46
|
-
|
|
47
|
-
// Hybrid prompt: Clean modern + Greek mythology symbolism
|
|
48
|
-
const prompt = `
|
|
49
|
-
Professional minimalist logo for AI orchestration platform "Olympus".
|
|
50
|
-
Merge modern tech aesthetic with subtle Greek mythology symbolism.
|
|
51
|
-
|
|
52
|
-
CORE CONCEPT:
|
|
53
|
-
Geometric Mount Olympus peak (clean, minimal silhouette) with stylized Zeus golden lightning bolt striking down the center. Three to five small glowing points or stars around the peak representing the pantheon of specialized AI agents (Oracle, Prometheus, Olympian). The mountain forms the stable foundation, the lightning represents command and action, the stars represent distributed intelligence.
|
|
54
|
-
|
|
55
|
-
STYLE DIRECTION:
|
|
56
|
-
- MINIMALIST FIRST: Clean geometric shapes, not overly detailed
|
|
57
|
-
- Modern software branding like Vercel, Linear, or Stripe
|
|
58
|
-
- Subtle Greek mythology elements (not fantasy art)
|
|
59
|
-
- Flat design with strategic use of gradients
|
|
60
|
-
- Professional, iconic, memorable at any size
|
|
61
|
-
- Think: "Google meets Greek mythology" not "Game of Thrones"
|
|
62
|
-
|
|
63
|
-
VISUAL ELEMENTS:
|
|
64
|
-
- Geometric mountain peak: Sharp, angular, clean lines (like first logo)
|
|
65
|
-
- Golden lightning bolt: Stylized, integrated into design (not sitting on top)
|
|
66
|
-
- 3-5 subtle glowing orbs or stars: Arranged symmetrically around peak
|
|
67
|
-
- Optional: Very subtle circuit patterns in background mist
|
|
68
|
-
- Optional: Hint of Greek column shapes in negative space
|
|
69
|
-
|
|
70
|
-
COLOR PALETTE:
|
|
71
|
-
- Primary: Golden yellow to electric gold gradient (#FFD700 to #FFA500)
|
|
72
|
-
- Secondary: Deep blue to royal blue (#1E40AF to #3B82F6)
|
|
73
|
-
- Accents: Bright cyan for lightning energy (#60A5FA)
|
|
74
|
-
- Stars/orbs: White or golden glow (#FFFFFF or #FDE68A)
|
|
75
|
-
- Background: Dark navy (#0A0E27) or transparent
|
|
76
|
-
|
|
77
|
-
COMPOSITION:
|
|
78
|
-
- Centered, balanced, symmetrical
|
|
79
|
-
- Square format (1:1 aspect ratio)
|
|
80
|
-
- Mountain takes up 50-60% of canvas
|
|
81
|
-
- Lightning bolt as central vertical element
|
|
82
|
-
- Stars positioned around peak in pleasing arrangement
|
|
83
|
-
- Negative space is important - don't overcrowd
|
|
84
|
-
|
|
85
|
-
TECHNICAL REQUIREMENTS:
|
|
86
|
-
- High resolution, sharp edges
|
|
87
|
-
- Suitable for: favicon (64px), GitHub header (1200px), app icon
|
|
88
|
-
- Works in monochrome (single color version still recognizable)
|
|
89
|
-
- No gradients on tiny details (they'll blur at small sizes)
|
|
90
|
-
|
|
91
|
-
ABSOLUTELY FORBIDDEN:
|
|
92
|
-
- NO text, words, letters, or typography
|
|
93
|
-
- NOT overly detailed or cluttered
|
|
94
|
-
- NOT cartoonish or game-like
|
|
95
|
-
- NOT photorealistic or 3D rendered
|
|
96
|
-
- NOT fantasy art style
|
|
97
|
-
|
|
98
|
-
REFERENCE AESTHETIC:
|
|
99
|
-
Think modern tech logos (Notion, Linear, Vercel) but with personality and story. Clean enough for professional branding, interesting enough to be memorable. The mythology is in the symbolism, not in the rendering style.
|
|
100
|
-
|
|
101
|
-
BALANCE TARGET:
|
|
102
|
-
70% clean modern minimalism + 30% Greek mythology symbolism
|
|
103
|
-
`.trim();
|
|
104
|
-
|
|
105
|
-
console.log('ā” Generating Olympus Hybrid Logo...\n');
|
|
106
|
-
console.log('šÆ Approach: Modern minimalism + Greek symbolism');
|
|
107
|
-
console.log('š Balance: 70% clean tech, 30% mythology');
|
|
108
|
-
console.log('šļø Elements: Geometric mountain + lightning + constellation');
|
|
109
|
-
console.log('ā³ Generating with FLUX 1.1 Pro...\n');
|
|
110
|
-
|
|
111
|
-
async function generateLogo() {
|
|
112
|
-
try {
|
|
113
|
-
// Create prediction using FLUX 1.1 Pro
|
|
114
|
-
const createResponse = await fetch('https://api.replicate.com/v1/predictions', {
|
|
115
|
-
method: 'POST',
|
|
116
|
-
headers: {
|
|
117
|
-
'Authorization': `Bearer ${REPLICATE_API_TOKEN}`,
|
|
118
|
-
'Content-Type': 'application/json',
|
|
119
|
-
'Prefer': 'wait'
|
|
120
|
-
},
|
|
121
|
-
body: JSON.stringify({
|
|
122
|
-
version: 'black-forest-labs/flux-1.1-pro',
|
|
123
|
-
input: {
|
|
124
|
-
prompt: prompt,
|
|
125
|
-
aspect_ratio: '1:1',
|
|
126
|
-
output_format: 'png',
|
|
127
|
-
output_quality: 100,
|
|
128
|
-
safety_tolerance: 2,
|
|
129
|
-
prompt_upsampling: true
|
|
130
|
-
}
|
|
131
|
-
})
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
if (!createResponse.ok) {
|
|
135
|
-
const error = await createResponse.text();
|
|
136
|
-
throw new Error(`API error (${createResponse.status}): ${error}`);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const prediction = await createResponse.json();
|
|
140
|
-
console.log('š Prediction ID:', prediction.id);
|
|
141
|
-
|
|
142
|
-
// Poll for completion
|
|
143
|
-
let result = prediction;
|
|
144
|
-
while (result.status === 'starting' || result.status === 'processing') {
|
|
145
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
146
|
-
|
|
147
|
-
const pollResponse = await fetch(
|
|
148
|
-
`https://api.replicate.com/v1/predictions/${prediction.id}`,
|
|
149
|
-
{
|
|
150
|
-
headers: {
|
|
151
|
-
'Authorization': `Bearer ${REPLICATE_API_TOKEN}`,
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
result = await pollResponse.json();
|
|
157
|
-
console.log('ā³ Status:', result.status);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
if (result.status !== 'succeeded') {
|
|
161
|
-
throw new Error(`Generation failed with status: ${result.status}`);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const imageUrl = result.output;
|
|
165
|
-
console.log('\nā
Generation complete!');
|
|
166
|
-
console.log('š Image URL:', imageUrl);
|
|
167
|
-
|
|
168
|
-
// Download the image
|
|
169
|
-
console.log('\nš„ Downloading image...');
|
|
170
|
-
const imageResponse = await fetch(imageUrl);
|
|
171
|
-
const arrayBuffer = await imageResponse.arrayBuffer();
|
|
172
|
-
const buffer = Buffer.from(arrayBuffer);
|
|
173
|
-
|
|
174
|
-
// Save to docs/assets/
|
|
175
|
-
const logoPath = join(projectRoot, 'docs', 'assets', 'logo-hybrid.png');
|
|
176
|
-
const timestamp = Date.now();
|
|
177
|
-
const logoWithTimestamp = join(projectRoot, 'docs', 'assets', `logo-hybrid-${timestamp}.png`);
|
|
178
|
-
|
|
179
|
-
writeFileSync(logoPath, buffer);
|
|
180
|
-
writeFileSync(logoWithTimestamp, buffer);
|
|
181
|
-
|
|
182
|
-
console.log('ā
Logo saved to:', logoPath);
|
|
183
|
-
console.log('ā
Backup saved to:', logoWithTimestamp);
|
|
184
|
-
console.log('\nā” Hybrid Logo Features:');
|
|
185
|
-
console.log(' ā Clean geometric mountain (modern aesthetic)');
|
|
186
|
-
console.log(' ā Stylized Zeus lightning (Greek power symbol)');
|
|
187
|
-
console.log(' ā Constellation of agent stars (pantheon concept)');
|
|
188
|
-
console.log(' ā Professional minimalism meets mythology');
|
|
189
|
-
console.log('\nš Done! Your hybrid logo is ready.');
|
|
190
|
-
console.log('\nš Compare all three versions:');
|
|
191
|
-
console.log(' 1. docs/assets/logo.png (original simple)');
|
|
192
|
-
console.log(' 2. docs/assets/logo-mythology.png (full mythology)');
|
|
193
|
-
console.log(' 3. docs/assets/logo-hybrid.png (NEW - best of both)');
|
|
194
|
-
console.log('\nNext: Choose your favorite and I\'ll add it to README!');
|
|
195
|
-
|
|
196
|
-
} catch (error) {
|
|
197
|
-
console.error('\nā Error:', error.message);
|
|
198
|
-
|
|
199
|
-
if (error.message.includes('401') || error.message.includes('authentication')) {
|
|
200
|
-
console.error('\nš” Tip: Check that your REPLICATE_API_TOKEN is correct');
|
|
201
|
-
} else if (error.message.includes('quota') || error.message.includes('billing')) {
|
|
202
|
-
console.error('\nš” Tip: Check your Replicate billing');
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
process.exit(1);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
generateLogo();
|