opencode-athena 0.4.0 → 0.5.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.
@@ -178,7 +178,7 @@ opencode
178
178
  ```
179
179
  # Start story 2.1 in background
180
180
  background_task({
181
- agent: "general",
181
+ agent: "Sisyphus",
182
182
  prompt: "Implement BMAD story 2.1. Load context with athena_get_story({storyId: '2.1'}), implement following /athena-dev workflow, update status when complete.",
183
183
  description: "Story 2.1 implementation"
184
184
  })
@@ -216,7 +216,7 @@ async function executeParallel(storyIds: string[]) {
216
216
 
217
217
  // 3. Spawn background agents
218
218
  const tasks = storyIds.map(id => ({
219
- agent: "general", // or dedicated story-impl agent
219
+ agent: "Sisyphus",
220
220
  prompt: generateStoryPrompt(id),
221
221
  }));
222
222
 
@@ -33,7 +33,7 @@ This review runs in a **separate context** to preserve main session tokens.
33
33
  Use background_task to spawn a review agent:
34
34
 
35
35
  background_task({
36
- agent: "general",
36
+ agent: "oracle",
37
37
  description: "Party review of {identifier}",
38
38
  prompt: `
39
39
  You are performing a party review for Athena.
@@ -134,7 +134,7 @@ For each recommended agent, spawn a background task:
134
134
  ```
135
135
  # Spawn in parallel - all at once
136
136
  background_task({
137
- agent: "general",
137
+ agent: "oracle",
138
138
  description: "Architect analysis of {identifier}",
139
139
  prompt: `
140
140
  You are Winston, the Software Architect from BMAD.
@@ -14,7 +14,8 @@
14
14
  "librarian": "github-copilot/claude-haiku-4.5",
15
15
  "frontend": "github-copilot/claude-sonnet-4.5",
16
16
  "documentWriter": "github-copilot/gemini-2.5-pro",
17
- "multimodalLooker": "github-copilot/gemini-2.5-pro"
17
+ "multimodalLooker": "github-copilot/gemini-2.5-pro",
18
+ "explore": "github-copilot/gpt-5-mini"
18
19
  },
19
20
  "bmad": {
20
21
  "defaultTrack": "bmad-method",
@@ -28,7 +29,8 @@
28
29
  "notifications": true,
29
30
  "contextMonitor": true,
30
31
  "commentChecker": true,
31
- "lspTools": true
32
+ "lspTools": true,
33
+ "autoGitOperations": false
32
34
  },
33
35
  "mcps": {
34
36
  "context7": true,
@@ -15,13 +15,15 @@
15
15
  "frontend": "google/gemini-2.5-pro",
16
16
  "documentWriter": "anthropic/claude-opus-4-5",
17
17
  "multimodalLooker": "google/gemini-2.5-pro",
18
+ "explore": "google/gemini-2.5-flash",
18
19
  "settings": {
19
20
  "sisyphus": { "thinkingLevel": "high" },
20
21
  "oracle": { "thinkingLevel": "high" },
21
22
  "librarian": { "thinkingLevel": "medium" },
22
23
  "frontend": { "temperature": 0.5 },
23
24
  "documentWriter": { "temperature": 0.4 },
24
- "multimodalLooker": { "temperature": 0.2 }
25
+ "multimodalLooker": { "temperature": 0.2 },
26
+ "explore": { "thinkingLevel": "off", "temperature": 0.2 }
25
27
  }
26
28
  },
27
29
  "bmad": {
@@ -36,7 +38,8 @@
36
38
  "notifications": true,
37
39
  "contextMonitor": true,
38
40
  "commentChecker": true,
39
- "lspTools": true
41
+ "lspTools": true,
42
+ "autoGitOperations": false
40
43
  },
