mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-03 05:59:43 +02:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e24817b51 | ||
|
|
f7cf15485e |
@@ -1,5 +1,20 @@
|
|||||||
# aicodeman
|
# aicodeman
|
||||||
|
|
||||||
|
## 1.24.5
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Fable 5.1 is selectable in App Settings.
|
||||||
|
|
||||||
|
`claude-fable-5-1` is in Claude Code's model catalog (display name "Fable 5.1", June 2026 knowledge cutoff), but the model picker only went up to Fable 5, so pinning it meant hand-editing a case's `.claude/settings.local.json`. It now appears as a card under **App Settings -> Models -> New Claude sessions**, and as an option in **Task routing** (Default for tasks, plus the Explore / Implement / Test / Review overrides).
|
||||||
|
|
||||||
|
It is offered exactly the way Fable 5 already is: the "1M capable" badge, the 1M context window switch stays live for it, and base + switch compose into `claude-fable-5-1[1m]`. Both strings are accepted by the CLI.
|
||||||
|
|
||||||
|
Deliberately not claimed: that a 1M window is what sets Fable 5.1 apart. The CLI's model catalog marks both fable entries as natively 1M with the same window, so an always-on window for 5.1 next to a switchable one for 5 would encode a difference the models do not have.
|
||||||
|
|
||||||
|
### Thanks
|
||||||
|
- @shenlvkang-collab for #370, which surfaced that Fable 5.1 was missing from the picker.
|
||||||
|
|
||||||
## 1.24.4
|
## 1.24.4
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ When user says "COM":
|
|||||||
|
|
||||||
CI runs `npm run check:lockfile` on every push/PR, so lockfile drift fails the build even if the `version-packages` script is bypassed.
|
CI runs `npm run check:lockfile` on every push/PR, so lockfile drift fails the build even if the `version-packages` script is bypassed.
|
||||||
|
|
||||||
**Version**: 1.24.4 (must match `package.json`)
|
**Version**: 1.24.5 (must match `package.json`)
|
||||||
|
|
||||||
## Project Overview
|
## Project Overview
|
||||||
|
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "aicodeman",
|
"name": "aicodeman",
|
||||||
"version": "1.24.4",
|
"version": "1.24.5",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "aicodeman",
|
"name": "aicodeman",
|
||||||
"version": "1.24.4",
|
"version": "1.24.5",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "aicodeman",
|
"name": "aicodeman",
|
||||||
"version": "1.24.4",
|
"version": "1.24.5",
|
||||||
"description": "Mission control for AI coding agents - run 20 autonomous agents with real-time monitoring and session persistence",
|
"description": "Mission control for AI coding agents - run 20 autonomous agents with real-time monitoring and session persistence",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
|
|||||||
@@ -2028,6 +2028,8 @@
|
|||||||
<div class="set-modelgrid" id="appSettingsModelCards" role="radiogroup" aria-label="Model for new Claude sessions" data-search="model opus sonnet haiku fable claude"></div>
|
<div class="set-modelgrid" id="appSettingsModelCards" role="radiogroup" aria-label="Model for new Claude sessions" data-search="model opus sonnet haiku fable claude"></div>
|
||||||
<select id="appSettingsClaudeModel" class="set-select set-field-hidden" aria-hidden="true" tabindex="-1">
|
<select id="appSettingsClaudeModel" class="set-select set-field-hidden" aria-hidden="true" tabindex="-1">
|
||||||
<option value="" data-meta="Whatever the CLI picks">Default (CLI setting)</option>
|
<option value="" data-meta="Whatever the CLI picks">Default (CLI setting)</option>
|
||||||
|
<option value="claude-fable-5-1" data-meta="Latest" data-base="claude-fable-5-1" data-ctx="1">Fable 5.1</option>
|
||||||
|
<option value="claude-fable-5-1[1m]" data-variant="1m" data-base="claude-fable-5-1">Fable 5.1 (1M context)</option>
|
||||||
<option value="claude-fable-5" data-meta="Most powerful" data-base="claude-fable-5" data-ctx="1">Fable 5</option>
|
<option value="claude-fable-5" data-meta="Most powerful" data-base="claude-fable-5" data-ctx="1">Fable 5</option>
|
||||||
<option value="claude-fable-5[1m]" data-variant="1m" data-base="claude-fable-5">Fable 5 (1M context)</option>
|
<option value="claude-fable-5[1m]" data-variant="1m" data-base="claude-fable-5">Fable 5 (1M context)</option>
|
||||||
<option value="opus" data-meta="Most capable" data-base="opus" data-ctx="1">Opus</option>
|
<option value="opus" data-meta="Most capable" data-base="opus" data-ctx="1">Opus</option>
|
||||||
@@ -2040,7 +2042,7 @@
|
|||||||
<div class="set-row" id="appSettingsContextRow" data-search="1m context window opus long">
|
<div class="set-row" id="appSettingsContextRow" data-search="1m context window opus long">
|
||||||
<div class="set-row-text">
|
<div class="set-row-text">
|
||||||
<span class="set-row-label">1M context window</span>
|
<span class="set-row-label">1M context window</span>
|
||||||
<span class="set-row-desc" id="appSettingsContextDesc">Available for Fable 5, Opus and Opus 4.6.</span>
|
<span class="set-row-desc" id="appSettingsContextDesc">Available for Fable 5.1, Fable 5, Opus and Opus 4.6.</span>
|
||||||
</div>
|
</div>
|
||||||
<label class="switch switch-sm"><input type="checkbox" id="appSettingsOpusContext1m"><span class="slider"></span></label>
|
<label class="switch switch-sm"><input type="checkbox" id="appSettingsOpusContext1m"><span class="slider"></span></label>
|
||||||
</div>
|
</div>
|
||||||
@@ -2080,6 +2082,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<select id="appSettingsDefaultModel" class="set-select">
|
<select id="appSettingsDefaultModel" class="set-select">
|
||||||
<option value="">Default (CLI default)</option>
|
<option value="">Default (CLI default)</option>
|
||||||
|
<option value="claude-fable-5-1">Fable 5.1 (Latest)</option>
|
||||||
<option value="claude-fable-5">Fable 5 (Most powerful)</option>
|
<option value="claude-fable-5">Fable 5 (Most powerful)</option>
|
||||||
<option value="opus">Opus (Most capable)</option>
|
<option value="opus">Opus (Most capable)</option>
|
||||||
<option value="sonnet">Sonnet (Balanced)</option>
|
<option value="sonnet">Sonnet (Balanced)</option>
|
||||||
@@ -2094,6 +2097,7 @@
|
|||||||
<option value="haiku">Haiku</option>
|
<option value="haiku">Haiku</option>
|
||||||
<option value="sonnet">Sonnet</option>
|
<option value="sonnet">Sonnet</option>
|
||||||
<option value="opus">Opus</option>
|
<option value="opus">Opus</option>
|
||||||
|
<option value="claude-fable-5-1">Fable 5.1</option>
|
||||||
<option value="claude-fable-5">Fable 5</option>
|
<option value="claude-fable-5">Fable 5</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -2104,6 +2108,7 @@
|
|||||||
<option value="haiku">Haiku</option>
|
<option value="haiku">Haiku</option>
|
||||||
<option value="sonnet">Sonnet</option>
|
<option value="sonnet">Sonnet</option>
|
||||||
<option value="opus">Opus</option>
|
<option value="opus">Opus</option>
|
||||||
|
<option value="claude-fable-5-1">Fable 5.1</option>
|
||||||
<option value="claude-fable-5">Fable 5</option>
|
<option value="claude-fable-5">Fable 5</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -2114,6 +2119,7 @@
|
|||||||
<option value="haiku">Haiku</option>
|
<option value="haiku">Haiku</option>
|
||||||
<option value="sonnet">Sonnet</option>
|
<option value="sonnet">Sonnet</option>
|
||||||
<option value="opus">Opus</option>
|
<option value="opus">Opus</option>
|
||||||
|
<option value="claude-fable-5-1">Fable 5.1</option>
|
||||||
<option value="claude-fable-5">Fable 5</option>
|
<option value="claude-fable-5">Fable 5</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -2124,6 +2130,7 @@
|
|||||||
<option value="haiku">Haiku</option>
|
<option value="haiku">Haiku</option>
|
||||||
<option value="sonnet">Sonnet</option>
|
<option value="sonnet">Sonnet</option>
|
||||||
<option value="opus">Opus</option>
|
<option value="opus">Opus</option>
|
||||||
|
<option value="claude-fable-5-1">Fable 5.1</option>
|
||||||
<option value="claude-fable-5">Fable 5</option>
|
<option value="claude-fable-5">Fable 5</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -922,7 +922,7 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
desc.textContent = inert
|
desc.textContent = inert
|
||||||
? 'The selected model has no 1M variant.'
|
? 'The selected model has no 1M variant.'
|
||||||
: base
|
: base
|
||||||
? 'Available for Fable 5, Opus and Opus 4.6.'
|
? 'Available for Fable 5.1, Fable 5, Opus and Opus 4.6.'
|
||||||
: 'With no model pinned, this starts new sessions on Opus with a 1M window.';
|
: 'With no model pinned, this starts new sessions on Opus with a 1M window.';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -120,13 +120,31 @@ describe('App Settings modal structure', () => {
|
|||||||
const select = modal.match(/id="appSettingsClaudeModel"([\s\S]*?)<\/select>/)?.[1] ?? '';
|
const select = modal.match(/id="appSettingsClaudeModel"([\s\S]*?)<\/select>/)?.[1] ?? '';
|
||||||
// The cards render the base models; the [1m] rows exist so that base + the
|
// The cards render the base models; the [1m] rows exist so that base + the
|
||||||
// context switch can compose back into a real claudeModel value.
|
// context switch can compose back into a real claudeModel value.
|
||||||
for (const value of ['opus[1m]', 'claude-fable-5[1m]', 'claude-opus-4-6[1m]']) {
|
for (const value of ['opus[1m]', 'claude-fable-5[1m]', 'claude-fable-5-1[1m]', 'claude-opus-4-6[1m]']) {
|
||||||
expect(select).toContain(`value="${value}"`);
|
expect(select).toContain(`value="${value}"`);
|
||||||
}
|
}
|
||||||
expect(select).toContain('data-ctx="1"');
|
expect(select).toContain('data-ctx="1"');
|
||||||
expect(modal).toContain('id="appSettingsOpusContext1m"');
|
expect(modal).toContain('id="appSettingsOpusContext1m"');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('models: offers Fable 5.1 as a card and to task routing', () => {
|
||||||
|
const modal = settingsModal();
|
||||||
|
const select = modal.match(/id="appSettingsClaudeModel"([\s\S]*?)<\/select>/)?.[1] ?? '';
|
||||||
|
// The cards are built from these options, so data-ctx is what keeps the 1M
|
||||||
|
// switch live for the model rather than greying the row out.
|
||||||
|
expect(select).toMatch(/value="claude-fable-5-1"[^>]*data-ctx="1"/);
|
||||||
|
for (const id of [
|
||||||
|
'appSettingsDefaultModel',
|
||||||
|
'appSettingsModelExplore',
|
||||||
|
'appSettingsModelImplement',
|
||||||
|
'appSettingsModelTest',
|
||||||
|
'appSettingsModelReview',
|
||||||
|
]) {
|
||||||
|
const routing = modal.match(new RegExp(`id="${id}"([\\s\\S]*?)</select>`))?.[1] ?? '';
|
||||||
|
expect(routing, `${id} does not offer Fable 5.1`).toContain('value="claude-fable-5-1"');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('has retired the modal-tab chrome everywhere, not just here', () => {
|
it('has retired the modal-tab chrome everywhere, not just here', () => {
|
||||||
// Session Options and Add Case moved onto this same `set-*` surface, so the
|
// Session Options and Add Case moved onto this same `set-*` surface, so the
|
||||||
// old tab classes have no users left. A reappearance means a modal drifted
|
// old tab classes have no users left. A reappearance means a modal drifted
|
||||||
|
|||||||
Reference in New Issue
Block a user