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.
Files changed (104) hide show
  1. package/.claude/.olympus-version.json +6 -0
  2. package/.claude/CLAUDE.md +84 -61
  3. package/.claude/agents/document-writer.md +152 -0
  4. package/.claude/agents/explore-medium.md +25 -0
  5. package/.claude/agents/explore.md +86 -0
  6. package/.claude/agents/frontend-engineer-high.md +17 -0
  7. package/.claude/agents/frontend-engineer-low.md +17 -0
  8. package/.claude/agents/frontend-engineer.md +80 -0
  9. package/.claude/agents/librarian-low.md +22 -0
  10. package/.claude/agents/librarian.md +70 -0
  11. package/.claude/agents/metis.md +85 -0
  12. package/.claude/agents/momus.md +97 -0
  13. package/.claude/agents/multimodal-looker.md +39 -0
  14. package/.claude/agents/olympian-high.md +32 -0
  15. package/.claude/agents/olympian-low.md +22 -0
  16. package/.claude/agents/olympian.md +78 -0
  17. package/.claude/agents/oracle-low.md +23 -0
  18. package/.claude/agents/oracle-medium.md +28 -0
  19. package/.claude/agents/oracle.md +77 -0
  20. package/.claude/agents/prometheus.md +125 -0
  21. package/.claude/agents/qa-tester.md +220 -0
  22. package/.claude/commands/analyze/skill.md +14 -0
  23. package/.claude/commands/ascent/skill.md +152 -0
  24. package/.claude/commands/cancel-ascent.md +9 -0
  25. package/.claude/commands/complete-plan.md +101 -0
  26. package/.claude/commands/deepsearch/skill.md +15 -0
  27. package/.claude/commands/olympus/skill.md +82 -0
  28. package/.claude/commands/olympus-default.md +26 -0
  29. package/.claude/commands/plan.md +71 -0
  30. package/.claude/commands/prometheus/skill.md +38 -0
  31. package/.claude/commands/review/skill.md +34 -0
  32. package/.claude/commands/ultrawork/skill.md +90 -0
  33. package/.claude/commands/update.md +38 -0
  34. package/.claude-plugin/plugin.json +1 -1
  35. package/COPYRIGHT +22 -0
  36. package/LICENSE +1 -1
  37. package/NOTICE +24 -0
  38. package/README.md +376 -10
  39. package/dist/__tests__/installer.test.js +1 -1
  40. package/dist/__tests__/learning/cleanup.test.d.ts +2 -0
  41. package/dist/__tests__/learning/cleanup.test.d.ts.map +1 -0
  42. package/dist/__tests__/learning/cleanup.test.js +122 -0
  43. package/dist/__tests__/learning/cleanup.test.js.map +1 -0
  44. package/dist/__tests__/learning/storage.test.d.ts +2 -0
  45. package/dist/__tests__/learning/storage.test.d.ts.map +1 -0
  46. package/dist/__tests__/learning/storage.test.js +75 -0
  47. package/dist/__tests__/learning/storage.test.js.map +1 -0
  48. package/dist/agents/definitions.d.ts.map +1 -1
  49. package/dist/agents/definitions.js +22 -6
  50. package/dist/agents/definitions.js.map +1 -1
  51. package/dist/agents/olympian.d.ts.map +1 -1
  52. package/dist/agents/olympian.js +23 -7
  53. package/dist/agents/olympian.js.map +1 -1
  54. package/dist/agents/orchestrator-olympus.js +1 -1
  55. package/dist/cli/index.js +128 -9
  56. package/dist/cli/index.js.map +1 -1
  57. package/dist/hooks/context-window-limit-recovery/index.d.ts +2 -3
  58. package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -1
  59. package/dist/hooks/context-window-limit-recovery/index.js +2 -3
  60. package/dist/hooks/context-window-limit-recovery/index.js.map +1 -1
  61. package/dist/hooks/olympus-orchestrator/constants.d.ts +3 -3
  62. package/dist/hooks/olympus-orchestrator/constants.d.ts.map +1 -1
  63. package/dist/hooks/olympus-orchestrator/constants.js +3 -3
  64. package/dist/hooks/preemptive-compaction/index.d.ts +2 -3
  65. package/dist/hooks/preemptive-compaction/index.d.ts.map +1 -1
  66. package/dist/hooks/preemptive-compaction/index.js +2 -3
  67. package/dist/hooks/preemptive-compaction/index.js.map +1 -1
  68. package/dist/installer/index.d.ts +2 -2
  69. package/dist/installer/index.d.ts.map +1 -1
  70. package/dist/installer/index.js +114 -30
  71. package/dist/installer/index.js.map +1 -1
  72. package/dist/learning/cleanup.d.ts +18 -0
  73. package/dist/learning/cleanup.d.ts.map +1 -0
  74. package/dist/learning/cleanup.js +160 -0
  75. package/dist/learning/cleanup.js.map +1 -0
  76. package/dist/learning/discovery.d.ts.map +1 -1
  77. package/dist/learning/discovery.js +3 -1
  78. package/dist/learning/discovery.js.map +1 -1
  79. package/dist/learning/pattern-extractor.d.ts +1 -1
  80. package/dist/learning/pattern-extractor.d.ts.map +1 -1
  81. package/dist/learning/pattern-extractor.js +4 -2
  82. package/dist/learning/pattern-extractor.js.map +1 -1
  83. package/dist/learning/stats.d.ts +28 -0
  84. package/dist/learning/stats.d.ts.map +1 -0
  85. package/dist/learning/stats.js +112 -0
  86. package/dist/learning/stats.js.map +1 -0
  87. package/dist/learning/storage.d.ts +4 -0
  88. package/dist/learning/storage.d.ts.map +1 -1
  89. package/dist/learning/storage.js +26 -1
  90. package/dist/learning/storage.js.map +1 -1
  91. package/package.json +9 -4
  92. package/{dist → scripts/dist}/hooks/olympus-hooks.cjs +70 -69
  93. package/scripts/esbuild.hooks.mjs +67 -0
  94. package/scripts/generate-logo-hybrid-v2.mjs +213 -0
  95. package/scripts/generate-logo-hybrid.mjs +209 -0
  96. package/scripts/generate-logo-infinity.mjs +239 -0
  97. package/scripts/generate-logo-mythology.mjs +190 -0
  98. package/scripts/generate-logo-orchestration.mjs +228 -0
  99. package/scripts/generate-logo-recraft.mjs +147 -0
  100. package/scripts/generate-logo-simple.mjs +154 -0
  101. package/scripts/generate-logo.mjs +117 -0
  102. package/scripts/install.sh +4 -7
  103. package/scripts/rebrand.mjs +206 -0
  104. 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
+ }
@@ -1631,9 +1631,9 @@ SETTINGS_EOF
1631
1631
  fi
1632
1632
  fi
1633
1633
 
1634
- # Only create CLAUDE.md if it doesn't exist in home directory
1635
- if [ ! -f "$HOME/CLAUDE.md" ]; then
1636
- cat > "$CLAUDE_CONFIG_DIR/CLAUDE.md" << 'CLAUDEMD_EOF'
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
- echo -e "${GREEN}āœ“ Created $CLAUDE_CONFIG_DIR/CLAUDE.md${NC}"
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"');
@@ -1,3 +0,0 @@
1
- FINDSTR: Cannot open I:/
2
- FINDSTR: Cannot open worthy
3
- FINDSTR: Cannot open *.md