41
44
  "mcps": {
42
45
  "context7": true,
@@ -12,10 +12,12 @@
12
12
  "sisyphus": "anthropic/claude-sonnet-4-5",
13
13
  "oracle": "anthropic/claude-sonnet-4-5",
14
14
  "librarian": "anthropic/claude-sonnet-4-5",
15
+ "explore": "anthropic/claude-sonnet-4-5",
15
16
  "settings": {
16
17
  "sisyphus": { "temperature": 0.2 },
17
18
  "oracle": { "temperature": 0.1 },
18
- "librarian": { "temperature": 0.3 }
19
+ "librarian": { "temperature": 0.3 },
20
+ "explore": { "temperature": 0.2 }
19
21
  }
20
22
  },
21
23
  "bmad": {
@@ -30,7 +32,8 @@
30
32
  "notifications": false,
31
33
  "contextMonitor": false,
32
34
  "commentChecker": false,
33
- "lspTools": true
35
+ "lspTools": true,
36
+ "autoGitOperations": false
34
37
  },
35
38
  "mcps": {
36
39
  "context7": true,
@@ -12,10 +12,12 @@
12
12
  "sisyphus": "anthropic/claude-sonnet-4-5-thinking",
13
13
  "oracle": "anthropic/claude-sonnet-4-5-thinking",
14
14
  "librarian": "anthropic/claude-sonnet-4-5",
15
+ "explore": "anthropic/claude-sonnet-4-5",
15
16
  "settings": {
16
17
  "sisyphus": { "thinkingLevel": "medium" },
17
18
  "oracle": { "thinkingLevel": "high" },
18
- "librarian": { "temperature": 0.3 }
19
+ "librarian": { "temperature": 0.3 },
20
+ "explore": { "temperature": 0.2 }
19
21
  }
20
22
  },
21
23
  "bmad": {
@@ -30,7 +32,8 @@
30
32
  "notifications": true,
31
33
  "contextMonitor": true,
32
34
  "commentChecker": true,
33
- "lspTools": true
35
+ "lspTools": true,
36
+ "autoGitOperations": false
34
37
  },
35
38
  "mcps": {
36
39
  "context7": true,
@@ -15,13 +15,15 @@
15
15
  "frontend": "anthropic/claude-sonnet-4-5",
16
16
  "documentWriter": "google/gemini-2.5-pro",
17
17
  "multimodalLooker": "google/gemini-2.5-flash",
18
+ "explore": "google/gemini-2.5-flash",
18
19
  "settings": {
19
20
  "sisyphus": { "thinkingLevel": "medium" },
20
21
  "oracle": { "thinkingLevel": "high" },
21
22
  "librarian": { "thinkingLevel": "low" },
22
23
  "frontend": { "temperature": 0.5 },
23
24
  "documentWriter": { "temperature": 0.4 },
24
- "multimodalLooker": { "temperature": 0.2 }
25
+ "multimodalLooker": { "temperature": 0.2 },
26
+ "explore": { "thinkingLevel": "off", "temperature": 0.2 }
25
27
  }
26
28
  },
27
29
  "bmad": {
@@ -36,7 +38,8 @@
36
38
  "notifications": true,
37
39
  "contextMonitor": true,
38
40
  "commentChecker": true,
39
- "lspTools": true
41
+ "lspTools": true,
42
+ "autoGitOperations": false
40
43
  },
41
44
  "mcps": {
42
45
  "context7": true,
@@ -92,6 +92,10 @@
92
92
  "type": "string",
93
93
  "description": "Model for image analysis agent"
94
94
  },
