olympus-ai 2.7.4 ā 3.2.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/.olympus-version.json +6 -0
- package/.claude/CLAUDE.md +84 -61
- package/.claude/agents/document-writer.md +152 -0
- package/.claude/agents/explore-medium.md +25 -0
- package/.claude/agents/explore.md +86 -0
- package/.claude/agents/frontend-engineer-high.md +17 -0
- package/.claude/agents/frontend-engineer-low.md +17 -0
- package/.claude/agents/frontend-engineer.md +80 -0
- package/.claude/agents/librarian-low.md +22 -0
- package/.claude/agents/librarian.md +70 -0
- package/.claude/agents/metis.md +85 -0
- package/.claude/agents/momus.md +97 -0
- package/.claude/agents/multimodal-looker.md +39 -0
- package/.claude/agents/olympian-high.md +32 -0
- package/.claude/agents/olympian-low.md +22 -0
- package/.claude/agents/olympian.md +78 -0
- package/.claude/agents/oracle-low.md +23 -0
- package/.claude/agents/oracle-medium.md +28 -0
- package/.claude/agents/oracle.md +77 -0
- package/.claude/agents/prometheus.md +125 -0
- package/.claude/agents/qa-tester.md +220 -0
- package/.claude/commands/analyze/skill.md +14 -0
- package/.claude/commands/ascent/skill.md +152 -0
- package/.claude/commands/cancel-ascent.md +9 -0
- package/.claude/commands/complete-plan.md +101 -0
- package/.claude/commands/deepsearch/skill.md +15 -0
- package/.claude/commands/olympus/skill.md +82 -0
- package/.claude/commands/olympus-default.md +26 -0
- package/.claude/commands/plan.md +71 -0
- package/.claude/commands/prometheus/skill.md +38 -0
- package/.claude/commands/review/skill.md +34 -0
- package/.claude/commands/ultrawork/skill.md +90 -0
- package/.claude/commands/update.md +38 -0
- package/.claude-plugin/plugin.json +1 -1
- package/COPYRIGHT +22 -0
- package/LICENSE +1 -1
- package/NOTICE +24 -0
- package/README.md +376 -10
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/learning/cleanup.test.d.ts +2 -0
- package/dist/__tests__/learning/cleanup.test.d.ts.map +1 -0
- package/dist/__tests__/learning/cleanup.test.js +122 -0
- package/dist/__tests__/learning/cleanup.test.js.map +1 -0
- package/dist/__tests__/learning/storage.test.d.ts +2 -0
- package/dist/__tests__/learning/storage.test.d.ts.map +1 -0
- package/dist/__tests__/learning/storage.test.js +75 -0
- package/dist/__tests__/learning/storage.test.js.map +1 -0
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +22 -6
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/olympian.d.ts.map +1 -1
- package/dist/agents/olympian.js +23 -7
- package/dist/agents/olympian.js.map +1 -1
- package/dist/agents/orchestrator-olympus.js +1 -1
- package/dist/cli/index.js +128 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/hooks/context-window-limit-recovery/index.d.ts +2 -3
- package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -1
- package/dist/hooks/context-window-limit-recovery/index.js +2 -3
- package/dist/hooks/context-window-limit-recovery/index.js.map +1 -1
- package/dist/hooks/olympus-orchestrator/constants.d.ts +3 -3
- package/dist/hooks/olympus-orchestrator/constants.d.ts.map +1 -1
- package/dist/hooks/olympus-orchestrator/constants.js +3 -3
- package/dist/hooks/preemptive-compaction/index.d.ts +2 -3
- package/dist/hooks/preemptive-compaction/index.d.ts.map +1 -1
- package/dist/hooks/preemptive-compaction/index.js +2 -3
- package/dist/hooks/preemptive-compaction/index.js.map +1 -1
- package/dist/installer/index.d.ts +2 -2
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +114 -30
- package/dist/installer/index.js.map +1 -1
- package/dist/learning/cleanup.d.ts +18 -0
- package/dist/learning/cleanup.d.ts.map +1 -0
- package/dist/learning/cleanup.js +160 -0
- package/dist/learning/cleanup.js.map +1 -0
- package/dist/learning/discovery.d.ts.map +1 -1
- package/dist/learning/discovery.js +3 -1
- package/dist/learning/discovery.js.map +1 -1
- package/dist/learning/pattern-extractor.d.ts +1 -1
- package/dist/learning/pattern-extractor.d.ts.map +1 -1
- package/dist/learning/pattern-extractor.js +4 -2
- package/dist/learning/pattern-extractor.js.map +1 -1
- package/dist/learning/stats.d.ts +28 -0
- package/dist/learning/stats.d.ts.map +1 -0
- package/dist/learning/stats.js +112 -0
- package/dist/learning/stats.js.map +1 -0
- package/dist/learning/storage.d.ts +4 -0
- package/dist/learning/storage.d.ts.map +1 -1
- package/dist/learning/storage.js +26 -1
- package/dist/learning/storage.js.map +1 -1
- package/package.json +9 -4
- package/{dist ā scripts/dist}/hooks/olympus-hooks.cjs +70 -69
- package/scripts/esbuild.hooks.mjs +67 -0
- package/scripts/generate-logo-hybrid-v2.mjs +213 -0
- package/scripts/generate-logo-hybrid.mjs +209 -0
- package/scripts/generate-logo-infinity.mjs +239 -0
- package/scripts/generate-logo-mythology.mjs +190 -0
- package/scripts/generate-logo-orchestration.mjs +228 -0
- package/scripts/generate-logo-recraft.mjs +147 -0
- package/scripts/generate-logo-simple.mjs +154 -0
- package/scripts/generate-logo.mjs +117 -0
- package/scripts/install.sh +4 -7
- package/scripts/rebrand.mjs +206 -0
- package/.claude-plugin/nul +0 -3
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generate Olympus logo using Recraft V3 SVG
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* node scripts/generate-logo-recraft.mjs
|
|
8
|
+
*
|
|
9
|
+
* Requires: REPLICATE_API_TOKEN in .env.local
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
import { dirname, join } from 'path';
|
|
15
|
+
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
const projectRoot = join(__dirname, '..');
|
|
19
|
+
|
|
20
|
+
// Load .env.local manually
|
|
21
|
+
const envPath = join(projectRoot, '.env.local');
|
|
22
|
+
if (!existsSync(envPath)) {
|
|
23
|
+
console.error('ā Error: .env.local file not found');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const envContent = readFileSync(envPath, 'utf-8');
|
|
28
|
+
const envLines = envContent.split('\n');
|
|
29
|
+
let REPLICATE_API_TOKEN = null;
|
|
30
|
+
|
|
31
|
+
for (const line of envLines) {
|
|
32
|
+
const trimmed = line.trim();
|
|
33
|
+
if (trimmed.startsWith('REPLICATE_API_TOKEN=')) {
|
|
34
|
+
REPLICATE_API_TOKEN = trimmed.split('=')[1].trim().replace(/['"]/g, '');
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!REPLICATE_API_TOKEN) {
|
|
40
|
+
console.error('ā Error: REPLICATE_API_TOKEN not found in .env.local');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
console.log('ā
Loaded API token from .env.local\n');
|
|
45
|
+
|
|
46
|
+
const prompt = `
|
|
47
|
+
Minimalist logo icon for developer tool.
|
|
48
|
+
Mount Olympus geometric peak with golden lightning bolt.
|
|
49
|
+
Vector art style, clean lines, modern tech aesthetic.
|
|
50
|
+
Gold to blue gradient (#FFD700 to #1E40AF).
|
|
51
|
+
Dark background or transparent.
|
|
52
|
+
Flat design, centered, iconic symbol.
|
|
53
|
+
NO TEXT - icon only.
|
|
54
|
+
`.trim();
|
|
55
|
+
|
|
56
|
+
console.log('šØ Generating Olympus logo with Recraft V3 SVG...\n');
|
|
57
|
+
console.log('š Output: Scalable Vector Graphics (SVG)');
|
|
58
|
+
console.log('ā³ This may take 30-60 seconds...\n');
|
|
59
|
+
|
|
60
|
+
async function generateLogo() {
|
|
61
|
+
try {
|
|
62
|
+
// Using Recraft V3 SVG model
|
|
63
|
+
// Model page: https://replicate.com/recraft-ai/recraft-v3-svg
|
|
64
|
+
const createResponse = await fetch('https://api.replicate.com/v1/models/recraft-ai/recraft-v3-svg/predictions', {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: {
|
|
67
|
+
'Authorization': `Bearer ${REPLICATE_API_TOKEN}`,
|
|
68
|
+
'Content-Type': 'application/json',
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify({
|
|
71
|
+
input: {
|
|
72
|
+
prompt: prompt,
|
|
73
|
+
size: '1024x1024',
|
|
74
|
+
style: 'line_circuit'
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
if (!createResponse.ok) {
|
|
80
|
+
const error = await createResponse.text();
|
|
81
|
+
throw new Error(`API error (${createResponse.status}): ${error}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const prediction = await createResponse.json();
|
|
85
|
+
console.log('š Prediction ID:', prediction.id);
|
|
86
|
+
|
|
87
|
+
// Poll for completion
|
|
88
|
+
let result = prediction;
|
|
89
|
+
while (result.status === 'starting' || result.status === 'processing') {
|
|
90
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
91
|
+
|
|
92
|
+
const pollResponse = await fetch(
|
|
93
|
+
`https://api.replicate.com/v1/predictions/${prediction.id}`,
|
|
94
|
+
{
|
|
95
|
+
headers: {
|
|
96
|
+
'Authorization': `Bearer ${REPLICATE_API_TOKEN}`,
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
result = await pollResponse.json();
|
|
102
|
+
console.log('ā³ Status:', result.status);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (result.status !== 'succeeded') {
|
|
106
|
+
throw new Error(`Generation failed with status: ${result.status}. ${result.error || ''}`);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const svgUrl = result.output;
|
|
110
|
+
console.log('\nā
Generation complete!');
|
|
111
|
+
console.log('š SVG URL:', svgUrl);
|
|
112
|
+
|
|
113
|
+
// Download the SVG
|
|
114
|
+
console.log('\nš„ Downloading SVG...');
|
|
115
|
+
const svgResponse = await fetch(svgUrl);
|
|
116
|
+
const svgContent = await svgResponse.text();
|
|
117
|
+
|
|
118
|
+
// Save SVG to docs/assets/
|
|
119
|
+
const svgPath = join(projectRoot, 'docs', 'assets', 'logo.svg');
|
|
120
|
+
writeFileSync(svgPath, svgContent);
|
|
121
|
+
|
|
122
|
+
console.log('ā
Logo saved to:', svgPath);
|
|
123
|
+
console.log('\nš Done! Your SVG logo is ready.');
|
|
124
|
+
console.log('\nš SVG Benefits:');
|
|
125
|
+
console.log(' ā Infinitely scalable without quality loss');
|
|
126
|
+
console.log(' ā Smaller file size than PNG');
|
|
127
|
+
console.log(' ā Can be styled with CSS');
|
|
128
|
+
console.log(' ā Perfect for favicons, headers, and all sizes');
|
|
129
|
+
console.log('\nNext steps:');
|
|
130
|
+
console.log('1. View: docs/assets/logo.svg');
|
|
131
|
+
console.log('2. If approved, I\'ll add it to README and create PNG versions');
|
|
132
|
+
console.log('3. If not satisfied, run again for a new generation');
|
|
133
|
+
|
|
134
|
+
} catch (error) {
|
|
135
|
+
console.error('\nā Error:', error.message);
|
|
136
|
+
|
|
137
|
+
if (error.message.includes('401') || error.message.includes('authentication')) {
|
|
138
|
+
console.error('\nš” Tip: Check that your REPLICATE_API_TOKEN is correct');
|
|
139
|
+
} else if (error.message.includes('quota') || error.message.includes('billing')) {
|
|
140
|
+
console.error('\nš” Tip: Check your Replicate billing');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
generateLogo();
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generate Olympus logo using Replicate API (no SDK needed)
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* node scripts/generate-logo-simple.mjs
|
|
8
|
+
*
|
|
9
|
+
* Requires: REPLICATE_API_TOKEN in .env.local
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
import { dirname, join } from 'path';
|
|
15
|
+
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
const projectRoot = join(__dirname, '..');
|
|
19
|
+
|
|
20
|
+
// Load .env.local manually
|
|
21
|
+
const envPath = join(projectRoot, '.env.local');
|
|
22
|
+
if (!existsSync(envPath)) {
|
|
23
|
+
console.error('ā Error: .env.local file not found');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const envContent = readFileSync(envPath, 'utf-8');
|
|
28
|
+
const envLines = envContent.split('\n');
|
|
29
|
+
let REPLICATE_API_TOKEN = null;
|
|
30
|
+
|
|
31
|
+
for (const line of envLines) {
|
|
32
|
+
const trimmed = line.trim();
|
|
33
|
+
if (trimmed.startsWith('REPLICATE_API_TOKEN=')) {
|
|
34
|
+
REPLICATE_API_TOKEN = trimmed.split('=')[1].trim().replace(/['"]/g, '');
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!REPLICATE_API_TOKEN) {
|
|
40
|
+
console.error('ā Error: REPLICATE_API_TOKEN not found in .env.local');
|
|
41
|
+
console.error('');
|
|
42
|
+
console.error('Add to .env.local:');
|
|
43
|
+
console.error(' REPLICATE_API_TOKEN=your_token_here');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
console.log('ā
Loaded API token from .env.local\n');
|
|
48
|
+
|
|
49
|
+
const prompt = `
|
|
50
|
+
Professional minimalist logo for developer tool software.
|
|
51
|
+
Geometric Mount Olympus mountain peak with integrated golden lightning bolt.
|
|
52
|
+
Clean modern tech aesthetic with subtle circuit board patterns.
|
|
53
|
+
Color palette: rich gold (#FFD700) to deep blue (#1E40AF) gradient with electric blue (#60A5FA) accents.
|
|
54
|
+
Dark navy background (#0A0E27) or transparent.
|
|
55
|
+
Flat design, iconic symbol, centered composition.
|
|
56
|
+
Vector art style, suitable for GitHub repository header and favicon.
|
|
57
|
+
Style: minimalist, geometric, modern software branding, clean lines.
|
|
58
|
+
NO TEXT, NO WORDS, NO LETTERS - icon only.
|
|
59
|
+
`.trim();
|
|
60
|
+
|
|
61
|
+
console.log('šØ Generating Olympus logo with Recraft V3 (SVG)...\n');
|
|
62
|
+
console.log('š Output format: SVG (scalable vector graphics)');
|
|
63
|
+
console.log('ā³ This may take 30-60 seconds...\n');
|
|
64
|
+
|
|
65
|
+
async function generateLogo() {
|
|
66
|
+
try {
|
|
67
|
+
// Create prediction using recraft-ai/recraft-v3-svg
|
|
68
|
+
const createResponse = await fetch('https://api.replicate.com/v1/predictions', {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers: {
|
|
71
|
+
'Authorization': `Bearer ${REPLICATE_API_TOKEN}`,
|
|
72
|
+
'Content-Type': 'application/json',
|
|
73
|
+
'Prefer': 'wait'
|
|
74
|
+
},
|
|
75
|
+
body: JSON.stringify({
|
|
76
|
+
version: 'recraft-ai/recraft-v3-svg',
|
|
77
|
+
input: {
|
|
78
|
+
prompt: prompt,
|
|
79
|
+
size: '1024',
|
|
80
|
+
style: 'digital_illustration'
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
if (!createResponse.ok) {
|
|
86
|
+
const error = await createResponse.text();
|
|
87
|
+
throw new Error(`API error (${createResponse.status}): ${error}`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const prediction = await createResponse.json();
|
|
91
|
+
console.log('š Prediction ID:', prediction.id);
|
|
92
|
+
|
|
93
|
+
// Poll for completion
|
|
94
|
+
let result = prediction;
|
|
95
|
+
while (result.status === 'starting' || result.status === 'processing') {
|
|
96
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
97
|
+
|
|
98
|
+
const pollResponse = await fetch(
|
|
99
|
+
`https://api.replicate.com/v1/predictions/${prediction.id}`,
|
|
100
|
+
{
|
|
101
|
+
headers: {
|
|
102
|
+
'Authorization': `Bearer ${REPLICATE_API_TOKEN}`,
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
result = await pollResponse.json();
|
|
108
|
+
console.log('ā³ Status:', result.status);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (result.status !== 'succeeded') {
|
|
112
|
+
throw new Error(`Generation failed with status: ${result.status}`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const svgUrl = result.output;
|
|
116
|
+
console.log('\nā
Generation complete!');
|
|
117
|
+
console.log('š SVG URL:', svgUrl);
|
|
118
|
+
|
|
119
|
+
// Download the SVG
|
|
120
|
+
console.log('\nš„ Downloading SVG...');
|
|
121
|
+
const svgResponse = await fetch(svgUrl);
|
|
122
|
+
const svgContent = await svgResponse.text();
|
|
123
|
+
|
|
124
|
+
// Save SVG to docs/assets/
|
|
125
|
+
const svgPath = join(projectRoot, 'docs', 'assets', 'logo.svg');
|
|
126
|
+
writeFileSync(svgPath, svgContent);
|
|
127
|
+
|
|
128
|
+
console.log('ā
Logo saved to:', svgPath);
|
|
129
|
+
console.log('\nš Done! Your SVG logo is ready.');
|
|
130
|
+
console.log('\nš SVG Benefits:');
|
|
131
|
+
console.log(' - Infinitely scalable without quality loss');
|
|
132
|
+
console.log(' - Smaller file size than PNG');
|
|
133
|
+
console.log(' - Can be styled with CSS');
|
|
134
|
+
console.log(' - Perfect for favicons, headers, and prints');
|
|
135
|
+
console.log('\nNext steps:');
|
|
136
|
+
console.log('1. View the logo: docs/assets/logo.svg');
|
|
137
|
+
console.log('2. If you like it, we can add it to README.md');
|
|
138
|
+
console.log('3. We can also convert to PNG for compatibility');
|
|
139
|
+
console.log('4. If not satisfied, run this script again for a new generation');
|
|
140
|
+
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.error('\nā Error:', error.message);
|
|
143
|
+
|
|
144
|
+
if (error.message.includes('401') || error.message.includes('authentication')) {
|
|
145
|
+
console.error('\nš” Tip: Check that your REPLICATE_API_TOKEN is correct');
|
|
146
|
+
} else if (error.message.includes('quota') || error.message.includes('billing')) {
|
|
147
|
+
console.error('\nš” Tip: Check your Replicate billing at https://replicate.com/account/billing');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
generateLogo();
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generate Olympus logo using Replicate
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* node scripts/generate-logo.mjs
|
|
8
|
+
*
|
|
9
|
+
* Requires: REPLICATE_API_TOKEN in .env.local
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import Replicate from 'replicate';
|
|
13
|
+
import { config } from 'dotenv';
|
|
14
|
+
import { writeFileSync, existsSync } from 'fs';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
import { dirname, join } from 'path';
|
|
17
|
+
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = dirname(__filename);
|
|
20
|
+
const projectRoot = join(__dirname, '..');
|
|
21
|
+
|
|
22
|
+
// Load .env.local
|
|
23
|
+
const envPath = join(projectRoot, '.env.local');
|
|
24
|
+
if (existsSync(envPath)) {
|
|
25
|
+
config({ path: envPath });
|
|
26
|
+
console.log('ā
Loaded environment from .env.local\n');
|
|
27
|
+
} else {
|
|
28
|
+
console.error('ā Error: .env.local file not found');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Check for API token
|
|
33
|
+
if (!process.env.REPLICATE_API_TOKEN) {
|
|
34
|
+
console.error('ā Error: REPLICATE_API_TOKEN not found in .env.local');
|
|
35
|
+
console.error('');
|
|
36
|
+
console.error('Add to .env.local:');
|
|
37
|
+
console.error(' REPLICATE_API_TOKEN=your_token_here');
|
|
38
|
+
console.error('');
|
|
39
|
+
console.error('Get your token at: https://replicate.com/account/api-tokens');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const replicate = new Replicate({
|
|
44
|
+
auth: process.env.REPLICATE_API_TOKEN,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const prompt = `
|
|
48
|
+
Professional minimalist logo for developer tool software.
|
|
49
|
+
Geometric Mount Olympus mountain peak with integrated golden lightning bolt.
|
|
50
|
+
Clean modern tech aesthetic with circuit board patterns.
|
|
51
|
+
Color palette: rich gold (#FFD700) to deep blue (#1E40AF) gradient with electric blue (#60A5FA) accents.
|
|
52
|
+
Dark navy background (#0A0E27) or transparent.
|
|
53
|
+
Flat design, iconic symbol, centered composition.
|
|
54
|
+
High quality, square format, suitable for GitHub repository header.
|
|
55
|
+
Style: minimalist, geometric, modern software branding.
|
|
56
|
+
NO TEXT, NO WORDS, NO LETTERS - icon only.
|
|
57
|
+
`.trim();
|
|
58
|
+
|
|
59
|
+
const negativePrompt = `
|
|
60
|
+
text, words, letters, typography, font, label, title,
|
|
61
|
+
blurry, low quality, 3d render, photorealistic,
|
|
62
|
+
cluttered, busy, cartoon, clipart, watermark, signature
|
|
63
|
+
`.trim();
|
|
64
|
+
|
|
65
|
+
console.log('šØ Generating Olympus logo...\n');
|
|
66
|
+
console.log('Prompt:', prompt);
|
|
67
|
+
console.log('\nNegative:', negativePrompt);
|
|
68
|
+
console.log('\nā³ This may take 30-60 seconds...\n');
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
// Using FLUX 1.1 Pro for high-quality logo generation
|
|
72
|
+
const output = await replicate.run(
|
|
73
|
+
"black-forest-labs/flux-1.1-pro",
|
|
74
|
+
{
|
|
75
|
+
input: {
|
|
76
|
+
prompt: prompt,
|
|
77
|
+
aspect_ratio: "1:1",
|
|
78
|
+
output_format: "png",
|
|
79
|
+
output_quality: 100,
|
|
80
|
+
safety_tolerance: 2,
|
|
81
|
+
prompt_upsampling: true
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
console.log('ā
Generation complete!');
|
|
87
|
+
console.log('Output URL:', output);
|
|
88
|
+
|
|
89
|
+
// Download the image
|
|
90
|
+
console.log('\nš„ Downloading image...');
|
|
91
|
+
const response = await fetch(output);
|
|
92
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
93
|
+
const buffer = Buffer.from(arrayBuffer);
|
|
94
|
+
|
|
95
|
+
// Save to docs/assets/
|
|
96
|
+
const logoPath = join(projectRoot, 'docs', 'assets', 'logo.png');
|
|
97
|
+
writeFileSync(logoPath, buffer);
|
|
98
|
+
|
|
99
|
+
console.log('ā
Logo saved to:', logoPath);
|
|
100
|
+
console.log('\nš Done! Your logo is ready.');
|
|
101
|
+
console.log('\nNext steps:');
|
|
102
|
+
console.log('1. View the logo: docs/assets/logo.png');
|
|
103
|
+
console.log('2. If you like it, we can add it to README.md');
|
|
104
|
+
console.log('3. If not, run this script again or try a different model');
|
|
105
|
+
console.log('\nTo generate variations, modify the prompt in scripts/generate-logo.mjs');
|
|
106
|
+
|
|
107
|
+
} catch (error) {
|
|
108
|
+
console.error('ā Error generating logo:', error.message);
|
|
109
|
+
|
|
110
|
+
if (error.message.includes('authentication')) {
|
|
111
|
+
console.error('\nš” Tip: Check that your REPLICATE_API_TOKEN is correct');
|
|
112
|
+
} else if (error.message.includes('quota') || error.message.includes('billing')) {
|
|
113
|
+
console.error('\nš” Tip: Check your Replicate billing at https://replicate.com/account/billing');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
package/scripts/install.sh
CHANGED
|
@@ -1631,9 +1631,9 @@ SETTINGS_EOF
|
|
|
1631
1631
|
fi
|
|
1632
1632
|
fi
|
|
1633
1633
|
|
|
1634
|
-
#
|
|
1635
|
-
|
|
1636
|
-
|
|
1634
|
+
# Install CLAUDE.md to ~/.claude/CLAUDE.md
|
|
1635
|
+
# This works alongside any existing ~/CLAUDE.md - Claude Code loads both
|
|
1636
|
+
cat > "$CLAUDE_CONFIG_DIR/CLAUDE.md" << 'CLAUDEMD_EOF'
|
|
1637
1637
|
# Olympus Multi-Agent System
|
|
1638
1638
|
|
|
1639
1639
|
You are enhanced with the Olympus multi-agent orchestration system.
|
|
@@ -1838,10 +1838,7 @@ Before concluding ANY work session, verify:
|
|
|
1838
1838
|
|
|
1839
1839
|
The ascent continues until Olympus is reached.
|
|
1840
1840
|
CLAUDEMD_EOF
|
|
1841
|
-
|
|
1842
|
-
else
|
|
1843
|
-
echo -e "${YELLOW}ā CLAUDE.md already exists, skipping${NC}"
|
|
1844
|
-
fi
|
|
1841
|
+
echo -e "${GREEN}ā Installed $CLAUDE_CONFIG_DIR/CLAUDE.md${NC}"
|
|
1845
1842
|
|
|
1846
1843
|
# Save version metadata for auto-update system
|
|
1847
1844
|
# Fetch current version from GitHub package.json
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Rebrand Script: Olympus ā Olympus
|
|
5
|
+
*
|
|
6
|
+
* Renames:
|
|
7
|
+
* - olympus ā olympus
|
|
8
|
+
* - ascent (persistence loop) ā ascent
|
|
9
|
+
* - olympian ā olympian
|
|
10
|
+
*
|
|
11
|
+
* Run: node rebrand.mjs
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { readFileSync, writeFileSync, renameSync, readdirSync, statSync, existsSync } from 'fs';
|
|
15
|
+
import { join, basename, dirname } from 'path';
|
|
16
|
+
|
|
17
|
+
const ROOT = process.cwd();
|
|
18
|
+
|
|
19
|
+
// Text replacements (order matters - more specific first)
|
|
20
|
+
const TEXT_REPLACEMENTS = [
|
|
21
|
+
// Ascent loop ā Ascent (renamed from the-ascent)
|
|
22
|
+
['the-ascent', 'ascent'],
|
|
23
|
+
['the_ascent', 'ascent'],
|
|
24
|
+
['The-Ascent', 'Ascent'],
|
|
25
|
+
['The Ascent', 'Ascent'],
|
|
26
|
+
['THE_ASCENT', 'ASCENT'],
|
|
27
|
+
['THE-ASCENT', 'ASCENT'],
|
|
28
|
+
['cancel-ascent', 'cancel-ascent'],
|
|
29
|
+
['cancelAscent', 'cancelAscent'],
|
|
30
|
+
|
|
31
|
+
// Ascent ā Ascent (general)
|
|
32
|
+
['ascent', 'ascent'],
|
|
33
|
+
['Ascent', 'Ascent'],
|
|
34
|
+
['ASCENT', 'ASCENT'],
|
|
35
|
+
|
|
36
|
+
// Olympus Junior ā Olympian
|
|
37
|
+
['olympian', 'olympian'],
|
|
38
|
+
['olympian', 'olympian'],
|
|
39
|
+
['Olympian', 'Olympian'],
|
|
40
|
+
['OLYMPIAN', 'OLYMPIAN'],
|
|
41
|
+
|
|
42
|
+
// Olympus ā Olympus
|
|
43
|
+
['olympus-default', 'olympus-default'],
|
|
44
|
+
['/olympus', '/olympus'],
|
|
45
|
+
['olympus', 'olympus'],
|
|
46
|
+
['Olympus', 'Olympus'],
|
|
47
|
+
['OLYMPUS', 'OLYMPUS'],
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
// File/directory renames
|
|
51
|
+
const PATH_RENAMES = [
|
|
52
|
+
['.olympus', '.olympus'],
|
|
53
|
+
['olympian-high.md', 'olympian-high.md'],
|
|
54
|
+
['olympian-low.md', 'olympian-low.md'],
|
|
55
|
+
['olympian.md', 'olympian.md'],
|
|
56
|
+
['olympus-default.md', 'olympus-default.md'],
|
|
57
|
+
['the-ascent.md', 'ascent.md'],
|
|
58
|
+
['cancel-ascent.md', 'cancel-ascent.md'],
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
// Files to skip (binary, lock files, etc.)
|
|
62
|
+
const SKIP_PATTERNS = [
|
|
63
|
+
'node_modules',
|
|
64
|
+
'.git',
|
|
65
|
+
'package-lock.json',
|
|
66
|
+
'.png',
|
|
67
|
+
'.jpg',
|
|
68
|
+
'.ico',
|
|
69
|
+
'.woff',
|
|
70
|
+
'dist/',
|
|
71
|
+
];
|
|
72
|
+
|
|
73
|
+
function shouldSkip(path) {
|
|
74
|
+
return SKIP_PATTERNS.some(pattern => path.includes(pattern));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function replaceInFile(filePath) {
|
|
78
|
+
if (shouldSkip(filePath)) return false;
|
|
79
|
+
|
|
80
|
+
const ext = filePath.split('.').pop();
|
|
81
|
+
const textExtensions = ['md', 'json', 'js', 'ts', 'mjs', 'mts', 'txt', 'yaml', 'yml', 'sh', 'toml'];
|
|
82
|
+
|
|
83
|
+
if (!textExtensions.includes(ext)) return false;
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
let content = readFileSync(filePath, 'utf8');
|
|
87
|
+
let originalContent = content;
|
|
88
|
+
|
|
89
|
+
for (const [search, replace] of TEXT_REPLACEMENTS) {
|
|
90
|
+
content = content.split(search).join(replace);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (content !== originalContent) {
|
|
94
|
+
writeFileSync(filePath, content, 'utf8');
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
} catch (e) {
|
|
98
|
+
console.error(`Error processing ${filePath}: ${e.message}`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function renameIfNeeded(fullPath) {
|
|
105
|
+
const name = basename(fullPath);
|
|
106
|
+
|
|
107
|
+
for (const [oldName, newName] of PATH_RENAMES) {
|
|
108
|
+
if (name === oldName) {
|
|
109
|
+
const newPath = join(dirname(fullPath), newName);
|
|
110
|
+
try {
|
|
111
|
+
renameSync(fullPath, newPath);
|
|
112
|
+
console.log(` Renamed: ${name} ā ${newName}`);
|
|
113
|
+
return newPath;
|
|
114
|
+
} catch (e) {
|
|
115
|
+
console.error(` Error renaming ${name}: ${e.message}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return fullPath;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function walkDir(dir, fileCallback, dirCallback) {
|
|
124
|
+
if (shouldSkip(dir)) return;
|
|
125
|
+
|
|
126
|
+
const entries = readdirSync(dir);
|
|
127
|
+
|
|
128
|
+
// Process files first
|
|
129
|
+
for (const entry of entries) {
|
|
130
|
+
const fullPath = join(dir, entry);
|
|
131
|
+
if (shouldSkip(fullPath)) continue;
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
const stat = statSync(fullPath);
|
|
135
|
+
if (stat.isFile()) {
|
|
136
|
+
fileCallback(fullPath);
|
|
137
|
+
}
|
|
138
|
+
} catch (e) {}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Then process directories (and recurse)
|
|
142
|
+
for (const entry of entries) {
|
|
143
|
+
const fullPath = join(dir, entry);
|
|
144
|
+
if (shouldSkip(fullPath)) continue;
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
const stat = statSync(fullPath);
|
|
148
|
+
if (stat.isDirectory()) {
|
|
149
|
+
walkDir(fullPath, fileCallback, dirCallback);
|
|
150
|
+
dirCallback(fullPath);
|
|
151
|
+
}
|
|
152
|
+
} catch (e) {}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Main execution
|
|
157
|
+
console.log('šļø OLYMPUS REBRAND SCRIPT');
|
|
158
|
+
console.log('========================\n');
|
|
159
|
+
|
|
160
|
+
console.log('Step 1: Replacing text in files...');
|
|
161
|
+
let filesModified = 0;
|
|
162
|
+
walkDir(ROOT, (filePath) => {
|
|
163
|
+
if (replaceInFile(filePath)) {
|
|
164
|
+
filesModified++;
|
|
165
|
+
console.log(` Modified: ${filePath.replace(ROOT, '')}`);
|
|
166
|
+
}
|
|
167
|
+
}, () => {});
|
|
168
|
+
|
|
169
|
+
console.log(`\n ā Modified ${filesModified} files\n`);
|
|
170
|
+
|
|
171
|
+
console.log('Step 2: Renaming files and directories...');
|
|
172
|
+
walkDir(ROOT, () => {}, (dirPath) => {
|
|
173
|
+
renameIfNeeded(dirPath);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Rename files in key directories
|
|
177
|
+
const dirsToCheck = ['agents', 'commands', 'skills', 'hooks', '.'];
|
|
178
|
+
for (const dir of dirsToCheck) {
|
|
179
|
+
const fullDir = join(ROOT, dir);
|
|
180
|
+
if (existsSync(fullDir)) {
|
|
181
|
+
try {
|
|
182
|
+
const entries = readdirSync(fullDir);
|
|
183
|
+
for (const entry of entries) {
|
|
184
|
+
const fullPath = join(fullDir, entry);
|
|
185
|
+
if (statSync(fullPath).isFile()) {
|
|
186
|
+
renameIfNeeded(fullPath);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
} catch (e) {}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Rename .olympus directory
|
|
194
|
+
const olympusDir = join(ROOT, '.olympus');
|
|
195
|
+
const olympusDir = join(ROOT, '.olympus');
|
|
196
|
+
if (existsSync(olympusDir)) {
|
|
197
|
+
renameSync(olympusDir, olympusDir);
|
|
198
|
+
console.log(' Renamed: .olympus ā .olympus');
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
console.log('\nā
Rebrand complete!\n');
|
|
202
|
+
console.log('Next steps:');
|
|
203
|
+
console.log('1. Review the changes: git diff');
|
|
204
|
+
console.log('2. Update package.json with your details');
|
|
205
|
+
console.log('3. Update README.md with Olympus branding');
|
|
206
|
+
console.log('4. Commit: git add -A && git commit -m "Rebrand to Olympus"');
|
package/.claude-plugin/nul
DELETED