@autohq/cli 0.1.440 → 0.1.442

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.
@@ -30825,7 +30825,7 @@ Object.assign(lookup, {
30825
30825
  // package.json
30826
30826
  var package_default = {
30827
30827
  name: "@autohq/cli",
30828
- version: "0.1.440",
30828
+ version: "0.1.442",
30829
30829
  license: "SEE LICENSE IN README.md",
30830
30830
  publishConfig: {
30831
30831
  access: "public"
@@ -33231,6 +33231,9 @@ function reasoningEffortRulesForModelSelection(input) {
33231
33231
  efforts: rules.reasoningEfforts
33232
33232
  };
33233
33233
  }
33234
+ function defaultReasoningEffortForModelSelection(input) {
33235
+ return reasoningEffortRulesForModelSelection(input).defaultEffort;
33236
+ }
33234
33237
  function resolveModelSelectionForHarness(harness, selection) {
33235
33238
  const rules = modelRulesForHarness(harness);
33236
33239
  const provider = selection?.provider ?? rules.defaultProvider;
@@ -58997,6 +59000,20 @@ var ProjectTemplateSubscriptionSchema = external_exports.object({
58997
59000
 
58998
59001
  // ../../packages/schemas/src/templates/catalog.ts
58999
59002
  var import_yaml = __toESM(require_dist(), 1);
59003
+ function catalogModelProvider(entry) {
59004
+ if (entry.harness === "claude-code") return "anthropic";
59005
+ return entry.model?.includes("/") ? "openrouter" : "openai";
59006
+ }
59007
+ function catalogReasoningEffort(entry) {
59008
+ if (entry.reasoningEffort) return entry.reasoningEffort;
59009
+ return defaultReasoningEffortForModelSelection({
59010
+ harness: entry.harness,
59011
+ model: entry.model ? {
59012
+ provider: catalogModelProvider(entry),
59013
+ id: entry.model
59014
+ } : null
59015
+ });
59016
+ }
59000
59017
  function plannedCatalogAgent(input) {
59001
59018
  return {
59002
59019
  ...input,
@@ -59090,6 +59107,7 @@ var ROSTER_CATALOG_ENTRIES = [
59090
59107
  description: "The senior implementer: dispatched with a single scoped task, it explores the codebase, plans the change, implements it with tests, opens and binds the PR, and keeps handling CI failures, reviews, comments, and conflicts while the PR remains open. It reports milestones to its dispatcher and never merges the PR itself.",
59091
59108
  harness: "codex",
59092
59109
  model: "gpt-5.6-sol",
59110
+ reasoningEffort: "xhigh",
59093
59111
  triggers: [
59094
59112
  {
59095
59113
  kind: "agent",
@@ -59132,6 +59150,7 @@ var ROSTER_CATALOG_ENTRIES = [
59132
59150
  description: "The senior implementer (GPT-5.6 Sol, medium reasoning): dispatched with a scoped task, it explores the codebase, plans and implements with tests, binds the PR, and keeps handling CI, review feedback, comments, and conflicts while the PR remains open. It never merges the PR itself.",
59133
59151
  harness: "codex",
59134
59152
  model: "gpt-5.6-sol",
59153
+ reasoningEffort: "medium",
59135
59154
  triggers: [
59136
59155
  {
59137
59156
  kind: "agent",
@@ -59792,6 +59811,7 @@ var ROSTER_CATALOG_ENTRIES = [
59792
59811
  description: "A deletion-first implementer for unused dependencies, exports, and obsolete paths. It checks git history and the team's rulings before cutting, opens one negative-diff PR per concern, proves each cut with targeted checks, and never merges its own work.",
59793
59812
  harness: "codex",
59794
59813
  model: "gpt-5.6-sol",
59814
+ reasoningEffort: "xhigh",
59795
59815
  triggers: [
59796
59816
  {
59797
59817
  kind: "schedule",
@@ -59870,6 +59890,7 @@ var ROSTER_CATALOG_ENTRIES = [
59870
59890
  description: "A CI reliability specialist that reads CI history for flake signatures, reproduces what it can, and either fixes the test or quarantines it with a tracking issue. It maintains a haunted-list registry and closes every case with the mechanism explained.",
59871
59891
  harness: "codex",
59872
59892
  model: "gpt-5.6-sol",
59893
+ reasoningEffort: "xhigh",
59873
59894
  triggers: [
59874
59895
  {
59875
59896
  kind: "schedule",
@@ -59999,6 +60020,7 @@ var ROSTER_CATALOG_ENTRIES = [
59999
60020
  description: "A review gate focused on leaked secrets, injection surfaces, disappearing authorization checks, dangerous dependencies, and permission escalations. It reports a dedicated security check next to the review check: quiet when clean, specific when not. Persuasion plus check status only \u2014 humans decide whether the check blocks.",
60000
60021
  harness: "codex",
60001
60022
  model: "gpt-5.6-sol",
60023
+ reasoningEffort: "xhigh",
60002
60024
  triggers: [
60003
60025
  {
60004
60026
  kind: "github",
@@ -60072,6 +60094,7 @@ var ROSTER_CATALOG_ENTRIES = [
60072
60094
  description: "A post-incident analyst that reconstructs the incident timeline from evidence, writes the blameless postmortem, files action items as tracked issues with owners, and follows up on prior postmortems' action items \u2014 the part humans never do. It never writes 'human error' as a root cause.",
60073
60095
  harness: "codex",
60074
60096
  model: "gpt-5.6-sol",
60097
+ reasoningEffort: "xhigh",
60075
60098
  triggers: [
60076
60099
  {
60077
60100
  kind: "github",
@@ -60175,6 +60198,7 @@ var ROSTER_CATALOG_MANIFEST = ROSTER_CATALOG_ENTRIES.map((entry) => ({
60175
60198
  ...entry,
60176
60199
  availability: entry.availability ?? "available",
60177
60200
  capabilitySummary: capabilitySummary(entry),
60201
+ reasoningEffort: catalogReasoningEffort(entry),
60178
60202
  trustNotes: entry.trustNotes ?? []
60179
60203
  }));
60180
60204
  var ROSTER_CATALOG = ROSTER_CATALOG_MANIFEST.filter((agent) => agent.availability === "available");
@@ -60189,8 +60213,8 @@ var TEAM_TEMPLATES = [
60189
60213
  id: "accelerator",
60190
60214
  name: "The Accelerator",
60191
60215
  template: "@auto/agent-fleet",
60192
- tagline: "You decide. It ships.",
60193
- pitch: "You've got a big idea and you want it to happen quickly and efficiently. Your software factory boots up and gets to work, anticipating your next move and improving itself as it goes.",
60216
+ tagline: "You set the goal. It shepherds every PR through review\u2014and gets better over time.",
60217
+ pitch: "Hand this team a goal and step out of the operational loop. It breaks down the work, dispatches the right agents, opens the PRs, shepherds every change through CI and review, responds to feedback, resolves conflicts, and keeps the whole queue moving until a decision genuinely needs you. Along the way, it reviews its own performance and proposes improvements so your software factory gets faster, sharper, and more efficient over time.",
60194
60218
  backdrop: "accelerator.mp4",
60195
60219
  frontOfHouse: "chief-of-staff",
60196
60220
  onboardingDocument: "docs/plans/drafts/front-of-house/onboarding/accelerator-onboarding.md",
@@ -60269,8 +60293,8 @@ var TEAM_TEMPLATES = [
60269
60293
  id: "slopbusters",
60270
60294
  name: "The Slopbusters",
60271
60295
  template: "@auto/slopbusters",
60272
- tagline: "Somebody has to say it: your codebase is haunted.",
60273
- pitch: "Your agent swarm got ahead of itself. The machine works, but nobody knows how and every new feature digs the hole deeper. Send in the squad to recover a workable codebase and shake out the haunts.",
60296
+ tagline: "Continuously simplifies and documents your codebase as it changes.",
60297
+ pitch: "The Slopbusters are a standing maintenance crew, not a cleanup command. They regularly inspect the codebase for dead code, flaky tests, stale branches, expired TODOs, risky patterns, structural clutter, and missing context. They investigate unusual behavior before touching it, turn what they find into small, reviewable PRs, and shepherd each change through CI and review. As the code evolves, they keep simplifying tangled areas and documenting confusing behavior and architectural decisions, so knowledge does not disappear into people's heads or old threads. The result is a codebase that stays smaller, clearer, and easier for both people and agents to understand, change, and trust.",
60274
60298
  backdrop: "slopbusters.mp4",
60275
60299
  frontOfHouse: "renovator",
60276
60300
  onboardingDocument: "docs/plans/drafts/front-of-house/onboarding/slopbusters-onboarding.md",
@@ -60326,8 +60350,8 @@ var TEAM_TEMPLATES = [
60326
60350
  id: "war-room",
60327
60351
  name: "The War Room",
60328
60352
  template: "@auto/war-room",
60329
- tagline: "The fleet reports to the Admiral. The Admiral reports to you.",
60330
- pitch: "Every emergent threat gets an owner, a status, and a follow-up. The room proves itself on a synthetic drill before anything real is burning, then keeps watch around the clock.",
60353
+ tagline: "Triages incidents, investigates causes, and drives fixes through resolution.",
60354
+ pitch: "This team triages alerts, investigates causes, dispatches fixes, and follows every incident through resolution.",
60331
60355
  backdrop: "war-room.mp4",
60332
60356
  frontOfHouse: "admiral",
60333
60357
  onboardingDocument: "docs/plans/drafts/front-of-house/onboarding/war-room-onboarding.md",
@@ -60383,8 +60407,8 @@ var TEAM_TEMPLATES = [
60383
60407
  id: "blank-canvas",
60384
60408
  name: "The Blank Canvas",
60385
60409
  template: "@auto/blank-canvas",
60386
- tagline: "The whole corpus. Your vision.",
60387
- pitch: "Describe the automations you want in plain language. The Patron turns that commission into the smallest useful team and drives it to your definition of a magic moment.",
60410
+ tagline: "Builds any automation from a plain-language idea.",
60411
+ pitch: "Describe what you want to happen, when it should run, and which tools it can use. The Patron will help you shape the workflow, build the agents and triggers behind it, and open a setup PR for your approval.",
60388
60412
  backdrop: "blank-canvas.mp4",
60389
60413
  frontOfHouse: "patron",
60390
60414
  onboardingDocument: "docs/plans/drafts/front-of-house/onboarding/blank-canvas-onboarding.md",
@@ -90581,7 +90605,7 @@ function withClaudeStderrDiagnosticsPointer(error51, capturedStderr) {
90581
90605
  var CLAUDE_AGENT_STARTUP_TIMEOUT_MS = 3e4;
90582
90606
  var CLAUDE_INTERRUPT_SETTLE_TIMEOUT_MS = 1e4;
90583
90607
  var CLAUDE_INTERRUPT_ACK_TIMEOUT_MS = 1e4;
90584
- var CLAUDE_MCP_REGISTRATION_TIMEOUT_MS = 3e3;
90608
+ var CLAUDE_MCP_REGISTRATION_TIMEOUT_MS = 3e4;
90585
90609
  var CLAUDE_MCP_REGISTRATION_POLL_INTERVAL_MS = 100;
90586
90610
  var CLAUDE_READ_STATE_SEED_FAILURE_LIMIT = 3;
90587
90611
  var CLAUDE_STARTUP_PROFILE_HOOK_EVENTS = [
@@ -90612,6 +90636,12 @@ var ClaudeMcpRequiredToolsMissingError = class extends Error {
90612
90636
  this.name = "ClaudeMcpRequiredToolsMissingError";
90613
90637
  }
90614
90638
  };
90639
+ var ClaudeMcpRegistryNotReadyError = class extends Error {
90640
+ constructor(detail) {
90641
+ super(`MCP tool registry was not ready at session start: ${detail}`);
90642
+ this.name = "ClaudeMcpRegistryNotReadyError";
90643
+ }
90644
+ };
90615
90645
  var ClaudeAgentBridgeSessionImpl = class {
90616
90646
  input;
90617
90647
  inputQueue;
@@ -91178,12 +91208,13 @@ var ClaudeAgentBridgeSessionImpl = class {
91178
91208
  }
91179
91209
  // Why this gate is correct without a provider-backed test (it relies on real
91180
91210
  // SDK mcpServerStatus() timing that fakes cannot prove):
91181
- // - Safe-degrade on uncertainty: pollMcpRegistration never rejects on
91182
- // timeout, a status-read failure, or a closed session it resolves, so an
91183
- // *unconfirmed* registry still degrades to today's immediate injection.
91184
- // The one fail-closed exit is the confirmed-empty registry: every
91185
- // configured server settled and none is serving tools, which is exactly
91186
- // the state that produced silent toolless runs in production (FRA-3458).
91211
+ // - Fail closed before first-turn injection whenever configured servers are
91212
+ // still pending or their status cannot be read. The model must never see a
91213
+ // callable MCP name whose SDK registry snapshot is not ready to dispatch
91214
+ // it. Closing the SDK session lets the wrapper's existing bounded command
91215
+ // delivery retries warm a fresh registry without replaying a tool call.
91216
+ // - Confirmed-empty and missing-required-tool states retain their distinct
91217
+ // diagnostics and typed failures from FRA-3458.
91187
91218
  // - Provider-path validation is deferred deliberately: the failure is the
91188
91219
  // intermittent live-prod race on the chief-of-staff singleton (a real
91189
91220
  // runtime restart dispatching turn-1 while real mcp__* servers reconnect),
@@ -91216,14 +91247,19 @@ var ClaudeAgentBridgeSessionImpl = class {
91216
91247
  };
91217
91248
  }
91218
91249
  const result = await this.mcpRegistrationGate.promise;
91219
- if (result.outcome !== "empty" && result.outcome !== "missing_required_tools") {
91250
+ if (result.outcome === "ready" || result.outcome === "closed") {
91220
91251
  return;
91221
91252
  }
91222
91253
  this.close();
91223
- if (result.outcome === "missing_required_tools") {
91224
- throw new ClaudeMcpRequiredToolsMissingError(result.detail);
91254
+ switch (result.outcome) {
91255
+ case "missing_required_tools":
91256
+ throw new ClaudeMcpRequiredToolsMissingError(result.detail);
91257
+ case "not_ready":
91258
+ case "status_failed":
91259
+ throw new ClaudeMcpRegistryNotReadyError(result.detail);
91260
+ case "empty":
91261
+ throw new ClaudeMcpRegistryEmptyError(result.detail);
91225
91262
  }
91226
- throw new ClaudeMcpRegistryEmptyError(result.detail);
91227
91263
  }
91228
91264
  // Poll the live query's MCP server status until no configured server is still
91229
91265
  // `pending`, bounded by CLAUDE_MCP_REGISTRATION_TIMEOUT_MS. Terminal states
@@ -91235,7 +91271,9 @@ var ClaudeAgentBridgeSessionImpl = class {
91235
91271
  // status-read failure, timeout, or a closed session all resolve so the caller
91236
91272
  // degrades to immediate injection when the registry state is uncertain. A
91237
91273
  // connected required server with positive zero/missing-tool telemetry fails
91238
- // immediately even while unrelated configured servers remain pending.
91274
+ // immediately even while unrelated configured servers remain pending. A
91275
+ // timeout or status-read failure returns a distinct not-ready result so the
91276
+ // caller closes the session and rejects before first-turn injection.
91239
91277
  async pollMcpRegistration(query) {
91240
91278
  const configuredNames = Object.keys(this.options.mcpServers ?? {});
91241
91279
  const startedAt = Date.now();
@@ -91251,10 +91289,14 @@ var ClaudeAgentBridgeSessionImpl = class {
91251
91289
  try {
91252
91290
  statuses = await query.mcpServerStatus();
91253
91291
  } catch (error51) {
91292
+ const detail = error51 instanceof Error ? error51.message : String(error51);
91254
91293
  this.input.writeOutput?.(
91255
- `agent_bridge_claude_mcp_gate_status_failed duration_ms=${Date.now() - startedAt} error=${error51 instanceof Error ? error51.message : String(error51)}`
91294
+ `agent_bridge_claude_mcp_gate_status_failed duration_ms=${Date.now() - startedAt} error=${detail}`
91256
91295
  );
91257
- return { outcome: "status_failed" };
91296
+ return {
91297
+ outcome: "status_failed",
91298
+ detail: `status read failed: ${detail}`
91299
+ };
91258
91300
  }
91259
91301
  const missingRequiredTools = missingRequiredMcpTools(
91260
91302
  statuses,
@@ -91281,10 +91323,11 @@ var ClaudeAgentBridgeSessionImpl = class {
91281
91323
  return { outcome: "ready" };
91282
91324
  }
91283
91325
  if (Date.now() >= deadline) {
91326
+ const detail = mcpStatusDetailList(statuses);
91284
91327
  this.input.writeOutput?.(
91285
- `agent_bridge_claude_mcp_gate_timeout duration_ms=${Date.now() - startedAt} servers=${mcpStatusList(statuses)}`
91328
+ `agent_bridge_claude_mcp_gate_not_ready duration_ms=${Date.now() - startedAt} servers=${detail}`
91286
91329
  );
91287
- return { outcome: "timeout" };
91330
+ return { outcome: "not_ready", detail };
91288
91331
  }
91289
91332
  await delay(
91290
91333
  CLAUDE_MCP_REGISTRATION_POLL_INTERVAL_MS,
package/dist/index.js CHANGED
@@ -16991,6 +16991,9 @@ function reasoningEffortRulesForModelSelection(input) {
16991
16991
  efforts: rules.reasoningEfforts
16992
16992
  };
16993
16993
  }
16994
+ function defaultReasoningEffortForModelSelection(input) {
16995
+ return reasoningEffortRulesForModelSelection(input).defaultEffort;
16996
+ }
16994
16997
  function resolveModelSelectionForHarness(harness, selection) {
16995
16998
  const rules = modelRulesForHarness(harness);
16996
16999
  const provider = selection?.provider ?? rules.defaultProvider;
@@ -43417,6 +43420,20 @@ var init_subscription = __esm({
43417
43420
 
43418
43421
  // ../../packages/schemas/src/templates/catalog.ts
43419
43422
  import { parse as parseYaml } from "yaml";
43423
+ function catalogModelProvider(entry) {
43424
+ if (entry.harness === "claude-code") return "anthropic";
43425
+ return entry.model?.includes("/") ? "openrouter" : "openai";
43426
+ }
43427
+ function catalogReasoningEffort(entry) {
43428
+ if (entry.reasoningEffort) return entry.reasoningEffort;
43429
+ return defaultReasoningEffortForModelSelection({
43430
+ harness: entry.harness,
43431
+ model: entry.model ? {
43432
+ provider: catalogModelProvider(entry),
43433
+ id: entry.model
43434
+ } : null
43435
+ });
43436
+ }
43420
43437
  function plannedCatalogAgent(input) {
43421
43438
  return {
43422
43439
  ...input,
@@ -43473,6 +43490,7 @@ var ROSTER_CATALOG_ENTRIES, ROSTER_CATALOG_MANIFEST, ROSTER_CATALOG, SELF_IMPROV
43473
43490
  var init_catalog = __esm({
43474
43491
  "../../packages/schemas/src/templates/catalog.ts"() {
43475
43492
  "use strict";
43493
+ init_model_selection();
43476
43494
  init_content_generated();
43477
43495
  init_registry();
43478
43496
  ROSTER_CATALOG_ENTRIES = [
@@ -43548,6 +43566,7 @@ var init_catalog = __esm({
43548
43566
  description: "The senior implementer: dispatched with a single scoped task, it explores the codebase, plans the change, implements it with tests, opens and binds the PR, and keeps handling CI failures, reviews, comments, and conflicts while the PR remains open. It reports milestones to its dispatcher and never merges the PR itself.",
43549
43567
  harness: "codex",
43550
43568
  model: "gpt-5.6-sol",
43569
+ reasoningEffort: "xhigh",
43551
43570
  triggers: [
43552
43571
  {
43553
43572
  kind: "agent",
@@ -43590,6 +43609,7 @@ var init_catalog = __esm({
43590
43609
  description: "The senior implementer (GPT-5.6 Sol, medium reasoning): dispatched with a scoped task, it explores the codebase, plans and implements with tests, binds the PR, and keeps handling CI, review feedback, comments, and conflicts while the PR remains open. It never merges the PR itself.",
43591
43610
  harness: "codex",
43592
43611
  model: "gpt-5.6-sol",
43612
+ reasoningEffort: "medium",
43593
43613
  triggers: [
43594
43614
  {
43595
43615
  kind: "agent",
@@ -44250,6 +44270,7 @@ var init_catalog = __esm({
44250
44270
  description: "A deletion-first implementer for unused dependencies, exports, and obsolete paths. It checks git history and the team's rulings before cutting, opens one negative-diff PR per concern, proves each cut with targeted checks, and never merges its own work.",
44251
44271
  harness: "codex",
44252
44272
  model: "gpt-5.6-sol",
44273
+ reasoningEffort: "xhigh",
44253
44274
  triggers: [
44254
44275
  {
44255
44276
  kind: "schedule",
@@ -44328,6 +44349,7 @@ var init_catalog = __esm({
44328
44349
  description: "A CI reliability specialist that reads CI history for flake signatures, reproduces what it can, and either fixes the test or quarantines it with a tracking issue. It maintains a haunted-list registry and closes every case with the mechanism explained.",
44329
44350
  harness: "codex",
44330
44351
  model: "gpt-5.6-sol",
44352
+ reasoningEffort: "xhigh",
44331
44353
  triggers: [
44332
44354
  {
44333
44355
  kind: "schedule",
@@ -44457,6 +44479,7 @@ var init_catalog = __esm({
44457
44479
  description: "A review gate focused on leaked secrets, injection surfaces, disappearing authorization checks, dangerous dependencies, and permission escalations. It reports a dedicated security check next to the review check: quiet when clean, specific when not. Persuasion plus check status only \u2014 humans decide whether the check blocks.",
44458
44480
  harness: "codex",
44459
44481
  model: "gpt-5.6-sol",
44482
+ reasoningEffort: "xhigh",
44460
44483
  triggers: [
44461
44484
  {
44462
44485
  kind: "github",
@@ -44530,6 +44553,7 @@ var init_catalog = __esm({
44530
44553
  description: "A post-incident analyst that reconstructs the incident timeline from evidence, writes the blameless postmortem, files action items as tracked issues with owners, and follows up on prior postmortems' action items \u2014 the part humans never do. It never writes 'human error' as a root cause.",
44531
44554
  harness: "codex",
44532
44555
  model: "gpt-5.6-sol",
44556
+ reasoningEffort: "xhigh",
44533
44557
  triggers: [
44534
44558
  {
44535
44559
  kind: "github",
@@ -44601,6 +44625,7 @@ var init_catalog = __esm({
44601
44625
  ...entry,
44602
44626
  availability: entry.availability ?? "available",
44603
44627
  capabilitySummary: capabilitySummary(entry),
44628
+ reasoningEffort: catalogReasoningEffort(entry),
44604
44629
  trustNotes: entry.trustNotes ?? []
44605
44630
  }));
44606
44631
  ROSTER_CATALOG = ROSTER_CATALOG_MANIFEST.filter((agent) => agent.availability === "available");
@@ -44615,8 +44640,8 @@ var init_catalog = __esm({
44615
44640
  id: "accelerator",
44616
44641
  name: "The Accelerator",
44617
44642
  template: "@auto/agent-fleet",
44618
- tagline: "You decide. It ships.",
44619
- pitch: "You've got a big idea and you want it to happen quickly and efficiently. Your software factory boots up and gets to work, anticipating your next move and improving itself as it goes.",
44643
+ tagline: "You set the goal. It shepherds every PR through review\u2014and gets better over time.",
44644
+ pitch: "Hand this team a goal and step out of the operational loop. It breaks down the work, dispatches the right agents, opens the PRs, shepherds every change through CI and review, responds to feedback, resolves conflicts, and keeps the whole queue moving until a decision genuinely needs you. Along the way, it reviews its own performance and proposes improvements so your software factory gets faster, sharper, and more efficient over time.",
44620
44645
  backdrop: "accelerator.mp4",
44621
44646
  frontOfHouse: "chief-of-staff",
44622
44647
  onboardingDocument: "docs/plans/drafts/front-of-house/onboarding/accelerator-onboarding.md",
@@ -44695,8 +44720,8 @@ var init_catalog = __esm({
44695
44720
  id: "slopbusters",
44696
44721
  name: "The Slopbusters",
44697
44722
  template: "@auto/slopbusters",
44698
- tagline: "Somebody has to say it: your codebase is haunted.",
44699
- pitch: "Your agent swarm got ahead of itself. The machine works, but nobody knows how and every new feature digs the hole deeper. Send in the squad to recover a workable codebase and shake out the haunts.",
44723
+ tagline: "Continuously simplifies and documents your codebase as it changes.",
44724
+ pitch: "The Slopbusters are a standing maintenance crew, not a cleanup command. They regularly inspect the codebase for dead code, flaky tests, stale branches, expired TODOs, risky patterns, structural clutter, and missing context. They investigate unusual behavior before touching it, turn what they find into small, reviewable PRs, and shepherd each change through CI and review. As the code evolves, they keep simplifying tangled areas and documenting confusing behavior and architectural decisions, so knowledge does not disappear into people's heads or old threads. The result is a codebase that stays smaller, clearer, and easier for both people and agents to understand, change, and trust.",
44700
44725
  backdrop: "slopbusters.mp4",
44701
44726
  frontOfHouse: "renovator",
44702
44727
  onboardingDocument: "docs/plans/drafts/front-of-house/onboarding/slopbusters-onboarding.md",
@@ -44752,8 +44777,8 @@ var init_catalog = __esm({
44752
44777
  id: "war-room",
44753
44778
  name: "The War Room",
44754
44779
  template: "@auto/war-room",
44755
- tagline: "The fleet reports to the Admiral. The Admiral reports to you.",
44756
- pitch: "Every emergent threat gets an owner, a status, and a follow-up. The room proves itself on a synthetic drill before anything real is burning, then keeps watch around the clock.",
44780
+ tagline: "Triages incidents, investigates causes, and drives fixes through resolution.",
44781
+ pitch: "This team triages alerts, investigates causes, dispatches fixes, and follows every incident through resolution.",
44757
44782
  backdrop: "war-room.mp4",
44758
44783
  frontOfHouse: "admiral",
44759
44784
  onboardingDocument: "docs/plans/drafts/front-of-house/onboarding/war-room-onboarding.md",
@@ -44809,8 +44834,8 @@ var init_catalog = __esm({
44809
44834
  id: "blank-canvas",
44810
44835
  name: "The Blank Canvas",
44811
44836
  template: "@auto/blank-canvas",
44812
- tagline: "The whole corpus. Your vision.",
44813
- pitch: "Describe the automations you want in plain language. The Patron turns that commission into the smallest useful team and drives it to your definition of a magic moment.",
44837
+ tagline: "Builds any automation from a plain-language idea.",
44838
+ pitch: "Describe what you want to happen, when it should run, and which tools it can use. The Patron will help you shape the workflow, build the agents and triggers behind it, and open a setup PR for your approval.",
44814
44839
  backdrop: "blank-canvas.mp4",
44815
44840
  frontOfHouse: "patron",
44816
44841
  onboardingDocument: "docs/plans/drafts/front-of-house/onboarding/blank-canvas-onboarding.md",
@@ -47809,7 +47834,7 @@ var init_package = __esm({
47809
47834
  "package.json"() {
47810
47835
  package_default = {
47811
47836
  name: "@autohq/cli",
47812
- version: "0.1.440",
47837
+ version: "0.1.442",
47813
47838
  license: "SEE LICENSE IN README.md",
47814
47839
  publishConfig: {
47815
47840
  access: "public"
@@ -61601,7 +61626,7 @@ function withClaudeStderrDiagnosticsPointer(error51, capturedStderr) {
61601
61626
  var CLAUDE_AGENT_STARTUP_TIMEOUT_MS = 3e4;
61602
61627
  var CLAUDE_INTERRUPT_SETTLE_TIMEOUT_MS = 1e4;
61603
61628
  var CLAUDE_INTERRUPT_ACK_TIMEOUT_MS = 1e4;
61604
- var CLAUDE_MCP_REGISTRATION_TIMEOUT_MS = 3e3;
61629
+ var CLAUDE_MCP_REGISTRATION_TIMEOUT_MS = 3e4;
61605
61630
  var CLAUDE_MCP_REGISTRATION_POLL_INTERVAL_MS = 100;
61606
61631
  var CLAUDE_READ_STATE_SEED_FAILURE_LIMIT = 3;
61607
61632
  var CLAUDE_STARTUP_PROFILE_HOOK_EVENTS = [
@@ -61632,6 +61657,12 @@ var ClaudeMcpRequiredToolsMissingError = class extends Error {
61632
61657
  this.name = "ClaudeMcpRequiredToolsMissingError";
61633
61658
  }
61634
61659
  };
61660
+ var ClaudeMcpRegistryNotReadyError = class extends Error {
61661
+ constructor(detail) {
61662
+ super(`MCP tool registry was not ready at session start: ${detail}`);
61663
+ this.name = "ClaudeMcpRegistryNotReadyError";
61664
+ }
61665
+ };
61635
61666
  var ClaudeAgentBridgeSessionImpl = class {
61636
61667
  input;
61637
61668
  inputQueue;
@@ -62198,12 +62229,13 @@ var ClaudeAgentBridgeSessionImpl = class {
62198
62229
  }
62199
62230
  // Why this gate is correct without a provider-backed test (it relies on real
62200
62231
  // SDK mcpServerStatus() timing that fakes cannot prove):
62201
- // - Safe-degrade on uncertainty: pollMcpRegistration never rejects on
62202
- // timeout, a status-read failure, or a closed session it resolves, so an
62203
- // *unconfirmed* registry still degrades to today's immediate injection.
62204
- // The one fail-closed exit is the confirmed-empty registry: every
62205
- // configured server settled and none is serving tools, which is exactly
62206
- // the state that produced silent toolless runs in production (FRA-3458).
62232
+ // - Fail closed before first-turn injection whenever configured servers are
62233
+ // still pending or their status cannot be read. The model must never see a
62234
+ // callable MCP name whose SDK registry snapshot is not ready to dispatch
62235
+ // it. Closing the SDK session lets the wrapper's existing bounded command
62236
+ // delivery retries warm a fresh registry without replaying a tool call.
62237
+ // - Confirmed-empty and missing-required-tool states retain their distinct
62238
+ // diagnostics and typed failures from FRA-3458.
62207
62239
  // - Provider-path validation is deferred deliberately: the failure is the
62208
62240
  // intermittent live-prod race on the chief-of-staff singleton (a real
62209
62241
  // runtime restart dispatching turn-1 while real mcp__* servers reconnect),
@@ -62236,14 +62268,19 @@ var ClaudeAgentBridgeSessionImpl = class {
62236
62268
  };
62237
62269
  }
62238
62270
  const result = await this.mcpRegistrationGate.promise;
62239
- if (result.outcome !== "empty" && result.outcome !== "missing_required_tools") {
62271
+ if (result.outcome === "ready" || result.outcome === "closed") {
62240
62272
  return;
62241
62273
  }
62242
62274
  this.close();
62243
- if (result.outcome === "missing_required_tools") {
62244
- throw new ClaudeMcpRequiredToolsMissingError(result.detail);
62275
+ switch (result.outcome) {
62276
+ case "missing_required_tools":
62277
+ throw new ClaudeMcpRequiredToolsMissingError(result.detail);
62278
+ case "not_ready":
62279
+ case "status_failed":
62280
+ throw new ClaudeMcpRegistryNotReadyError(result.detail);
62281
+ case "empty":
62282
+ throw new ClaudeMcpRegistryEmptyError(result.detail);
62245
62283
  }
62246
- throw new ClaudeMcpRegistryEmptyError(result.detail);
62247
62284
  }
62248
62285
  // Poll the live query's MCP server status until no configured server is still
62249
62286
  // `pending`, bounded by CLAUDE_MCP_REGISTRATION_TIMEOUT_MS. Terminal states
@@ -62255,7 +62292,9 @@ var ClaudeAgentBridgeSessionImpl = class {
62255
62292
  // status-read failure, timeout, or a closed session all resolve so the caller
62256
62293
  // degrades to immediate injection when the registry state is uncertain. A
62257
62294
  // connected required server with positive zero/missing-tool telemetry fails
62258
- // immediately even while unrelated configured servers remain pending.
62295
+ // immediately even while unrelated configured servers remain pending. A
62296
+ // timeout or status-read failure returns a distinct not-ready result so the
62297
+ // caller closes the session and rejects before first-turn injection.
62259
62298
  async pollMcpRegistration(query) {
62260
62299
  const configuredNames = Object.keys(this.options.mcpServers ?? {});
62261
62300
  const startedAt = Date.now();
@@ -62271,10 +62310,14 @@ var ClaudeAgentBridgeSessionImpl = class {
62271
62310
  try {
62272
62311
  statuses = await query.mcpServerStatus();
62273
62312
  } catch (error51) {
62313
+ const detail = error51 instanceof Error ? error51.message : String(error51);
62274
62314
  this.input.writeOutput?.(
62275
- `agent_bridge_claude_mcp_gate_status_failed duration_ms=${Date.now() - startedAt} error=${error51 instanceof Error ? error51.message : String(error51)}`
62315
+ `agent_bridge_claude_mcp_gate_status_failed duration_ms=${Date.now() - startedAt} error=${detail}`
62276
62316
  );
62277
- return { outcome: "status_failed" };
62317
+ return {
62318
+ outcome: "status_failed",
62319
+ detail: `status read failed: ${detail}`
62320
+ };
62278
62321
  }
62279
62322
  const missingRequiredTools = missingRequiredMcpTools(
62280
62323
  statuses,
@@ -62301,10 +62344,11 @@ var ClaudeAgentBridgeSessionImpl = class {
62301
62344
  return { outcome: "ready" };
62302
62345
  }
62303
62346
  if (Date.now() >= deadline) {
62347
+ const detail = mcpStatusDetailList(statuses);
62304
62348
  this.input.writeOutput?.(
62305
- `agent_bridge_claude_mcp_gate_timeout duration_ms=${Date.now() - startedAt} servers=${mcpStatusList(statuses)}`
62349
+ `agent_bridge_claude_mcp_gate_not_ready duration_ms=${Date.now() - startedAt} servers=${detail}`
62306
62350
  );
62307
- return { outcome: "timeout" };
62351
+ return { outcome: "not_ready", detail };
62308
62352
  }
62309
62353
  await delay(
62310
62354
  CLAUDE_MCP_REGISTRATION_POLL_INTERVAL_MS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autohq/cli",
3
- "version": "0.1.440",
3
+ "version": "0.1.442",
4
4
  "license": "SEE LICENSE IN README.md",
5
5
  "publishConfig": {
6
6
  "access": "public"