95
+ "explore": {
96
+ "type": "string",
97
+ "description": "Model for fast codebase exploration agent"
98
+ },
95
99
  "settings": {
96
100
  "type": "object",
97
101
  "description": "Optional agent-specific settings for temperature and thinking level",
@@ -102,6 +106,7 @@
102
106
  "frontend": { "$ref": "#/definitions/agentSettings" },
103
107
  "documentWriter": { "$ref": "#/definitions/agentSettings" },
104
108
  "multimodalLooker": { "$ref": "#/definitions/agentSettings" },
109
+ "explore": { "$ref": "#/definitions/agentSettings" },
105
110
  "overrides": {
106
111
  "type": "object",
107
112
  "description": "Per-model overrides (key: model ID, value: settings)",
package/dist/cli/index.js CHANGED
@@ -101,8 +101,8 @@ function createModelChoices(models) {
101
101
  function getSuggestedModel(role, _subscriptions, availableModels) {
102
102
  const suggestions = {
103
103
  sisyphus: [
104
- "anthropic/claude-opus-4-5-thinking",
105
104
  "anthropic/claude-sonnet-4-5-thinking",
105
+ "anthropic/claude-opus-4-5-thinking",
106
106
  "openai/gpt-5.1-high",
107
107
  "google/gemini-2.5-pro",
108
108
  "github-copilot/claude-sonnet-4.5",
@@ -145,6 +145,14 @@ function getSuggestedModel(role, _subscriptions, availableModels) {
145
145
  "anthropic/claude-sonnet-4-5",
146
146
  "github-copilot/gemini-3-flash",
147
147
  "github-copilot/gpt-5-mini"
148
+ ],
149
+ explore: [
150
+ "google/gemini-2.5-flash",
151
+ "anthropic/claude-sonnet-4-5",
152
+ "openai/gpt-4o",
153
+ "github-copilot/claude-haiku-4.5",
154
+ "github-copilot/gpt-5-mini",
155
+ "github-copilot/gemini-3-flash"
148
156
  ]
149
157
  };
150
158
  const roleDefaults = suggestions[role] || [];
@@ -1453,39 +1461,259 @@ function generateAthenaConfig(answers) {
1453
1461
 
1454
1462
  // src/cli/generators/omo-config.ts
1455
1463
  init_esm_shims();
1464
+
1465
+ // src/plugin/utils/model-params.ts
1466
+ init_esm_shims();
1467
+ var MODEL_FAMILY_BASE_TEMPS = {
1468
+ "claude-thinking": 0.3,
1469
+ claude: 0.2,
1470
+ "gpt-reasoning": 0.2,
1471
+ gpt: 0.3,
1472
+ gemini: 0.3,
1473
+ copilot: 0.25
1474
+ };
1475
+ var ROLE_TEMP_ADJUSTMENTS = {
1476
+ oracle: -0.1,
1477
+ sisyphus: 0,
1478
+ librarian: 0.1,
1479
+ frontend: 0.2,
1480
+ documentWriter: 0.1,
1481
+ multimodalLooker: -0.1,
1482
+ explore: -0.1
1483
+ };
1484
+ var ROLE_DEFAULT_THINKING = {
1485
+ oracle: "high",
1486
+ sisyphus: "medium",
1487
+ librarian: "low",
1488
+ frontend: "low",
1489
+ documentWriter: "low",
1490
+ multimodalLooker: "off",
1491
+ explore: "off"
1492
+ };
1493
+ var MODEL_CAPABILITIES = {
1494
+ "anthropic/claude-sonnet-4-5-thinking": { supportsThinking: true, thinkingType: "anthropic" },
1495
+ "anthropic/claude-opus-4-5-thinking": { supportsThinking: true, thinkingType: "anthropic" },
1496
+ "anthropic/claude-sonnet-4-5": { supportsTemperature: true },
1497
+ "anthropic/claude-opus-4-5": { supportsTemperature: true },
1498
+ "openai/gpt-5.1-high": { supportsThinking: true, thinkingType: "openai" },
1499
+ "openai/gpt-5.1": { supportsTemperature: false },
1500
+ "openai/gpt-5.2": { supportsTemperature: false },
1501
+ "openai/gpt-4o": { supportsTemperature: true },
1502
+ "google/gemini-2.5-pro": {
1503
+ supportsTemperature: true,
1504
+ supportsThinking: true,
1505
+ thinkingType: "google"
1506
+ },
1507
+ "google/gemini-2.5-flash": { supportsTemperature: true },
1508
+ "google/gemini-3-pro": {
1509
+ supportsTemperature: true,
1510
+ supportsThinking: true,
1511
+ thinkingType: "google"
1512
+ },
1513
+ "google/gemini-3-flash": {
1514
+ supportsTemperature: true,
1515
+ supportsThinking: true,
1516
+ thinkingType: "google"
1517
+ }
1518
+ };
1519
+ var COPILOT_DEFAULTS = {
1520
+ supportsTemperature: false,
1521
+ supportsThinking: false
1522
+ };
1523
+ function getModelFamily(modelId) {
1524
+ if (modelId.startsWith("github-copilot/")) return "copilot";
1525
+ if (modelId.includes("thinking")) return "claude-thinking";
1526
+ if (modelId.includes("claude")) return "claude";
1527
+ if (modelId.includes("gpt-5.1-high") || modelId.includes("o3") || modelId.includes("o1")) {
1528
+ return "gpt-reasoning";
1529
+ }
1530
+ if (modelId.includes("gpt")) return "gpt";
1531
+ if (modelId.includes("gemini")) return "gemini";
1532
+ return "claude";
1533
+ }
1534
+ function getMaxTemperatureForModel(modelId) {
1535
+ if (modelId.startsWith("anthropic/") || modelId.includes("claude")) {
1536
+ return 1;
1537
+ }
1538
+ if (modelId.startsWith("openai/") || modelId.includes("gpt")) {
1539
+ return 2;
1540
+ }
1541
+ if (modelId.startsWith("google/") || modelId.includes("gemini")) {
1542
+ return 2;
1543
+ }
1544
+ return 1;
1545
+ }
1546
+ function getModelCapabilities(modelId) {
1547
+ const known = MODEL_CAPABILITIES[modelId];
1548
+ if (known) {
1549
+ return {
1550
+ supportsTemperature: known.supportsTemperature ?? true,
1551
+ supportsThinking: known.supportsThinking ?? false,
1552
+ thinkingType: known.thinkingType
1553
+ };
1554
+ }
1555
+ if (modelId.startsWith("github-copilot/")) {
1556
+ return {
1557
+ supportsTemperature: COPILOT_DEFAULTS.supportsTemperature,
1558
+ supportsThinking: COPILOT_DEFAULTS.supportsThinking
1559
+ };
1560
+ }
1561
+ return { supportsTemperature: true, supportsThinking: false };
1562
+ }
1563
+ function getEffectiveTemperature(modelId, role, config) {
1564
+ const roleOverride = config.models.settings?.[role]?.temperature;
1565
+ if (roleOverride !== void 0) return roleOverride;
1566
+ const modelOverride = config.models.settings?.overrides?.[modelId]?.temperature;
1567
+ if (modelOverride !== void 0) return modelOverride;
1568
+ const capabilities = getModelCapabilities(modelId);
1569
+ if (!capabilities.supportsTemperature) return void 0;
1570
+ const family = getModelFamily(modelId);
1571
+ const baseTemp = MODEL_FAMILY_BASE_TEMPS[family];
1572
+ const adjustment = ROLE_TEMP_ADJUSTMENTS[role];
1573
+ const maxTemp = getMaxTemperatureForModel(modelId);
1574
+ return Math.max(0, Math.min(maxTemp, baseTemp + adjustment));
1575
+ }
1576
+ function getEffectiveThinkingLevel(modelId, role, config) {
1577
+ const roleOverride = config.models.settings?.[role]?.thinkingLevel;
1578
+ if (roleOverride !== void 0) return roleOverride;
1579
+ const modelOverride = config.models.settings?.overrides?.[modelId]?.thinkingLevel;
1580
+ if (modelOverride !== void 0) return modelOverride;
1581
+ const capabilities = getModelCapabilities(modelId);
1582
+ if (!capabilities.supportsThinking) return void 0;
1583
+ return ROLE_DEFAULT_THINKING[role];
1584
+ }
1585
+ function getProviderParams(modelId, role, config) {
1586
+ const result = {};
1587
+ const temperature = getEffectiveTemperature(modelId, role, config);
1588
+ if (temperature !== void 0) {
1589
+ result.temperature = temperature;
1590
+ }
1591
+ const thinkingLevel = getEffectiveThinkingLevel(modelId, role, config);
1592
+ if (thinkingLevel && thinkingLevel !== "off") {
1593
+ const capabilities = getModelCapabilities(modelId);
1594
+ switch (capabilities.thinkingType) {
1595
+ case "openai":
1596
+ result.reasoning_effort = thinkingLevel;
1597
+ break;
1598
+ case "anthropic":
1599
+ result.thinking_budget = thinkingLevelToTokenBudget(thinkingLevel);
1600
+ break;
1601
+ case "google":
1602
+ result.thinking_level = thinkingLevel;
1603
+ break;
1604
+ }
1605
+ }
1606
+ return result;
1607
+ }
1608
+ function thinkingLevelToTokenBudget(level) {
1609
+ switch (level) {
1610
+ case "low":
1611
+ return 4096;
1612
+ case "medium":
1613
+ return 16384;
1614
+ case "high":
1615
+ return 32768;
1616
+ default:
1617
+ return 0;
1618
+ }
1619
+ }
1620
+
1621
+ // src/cli/generators/omo-config.ts
1622
+ function buildMinimalConfig(answers) {
1623
+ const { subscriptions, models, methodology, features, advanced } = answers;
1624
+ return {
1625
+ version: "0.4.0",
1626
+ subscriptions: {
1627
+ claude: {
1628
+ enabled: subscriptions.hasClaude,
1629
+ tier: subscriptions.claudeTier || "none"
1630
+ },
1631
+ openai: {
1632
+ enabled: subscriptions.hasOpenAI
1633
+ },
1634
+ google: {
1635
+ enabled: subscriptions.hasGoogle,
1636
+ authMethod: subscriptions.googleAuth || "none"
1637
+ },
1638
+ githubCopilot: {
1639
+ enabled: subscriptions.hasGitHubCopilot,
1640
+ plan: subscriptions.copilotPlan,
1641
+ enabledModels: subscriptions.copilotEnabledModels
1642
+ }
1643
+ },
1644
+ models: {
1645
+ sisyphus: models.sisyphus,
1646
+ oracle: models.oracle,
1647
+ librarian: models.librarian,
1648
+ frontend: models.frontend,
1649
+ documentWriter: models.documentWriter,
1650
+ multimodalLooker: models.multimodalLooker,
1651
+ settings: models.settings,
1652
+ custom: models.custom
1653
+ },
1654
+ bmad: {
1655
+ defaultTrack: methodology.defaultTrack,
1656
+ autoStatusUpdate: methodology.autoStatusUpdate,
1657
+ parallelStoryLimit: advanced.parallelStoryLimit || 3
1658
+ },
1659
+ features: {
1660
+ bmadBridge: true,
1661
+ autoStatus: features.enabledFeatures.includes("auto-status"),
1662
+ parallelExecution: features.enabledFeatures.includes("parallel"),
1663
+ notifications: features.enabledFeatures.includes("notifications"),
1664
+ contextMonitor: features.enabledFeatures.includes("context-monitor"),
1665
+ commentChecker: features.enabledFeatures.includes("comment-checker"),
1666
+ lspTools: features.enabledFeatures.includes("lsp-tools"),
1667
+ autoGitOperations: false
1668
+ },
1669
+ mcps: {
1670
+ context7: features.mcps.includes("context7"),
1671
+ exa: features.mcps.includes("exa"),
1672
+ grepApp: features.mcps.includes("grep_app")
1673
+ }
1674
+ };
1675
+ }
1456
1676
  function generateOmoConfig(answers) {
1457
1677
  const { subscriptions, models, features, advanced } = answers;
1458
- const config = {
1678
+ const config = buildMinimalConfig(answers);
1679
+ const omoConfig = {
1459
1680
  $schema: "https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/master/assets/oh-my-opencode.schema.json"
1460
1681
  };
1461
1682
  if (subscriptions.hasGoogle && subscriptions.googleAuth === "antigravity") {
1462
- config.google_auth = false;
1463
- }
1464
- config.agents = {
1465
- // Main orchestrator
1466
- Sisyphus: {
1467
- model: models.sisyphus
1468
- },
1469
- // Debugging/reasoning agent
1470
- oracle: {
1471
- model: models.oracle
1472
- },
1473
- // Research agent
1474
- librarian: {
1475
- model: models.librarian
1683
+ omoConfig.google_auth = false;
1684
+ }
1685
+ const agentConfigs = [
1686
+ { role: "sisyphus", omoName: "Sisyphus", modelId: models.sisyphus },
1687
+ { role: "oracle", omoName: "oracle", modelId: models.oracle },
1688
+ { role: "librarian", omoName: "librarian", modelId: models.librarian },
1689
+ {
1690
+ role: "frontend",
1691
+ omoName: "frontend-ui-ux-engineer",
1692
+ modelId: models.frontend || models.sisyphus
1476
1693
  },
1477
- // UI/UX agent
1478
- "frontend-ui-ux-engineer": {
1479
- model: models.frontend || models.sisyphus
1694
+ {
1695
+ role: "documentWriter",
1696
+ omoName: "document-writer",
1697
+ modelId: models.documentWriter || models.librarian
1480
1698
  },
1481
- // Documentation agent
1482
- "document-writer": {
1483
- model: models.documentWriter || models.librarian
1699
+ {
1700
+ role: "multimodalLooker",
1701
+ omoName: "multimodal-looker",
1702
+ modelId: models.multimodalLooker || models.librarian
1484
1703
  },
1485
- // Image analysis agent
1486
- "multimodal-looker": {
1487
- model: models.multimodalLooker || models.librarian
1488
- }
1704
+ { role: "explore", omoName: "explore", modelId: models.explore || models.librarian }
1705
+ ];
1706
+ omoConfig.agents = {};
1707
+ for (const { role, omoName, modelId } of agentConfigs) {
1708
+ const providerParams = getProviderParams(modelId, role, config);
1709
+ omoConfig.agents[omoName] = {
1710
+ model: modelId,
1711
+ ...providerParams
1712
+ };
1713
+ }
1714
+ omoConfig.agents.general = {
1715
+ model: models.oracle,
1716
+ ...getProviderParams(models.oracle, "oracle", config)
1489
1717
  };
1490
1718
  const disabledHooks = [];
1491
1719
  if (!features.enabledFeatures.includes("context-monitor")) {
@@ -1498,7 +1726,7 @@ function generateOmoConfig(answers) {
1498
1726
  disabledHooks.push("session-notification", "background-notification");
1499
1727
  }
1500
1728
  if (disabledHooks.length > 0) {
1501
- config.disabled_hooks = disabledHooks;
1729
+ omoConfig.disabled_hooks = disabledHooks;
1502
1730
  }
1503
1731
  const allMcps = ["context7", "websearch_exa", "grep_app"];
1504
1732
  const enabledMcpIds = features.mcps.map((mcp) => {
@@ -1507,18 +1735,18 @@ function generateOmoConfig(answers) {
1507
1735
  });
1508
1736
  const disabledMcps = allMcps.filter((mcp) => !enabledMcpIds.includes(mcp));
1509
1737
  if (disabledMcps.length > 0) {
1510
- config.disabled_mcps = disabledMcps;
1738
+ omoConfig.disabled_mcps = disabledMcps;
1511
1739
  }
1512
1740
  if (advanced.experimental && advanced.experimental.length > 0) {
1513
- config.experimental = {};
1741
+ omoConfig.experimental = {};
1514
1742
  if (advanced.experimental.includes("aggressive-truncation")) {
1515
- config.experimental.aggressive_truncation = true;
1743
+ omoConfig.experimental.aggressive_truncation = true;
1516
1744
  }
1517
1745
  if (advanced.experimental.includes("auto-resume")) {
1518
- config.experimental.auto_resume = true;
1746
+ omoConfig.experimental.auto_resume = true;
1519
1747
  }
1520
1748
  }
1521
- return config;
1749
+ return omoConfig;
1522
1750
  }
1523
1751
 
1524
1752
  // src/cli/generators/opencode-config.ts