@yemi33/minions 0.1.920 → 0.1.921

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
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.920 (2026-04-13)
3
+ ## 0.1.921 (2026-04-13)
4
4
 
5
5
  ### Features
6
6
  - CC tab unread dot + reopened badge on work items
@@ -18,6 +18,7 @@
18
18
  - add red dot notification on CC tab when response completes (#934) (#946)
19
19
 
20
20
  ### Fixes
21
+ - prioritize error_max_turns over permission-blocked in classifyFailure (#1001)
21
22
  - optimistic archive hides both PRD and linked source plan simultaneously
22
23
  - align CC tab unread dot to same position as working dot
23
24
  - pipeline artifact links use pushModalBack instead of setTimeout race (#993)
@@ -1910,6 +1910,14 @@ function classifyFailure(code, stdout = '', stderr = '') {
1910
1910
  // Exit code 78 — configuration error (Claude CLI not found, bad setup)
1911
1911
  if (code === 78) return FAILURE_CLASS.CONFIG_ERROR;
1912
1912
 
1913
+ // Max turns exhausted (error_max_turns) — definitive stop reason, retryable
1914
+ // Must be checked FIRST — hook startup failures (e.g. curl exit code 28) can inject
1915
+ // permission/auth text into stderr, but if the agent ran to turn exhaustion that's the
1916
+ // real cause. Checked before PERMISSION_BLOCKED and OUT_OF_CONTEXT.
1917
+ if (/error_max_turns|"subtype"\s*:\s*"error_max_turns"|terminal_reason.*max_turns|max.*turns.*reached/i.test(combined)) {
1918
+ return FAILURE_CLASS.MAX_TURNS;
1919
+ }
1920
+
1913
1921
  // Permission / trust / auth failures
1914
1922
  if (/permission denied|access denied|unauthorized|403 forbidden|trust.*blocked|auth.*fail/i.test(combined)) {
1915
1923
  return FAILURE_CLASS.PERMISSION_BLOCKED;
@@ -1920,12 +1928,6 @@ function classifyFailure(code, stdout = '', stderr = '') {
1920
1928
  return FAILURE_CLASS.MERGE_CONFLICT;
1921
1929
  }
1922
1930
 
1923
- // Max turns exhausted (error_max_turns) — work in progress, retryable
1924
- // Must be checked BEFORE OUT_OF_CONTEXT to avoid misclassification as non-retryable
1925
- if (/error_max_turns|"subtype"\s*:\s*"error_max_turns"|terminal_reason.*max_turns|max.*turns.*reached/i.test(combined)) {
1926
- return FAILURE_CLASS.MAX_TURNS;
1927
- }
1928
-
1929
1931
  // Context window exhausted (token limit, context length — NOT max turns)
1930
1932
  if (/context window|token limit|conversation.*too long|context.*length.*exceeded/i.test(combined)) {
1931
1933
  return FAILURE_CLASS.OUT_OF_CONTEXT;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.920",
3
+ "version": "0.1.921",
4
4
  "description": "Multi-agent AI dev team that runs from ~/.minions/ — five autonomous agents share a single engine, dashboard, and knowledge base",
5
5
  "bin": {
6
6
  "minions": "bin/minions.js"