@martinffx/atelier 3.5.0 → 3.7.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/CHANGELOG.md CHANGED
@@ -4,6 +4,22 @@
4
4
 
5
5
  - **breaking:** rename the `recon` agent to `sentinel`. Existing Atelier configuration is migrated automatically and legacy generated files are removed during the next command.
6
6
 
7
+ ## [3.7.0](https://github.com/martinffx/atelier/compare/v3.6.0...v3.7.0) (2026-11-07)
8
+
9
+
10
+ ### Features
11
+
12
+ * **agents:** make keymaker the implementer of settled designs ([6c7fb33](https://github.com/martinffx/atelier/commit/6c7fb33463006d64f68f6bb2d7056347b3eb7bbf))
13
+ * **claude:** set a 190k auto-compact window under opusplan ([a9f1ed1](https://github.com/martinffx/atelier/commit/a9f1ed156f10fbde547dcffe9b31b33409a204f3))
14
+ * **opencode:** refresh model catalogs and add openrouter and google providers ([#90](https://github.com/martinffx/atelier/issues/90)) ([85ed86b](https://github.com/martinffx/atelier/commit/85ed86b5a070f08624c8f4dab2445ebeb8b73db3))
15
+
16
+ ## [3.6.0](https://github.com/martinffx/atelier/compare/v3.5.0...v3.6.0) (2026-10-25)
17
+
18
+
19
+ ### Features
20
+
21
+ * **claude:** disable conflicting Claude Code built-ins ([40e074d](https://github.com/martinffx/atelier/commit/40e074df4e55a300ea4521fb05fad9232525715d))
22
+
7
23
  ## [3.5.0](https://github.com/martinffx/atelier/compare/v3.4.0...v3.5.0) (2026-10-18)
8
24
 
9
25
 
package/README.md CHANGED
@@ -114,24 +114,26 @@ The CLI also configures four specialist agents for Claude Code, OpenCode, Codex,
114
114
  | **Sentinel** | Read-only codebase reconnaissance and review triage |
115
115
  | **Oracle** | Requirements, trade-offs, and critical analysis of changes |
116
116
  | **Architect** | Domain modelling, system design, and architecture review |
117
- | **Keymaker** | Fast scaffolding of files and boilerplate from templates and existing patterns |
117
+ | **Keymaker** | Implements settled designs: code, business logic and tests, so the main conversation stays small |
118
118
 
119
- Each subagent launch explicitly selects one of these four by matching the task to its description; the harness default is never used. Keymaker is the only agent with write access in Codex, and it uses Sentinel's model and thinking defaults in every configuration.
119
+ Each subagent launch explicitly selects one of these four by matching the task to its description; the harness default is never used. Keymaker is the only agent with write access in Codex. It runs on each harness's build-tier model (Sonnet on Claude Code), not the cheap Sentinel model.
120
120
 
121
121
  Run `npx @martinffx/atelier@latest --help` for CLI commands and options. Each skill contains its own operating instructions and loads when its context applies.
122
122
 
123
123
  ## Models and thinking
124
124
 
125
- New configurations use the following defaults (September 2026). Each entry is **model / thinking**.
125
+ New configurations use the following defaults (November 2026). Each entry is **model / thinking**.
126
126
 
127
127
  | Configuration | Sentinel | Oracle | Architect | Plan | Build |
128
128
  |---|---|---|---|---|---|
129
129
  | Claude Code | Haiku 5.5 / default | Opus 5.5 / xhigh | Opus 5.5 / high | Opus 5.5 / high | Sonnet 5 / high |
130
130
  | Codex | Luna 6 / low | Astra 6 / high | Astra 6 / xhigh | Sol 6 / xhigh | Sol 6 / high |
131
131
  | OpenCode / OpenAI | Luna 6 / low | Astra 6 / high | Astra 6 / xhigh | Astra 6 / xhigh | Sol 6 / high |
132
- | OpenCode / Bedrock | Haiku 4.5 / default | Fable 5.1 / high | Opus 5.5 / high | Opus 5.5 / high | Sonnet 5 / high |
132
+ | OpenCode / Bedrock | Haiku 5.5 / low | Fable 5.1 / high | Opus 5.5 / high | Opus 5.5 / high | Sonnet 5 / high |
133
133
  | OpenCode / Zen | GLM 5.3 Flash / low | Kimi K3 / high | GLM 5.3 / high | GLM 5.3 / high | DeepSeek V4.1 Flash / high |
134
134
  | OpenCode / Go | GLM 5.3 Flash / low | MiMo V2.6 Pro / on | GLM 5.3 / high | GLM 5.3 / high | DeepSeek V4.1 Flash / high |
135
+ | OpenCode / OpenRouter | GLM 5.3 Flash / low | Kimi K3.1 Pro / high | GLM 5.3 / high | GLM 5.3 / high | DeepSeek V4.1 Flash (1017) / high |
136
+ | OpenCode / Google | Gemini 3.5 Flash Lite / low | Gemini 4 Argon / high | Gemini 4 Argon / high | Gemini 4 Argon / high | Gemini 3.8 Flash / high |
135
137
 
136
138
  Sentinel favors inexpensive reconnaissance. Oracle needs requirements synthesis and judgment; Architect and Plan need technical depth and completeness. Build balances capability and execution cost. These are starting configurations, informed by [Artificial Analysis](https://artificialanalysis.ai/models), rather than measured winners for Atelier's specific roles. Benchmark effort levels and provider speeds may differ from these defaults.
137
139
 
@@ -141,9 +143,9 @@ Run `atelier update --harness <claude|codex|opencode>` to choose models and thin
141
143
 
142
144
  Thinking is stored as `agents[].thinking`, `build_thinking`, and `plan_thinking` in `~/.atelier/config.json`. Values are model-specific: `default`, `off`, `on`, `low`, `medium`, `high`, `xhigh`, or `max`. The picker offers only verified capabilities. Custom models and catalog models whose controls have not been verified offer `default` only. Missing fields preserve legacy behavior; **Keep existing behavior** preserves that omission when editing. In particular, old Codex configurations retain medium agent/Build effort and high Plan effort. An explicit `default` omits Atelier's native effort override; other harness settings can still apply.
143
145
 
144
- - **Claude Code:** `opusplan` switches Opus/Sonnet by mode. Other session models share one thinking setting across modes. Atelier writes canonical `modelSettings.<model>.effortLevel` entries and subagent `effort`. Session `max` cannot be persisted, though supported subagents can use it. Use Claude Code **2.1.280 or later** for Opus 5.5 and the current aliases. Atelier also sets `disableClaudeAiConnectors: true`, `syncClaudeAiSkills: false` and `syncClaudeAiPlugins: false` in `~/.claude/settings.json`, so nothing from claude.ai is synced into Claude Code; `atelier remove` clears them unless you changed them. [Claude configuration](https://code.claude.com/docs/en/model-config)
146
+ - **Claude Code:** `opusplan` switches Opus/Sonnet by mode. Other session models share one thinking setting across modes. Atelier writes canonical `modelSettings.<model>.effortLevel` entries and subagent `effort`. Session `max` cannot be persisted, though supported subagents can use it. Under `opusplan`, Atelier also writes `modelSettings.<model>.autoCompactWindow: 190000` for both models: Claude Code silently plans on Sonnet once a turn passes 200k tokens, but only auto-compacts near 967k ([anthropics/claude-code#95206](https://github.com/anthropics/claude-code/issues/95206)). A window you set yourself is kept, and `atelier remove` clears only the 190000 value. Use Claude Code **2.1.280 or later** for Opus 5.5 and the current aliases. Atelier also sets `disableClaudeAiConnectors: true`, `syncClaudeAiSkills: false` and `syncClaudeAiPlugins: false` in `~/.claude/settings.json`, so nothing from claude.ai is synced into Claude Code; `atelier remove` clears them unless you changed them. It also disables the Claude Code built-ins that clash with Atelier skills (`disableBundledSkills`, `enableArtifact: false`, `disableWorkflows`, deny rules for `Artifact`, `ArtifactComments`, `ArtifactData`, `Workflow` and `DesignSync`, and `skillOverrides` turning off the `/security-review` and `/ultrareview` commands). Interactive `init` also offers a checklist of optional built-ins to disable, none selected by default: `cron` (`/loop` and the Cron tools), `chrome` (the claude-in-chrome MCP server) and `remote-trigger` (`RemoteTrigger`). `atelier remove` and unticking an option undo these the same way. [Claude configuration](https://code.claude.com/docs/en/model-config)
145
147
  - **Codex:** Plan and Build share the selected session model, with separate reasoning settings. Oracle and Architect use independent Astra configurations. `off` maps to native `none`, available on Sol/Luna but not Astra. [Codex configuration](https://developers.openai.com/codex/config-reference/)
146
- - **OpenCode:** all five assignments are independent. Use **1.18.30 or later** for GPT-6 integration. Atelier sends explicit provider options rather than relying on automatically discovered reasoning variants: `reasoningEffort` for OpenAI-compatible routes, `effort` for Anthropic, and `reasoningConfig` for Bedrock. GLM 5.3 supports low/high/max; it does not support medium. Bedrock defaults use US inference profiles with `us-east-1`. [OpenCode agents](https://opencode.ai/docs/agents/)
148
+ - **OpenCode:** all five assignments are independent. Use **1.18.30 or later** for GPT-6 integration. Atelier sends explicit provider options rather than relying on automatically discovered reasoning variants: `reasoningEffort` for OpenAI-compatible routes, `effort` for Anthropic, and `reasoningConfig` for Bedrock, `reasoning.effort` for OpenRouter and `thinkingConfig.thinkingLevel` for Google. GLM 5.3 supports low/high/max; it does not support medium. Bedrock defaults use US inference profiles with `us-east-1`. Go's Muse Spark 1.3 Contributor only works if the workspace allows paid endpoints that train on request data. [OpenCode agents](https://opencode.ai/docs/agents/)
147
149
  - **MiMo:** `on`/`off` maps to `thinking.type: enabled`/`disabled`. There are no graded effort tiers. OpenCode agent files omit the old fixed temperature override so provider defaults apply. [MiMo API](https://mimo.mi.com/docs/en-US/api/chat/openai-api)
148
150
 
149
151
  Atelier does not upgrade installed harness CLIs. Request-option serialization was checked against OpenCode's provider SDK versions with intercepted requests; this verifies parameter encoding, not upstream availability, quota, or role quality.
@@ -1,36 +1,44 @@
1
1
  ---
2
2
  name: keymaker
3
- description: Fast scaffolder. Use proactively to create files, directories and boilerplate from templates or existing project patterns, or to make simple pattern-following edits; reports exactly what changed. Does not design, review or implement business logic.
3
+ description: Implementer. MUST BE USED for every code change once the design or plan is settled, including new files, features, business logic, refactors, test writing, bug fixes with a known cause, and multi-file edits. Delegate implementation to Keymaker instead of editing in the main conversation, so the main conversation's context stays small. Give it the design excerpt, owned files and validation command. It writes tests first, implements, runs validation and reports files changed and test results. It makes no design decisions; it stops and asks.
4
4
  ---
5
5
 
6
- You are the **Keymaker**, a fast scaffolding agent. Your job is to create the files and directories others need, by copying existing project patterns or applying templates exactly. You work quickly, follow the pattern you are given, and never improvise design.
6
+ You are the **Keymaker**, the implementer. The design is settled and someone has handed you one task to build. You write the code and tests, run the validation, and report back, so the main conversation never has to carry the implementation.
7
+
8
+ Delegating to you is the default path for writing code. The main conversation edits directly only for trivial one-line changes and stateful debugging.
7
9
 
8
10
  ## Role
9
11
 
10
- - Create files and directory structures from templates or existing project patterns
11
- - Apply variable substitutions consistently across everything you create
12
- - Make simple, mechanical, pattern-following edits (renames, boilerplate, wiring)
13
- - Report exactly what was created or changed
12
+ - Implement one task from the design excerpt you are given: files, business logic, wiring, and tests
13
+ - Follow existing project patterns and conventions rather than inventing new ones
14
+ - Write the test first when behaviour changes (stub → test → fix), then make it pass
15
+ - Run the task's validation command and fix what fails, within the files you own
16
+ - Report exactly what changed, and what the validation showed
14
17
 
15
18
  ## Skills
16
19
 
17
- Before beginning work, scan your environment for relevant skills and load any that apply to the task at hand. Use them to follow the project's conventions for structure and naming.
20
+ Before beginning work, scan your environment for relevant skills and load any that apply to the task at hand. Use them to follow the project's conventions for structure, naming and testing.
21
+
22
+ ## Inputs
23
+
24
+ You should be given: the task and its requirements, the design excerpt it implements, the files you own, and the validation command. If any of these is missing or ambiguous, stop and ask. Do not guess your way around a gap in the design.
18
25
 
19
26
  ## Checklist
20
27
 
21
28
  Before finishing, confirm you have:
22
29
 
23
- - [ ] Verified each target file does not already exist before creating it
24
- - [ ] Created parent directories as needed
25
- - [ ] Applied all relevant variable substitutions when using templates
26
- - [ ] Matched the pattern you were pointed at (naming, structure, imports)
27
- - [ ] Reported every file created or modified
30
+ - [ ] Stayed inside the files you were told you own
31
+ - [ ] Matched the pattern you were pointed at (naming, structure, imports, test style)
32
+ - [ ] Written or updated tests for any changed behaviour
33
+ - [ ] Run the validation command and read its output
34
+ - [ ] Reported every file created or modified, plus the validation result (pass or the failing output)
28
35
 
29
36
  ## Boundaries
30
37
 
31
- - DO create files and directories as requested
32
- - DO follow the pattern you are given rather than inventing one
38
+ - DO implement the task, including business logic, within your owned files
39
+ - DO write and update tests
40
+ - DO stop and ask when the design is unclear, contradicts the code, or a change would reach outside your owned files
33
41
  - DON'T make design or architectural decisions (that's `architect`)
34
- - DON'T implement business logic or review code
35
- - DON'T conduct requirements discovery (that's `oracle`)
36
- - NEVER overwrite existing files unless explicitly told to
42
+ - DON'T conduct requirements discovery or challenge scope (that's `oracle`)
43
+ - DON'T review code beyond checking your own work
44
+ - NEVER overwrite files outside your owned list, and never silently work around a failing test by weakening it
package/dist/atelier.js CHANGED
@@ -32104,17 +32104,33 @@ function resolveBasePath(harness) {
32104
32104
  var THINKING_LEVELS = ["default", "off", "on", "low", "medium", "high", "xhigh", "max"];
32105
32105
  function thinkingChoices(harness, model, session = false) {
32106
32106
  const id = model.split("/").at(-1).toLowerCase();
32107
- if (/gpt-6-(astra|sol|luna)$/.test(id)) {
32108
- return ["default", ...id.endsWith("astra") ? [] : ["off"], "low", "medium", "high", "xhigh", "max"];
32107
+ if (/gpt-6(\.1)?-(astra|sol|luna|terra)$/.test(id)) {
32108
+ return ["default", .../astra$|6\.1-sol$/.test(id) ? [] : ["off"], "low", "medium", "high", "xhigh", "max"];
32109
32109
  }
32110
- if (/^(opus|opusplan|sonnet|haiku|fable|best)$/.test(id) || /claude-(opus-5-5|fable-5-1|sonnet-5-5|haiku-5-5)$/.test(id)) {
32110
+ if (/^(opus|opusplan|sonnet|haiku|fable|best)$/.test(id) || /claude-(opus-5[-.]5|fable-5[-.]1|sonnet-5[-.]5|haiku-5[-.]5)$/.test(id)) {
32111
32111
  return ["default", "low", "medium", "high", "xhigh", ...harness === "claude" && session ? [] : ["max"]];
32112
32112
  }
32113
32113
  if (harness === "opencode") {
32114
- if (/^(glm-5\.3(-flash)?|kimi-k3|deepseek-v4(\.1-flash|-pro))$/.test(id))
32114
+ if (/^(glm-5\.3(-flash)?|kimi-k3(\.1-pro)?|deepseek-v4(\.1-flash(-1017)?|-pro))$/.test(id))
32115
32115
  return ["default", "low", "high", "max"];
32116
32116
  if (/^(mimo-v2\.6-(pro|flash)(-free)?|minimax-m3(-free)?)$/.test(id))
32117
32117
  return ["default", "off", "on"];
32118
+ if (id === "minimax-m3.1-flash")
32119
+ return ["default", "low", "medium", "high", "xhigh", "max"];
32120
+ if (/^(gemini-4-argon(-contributor)?|gemini-3\.[5-8]-flash(-lite)?)$/.test(id))
32121
+ return ["default", "low", "medium", "high"];
32122
+ if (id === "grok-4.7")
32123
+ return ["default", "low", "medium", "high", "xhigh"];
32124
+ if (/^mistral-large-4(-0)?$/.test(id))
32125
+ return ["default", "off", "high"];
32126
+ if (/^inkling(-2)?(-small)?(-free)?$/.test(id))
32127
+ return ["default", "off", "low", "medium", "high", "max"];
32128
+ if (/^muse-(spark-1\.3(-contributor)?|wonder(-1\.0)?)$/.test(id))
32129
+ return ["default", "low", "medium", "high", "xhigh", "max"];
32130
+ if (id === "muse-spark-open")
32131
+ return ["default", "low", "medium", "high", "xhigh"];
32132
+ if (/^nemotron-3\.5-super-vl(-free)?$/.test(id))
32133
+ return ["default", "off", "low", "medium", "high", "xhigh"];
32118
32134
  }
32119
32135
  return ["default"];
32120
32136
  }
@@ -32136,7 +32152,7 @@ function claudeModel(model) {
32136
32152
  function claudeModeModels(model) {
32137
32153
  return model === "opusplan" ? { build: claudeModel("sonnet"), plan: claudeModel("opus") } : { build: claudeModel(model), plan: claudeModel(model) };
32138
32154
  }
32139
- var OPENCODE_THINKING_KEYS = ["reasoningEffort", "thinking", "effort", "reasoningConfig"];
32155
+ var OPENCODE_THINKING_KEYS = ["reasoningEffort", "thinking", "effort", "reasoningConfig", "reasoning", "thinkingConfig"];
32140
32156
  function openCodeThinkingOptions(model, thinking) {
32141
32157
  assertThinking("opencode", model, thinking);
32142
32158
  if (!thinking || thinking === "default")
@@ -32144,10 +32160,17 @@ function openCodeThinkingOptions(model, thinking) {
32144
32160
  if (model.startsWith("amazon-bedrock/")) {
32145
32161
  return { reasoningConfig: { type: "adaptive", maxReasoningEffort: thinking, display: "summarized" } };
32146
32162
  }
32163
+ if (model.startsWith("openrouter/")) {
32164
+ if (thinking === "on" || thinking === "off")
32165
+ return { reasoning: { enabled: thinking === "on" } };
32166
+ return { reasoning: { effort: thinking } };
32167
+ }
32168
+ if (model.startsWith("google/"))
32169
+ return { thinkingConfig: { thinkingLevel: thinking } };
32147
32170
  if (model.includes("claude-"))
32148
32171
  return { effort: thinking };
32149
32172
  if (thinking === "on" || thinking === "off") {
32150
- if (model.includes("gpt-6-"))
32173
+ if (/gpt-6|mistral-large|inkling|nemotron/.test(model))
32151
32174
  return { reasoningEffort: "none" };
32152
32175
  return { thinking: { type: thinking === "off" ? "disabled" : model.includes("minimax") ? "adaptive" : "enabled" } };
32153
32176
  }
@@ -32293,7 +32316,7 @@ function formatFileList(files) {
32293
32316
  `);
32294
32317
  }
32295
32318
  function guardProvider(provider) {
32296
- if (!provider || !["opencode-zen", "opencode-go", "amazon-bedrock", "openai"].includes(provider)) {
32319
+ if (!provider || !["opencode-zen", "opencode-go", "amazon-bedrock", "openai", "openrouter", "google"].includes(provider)) {
32297
32320
  throw new InvalidConfigError("A valid provider must be selected for OpenCode");
32298
32321
  }
32299
32322
  return provider;
@@ -32561,7 +32584,7 @@ var SimpleConfigSchema = objectType({
32561
32584
  var CursorConfigSchema = objectType({
32562
32585
  agents: arrayType(AgentSchema).min(1)
32563
32586
  }).strict();
32564
- var OPENCODE_PROVIDERS = ["opencode-zen", "opencode-go", "amazon-bedrock", "openai"];
32587
+ var OPENCODE_PROVIDERS = ["opencode-zen", "opencode-go", "amazon-bedrock", "openai", "openrouter", "google"];
32565
32588
  var OpenCodeConfigSchema = objectType({
32566
32589
  provider: enumType(OPENCODE_PROVIDERS),
32567
32590
  build_model: stringType().min(1),
@@ -32570,7 +32593,10 @@ var OpenCodeConfigSchema = objectType({
32570
32593
  plan_thinking: ThinkingSchema.optional(),
32571
32594
  agents: arrayType(ThinkingAgentSchema).min(1)
32572
32595
  }).superRefine((config, ctx) => checkThinking("opencode", config, ctx));
32573
- var ClaudeConfigSchema = SimpleConfigSchema.superRefine((config, ctx) => {
32596
+ var CLAUDE_OPTIONAL_BUILTINS = ["cron", "chrome", "remote-trigger"];
32597
+ var ClaudeConfigSchema = SimpleConfigSchema.extend({
32598
+ disabled_builtins: arrayType(enumType(CLAUDE_OPTIONAL_BUILTINS)).optional()
32599
+ }).superRefine((config, ctx) => {
32574
32600
  checkThinking("claude", config, ctx);
32575
32601
  if (config.default_model !== "opusplan" && config.plan_thinking !== undefined && config.plan_thinking !== config.build_thinking) {
32576
32602
  ctx.addIssue({ code: "custom", path: ["plan_thinking"], message: "Separate Claude Plan/Build thinking requires opusplan" });
@@ -32595,13 +32621,23 @@ var DEFAULT_MODELS = {
32595
32621
  sentinel: "haiku",
32596
32622
  oracle: "opus",
32597
32623
  architect: "opus",
32598
- keymaker: "haiku"
32624
+ keymaker: "sonnet"
32599
32625
  };
32600
32626
  var CLAUDE_AI_OPT_OUTS = {
32601
32627
  disableClaudeAiConnectors: true,
32602
32628
  syncClaudeAiSkills: false,
32603
32629
  syncClaudeAiPlugins: false
32604
32630
  };
32631
+ var CONFLICTING_BUILTINS = {
32632
+ settings: { disableBundledSkills: true, enableArtifact: false, disableWorkflows: true },
32633
+ deny: ["Artifact", "ArtifactComments", "ArtifactData", "Workflow", "DesignSync"],
32634
+ skillOverrides: ["security-review", "ultrareview"]
32635
+ };
32636
+ var OPTIONAL_BUILTINS = {
32637
+ cron: { env: { CLAUDE_CODE_DISABLE_CRON: "1" } },
32638
+ chrome: { deniedMcpServers: ["claude-in-chrome"] },
32639
+ "remote-trigger": { deny: ["RemoteTrigger"] }
32640
+ };
32605
32641
  var claudeAdapter = {
32606
32642
  name: "claude",
32607
32643
  configSchema: ClaudeConfigSchema,
@@ -32631,7 +32667,15 @@ function modelsForProvider(_provider) {
32631
32667
  return [...ANTHROPIC_MODELS];
32632
32668
  }
32633
32669
  async function promptSection(prompt, section) {
32634
- return promptForSimpleModels(prompt, section, modelsForProvider());
32670
+ const claude = section;
32671
+ const result = await promptForSimpleModels(prompt, claude, modelsForProvider());
32672
+ const { disabled } = await prompt.prompt([{
32673
+ type: "checkbox",
32674
+ name: "disabled",
32675
+ message: "Disable optional Claude Code built-ins",
32676
+ choices: CLAUDE_OPTIONAL_BUILTINS.map((value) => ({ name: value, value, checked: claude.disabled_builtins?.includes(value) ?? false }))
32677
+ }]);
32678
+ return { ...result, disabled_builtins: disabled };
32635
32679
  }
32636
32680
  function installAgents(section, basePath) {
32637
32681
  const config = ClaudeConfigSchema.parse(section);
@@ -32671,6 +32715,14 @@ function mergeHarnessConfig(section, basePath) {
32671
32715
  model: config.default_model || DEFAULT_MODELS.default_model
32672
32716
  };
32673
32717
  applyModeThinking(settings, config);
32718
+ applyAutoCompactWindow(settings, config);
32719
+ applyBuiltins(settings, CONFLICTING_BUILTINS);
32720
+ for (const name of CLAUDE_OPTIONAL_BUILTINS) {
32721
+ if (config.disabled_builtins?.includes(name))
32722
+ applyBuiltins(settings, OPTIONAL_BUILTINS[name]);
32723
+ else
32724
+ removeBuiltins(settings, OPTIONAL_BUILTINS[name]);
32725
+ }
32674
32726
  try {
32675
32727
  mkdirSync2(claudeDir, { recursive: true });
32676
32728
  writeFileSync3(settingsPath, JSON.stringify(settings, null, 2) + `
@@ -32729,6 +32781,10 @@ function removeAtelierSettings(claudeDir, config) {
32729
32781
  delete content[key];
32730
32782
  }
32731
32783
  applyModeThinking(content, config, true);
32784
+ applyAutoCompactWindow(content, config, true);
32785
+ removeBuiltins(content, CONFLICTING_BUILTINS);
32786
+ for (const patch of Object.values(OPTIONAL_BUILTINS))
32787
+ removeBuiltins(content, patch);
32732
32788
  writeOrDeleteSettings(settingsPath, content);
32733
32789
  }
32734
32790
  function applyModeThinking(settings, config, remove = false) {
@@ -32753,6 +32809,96 @@ function applyModeThinking(settings, config, remove = false) {
32753
32809
  else
32754
32810
  delete settings.modelSettings;
32755
32811
  }
32812
+ var OPUSPLAN_AUTO_COMPACT_WINDOW = 190000;
32813
+ function applyAutoCompactWindow(settings, config, remove = false) {
32814
+ const models = claudeModeModels("opusplan");
32815
+ const enabled = !remove && config.default_model === "opusplan";
32816
+ const modelSettings = { ...settings.modelSettings };
32817
+ for (const model of new Set([models.build, models.plan])) {
32818
+ const entry = { ...modelSettings[model] };
32819
+ if (enabled)
32820
+ entry.autoCompactWindow ??= OPUSPLAN_AUTO_COMPACT_WINDOW;
32821
+ else if (entry.autoCompactWindow === OPUSPLAN_AUTO_COMPACT_WINDOW)
32822
+ delete entry.autoCompactWindow;
32823
+ if (Object.keys(entry).length)
32824
+ modelSettings[model] = entry;
32825
+ else
32826
+ delete modelSettings[model];
32827
+ }
32828
+ if (Object.keys(modelSettings).length)
32829
+ settings.modelSettings = modelSettings;
32830
+ else
32831
+ delete settings.modelSettings;
32832
+ }
32833
+ function applyBuiltins(settings, patch) {
32834
+ Object.assign(settings, patch.settings);
32835
+ if (patch.env)
32836
+ settings.env = { ...settings.env, ...patch.env };
32837
+ if (patch.deny) {
32838
+ const permissions = { ...settings.permissions };
32839
+ const deny = permissions.deny ?? [];
32840
+ permissions.deny = [...deny, ...patch.deny.filter((rule) => !deny.includes(rule))];
32841
+ settings.permissions = permissions;
32842
+ }
32843
+ if (patch.skillOverrides) {
32844
+ const overrides = { ...settings.skillOverrides };
32845
+ for (const name of patch.skillOverrides)
32846
+ overrides[name] = "off";
32847
+ settings.skillOverrides = overrides;
32848
+ }
32849
+ if (patch.deniedMcpServers) {
32850
+ const denied = settings.deniedMcpServers ?? [];
32851
+ const missing = patch.deniedMcpServers.filter((name) => !denied.some((entry) => entry.serverName === name));
32852
+ settings.deniedMcpServers = [...denied, ...missing.map((serverName) => ({ serverName }))];
32853
+ }
32854
+ }
32855
+ function removeBuiltins(settings, patch) {
32856
+ for (const [key, value] of Object.entries(patch.settings ?? {})) {
32857
+ if (settings[key] === value)
32858
+ delete settings[key];
32859
+ }
32860
+ if (patch.env) {
32861
+ const env = { ...settings.env };
32862
+ for (const [key, value] of Object.entries(patch.env)) {
32863
+ if (env[key] === value)
32864
+ delete env[key];
32865
+ }
32866
+ if (Object.keys(env).length)
32867
+ settings.env = env;
32868
+ else
32869
+ delete settings.env;
32870
+ }
32871
+ if (patch.deny && settings.permissions) {
32872
+ const permissions = { ...settings.permissions };
32873
+ const deny = (permissions.deny ?? []).filter((rule) => !patch.deny.includes(rule));
32874
+ if (deny.length)
32875
+ permissions.deny = deny;
32876
+ else
32877
+ delete permissions.deny;
32878
+ if (Object.keys(permissions).length)
32879
+ settings.permissions = permissions;
32880
+ else
32881
+ delete settings.permissions;
32882
+ }
32883
+ if (patch.skillOverrides && settings.skillOverrides) {
32884
+ const overrides = { ...settings.skillOverrides };
32885
+ for (const name of patch.skillOverrides) {
32886
+ if (overrides[name] === "off")
32887
+ delete overrides[name];
32888
+ }
32889
+ if (Object.keys(overrides).length)
32890
+ settings.skillOverrides = overrides;
32891
+ else
32892
+ delete settings.skillOverrides;
32893
+ }
32894
+ if (patch.deniedMcpServers && settings.deniedMcpServers) {
32895
+ const denied = settings.deniedMcpServers.filter((entry) => !patch.deniedMcpServers.includes(entry.serverName ?? ""));
32896
+ if (denied.length)
32897
+ settings.deniedMcpServers = denied;
32898
+ else
32899
+ delete settings.deniedMcpServers;
32900
+ }
32901
+ }
32756
32902
  function parseSettingsJson(settingsPath) {
32757
32903
  try {
32758
32904
  return JSON.parse(readFileSync4(settingsPath, "utf-8"));
@@ -32791,17 +32937,20 @@ var OPENCODE_PROVIDERS2 = [
32791
32937
  { name: "OpenCode Zen", value: "opencode-zen" },
32792
32938
  { name: "OpenCode Go", value: "opencode-go" },
32793
32939
  { name: "Amazon Bedrock", value: "amazon-bedrock" },
32794
- { name: "OpenAI", value: "openai" }
32940
+ { name: "OpenAI", value: "openai" },
32941
+ { name: "OpenRouter", value: "openrouter" },
32942
+ { name: "Google Gemini", value: "google" }
32795
32943
  ];
32796
32944
  var PROVIDER_MODELS = {
32797
32945
  "opencode-zen": [
32946
+ "gpt-6.1-sol",
32798
32947
  "gpt-6-astra",
32799
32948
  "gpt-6-sol",
32800
32949
  "gpt-6-luna",
32801
32950
  "claude-opus-5-5",
32802
32951
  "claude-fable-5-1",
32803
32952
  "claude-sonnet-5-5",
32804
- "claude-haiku-4-5",
32953
+ "claude-haiku-5-5",
32805
32954
  "glm-5.3",
32806
32955
  "glm-5.3-flash",
32807
32956
  "kimi-k3",
@@ -32812,36 +32961,83 @@ var PROVIDER_MODELS = {
32812
32961
  "qwen3.8-max",
32813
32962
  "qwen3.8-flash",
32814
32963
  "mimo-v2.6-flash-free",
32964
+ "gemini-4-argon",
32815
32965
  "gemini-3.8-flash",
32816
- "gemini-3.1-pro"
32966
+ "grok-4.7",
32967
+ "mistral-large-4",
32968
+ "muse-spark-1.3",
32969
+ "muse-wonder-1.0",
32970
+ "inkling-2-small-free",
32971
+ "nemotron-3.5-super-vl-free",
32972
+ "nemotron-3.5-lightning-free"
32817
32973
  ].map((id) => `opencode/${id}`),
32818
32974
  "opencode-go": [
32819
32975
  "glm-5.3",
32820
32976
  "glm-5.3-flash",
32977
+ "kimi-k3.1-pro",
32821
32978
  "kimi-k3",
32822
32979
  "deepseek-v4.1-flash",
32823
32980
  "deepseek-v4-pro",
32981
+ "minimax-m3.1-flash",
32824
32982
  "minimax-m3",
32825
32983
  "qwen3.8-max",
32826
32984
  "qwen3.8-flash",
32827
32985
  "mimo-v2.6-pro",
32828
32986
  "mimo-v2.6-flash",
32829
- "gpt-6-luna"
32987
+ "gpt-6-luna",
32988
+ "claude-haiku-5-5",
32989
+ "gemini-4-argon",
32990
+ "grok-4.7",
32991
+ "muse-spark-1.3-contributor"
32830
32992
  ].map((id) => `opencode-go/${id}`),
32831
32993
  "amazon-bedrock": [
32832
32994
  "us.anthropic.claude-opus-5-5",
32833
32995
  "us.anthropic.claude-fable-5-1",
32834
32996
  "us.anthropic.claude-sonnet-5-5",
32835
- "us.anthropic.claude-haiku-4-5-20251001-v1:0"
32997
+ "us.anthropic.claude-haiku-5-5"
32836
32998
  ].map((id) => `amazon-bedrock/${id}`),
32837
- openai: ["gpt-6-astra", "gpt-6-sol", "gpt-6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.3-codex-spark"].map((id) => `openai/${id}`)
32999
+ openai: ["gpt-6.1-sol", "gpt-6.1-terra", "gpt-6-astra", "gpt-6-sol", "gpt-6-luna", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.3-codex-spark"].map((id) => `openai/${id}`),
33000
+ openrouter: [
33001
+ "anthropic/claude-opus-5.5",
33002
+ "anthropic/claude-fable-5.1",
33003
+ "anthropic/claude-sonnet-5.5",
33004
+ "anthropic/claude-haiku-5.5",
33005
+ "openai/gpt-6.1-sol",
33006
+ "openai/gpt-6.1-terra",
33007
+ "openai/gpt-6-astra",
33008
+ "openai/gpt-6-sol",
33009
+ "openai/gpt-6-luna",
33010
+ "google/gemini-4-argon",
33011
+ "google/gemini-3.8-flash",
33012
+ "z-ai/glm-5.3",
33013
+ "z-ai/glm-5.3-flash",
33014
+ "moonshotai/kimi-k3.1-pro",
33015
+ "moonshotai/kimi-k3",
33016
+ "deepseek/deepseek-v4.1-flash-1017",
33017
+ "deepseek/deepseek-v4.1-flash",
33018
+ "deepseek/deepseek-v4-pro",
33019
+ "x-ai/grok-4.7",
33020
+ "minimax/minimax-m3.1-flash",
33021
+ "minimax/minimax-m3",
33022
+ "qwen/qwen3.8-flash",
33023
+ "xiaomi/mimo-v2.6-pro",
33024
+ "mistralai/mistral-large-4-0",
33025
+ "thinkingmachines/inkling",
33026
+ "thinkingmachines/inkling-small",
33027
+ "nvidia/nemotron-3.5-super-vl",
33028
+ "nvidia/nemotron-3.5-lightning",
33029
+ "meta/muse-spark-1.3",
33030
+ "meta/muse-spark-open",
33031
+ "meta/muse-wonder"
33032
+ ].map((id) => `openrouter/${id}`),
33033
+ google: ["gemini-4-argon", "gemini-3.8-flash", "gemini-3.7-flash", "gemini-3.5-flash-lite"].map((id) => `google/${id}`)
32838
33034
  };
32839
33035
  var DEFAULT_MODELS2 = {
32840
33036
  "opencode-zen": {
32841
33037
  sentinel: "opencode/glm-5.3-flash",
32842
33038
  oracle: "opencode/kimi-k3",
32843
33039
  architect: "opencode/glm-5.3",
32844
- keymaker: "opencode/glm-5.3-flash",
33040
+ keymaker: "opencode/deepseek-v4.1-flash",
32845
33041
  build: "opencode/deepseek-v4.1-flash",
32846
33042
  plan: "opencode/glm-5.3"
32847
33043
  },
@@ -32849,15 +33045,15 @@ var DEFAULT_MODELS2 = {
32849
33045
  sentinel: "opencode-go/glm-5.3-flash",
32850
33046
  oracle: "opencode-go/mimo-v2.6-pro",
32851
33047
  architect: "opencode-go/glm-5.3",
32852
- keymaker: "opencode-go/glm-5.3-flash",
33048
+ keymaker: "opencode-go/deepseek-v4.1-flash",
32853
33049
  build: "opencode-go/deepseek-v4.1-flash",
32854
33050
  plan: "opencode-go/glm-5.3"
32855
33051
  },
32856
33052
  "amazon-bedrock": {
32857
- sentinel: "amazon-bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0",
33053
+ sentinel: "amazon-bedrock/us.anthropic.claude-haiku-5-5",
32858
33054
  oracle: "amazon-bedrock/us.anthropic.claude-fable-5-1",
32859
33055
  architect: "amazon-bedrock/us.anthropic.claude-opus-5-5",
32860
- keymaker: "amazon-bedrock/us.anthropic.claude-haiku-4-5-20251001-v1:0",
33056
+ keymaker: "amazon-bedrock/us.anthropic.claude-sonnet-5-5",
32861
33057
  build: "amazon-bedrock/us.anthropic.claude-sonnet-5-5",
32862
33058
  plan: "amazon-bedrock/us.anthropic.claude-opus-5-5"
32863
33059
  },
@@ -32865,9 +33061,25 @@ var DEFAULT_MODELS2 = {
32865
33061
  sentinel: "openai/gpt-6-luna",
32866
33062
  oracle: "openai/gpt-6-astra",
32867
33063
  architect: "openai/gpt-6-astra",
32868
- keymaker: "openai/gpt-6-luna",
33064
+ keymaker: "openai/gpt-6-sol",
32869
33065
  build: "openai/gpt-6-sol",
32870
33066
  plan: "openai/gpt-6-astra"
33067
+ },
33068
+ openrouter: {
33069
+ sentinel: "openrouter/z-ai/glm-5.3-flash",
33070
+ oracle: "openrouter/moonshotai/kimi-k3.1-pro",
33071
+ architect: "openrouter/z-ai/glm-5.3",
33072
+ keymaker: "openrouter/deepseek/deepseek-v4.1-flash-1017",
33073
+ build: "openrouter/deepseek/deepseek-v4.1-flash-1017",
33074
+ plan: "openrouter/z-ai/glm-5.3"
33075
+ },
33076
+ google: {
33077
+ sentinel: "google/gemini-3.5-flash-lite",
33078
+ oracle: "google/gemini-4-argon",
33079
+ architect: "google/gemini-4-argon",
33080
+ keymaker: "google/gemini-3.8-flash",
33081
+ build: "google/gemini-3.8-flash",
33082
+ plan: "google/gemini-4-argon"
32871
33083
  }
32872
33084
  };
32873
33085
  var COMMAND_MARKER = "<!-- Generated by Atelier -->";
@@ -32896,7 +33108,7 @@ function defaultSection2(provider) {
32896
33108
  template: name,
32897
33109
  name,
32898
33110
  model: defaults[name],
32899
- thinking: name === "sentinel" || name === "keymaker" ? selectedProvider === "amazon-bedrock" ? "default" : "low" : name === "oracle" && selectedProvider === "opencode-go" ? "on" : name === "architect" && selectedProvider === "openai" ? "xhigh" : "high"
33111
+ thinking: name === "keymaker" ? selectedProvider === "amazon-bedrock" ? "default" : "high" : name === "sentinel" ? "low" : name === "oracle" && selectedProvider === "opencode-go" ? "on" : name === "architect" && selectedProvider === "openai" ? "xhigh" : "high"
32900
33112
  }))
32901
33113
  };
32902
33114
  }
@@ -34325,7 +34537,7 @@ var DEFAULT_MODELS3 = {
34325
34537
  sentinel: "gpt-6-luna",
34326
34538
  oracle: "gpt-6-astra",
34327
34539
  architect: "gpt-6-astra",
34328
- keymaker: "gpt-6-luna"
34540
+ keymaker: "gpt-6-sol"
34329
34541
  };
34330
34542
  var WRITABLE_AGENTS = ["keymaker"];
34331
34543
  var MANAGED_CODEX_KEYS = [
@@ -34364,7 +34576,7 @@ function defaultSection3() {
34364
34576
  template: name,
34365
34577
  name,
34366
34578
  model: DEFAULT_MODELS3[name],
34367
- thinking: { sentinel: "low", oracle: "high", architect: "xhigh", keymaker: "low" }[name]
34579
+ thinking: { sentinel: "low", oracle: "high", architect: "xhigh", keymaker: "medium" }[name]
34368
34580
  }))
34369
34581
  };
34370
34582
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@martinffx/atelier",
3
- "version": "3.5.0",
3
+ "version": "3.7.0",
4
4
  "description": "Personal development toolkit - spec-driven development, code quality, deep thinking, and ecosystem patterns",
5
5
  "type": "module",
6
6
  "bin": {
@@ -126,8 +126,11 @@ choice to review. If any choice exists, use an Inline Plan.
126
126
  Delegate bounded, read-only work to a subagent when it would otherwise flood the main context:
127
127
  wide codebase research, finding comparable code, or independent review. Ask for a concise,
128
128
  file:line-cited summary, and read the key cited files yourself before deciding. Do not delegate
129
- interviews or design dialogue with the human, lookups of a few files, or stateful debug and
130
- implementation loops.
129
+ interviews or design dialogue with the human, lookups of a few files, or stateful debug loops.
130
+
131
+ Delegate implementation too. Once the design is settled, implementation batches go to
132
+ **Keymaker** subagents through **code-subagents**; the main conversation edits code directly
133
+ only for trivial or mechanical changes and debugging loops.
131
134
 
132
135
  Every subagent launch must explicitly select an agent. Match the work to the descriptions of
133
136
  Atelier's agents (Sentinel, Oracle, Architect, Keymaker) and choose one. Never launch without a
@@ -135,6 +138,21 @@ selection or rely on the harness default. Exception: design-sensitive implementa
135
138
  harness's general agent. If Atelier's agents are not installed, explicitly choose the closest
136
139
  available agent by description and state the choice in the output.
137
140
 
141
+ ### Parent context
142
+
143
+ The main conversation holds the human's decisions and is the scarcest context. Quality degrades
144
+ as it grows, compaction loses detail, and under `opusplan` planning silently drops to Sonnet once
145
+ a turn passes 200k tokens. Keep it lean:
146
+
147
+ - Send work that produces bulky output to subagents and keep only their summaries. That covers
148
+ broad search, test and build runs, log reading, and implementation batches through
149
+ code-subagents.
150
+ - Read only the ranges you need, don't re-read files, and don't paste large outputs back.
151
+ - Persist decisions and progress to the plan or spec artifacts, so compaction or a fresh session
152
+ loses nothing.
153
+ - Compact deliberately at phase boundaries (plan approved, batch done, before re-planning) with
154
+ `/compact <focus>`, or start a fresh session. Don't wait for the automatic trigger mid-task.
155
+
138
156
  ## Hard Transitions
139
157
 
140
158
  | After completing... | Next step |
@@ -70,10 +70,10 @@ For shared-tree parallel work:
70
70
  ## Agent Selection
71
71
 
72
72
  Select the agent explicitly for every dispatch (see Delegation in `atelier-orchestrator`). Give
73
- implementers the design excerpt so they make no design decisions: mechanical file creation should
74
- match a scaffolder; design-sensitive implementation may use the harness's general agent, the one
75
- permitted exception to selecting from Atelier's agents. The batch reviewer is a read-only
76
- critical review.
73
+ implementers the design excerpt so they make no design decisions. Implementers of settled
74
+ designs, mechanical or not, are Keymaker; design-sensitive implementation may use the harness's
75
+ general agent, the one permitted exception to selecting from Atelier's agents. The batch reviewer
76
+ is a read-only critical review.
77
77
 
78
78
  ---
79
79