olympus-ai 2.7.3 ā 3.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/.claude/.olympus-version.json +6 -0
- package/.claude/CLAUDE.md +1 -49
- 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 +30 -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/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/COPYRIGHT +22 -0
- package/LICENSE +1 -1
- package/NOTICE +24 -0
- package/README.md +431 -61
- 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 +23 -6
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +47 -14
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/document-writer.d.ts +13 -3
- package/dist/agents/document-writer.d.ts.map +1 -1
- package/dist/agents/document-writer.js +13 -3
- package/dist/agents/document-writer.js.map +1 -1
- package/dist/agents/explore.d.ts +13 -4
- package/dist/agents/explore.d.ts.map +1 -1
- package/dist/agents/explore.js +13 -4
- package/dist/agents/explore.js.map +1 -1
- package/dist/agents/frontend-engineer.d.ts +14 -3
- package/dist/agents/frontend-engineer.d.ts.map +1 -1
- package/dist/agents/frontend-engineer.js +14 -3
- package/dist/agents/frontend-engineer.js.map +1 -1
- package/dist/agents/librarian.d.ts +13 -4
- package/dist/agents/librarian.d.ts.map +1 -1
- package/dist/agents/librarian.js +13 -4
- package/dist/agents/librarian.js.map +1 -1
- package/dist/agents/metis.d.ts +12 -4
- package/dist/agents/metis.d.ts.map +1 -1
- package/dist/agents/metis.js +12 -4
- package/dist/agents/metis.js.map +1 -1
- package/dist/agents/momus.d.ts +12 -4
- package/dist/agents/momus.d.ts.map +1 -1
- package/dist/agents/momus.js +12 -4
- package/dist/agents/momus.js.map +1 -1
- package/dist/agents/multimodal-looker.d.ts +13 -3
- package/dist/agents/multimodal-looker.d.ts.map +1 -1
- package/dist/agents/multimodal-looker.js +13 -3
- package/dist/agents/multimodal-looker.js.map +1 -1
- package/dist/agents/olympian.d.ts +14 -4
- package/dist/agents/olympian.d.ts.map +1 -1
- package/dist/agents/olympian.js +37 -11
- package/dist/agents/olympian.js.map +1 -1
- package/dist/agents/oracle.d.ts +13 -5
- package/dist/agents/oracle.d.ts.map +1 -1
- package/dist/agents/oracle.js +13 -5
- package/dist/agents/oracle.js.map +1 -1
- package/dist/agents/orchestrator-olympus.d.ts +13 -3
- package/dist/agents/orchestrator-olympus.d.ts.map +1 -1
- package/dist/agents/orchestrator-olympus.js +14 -4
- package/dist/agents/orchestrator-olympus.js.map +1 -1
- package/dist/agents/prometheus.d.ts +12 -4
- package/dist/agents/prometheus.d.ts.map +1 -1
- package/dist/agents/prometheus.js +12 -4
- package/dist/agents/prometheus.js.map +1 -1
- package/dist/agents/types.d.ts +10 -3
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/types.js +10 -3
- package/dist/agents/types.js.map +1 -1
- package/dist/agents/utils.d.ts +9 -4
- package/dist/agents/utils.d.ts.map +1 -1
- package/dist/agents/utils.js +9 -4
- package/dist/agents/utils.js.map +1 -1
- package/dist/cli/index.js +128 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/config/loader.js +1 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/features/background-agent/concurrency.d.ts +1 -1
- package/dist/features/background-agent/concurrency.js +1 -1
- package/dist/features/background-agent/index.d.ts +1 -1
- package/dist/features/background-agent/index.js +1 -1
- package/dist/features/background-agent/manager.d.ts +1 -1
- package/dist/features/background-agent/manager.js +1 -1
- package/dist/features/background-agent/types.d.ts +1 -1
- package/dist/features/background-agent/types.js +1 -1
- package/dist/features/background-tasks.d.ts +11 -11
- package/dist/features/background-tasks.js +11 -11
- package/dist/features/builtin-skills/index.d.ts +1 -1
- package/dist/features/builtin-skills/index.js +1 -1
- package/dist/features/builtin-skills/skills.d.ts +1 -1
- package/dist/features/builtin-skills/skills.js +1 -1
- package/dist/features/builtin-skills/types.d.ts +1 -1
- package/dist/features/builtin-skills/types.js +1 -1
- package/dist/features/context-injector/collector.d.ts +9 -4
- package/dist/features/context-injector/collector.d.ts.map +1 -1
- package/dist/features/context-injector/collector.js +9 -4
- package/dist/features/context-injector/collector.js.map +1 -1
- package/dist/features/context-injector/index.d.ts +1 -1
- package/dist/features/context-injector/index.js +1 -1
- package/dist/features/context-injector/injector.d.ts +1 -1
- package/dist/features/context-injector/injector.js +1 -1
- package/dist/features/context-injector/types.d.ts +1 -1
- package/dist/features/context-injector/types.js +1 -1
- package/dist/features/continuation-enforcement.d.ts +5 -2
- package/dist/features/continuation-enforcement.d.ts.map +1 -1
- package/dist/features/continuation-enforcement.js +10 -4
- package/dist/features/continuation-enforcement.js.map +1 -1
- package/dist/features/magic-keywords.d.ts +12 -3
- package/dist/features/magic-keywords.d.ts.map +1 -1
- package/dist/features/magic-keywords.js +12 -3
- package/dist/features/magic-keywords.js.map +1 -1
- package/dist/features/quest-state/constants.d.ts +1 -1
- package/dist/features/quest-state/constants.js +1 -1
- package/dist/features/quest-state/index.d.ts +1 -1
- package/dist/features/quest-state/index.js +1 -1
- package/dist/features/quest-state/storage.d.ts +1 -1
- package/dist/features/quest-state/storage.js +1 -1
- package/dist/features/quest-state/types.d.ts +1 -1
- package/dist/features/quest-state/types.js +1 -1
- package/dist/hooks/agent-usage-reminder/constants.d.ts +1 -1
- package/dist/hooks/agent-usage-reminder/constants.js +1 -1
- package/dist/hooks/agent-usage-reminder/index.d.ts +1 -1
- package/dist/hooks/agent-usage-reminder/index.js +1 -1
- package/dist/hooks/agent-usage-reminder/storage.d.ts +1 -1
- package/dist/hooks/agent-usage-reminder/storage.js +1 -1
- package/dist/hooks/agent-usage-reminder/types.d.ts +1 -1
- package/dist/hooks/agent-usage-reminder/types.js +1 -1
- package/dist/hooks/ascent/index.d.ts +1 -1
- package/dist/hooks/ascent/index.js +1 -1
- package/dist/hooks/auto-slash-command/constants.d.ts +1 -1
- package/dist/hooks/auto-slash-command/constants.js +1 -1
- package/dist/hooks/auto-slash-command/detector.d.ts +1 -1
- package/dist/hooks/auto-slash-command/detector.js +1 -1
- package/dist/hooks/auto-slash-command/executor.d.ts +1 -1
- package/dist/hooks/auto-slash-command/executor.js +1 -1
- package/dist/hooks/auto-slash-command/index.d.ts +1 -1
- package/dist/hooks/auto-slash-command/index.js +1 -1
- package/dist/hooks/auto-slash-command/types.d.ts +1 -1
- package/dist/hooks/auto-slash-command/types.js +1 -1
- package/dist/hooks/background-notification/index.d.ts +7 -4
- package/dist/hooks/background-notification/index.d.ts.map +1 -1
- package/dist/hooks/background-notification/index.js +7 -4
- package/dist/hooks/background-notification/index.js.map +1 -1
- package/dist/hooks/background-notification/types.d.ts +1 -1
- package/dist/hooks/background-notification/types.js +1 -1
- package/dist/hooks/comment-checker/constants.d.ts +1 -1
- package/dist/hooks/comment-checker/constants.js +1 -1
- package/dist/hooks/comment-checker/filters.d.ts +1 -1
- package/dist/hooks/comment-checker/filters.js +1 -1
- package/dist/hooks/comment-checker/index.d.ts +1 -1
- package/dist/hooks/comment-checker/index.js +1 -1
- package/dist/hooks/comment-checker/types.d.ts +1 -1
- package/dist/hooks/comment-checker/types.js +1 -1
- package/dist/hooks/context-window-limit-recovery/constants.d.ts +1 -1
- package/dist/hooks/context-window-limit-recovery/constants.js +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/context-window-limit-recovery/parser.d.ts +1 -1
- package/dist/hooks/context-window-limit-recovery/parser.js +1 -1
- package/dist/hooks/context-window-limit-recovery/types.d.ts +1 -1
- package/dist/hooks/context-window-limit-recovery/types.js +1 -1
- package/dist/hooks/directory-readme-injector/constants.d.ts +1 -1
- package/dist/hooks/directory-readme-injector/constants.js +1 -1
- package/dist/hooks/directory-readme-injector/index.d.ts +1 -1
- package/dist/hooks/directory-readme-injector/index.js +1 -1
- package/dist/hooks/directory-readme-injector/storage.d.ts +1 -1
- package/dist/hooks/directory-readme-injector/storage.js +1 -1
- package/dist/hooks/directory-readme-injector/types.d.ts +1 -1
- package/dist/hooks/directory-readme-injector/types.js +1 -1
- package/dist/hooks/edit-error-recovery/index.d.ts +1 -1
- package/dist/hooks/edit-error-recovery/index.js +1 -1
- package/dist/hooks/empty-message-sanitizer/constants.d.ts +1 -1
- package/dist/hooks/empty-message-sanitizer/constants.js +1 -1
- package/dist/hooks/empty-message-sanitizer/index.d.ts +1 -1
- package/dist/hooks/empty-message-sanitizer/index.js +1 -1
- package/dist/hooks/empty-message-sanitizer/types.d.ts +1 -1
- package/dist/hooks/empty-message-sanitizer/types.js +1 -1
- package/dist/hooks/keyword-detector/index.d.ts +7 -3
- package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
- package/dist/hooks/keyword-detector/index.js +7 -3
- package/dist/hooks/keyword-detector/index.js.map +1 -1
- package/dist/hooks/olympus-orchestrator/constants.d.ts +4 -4
- package/dist/hooks/olympus-orchestrator/constants.d.ts.map +1 -1
- package/dist/hooks/olympus-orchestrator/constants.js +4 -4
- package/dist/hooks/olympus-orchestrator/index.d.ts +8 -5
- package/dist/hooks/olympus-orchestrator/index.d.ts.map +1 -1
- package/dist/hooks/olympus-orchestrator/index.js +8 -5
- package/dist/hooks/olympus-orchestrator/index.js.map +1 -1
- package/dist/hooks/preemptive-compaction/constants.d.ts +1 -1
- package/dist/hooks/preemptive-compaction/constants.js +1 -1
- package/dist/hooks/preemptive-compaction/index.d.ts +3 -4
- package/dist/hooks/preemptive-compaction/index.d.ts.map +1 -1
- package/dist/hooks/preemptive-compaction/index.js +3 -4
- package/dist/hooks/preemptive-compaction/index.js.map +1 -1
- package/dist/hooks/preemptive-compaction/types.d.ts +1 -1
- package/dist/hooks/preemptive-compaction/types.js +1 -1
- package/dist/hooks/rules-injector/constants.d.ts +1 -1
- package/dist/hooks/rules-injector/constants.js +1 -1
- package/dist/hooks/rules-injector/finder.d.ts +1 -1
- package/dist/hooks/rules-injector/finder.js +1 -1
- package/dist/hooks/rules-injector/index.d.ts +1 -1
- package/dist/hooks/rules-injector/index.js +1 -1
- package/dist/hooks/rules-injector/matcher.d.ts +1 -1
- package/dist/hooks/rules-injector/matcher.js +1 -1
- package/dist/hooks/rules-injector/parser.d.ts +1 -1
- package/dist/hooks/rules-injector/parser.js +1 -1
- package/dist/hooks/rules-injector/storage.d.ts +1 -1
- package/dist/hooks/rules-injector/storage.js +1 -1
- package/dist/hooks/rules-injector/types.d.ts +1 -1
- package/dist/hooks/rules-injector/types.js +1 -1
- package/dist/hooks/session-recovery/constants.d.ts +1 -1
- package/dist/hooks/session-recovery/constants.js +1 -1
- package/dist/hooks/session-recovery/index.d.ts +1 -1
- package/dist/hooks/session-recovery/index.js +1 -1
- package/dist/hooks/session-recovery/storage.d.ts +1 -1
- package/dist/hooks/session-recovery/storage.js +1 -1
- package/dist/hooks/session-recovery/types.d.ts +1 -1
- package/dist/hooks/session-recovery/types.js +1 -1
- package/dist/hooks/think-mode/detector.d.ts +1 -1
- package/dist/hooks/think-mode/detector.js +1 -1
- package/dist/hooks/think-mode/index.d.ts +1 -1
- package/dist/hooks/think-mode/index.js +1 -1
- package/dist/hooks/think-mode/switcher.d.ts +1 -1
- package/dist/hooks/think-mode/switcher.js +1 -1
- package/dist/hooks/think-mode/types.d.ts +1 -1
- package/dist/hooks/think-mode/types.js +1 -1
- package/dist/hooks/thinking-block-validator/constants.d.ts +1 -1
- package/dist/hooks/thinking-block-validator/constants.js +1 -1
- package/dist/hooks/thinking-block-validator/index.d.ts +1 -1
- package/dist/hooks/thinking-block-validator/index.js +1 -1
- package/dist/hooks/thinking-block-validator/types.d.ts +1 -1
- package/dist/hooks/thinking-block-validator/types.js +1 -1
- package/dist/hooks/todo-continuation/index.d.ts +1 -1
- package/dist/hooks/todo-continuation/index.js +1 -1
- package/dist/index.d.ts +15 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -10
- package/dist/index.js.map +1 -1
- package/dist/installer/hooks.d.ts +70 -24
- package/dist/installer/hooks.d.ts.map +1 -1
- package/dist/installer/hooks.js +69 -24
- package/dist/installer/hooks.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 +29 -13
- 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 +12 -7
- 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 +0 -2
- package/scripts/rebrand.mjs +206 -0
- /package/scripts/{claude-sisyphus.sh ā claude-olympus.sh} +0 -0
- /package/scripts/{sisyphus-aliases.sh ā olympus-aliases.sh} +0 -0
|
@@ -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
|
@@ -1123,7 +1123,6 @@ cat > "$CLAUDE_CONFIG_DIR/hooks/keyword-detector.sh" << 'HOOK_EOF'
|
|
|
1123
1123
|
#!/bin/bash
|
|
1124
1124
|
# Olympus Keyword Detector Hook
|
|
1125
1125
|
# Detects ultrawork/ultrathink/search/analyze keywords and injects enhanced mode messages
|
|
1126
|
-
# Ported from oh-my-opencode's keyword-detector hook
|
|
1127
1126
|
|
|
1128
1127
|
# Read stdin (JSON input from Claude Code)
|
|
1129
1128
|
INPUT=$(cat)
|
|
@@ -1201,7 +1200,6 @@ cat > "$CLAUDE_CONFIG_DIR/hooks/stop-continuation.sh" << 'HOOK_EOF'
|
|
|
1201
1200
|
#!/bin/bash
|
|
1202
1201
|
# Olympus Stop Continuation Hook
|
|
1203
1202
|
# Checks for incomplete todos and injects continuation prompt
|
|
1204
|
-
# Ported from oh-my-opencode's todo-continuation-enforcer
|
|
1205
1203
|
|
|
1206
1204
|
# Read stdin
|
|
1207
1205
|
INPUT=$(cat)
|
|
@@ -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"');
|
|
File without changes
|
|
File without changes
|