From 1b680670aeb92ffc40c14c1a25f25b1f866448a2 Mon Sep 17 00:00:00 2001 From: devswha Date: Fri, 7 Aug 2026 21:17:01 +0900 Subject: [PATCH 1/3] feat(cli): MiniMax global and China provider presets Reimplements PR #667 by @octo-patch on the current codebase: the original targeted main against the retired Lemon Squeezy hold and could not be rebased. Both regional endpoints verified against MiniMax's official docs (api.minimax.io / api.minimaxi.com, model MiniMax-M3); the shared MINIMAX_API_KEY joins the HTTP key lookup and CLI help, and the hold's frozen provider snapshot and hashes are re-frozen. Co-authored-by: octo-patch --- .env.example | 4 +++- docs/operations/v6.4-preflight-hold.json | 22 +++++++++++++++++++--- scripts/check-v6.4-preflight-hold.mjs | 2 +- src/auth.js | 1 + src/cli/args.js | 5 +++-- src/providers.js | 16 ++++++++++++++++ tests/e2e/providers.test.js | 19 +++++++++++++++++-- 7 files changed, 60 insertions(+), 9 deletions(-) diff --git a/.env.example b/.env.example index 278f5bf..097a384 100644 --- a/.env.example +++ b/.env.example @@ -5,7 +5,8 @@ # CLI / local LLM provider keys (openai-http backend, quality:live harness) # Lookup order: PATINA_API_KEY first, then the provider-specific key # (src/auth.js HTTP_KEY_ENV_VARS). `--provider ` presets live in -# src/providers.js: openai, gemini, groq, kimi, moonshot, together. +# src/providers.js: openai, gemini, groq, kimi, moonshot, together, +# minimax, minimax-cn. # --------------------------------------------------------------------------- # PATINA_API_KEY= # generic key, wins over provider-specific vars # OPENAI_API_KEY= # default openai-http backend (gpt-5.5) @@ -14,6 +15,7 @@ # TOGETHER_API_KEY= # --provider together # KIMI_API_KEY= # --provider kimi (kimi-k2.5, api.moonshot.ai) # MOONSHOT_API_KEY= # --provider moonshot (same endpoint as kimi) +# MINIMAX_API_KEY= # --provider minimax or minimax-cn (MiniMax-M3) # PATINA_API_KEY_FILE= # or read any key from a file (recommended for CI) # Local subscription CLIs (claude / codex / gemini / kimi) need no key here — diff --git a/docs/operations/v6.4-preflight-hold.json b/docs/operations/v6.4-preflight-hold.json index 79f6e5d..d1191ca 100644 --- a/docs/operations/v6.4-preflight-hold.json +++ b/docs/operations/v6.4-preflight-hold.json @@ -131,12 +131,28 @@ "defaultModel": "meta-llama/Llama-3.3-70B-Instruct-Turbo-Free", "freeTier": true, "note": "Free models available (suffix \"-Free\"). Get a key at https://api.together.xyz/settings/api-keys" + }, + "minimax": { + "name": "minimax", + "baseURL": "https://api.minimax.io/v1", + "apiKeyEnv": "MINIMAX_API_KEY", + "defaultModel": "MiniMax-M3", + "freeTier": false, + "note": "MiniMax global OpenAI-compatible API. Set MINIMAX_API_KEY or PATINA_API_KEY." + }, + "minimax-cn": { + "name": "minimax-cn", + "baseURL": "https://api.minimaxi.com/v1", + "apiKeyEnv": "MINIMAX_API_KEY", + "defaultModel": "MiniMax-M3", + "freeTier": false, + "note": "MiniMax China OpenAI-compatible API. Set MINIMAX_API_KEY or PATINA_API_KEY." } }, "sourceHashes": { - ".env.example": "29b1cdc48b5c14ed0c84716ad9ca42ba23001b9f40f99efb78c2c368180e7e5a", + ".env.example": "9bd63e3d6caeb2fb9e94639145ab876ac3b79c63c6e8e7509cdb7fb07ef30132", "src/model-defaults.js": "c568977fcac8ea44d5387a8a8745b062675ec94d73d39ce528c492ad35f87176", - "src/providers.js": "92415eacaf87da2d0f2aed7db97feeb98b8b087adfe584a02c4478353b807d90", + "src/providers.js": "04c3c38f9a3a867eb632670cd5cf28f1d7b45d910eb6993a807dfdc6a4866d36", "src/web-rewrite-contract.js": "be433e8260e452028eb53b5c1aed0935a4150cd669ec2d5e826302219df22b9a", "playground/launch-config.js": "4d19fc8ce36651f73f94d80bbcd108a2ccbb50fa3fc25b54d75f193b42ac6bf4", "vercel.json": "37a54c0850db54e80eec963c570d4b8a047fcfb4bf56d1a133e5a3934b28260e", @@ -151,7 +167,7 @@ "docs/operations/pay-b-binding-20260723.json": "96eb8e0aba9fcb4ce67dd356bd35aaf678d8abea96a7ec134218eab7cd20f132", "docs/operations/pay-b-binding-polar-20260729.json": "471c9035a04ce5c2c76d7e5b4d595054191d513fa007455a02c9b123d0811ac5", "docs/operations/pay-live-runtime-polar-20260729.json": "384912dca4576f1c3f8d653f39c3d9a8cb19f8f8acc1a91ac2bc36fdf10e7a9c", - "tests/e2e/providers.test.js": "47958be678e9bbfd06bcdd849ec0df37ed765f886e245b7b528e7d596b6d9dfe", + "tests/e2e/providers.test.js": "837177c5c73b46f29ce93c8dbdf6ca51045d9958ff5ea9ffcff8fcdaa869ad27", "tests/unit/backend-model-defaults.test.js": "908dd9b06a9d5305ad28b50007d6428435b0b6b7019d6a2210aff813bfb9cf3d", "tests/unit/web-deploy-invariants.test.js": "2aecb9068c04999eaf964766cdc1e0c3a551f58ecfa54a0ade8802f1b8f4f296", "tests/unit/web-rewrite-contract.test.js": "2980f555bb53e7c8d93a74d60dc096adadfd1c7d07fd70f55de1670959219c13", diff --git a/scripts/check-v6.4-preflight-hold.mjs b/scripts/check-v6.4-preflight-hold.mjs index 3c4ab3e..00b100c 100644 --- a/scripts/check-v6.4-preflight-hold.mjs +++ b/scripts/check-v6.4-preflight-hold.mjs @@ -52,7 +52,7 @@ const REQUIRED_BLOCKERS = [['POLAR_APPROVAL', 'Polar Approval Owner', 'Immutable const REQUIRED_DECISIONS = [['GATE_C_OPENAI_HTTP_NO_PROMOTION', 'HOLD_NO_PROMOTION'], ['GATE_C_CODEX_CLI_NO_PROMOTION', 'HOLD_NO_PROMOTION'], ['GATE_C_CLAUDE_CLI_NO_PROMOTION', 'HOLD_NO_PROMOTION'], ['GATE_C_GEMINI_HTTP_NO_PROMOTION', 'HOLD_NO_PROMOTION'], ['GATE_C_GEMINI_CLI_NO_PROMOTION', 'HOLD_NO_PROMOTION'], ['PAY_STG_SUPERSEDED_BY_PRODUCTION_RUNTIME', 'SUPERSEDED'], ['PAY_B_BINDING_APPROVAL', 'COMPLETED'], ['SOURCE_BINDING_PRODUCTION_INTEGRATION', 'COMPLETED'], ['PAY_LIVE_RUNTIME_ZERO_AMOUNT_SMOKE', 'COMPLETED']]; const REQUIRED_DEFERRED_ACTIONS = [['V6_4_METADATA_COPY_RECONCILIATION', ['GATE_B'], 'Cannot reconcile 6.4 metadata and copy until Gate B evidence exists; Gate-C no-promotion cutoff decisions are complete.', false], ['FINAL_TAG_PUBLISH_COMMAND', ['PAY_LIVE', 'REL_PUBLISH'], 'Cannot run the final tag and publish command until named external evidence exists.', false]]; const FROZEN_SEMANTICS = Object.freeze({ manifestVersion: 4, providers: Object.fromEntries(Object.entries(PROVIDERS).map(([key, provider]) => [key, Object.fromEntries(['name', 'baseURL', 'apiKeyEnv', 'defaultModel', 'freeTier', 'note'].map((field) => [field, provider[field]]))])), sourceHashes: { - '.env.example': '29b1cdc48b5c14ed0c84716ad9ca42ba23001b9f40f99efb78c2c368180e7e5a', 'src/model-defaults.js': 'c568977fcac8ea44d5387a8a8745b062675ec94d73d39ce528c492ad35f87176', 'src/providers.js': '92415eacaf87da2d0f2aed7db97feeb98b8b087adfe584a02c4478353b807d90', 'src/web-rewrite-contract.js': 'be433e8260e452028eb53b5c1aed0935a4150cd669ec2d5e826302219df22b9a', 'playground/launch-config.js': '4d19fc8ce36651f73f94d80bbcd108a2ccbb50fa3fc25b54d75f193b42ac6bf4', 'vercel.json': '37a54c0850db54e80eec963c570d4b8a047fcfb4bf56d1a133e5a3934b28260e', 'scripts/checkout-evidence-bindings.mjs': '767c832fe4b517824e06fa7e18d6dd777e6525831dcfaa2022e51a4c8f27c07c', 'scripts/generate-launch-config.mjs': 'c5047625479bc687c510b6faf5045cf6118359ba978d219cea834325de5e8a07', 'scripts/check-v6.4-release-ready.mjs': 'fc4521db8f4677e03ac6a2199a86917b6332033030a9e8fe248cd166b0a59313', 'docs/AUTHENTICATION.md': 'e8c335550c4a0f0b144b79f4286d467a968962821a1c88049f1e679810751cfe', 'docs/AUTHENTICATION_KR.md': '5e077cd3a13c2299a11fc831c8303a204880c91dd0d465148d34a435dbe00796', 'docs/operations/pro-launch.md': '50448491ce0b745eb2bfe07983238a6e727466de0f71c72b7cbc4a9c447068ff', 'docs/operations/pay-stg-binding-20260716.json': '2f523259de91f640f056fe7acfe00264e493d9891b7a61152fe5e91704c0ecdf', 'docs/operations/pay-stg-runtime-20260716.json': 'b0229e892b06e1ec303a001c1317c4c63fc3c98fd7e10243e64db07df4803d29', 'docs/operations/pay-b-binding-20260723.json': '96eb8e0aba9fcb4ce67dd356bd35aaf678d8abea96a7ec134218eab7cd20f132', 'docs/operations/pay-b-binding-polar-20260729.json': '471c9035a04ce5c2c76d7e5b4d595054191d513fa007455a02c9b123d0811ac5', 'docs/operations/pay-live-runtime-polar-20260729.json': '384912dca4576f1c3f8d653f39c3d9a8cb19f8f8acc1a91ac2bc36fdf10e7a9c', 'tests/e2e/providers.test.js': '47958be678e9bbfd06bcdd849ec0df37ed765f886e245b7b528e7d596b6d9dfe', 'tests/unit/backend-model-defaults.test.js': '908dd9b06a9d5305ad28b50007d6428435b0b6b7019d6a2210aff813bfb9cf3d', 'tests/unit/web-deploy-invariants.test.js': '2aecb9068c04999eaf964766cdc1e0c3a551f58ecfa54a0ade8802f1b8f4f296', 'tests/unit/web-rewrite-contract.test.js': '2980f555bb53e7c8d93a74d60dc096adadfd1c7d07fd70f55de1670959219c13', 'tests/unit/web-rewrite-contract.redteam.test.js': '3c7591926e168b14f486199297fd1e84ed447c1b8d339c9b4860f79da0f6a7bb', 'tests/unit/v6.4-preflight-hold.test.js': 'c5f8a3465576dff5a94f07dd8eaac741d1e0e5006b7076fe9884204eb7a0c7a8', 'tests/unit/v6.4-release-ready.test.js': '8d88aab35ce75bc40b4782932329c0402001afabc380ac349ccc1b82d01c12d7', 'package.json': '6712053362194ab947aa10de4f7772bfa23ae6db97dc5a912e05763c4e3a2dc3', 'package-lock.json': '3d4b2573cd3a273d766a01a6ea2245b2528a9149ae75fdda9bb977bfd5af69a1', '.github/workflows/release.yml': '43900a0966a52c500d54b1971d4141fe2d380a893364b4cb7b9976e9e3795f8f', 'README.md': '78829adef9bc233a2dc0003ea022281ce483cb958daeef01a073361e31ce8f11', 'README_KR.md': 'ebac4f175b399a081d4c4a2b92fcc0708f1e85976d8da869f0f9b608046cfd59', 'README_ZH.md': '66076f5870bf806310b4516db0c260037f7b2684c3234b291660593f744a8ec0', 'README_JA.md': 'bd71aa30bd9eca7b1f4520f4fb609585f40ccbf78d9c0ba29d29c7364c869c44', 'SKILL.md': '3b7dc62f22c1feb9178d49a47e78bfa60fe94ea314d7132a99dcc6c9b231a4c5', '.patina.default.yaml': '308311b43add43e9d0e40bdfcdf65823337f12357e50366ce0fb8b07cfd76885', 'packages/patina-humanizer/package.json': 'fc9b27a4c97965d17b18492999f7018f34819806d63d626eeb428f6dd0834c63', '.claude-plugin/plugin.json': '7a5df3e87832d22821e7d1fafed76e125b33a02d5550e46fa73e7aa9073d2325', '.claude-plugin/marketplace.json': 'c500dfec67c40f4c2acb6de3efc5c60631e8e82ff961311a09609fe37e806e2d', 'CHANGELOG.md': 'dfc4fb1f70ca873ca1bf44b3949374d43018fc673b98212e7515b31c9a07ef80' } }); + '.env.example': '9bd63e3d6caeb2fb9e94639145ab876ac3b79c63c6e8e7509cdb7fb07ef30132', 'src/model-defaults.js': 'c568977fcac8ea44d5387a8a8745b062675ec94d73d39ce528c492ad35f87176', 'src/providers.js': '04c3c38f9a3a867eb632670cd5cf28f1d7b45d910eb6993a807dfdc6a4866d36', 'src/web-rewrite-contract.js': 'be433e8260e452028eb53b5c1aed0935a4150cd669ec2d5e826302219df22b9a', 'playground/launch-config.js': '4d19fc8ce36651f73f94d80bbcd108a2ccbb50fa3fc25b54d75f193b42ac6bf4', 'vercel.json': '37a54c0850db54e80eec963c570d4b8a047fcfb4bf56d1a133e5a3934b28260e', 'scripts/checkout-evidence-bindings.mjs': '767c832fe4b517824e06fa7e18d6dd777e6525831dcfaa2022e51a4c8f27c07c', 'scripts/generate-launch-config.mjs': 'c5047625479bc687c510b6faf5045cf6118359ba978d219cea834325de5e8a07', 'scripts/check-v6.4-release-ready.mjs': 'fc4521db8f4677e03ac6a2199a86917b6332033030a9e8fe248cd166b0a59313', 'docs/AUTHENTICATION.md': 'e8c335550c4a0f0b144b79f4286d467a968962821a1c88049f1e679810751cfe', 'docs/AUTHENTICATION_KR.md': '5e077cd3a13c2299a11fc831c8303a204880c91dd0d465148d34a435dbe00796', 'docs/operations/pro-launch.md': '50448491ce0b745eb2bfe07983238a6e727466de0f71c72b7cbc4a9c447068ff', 'docs/operations/pay-stg-binding-20260716.json': '2f523259de91f640f056fe7acfe00264e493d9891b7a61152fe5e91704c0ecdf', 'docs/operations/pay-stg-runtime-20260716.json': 'b0229e892b06e1ec303a001c1317c4c63fc3c98fd7e10243e64db07df4803d29', 'docs/operations/pay-b-binding-20260723.json': '96eb8e0aba9fcb4ce67dd356bd35aaf678d8abea96a7ec134218eab7cd20f132', 'docs/operations/pay-b-binding-polar-20260729.json': '471c9035a04ce5c2c76d7e5b4d595054191d513fa007455a02c9b123d0811ac5', 'docs/operations/pay-live-runtime-polar-20260729.json': '384912dca4576f1c3f8d653f39c3d9a8cb19f8f8acc1a91ac2bc36fdf10e7a9c', 'tests/e2e/providers.test.js': '837177c5c73b46f29ce93c8dbdf6ca51045d9958ff5ea9ffcff8fcdaa869ad27', 'tests/unit/backend-model-defaults.test.js': '908dd9b06a9d5305ad28b50007d6428435b0b6b7019d6a2210aff813bfb9cf3d', 'tests/unit/web-deploy-invariants.test.js': '2aecb9068c04999eaf964766cdc1e0c3a551f58ecfa54a0ade8802f1b8f4f296', 'tests/unit/web-rewrite-contract.test.js': '2980f555bb53e7c8d93a74d60dc096adadfd1c7d07fd70f55de1670959219c13', 'tests/unit/web-rewrite-contract.redteam.test.js': '3c7591926e168b14f486199297fd1e84ed447c1b8d339c9b4860f79da0f6a7bb', 'tests/unit/v6.4-preflight-hold.test.js': 'c5f8a3465576dff5a94f07dd8eaac741d1e0e5006b7076fe9884204eb7a0c7a8', 'tests/unit/v6.4-release-ready.test.js': '8d88aab35ce75bc40b4782932329c0402001afabc380ac349ccc1b82d01c12d7', 'package.json': '6712053362194ab947aa10de4f7772bfa23ae6db97dc5a912e05763c4e3a2dc3', 'package-lock.json': '3d4b2573cd3a273d766a01a6ea2245b2528a9149ae75fdda9bb977bfd5af69a1', '.github/workflows/release.yml': '43900a0966a52c500d54b1971d4141fe2d380a893364b4cb7b9976e9e3795f8f', 'README.md': '78829adef9bc233a2dc0003ea022281ce483cb958daeef01a073361e31ce8f11', 'README_KR.md': 'ebac4f175b399a081d4c4a2b92fcc0708f1e85976d8da869f0f9b608046cfd59', 'README_ZH.md': '66076f5870bf806310b4516db0c260037f7b2684c3234b291660593f744a8ec0', 'README_JA.md': 'bd71aa30bd9eca7b1f4520f4fb609585f40ccbf78d9c0ba29d29c7364c869c44', 'SKILL.md': '3b7dc62f22c1feb9178d49a47e78bfa60fe94ea314d7132a99dcc6c9b231a4c5', '.patina.default.yaml': '308311b43add43e9d0e40bdfcdf65823337f12357e50366ce0fb8b07cfd76885', 'packages/patina-humanizer/package.json': 'fc9b27a4c97965d17b18492999f7018f34819806d63d626eeb428f6dd0834c63', '.claude-plugin/plugin.json': '7a5df3e87832d22821e7d1fafed76e125b33a02d5550e46fa73e7aa9073d2325', '.claude-plugin/marketplace.json': 'c500dfec67c40f4c2acb6de3efc5c60631e8e82ff961311a09609fe37e806e2d', 'CHANGELOG.md': 'dfc4fb1f70ca873ca1bf44b3949374d43018fc673b98212e7515b31c9a07ef80' } }); const DISABLED_LAUNCH = { schemaVersion: 1, channel: 'disabled', enabled: false, checkoutOrigin: null, checkoutPath: null, evidence: null }; const isObject = (value) => Boolean(value) && typeof value === 'object' && !Array.isArray(value); const sameJson = (left, right) => JSON.stringify(left) === JSON.stringify(right); diff --git a/src/auth.js b/src/auth.js index adb7c5f..9176dab 100644 --- a/src/auth.js +++ b/src/auth.js @@ -18,6 +18,7 @@ export const HTTP_KEY_ENV_VARS = [ 'TOGETHER_API_KEY', 'KIMI_API_KEY', 'MOONSHOT_API_KEY', + 'MINIMAX_API_KEY', ]; // Default openai-http runs against the OpenAI-compatible default endpoint, so diff --git a/src/cli/args.js b/src/cli/args.js index 93739ba..6437e64 100644 --- a/src/cli/args.js +++ b/src/cli/args.js @@ -850,7 +850,8 @@ MODEL & AUTH --timeout-ms Per-request/backend timeout in milliseconds --max-concurrency Cross-process backend cap (safe defaults per backend) --max-retries Retry budget per backend (local CLIs default to 0) - --provider Provider preset: openai, gemini, groq, kimi, moonshot, together + --provider Provider preset: openai, gemini, groq, kimi, moonshot, together, + minimax, minimax-cn ADVANCED --config Layer explicit config after defaults and .patina.yaml --allow-insecure-base-url Permit plaintext http:// to non-localhost endpoints @@ -867,7 +868,7 @@ EXAMPLES ENVIRONMENT PATINA_API_KEY, PATINA_API_KEY_FILE, PATINA_API_BASE, PATINA_MODEL OPENAI_API_KEY, GEMINI_API_KEY, GROQ_API_KEY, TOGETHER_API_KEY, - KIMI_API_KEY, MOONSHOT_API_KEY + KIMI_API_KEY, MOONSHOT_API_KEY, MINIMAX_API_KEY EXIT CODES 0 success · 1 runtime/backend · 2 input/usage · 3 score gate exceeded · 130 interrupted diff --git a/src/providers.js b/src/providers.js index 865de69..4d23cc0 100644 --- a/src/providers.js +++ b/src/providers.js @@ -62,6 +62,22 @@ export const PROVIDERS = { freeTier: true, note: 'Free models available (suffix "-Free"). Get a key at https://api.together.xyz/settings/api-keys', }, + minimax: { + name: 'minimax', + baseURL: 'https://api.minimax.io/v1', + apiKeyEnv: 'MINIMAX_API_KEY', + defaultModel: 'MiniMax-M3', + freeTier: false, + note: 'MiniMax global OpenAI-compatible API. Set MINIMAX_API_KEY or PATINA_API_KEY.', + }, + 'minimax-cn': { + name: 'minimax-cn', + baseURL: 'https://api.minimaxi.com/v1', + apiKeyEnv: 'MINIMAX_API_KEY', + defaultModel: 'MiniMax-M3', + freeTier: false, + note: 'MiniMax China OpenAI-compatible API. Set MINIMAX_API_KEY or PATINA_API_KEY.', + }, }; /** diff --git a/tests/e2e/providers.test.js b/tests/e2e/providers.test.js index fe54d67..7a7726b 100644 --- a/tests/e2e/providers.test.js +++ b/tests/e2e/providers.test.js @@ -37,9 +37,9 @@ describe('Provider Selection', () => { assert.throws(() => selectProvider('madeup'), /Unknown provider/); }); - it('lists all six providers', () => { + it('lists all eight providers', () => { const names = Object.keys(PROVIDERS).sort(); - assert.deepStrictEqual(names, ['gemini', 'groq', 'kimi', 'moonshot', 'openai', 'together']); + assert.deepStrictEqual(names, ['gemini', 'groq', 'kimi', 'minimax', 'minimax-cn', 'moonshot', 'openai', 'together']); }); it('marks free-tier providers correctly', () => { @@ -49,6 +49,21 @@ describe('Provider Selection', () => { assert.strictEqual(PROVIDERS.kimi.freeTier, false); assert.strictEqual(PROVIDERS.moonshot.freeTier, false); assert.strictEqual(PROVIDERS.openai.freeTier, false); + assert.strictEqual(PROVIDERS.minimax.freeTier, false); + assert.strictEqual(PROVIDERS['minimax-cn'].freeTier, false); + }); + + it('resolves both MiniMax regions from the shared key with regional endpoints', () => { + withEnv({ PATINA_API_KEY: undefined, MINIMAX_API_KEY: 'mm-env' }, () => { + const globalRegion = resolveProviderConfig({ provider: selectProvider('minimax') }); + assert.strictEqual(globalRegion.apiKey, 'mm-env'); + assert.strictEqual(globalRegion.apiKeySource, 'env:MINIMAX_API_KEY'); + assert.strictEqual(globalRegion.baseURL, 'https://api.minimax.io/v1'); + assert.strictEqual(globalRegion.model, 'MiniMax-M3'); + const china = resolveProviderConfig({ provider: selectProvider('minimax-cn') }); + assert.strictEqual(china.baseURL, 'https://api.minimaxi.com/v1'); + assert.strictEqual(china.model, 'MiniMax-M3'); + }); }); }); From 8b76367623e4f04eee4c04a104ceaa5ca2de4760 Mon Sep 17 00:00:00 2001 From: devswha Date: Fri, 7 Aug 2026 21:17:31 +0900 Subject: [PATCH 2/3] docs: changelog the MiniMax presets under Unreleased --- CHANGELOG.md | 6 ++++++ scripts/check-retired-concepts.mjs | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4d19cc..8d2944d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,12 @@ All notable changes to patina. Dates are release dates (YYYY-MM-DD). Semver rationale: patch | minor | major — explain whether this changes patterns, schemas, CLI behavior, or docs only. ``` +## Unreleased + +### Added + +- MiniMax provider presets for the CLI: `--provider minimax` (global, `api.minimax.io`) and `--provider minimax-cn` (China, `api.minimaxi.com`), both defaulting to `MiniMax-M3` on the shared `MINIMAX_API_KEY`. Reimplements community PR #667 by @octo-patch on the current codebase. + ## 7.0.0 — 2026-08-04 **Removes the retired iterative rewrite product contract, gives scoring and verification settings neutral ownership, and preserves the comparator only as unsupported research.** diff --git a/scripts/check-retired-concepts.mjs b/scripts/check-retired-concepts.mjs index 23d6315..78bcb82 100644 --- a/scripts/check-retired-concepts.mjs +++ b/scripts/check-retired-concepts.mjs @@ -9,19 +9,19 @@ const RETIRED_TERM = ['ouro', 'boros'].join(''); const ARCHIVE_PREFIXES = ['.gjc/', '.insane-review/']; const HISTORICAL_EXPECTATIONS = new Map([ ['CHANGELOG.md', new Map([ - ['a1aa4b471c432c2582586204d20566967533254171fbbd790a9da36a81412086', [234]], - ['d82c21439e957bf40f694b896d8eadd49a433fb66af9cca49495111604b69d75', [236]], - ['83f5e36d2ba73ed824cfec62e9f8fb72e569f26f3ab6c42604d1ef34f5b98e9b', [251]], - ['0e80229112d7d40105c64406604dbcd0312d5ae370ec871fa3258bb787af7bd1', [257]], - ['0bd7e2489f54e1e87a3efaae8e38df5c1a2878fa438c5f13775fc24b551440c7', [277]], - ['aa223b28b35c246b21ff99d20281bfa980bf01820845308948311c81e98a0de9', [282]], - ['12016238717b99f22a55d26b490943b50f82aef4a7ab27b6d662a1cdc5094dda', [331]], - ['af36a82757b517832706c84fc3d2b7dc93915243d8ce7b6ee80d65ecfdb6f31c', [340]], - ['51baf38ef6a43340c026a25e627e1544c70fc2c1dd99da3500ff2f11d8732e56', [345]], - ['61ff8778bd3e54e59a01636618c1de3c7d42659eb513a6385e71e161ec944c87', [355]], - ['272cba65bd46320ff28f5344fb3844c4b4ba08a95064db0009efd6bc145c2557', [403]], - ['45be57ebe8b5ba976d59551aef7c201a4205c4f86c1cf7952f15d3697b48d664', [406]], - ['226653d656455e6c74f4ae6216209470f05942ec9c0a275d1639a44d09bd0385', [699]], + ['a1aa4b471c432c2582586204d20566967533254171fbbd790a9da36a81412086', [240]], + ['d82c21439e957bf40f694b896d8eadd49a433fb66af9cca49495111604b69d75', [242]], + ['83f5e36d2ba73ed824cfec62e9f8fb72e569f26f3ab6c42604d1ef34f5b98e9b', [257]], + ['0e80229112d7d40105c64406604dbcd0312d5ae370ec871fa3258bb787af7bd1', [263]], + ['0bd7e2489f54e1e87a3efaae8e38df5c1a2878fa438c5f13775fc24b551440c7', [283]], + ['aa223b28b35c246b21ff99d20281bfa980bf01820845308948311c81e98a0de9', [288]], + ['12016238717b99f22a55d26b490943b50f82aef4a7ab27b6d662a1cdc5094dda', [337]], + ['af36a82757b517832706c84fc3d2b7dc93915243d8ce7b6ee80d65ecfdb6f31c', [346]], + ['51baf38ef6a43340c026a25e627e1544c70fc2c1dd99da3500ff2f11d8732e56', [351]], + ['61ff8778bd3e54e59a01636618c1de3c7d42659eb513a6385e71e161ec944c87', [361]], + ['272cba65bd46320ff28f5344fb3844c4b4ba08a95064db0009efd6bc145c2557', [409]], + ['45be57ebe8b5ba976d59551aef7c201a4205c4f86c1cf7952f15d3697b48d664', [412]], + ['226653d656455e6c74f4ae6216209470f05942ec9c0a275d1639a44d09bd0385', [705]], ])], ['docs/audits/2026-05-deep-research.md', new Map([ ['01a421a811703d5a24ad69214cff6cef7739ce301d718e1ad57268062a41abb5', [269]], From b60ff38579d54ff538383221cb64993fe8e0adaa Mon Sep 17 00:00:00 2001 From: devswha Date: Fri, 7 Aug 2026 21:29:00 +0900 Subject: [PATCH 3/3] fix(playground): drop the duplicate GitHub pill from the header controls The nav already links GitHub; the white pill sat at the end of the five-select control row looking like a form control. Control groups get consistent 14px rhythm with nowrap labels, and at mid widths the whole cluster wraps onto its own left-aligned row instead of orphaning the last select. --- playground/chatgpt.css | 12 ++++++++---- playground/index.html | 4 ---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/playground/chatgpt.css b/playground/chatgpt.css index 3352618..1b0711a 100644 --- a/playground/chatgpt.css +++ b/playground/chatgpt.css @@ -75,7 +75,7 @@ a { color: inherit; } .nav__links { display: flex; align-items: center; gap: 20px; margin-left: 14px; } .nav__links a { font-size: 15px; color: var(--text-dim); text-decoration: none; } .nav__links a:hover { color: var(--text); } -.nav__end { margin-left: auto; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: flex-end; } +.nav__end { margin-left: auto; display: flex; align-items: center; gap: 14px; flex-wrap: wrap; justify-content: flex-end; row-gap: 8px; } .nav__byok { flex-basis: 100%; display: flex; align-items: center; justify-content: flex-end; gap: 10px; flex-wrap: wrap; margin-top: 2px; } .nav__byok[hidden] { display: none; } .nav__pro { flex-basis: 100%; display: flex; align-items: center; justify-content: flex-end; gap: 10px; flex-wrap: wrap; margin-top: 2px; } @@ -83,7 +83,7 @@ a { color: inherit; } .ctl { display: flex; align-items: center; gap: 6px; } .ctl[hidden] { display: none; } -.ctl__label { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .04em; } +.ctl__label { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .04em; white-space: nowrap; } .ctl__select, .ctl__input { background: var(--bg-elev); color: var(--text); border: 1px solid var(--border); border-radius: 8px; @@ -104,8 +104,6 @@ a { color: inherit; } padding: 8px 16px; border-radius: 9999px; font-size: 14px; font-family: inherit; text-decoration: none; cursor: pointer; border: 1px solid transparent; } -.btn--gh { background: #ffffff; color: #0d1117; border-color: #ffffff; box-shadow: var(--inset); } -.btn--gh:hover { opacity: .88; } .btn--ghost { background: transparent; color: var(--text); border-color: var(--border-strong); } /* ───────── landing ───────── */ @@ -458,6 +456,12 @@ details.foldout > summary:focus-visible, } /* ───────── responsive ───────── */ + +/* Mid widths: drop the whole control cluster onto its own row instead of + letting a single trailing select orphan-wrap next to the nav links. */ +@media (max-width: 1180px) { + .nav__end { flex-basis: 100%; justify-content: flex-start; } +} @media (max-width: 900px) { /* Keep Docs/Examples/Benchmark/Ethics reachable on small screens: instead of hiding the links, wrap them onto their own full-width scrollable row. */ diff --git a/playground/index.html b/playground/index.html index ef09d80..f12470a 100644 --- a/playground/index.html +++ b/playground/index.html @@ -60,10 +60,6 @@ - - - GitHub -