claudecode-linter 2.1.150-patch.1 → 2.1.152

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.
@@ -1,6 +1,6 @@
1
1
  {
2
- "extractedFromClaudeCodeVersion": "2.1.150",
3
- "extractedAt": "2026-05-23T18:30:08.382Z",
2
+ "extractedFromClaudeCodeVersion": "2.1.152",
3
+ "extractedAt": "2026-05-27T07:39:39.201Z",
4
4
  "schema": {
5
5
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6
6
  "title": "Claude Code agent .md frontmatter",
@@ -1,6 +1,6 @@
1
1
  {
2
- "extractedFromClaudeCodeVersion": "2.1.150",
3
- "extractedAt": "2026-05-23T18:30:08.384Z",
2
+ "extractedFromClaudeCodeVersion": "2.1.152",
3
+ "extractedAt": "2026-05-27T07:39:39.202Z",
4
4
  "schema": {
5
5
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6
6
  "title": "Claude Code command .md frontmatter",
@@ -84,6 +84,60 @@
84
84
  ],
85
85
  "description": "Tools available to the model while this file is active. Comma-separated string or YAML list."
86
86
  },
87
+ "disallowed-tools": {
88
+ "anyOf": [
89
+ {
90
+ "anyOf": [
91
+ {
92
+ "type": "string"
93
+ },
94
+ {
95
+ "type": "number"
96
+ },
97
+ {
98
+ "type": "boolean"
99
+ },
100
+ {
101
+ "type": "null"
102
+ }
103
+ ]
104
+ },
105
+ {
106
+ "type": "array",
107
+ "items": {
108
+ "type": "string"
109
+ }
110
+ }
111
+ ],
112
+ "description": "Tools removed from the model while this file is active. Comma-separated string or YAML list. Cleared when the user sends the next message."
113
+ },
114
+ "disallowedTools": {
115
+ "anyOf": [
116
+ {
117
+ "anyOf": [
118
+ {
119
+ "type": "string"
120
+ },
121
+ {
122
+ "type": "number"
123
+ },
124
+ {
125
+ "type": "boolean"
126
+ },
127
+ {
128
+ "type": "null"
129
+ }
130
+ ]
131
+ },
132
+ {
133
+ "type": "array",
134
+ "items": {
135
+ "type": "string"
136
+ }
137
+ }
138
+ ],
139
+ "description": "Canonical (normalized) alias of `disallowed-tools`."
140
+ },
87
141
  "argument-hint": {
88
142
  "anyOf": [
89
143
  {
@@ -1,6 +1,6 @@
1
1
  {
2
- "extractedFromClaudeCodeVersion": "2.1.150",
3
- "extractedAt": "2026-05-23T18:30:08.388Z",
2
+ "extractedFromClaudeCodeVersion": "2.1.152",
3
+ "extractedAt": "2026-05-27T07:39:39.206Z",
4
4
  "schema": {
5
5
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6
6
  "title": "Claude Code hooks.json",
@@ -1,6 +1,6 @@
1
1
  {
2
- "extractedFromClaudeCodeVersion": "2.1.150",
3
- "extractedAt": "2026-05-23T18:30:08.358Z",
2
+ "extractedFromClaudeCodeVersion": "2.1.152",
3
+ "extractedAt": "2026-05-27T07:39:39.180Z",
4
4
  "schema": {
5
5
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6
6
  "title": "Claude Code .lsp.json",
@@ -1,6 +1,6 @@
1
1
  {
2
- "extractedFromClaudeCodeVersion": "2.1.150",
3
- "extractedAt": "2026-05-23T18:30:08.385Z",
2
+ "extractedFromClaudeCodeVersion": "2.1.152",
3
+ "extractedAt": "2026-05-27T07:39:39.203Z",
4
4
  "schema": {
5
5
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6
6
  "title": "Claude Code .mcp.json",
@@ -1,6 +1,6 @@
1
1
  {
2
- "extractedFromClaudeCodeVersion": "2.1.150",
3
- "extractedAt": "2026-05-23T18:30:08.359Z",
2
+ "extractedFromClaudeCodeVersion": "2.1.152",
3
+ "extractedAt": "2026-05-27T07:39:39.180Z",
4
4
  "schema": {
5
5
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6
6
  "title": "Claude Code monitors.json",
@@ -1,6 +1,6 @@
1
1
  {
2
- "extractedFromClaudeCodeVersion": "2.1.150",
3
- "extractedAt": "2026-05-23T18:30:08.356Z",
2
+ "extractedFromClaudeCodeVersion": "2.1.152",
3
+ "extractedAt": "2026-05-27T07:39:39.178Z",
4
4
  "schema": {
5
5
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6
6
  "title": "Claude Code plugin.json",
@@ -1,5 +1,5 @@
1
1
  {
2
- "fetchedAt": "2026-05-23T18:36:58.837Z",
2
+ "fetchedAt": "2026-05-27T07:39:40.332Z",
3
3
  "sources": {
4
4
  "plugin-manifest.schema.json": {
5
5
  "url": "https://www.schemastore.org/claude-code-plugin-manifest.json",
@@ -19,7 +19,7 @@
19
19
  "settings.schema.json": {
20
20
  "url": "https://www.schemastore.org/claude-code-settings.json",
21
21
  "artifact": "settings-json",
22
- "sha256": "d105a83c62dbdef4df8461f972992d10fda27588bfe0541b348b5937cb911c37"
22
+ "sha256": "b391de2b29df49cd20ba61049f1f1cea8cdbe7695c7015808ef2fe6e39639a7d"
23
23
  }
24
24
  }
25
25
  }
@@ -5,7 +5,7 @@
5
5
  "permissionRule": {
6
6
  "type": "string",
7
7
  "description": "Tool permission rule.\nSee https://code.claude.com/docs/en/settings#permission-rule-syntax\nSee https://code.claude.com/docs/en/tools-reference for full list of tools available to Claude.",
8
- "pattern": "^((Agent|Bash|Edit|ExitPlanMode|Glob|Grep|KillShell|LSP|Monitor|NotebookEdit|PowerShell|Read|Skill|TaskCreate|TaskGet|TaskList|TaskOutput|TaskStop|TaskUpdate|TodoWrite|ToolSearch|WebFetch|WebSearch|Write)(\\((?=.*[^)*?])[^)]+\\))?|mcp__.*)$",
8
+ "pattern": "^((Agent|Bash|Edit|ExitPlanMode|Glob|Grep|KillShell|LSP|Monitor|NotebookEdit|PowerShell|Read|Skill|TaskCreate|TaskGet|TaskList|TaskOutput|TaskStop|TaskUpdate|TodoWrite|ToolSearch|WebFetch|WebSearch|Write)(\\([^)]+\\))?|mcp__.*)$",
9
9
  "examples": [
10
10
  "Bash",
11
11
  "Bash(npm run build)",
@@ -15,6 +15,8 @@
15
15
  "Bash(git * main)",
16
16
  "Edit",
17
17
  "Edit(/src/**/*.ts)",
18
+ "Read(*)",
19
+ "Skill(*)",
18
20
  "Read(./.env)",
19
21
  "Read(./secrets/**)",
20
22
  "Read(//Users/alice/secrets/**)",
@@ -75,6 +77,13 @@
75
77
  "statusMessage": {
76
78
  "type": "string",
77
79
  "description": "Custom spinner message displayed while the hook runs"
80
+ },
81
+ "args": {
82
+ "type": "array",
83
+ "items": {
84
+ "type": "string"
85
+ },
86
+ "description": "Argument list for exec form. When present, spawns the command directly without shell interpretation — each element is passed as-is, so path placeholders never need quoting. See https://code.claude.com/docs/en/hooks#command-hook-fields"
78
87
  }
79
88
  }
80
89
  },
@@ -113,6 +122,11 @@
113
122
  "statusMessage": {
114
123
  "type": "string",
115
124
  "description": "Custom spinner message displayed while the hook runs"
125
+ },
126
+ "continueOnBlock": {
127
+ "type": "boolean",
128
+ "default": false,
129
+ "description": "When the prompt returns ok: false, feed the reason back to Claude and continue the turn instead of stopping. Implemented as continue: true on the resulting decision: \"block\". See https://code.claude.com/docs/en/hooks#prompt-hook-configuration"
116
130
  }
117
131
  }
118
132
  },
@@ -448,6 +462,10 @@
448
462
  "type": "string",
449
463
  "description": "Google Vertex AI project ID"
450
464
  },
465
+ "ANTHROPIC_WORKSPACE_ID": {
466
+ "type": "string",
467
+ "description": "Workspace ID for workload identity federation. Scopes the minted token to a specific workspace when the federation rule covers more than one. See https://code.claude.com/docs/en/env-vars"
468
+ },
451
469
  "API_TIMEOUT_MS": {
452
470
  "type": "string",
453
471
  "description": "API request timeout in milliseconds (default: 600000)"
@@ -599,6 +617,14 @@
599
617
  "1"
600
618
  ]
601
619
  },
620
+ "CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN": {
621
+ "type": "string",
622
+ "description": "Disable alternate screen buffer rendering. When set to 1, keeps conversation in native scrollback instead of fullscreen renderer",
623
+ "enum": [
624
+ "0",
625
+ "1"
626
+ ]
627
+ },
602
628
  "CLAUDE_CODE_DISABLE_ATTACHMENTS": {
603
629
  "type": "string",
604
630
  "description": "Disable attachment processing",
@@ -779,6 +805,14 @@
779
805
  "1"
780
806
  ]
781
807
  },
808
+ "CLAUDE_CODE_ENABLE_FEEDBACK_SURVEY_FOR_OTEL": {
809
+ "type": "string",
810
+ "description": "Enable feedback survey collection via OpenTelemetry for enterprises",
811
+ "enum": [
812
+ "0",
813
+ "1"
814
+ ]
815
+ },
782
816
  "CLAUDE_CODE_ENABLE_FINE_GRAINED_TOOL_STREAMING": {
783
817
  "type": "string",
784
818
  "description": "Force fine-grained tool output streaming",
@@ -787,6 +821,14 @@
787
821
  "1"
788
822
  ]
789
823
  },
824
+ "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": {
825
+ "type": "string",
826
+ "description": "Enable model discovery from LLM gateway /v1/models endpoint when ANTHROPIC_BASE_URL points at an Anthropic-compatible gateway",
827
+ "enum": [
828
+ "0",
829
+ "1"
830
+ ]
831
+ },
790
832
  "CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION": {
791
833
  "type": "string",
792
834
  "description": "Enable prompt suggestions",
@@ -831,6 +873,14 @@
831
873
  "type": "string",
832
874
  "description": "Token limit for file read operations"
833
875
  },
876
+ "CLAUDE_CODE_FORCE_SYNC_OUTPUT": {
877
+ "type": "string",
878
+ "description": "Force synchronous output flushing. When set to 1, forces synchronized output on terminals that auto-detection misses (e.g., Emacs eat)",
879
+ "enum": [
880
+ "0",
881
+ "1"
882
+ ]
883
+ },
834
884
  "CLAUDE_CODE_FORK_SUBAGENT": {
835
885
  "type": "string",
836
886
  "description": "Fork subagent processes in non-interactive sessions. See https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#21120",
@@ -943,6 +993,14 @@
943
993
  "type": "string",
944
994
  "description": "OAuth access token"
945
995
  },
996
+ "CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE": {
997
+ "type": "string",
998
+ "enum": [
999
+ "0",
1000
+ "1"
1001
+ ],
1002
+ "description": "Set to 1 to pin fast mode to Claude Opus 4.6 instead of the default Opus 4.7. With this set, /fast runs on Opus 4.6. Without it, /fast runs on Opus 4.7. See https://code.claude.com/docs/en/fast-mode and https://code.claude.com/docs/en/env-vars"
1003
+ },
946
1004
  "CLAUDE_CODE_OTEL_FLUSH_TIMEOUT_MS": {
947
1005
  "type": "string",
948
1006
  "description": "OpenTelemetry span flush timeout in milliseconds (default: 5000)"
@@ -955,6 +1013,14 @@
955
1013
  "type": "string",
956
1014
  "description": "OpenTelemetry shutdown timeout in milliseconds (default: 2000)"
957
1015
  },
1016
+ "CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE": {
1017
+ "type": "string",
1018
+ "description": "Enable automatic package manager updates. When set, Claude Code runs the upgrade command in background on Homebrew/WinGet and prompts to restart",
1019
+ "enum": [
1020
+ "0",
1021
+ "1"
1022
+ ]
1023
+ },
958
1024
  "CLAUDE_CODE_PERFORCE_MODE": {
959
1025
  "type": "string",
960
1026
  "description": "Enable Perforce write protection mode",
@@ -979,10 +1045,26 @@
979
1045
  "1"
980
1046
  ]
981
1047
  },
1048
+ "CLAUDE_CODE_PLUGIN_PREFER_HTTPS": {
1049
+ "type": "string",
1050
+ "enum": [
1051
+ "0",
1052
+ "1"
1053
+ ],
1054
+ "description": "Set to 1 to clone GitHub owner/repo plugin sources over HTTPS instead of SSH. Useful in CI runners, containers, or environments without a configured SSH key for github.com. See https://code.claude.com/docs/en/env-vars"
1055
+ },
982
1056
  "CLAUDE_CODE_PLUGIN_SEED_DIR": {
983
1057
  "type": "string",
984
1058
  "description": "Path(s) to pre-populated plugin directories"
985
1059
  },
1060
+ "CLAUDE_CODE_POWERSHELL_RESPECT_EXECUTION_POLICY": {
1061
+ "type": "string",
1062
+ "enum": [
1063
+ "0",
1064
+ "1"
1065
+ ],
1066
+ "description": "Set to 1 to stop Claude Code from passing -ExecutionPolicy Bypass when spawning PowerShell for tool calls, hooks, and status line commands. By default Claude Code bypasses execution policy so .ps1 scripts work on default-Restricted Windows installs. See https://code.claude.com/docs/en/env-vars"
1067
+ },
986
1068
  "CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST": {
987
1069
  "type": "string",
988
1070
  "description": "Indicate that the host application manages provider routing",
@@ -1095,6 +1177,10 @@
1095
1177
  "1"
1096
1178
  ]
1097
1179
  },
1180
+ "CLAUDE_CODE_STOP_HOOK_BLOCK_CAP": {
1181
+ "type": "string",
1182
+ "description": "Override the default maximum consecutive Stop hook blocks (default: 8) before the turn ends with a warning. Raise this when a stop hook legitimately needs more than 8 iterations to converge. See https://code.claude.com/docs/en/hooks-guide"
1183
+ },
1098
1184
  "CLAUDE_CODE_SUBAGENT_MODEL": {
1099
1185
  "type": "string",
1100
1186
  "description": "Override model used by subagents"
@@ -1427,7 +1513,7 @@
1427
1513
  },
1428
1514
  "fastMode": {
1429
1515
  "type": "boolean",
1430
- "description": "Enable fast mode for Opus 4.6 (research preview). Fast mode uses the same model with 2.5x faster output at higher per-token cost. Requires extra usage enabled. Alternatively, toggle with /fast command. See https://code.claude.com/docs/en/fast-mode",
1516
+ "description": "Enable fast mode, which uses Claude Opus 4.7 by default for 2.5x faster output at higher per-token cost. Requires extra usage enabled. Toggle with /fast command. Set CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE=1 to pin fast mode to Opus 4.6. See https://code.claude.com/docs/en/fast-mode",
1431
1517
  "default": false
1432
1518
  },
1433
1519
  "fastModePerSessionOptIn": {
@@ -1874,6 +1960,10 @@
1874
1960
  "type": "integer",
1875
1961
  "minimum": 1,
1876
1962
  "description": "Re-run the status line command every N seconds in addition to event-driven updates. Leave unset to run only on events. Useful for time-based data like clocks, or when background subagents change git state while the main session is idle. See https://code.claude.com/docs/en/statusline"
1963
+ },
1964
+ "hideVimModeIndicator": {
1965
+ "type": "boolean",
1966
+ "description": "Set to true when your status line script renders the vim mode indicator itself, to suppress the built-in vim mode display. See https://code.claude.com/docs/en/statusline#manually-configure-a-status-line"
1877
1967
  }
1878
1968
  },
1879
1969
  "required": [
@@ -2541,6 +2631,20 @@
2541
2631
  "description": "Additional arguments to pass to the ripgrep binary"
2542
2632
  }
2543
2633
  }
2634
+ },
2635
+ "bwrapPath": {
2636
+ "type": "string",
2637
+ "minLength": 1,
2638
+ "description": "(Managed setting only) Path to custom bubblewrap (bwrap) binary for Linux/WSL sandbox. Overrides default. See https://code.claude.com/docs/en/server-managed-settings"
2639
+ },
2640
+ "socatPath": {
2641
+ "type": "string",
2642
+ "minLength": 1,
2643
+ "description": "(Managed setting only) Path to custom socat binary for Linux/WSL network proxying. Overrides default. See https://code.claude.com/docs/en/server-managed-settings"
2644
+ },
2645
+ "failIfUnavailable": {
2646
+ "type": "boolean",
2647
+ "description": "When true, make sandbox startup a hard failure if required sandbox dependencies are missing. Default: false (sandbox is skipped with a warning). See https://code.claude.com/docs/en/sandboxing#enable-sandboxing"
2544
2648
  }
2545
2649
  },
2546
2650
  "additionalProperties": false
@@ -2611,6 +2715,25 @@
2611
2715
  "description": "Show turn duration messages after responses (e.g., \"Cooked for 1m 6s\"). Set to false to hide these messages (default: true)",
2612
2716
  "default": true
2613
2717
  },
2718
+ "skillOverrides": {
2719
+ "type": "object",
2720
+ "additionalProperties": {
2721
+ "type": "string",
2722
+ "enum": [
2723
+ "on",
2724
+ "name-only",
2725
+ "user-invocable-only",
2726
+ "off"
2727
+ ]
2728
+ },
2729
+ "description": "Per-skill visibility overrides. Controls whether skills appear to Claude and in the / picker. Values: 'on' (name and description shown, default), 'name-only' (name only), 'user-invocable-only' (hidden from Claude, visible in /), 'off' (hidden everywhere). Plugin skills are not affected by this setting. See https://code.claude.com/docs/en/skills#override-skill-visibility-from-settings",
2730
+ "examples": [
2731
+ {
2732
+ "legacy-context": "name-only",
2733
+ "deploy": "off"
2734
+ }
2735
+ ]
2736
+ },
2614
2737
  "prefersReducedMotion": {
2615
2738
  "type": "boolean",
2616
2739
  "description": "Reduce or disable UI animations (spinners, shimmer, flash effects) for accessibility",
@@ -2663,9 +2786,36 @@
2663
2786
  "shared/utils"
2664
2787
  ]
2665
2788
  ]
2789
+ },
2790
+ "baseRef": {
2791
+ "type": "string",
2792
+ "enum": [
2793
+ "fresh",
2794
+ "head"
2795
+ ],
2796
+ "default": "fresh",
2797
+ "description": "Whether to branch worktrees from origin/<default> (fresh) or local HEAD (head). Default: fresh. Set to 'head' to preserve unpushed commits in new worktrees. See https://code.claude.com/docs/en/settings#worktree-settings"
2798
+ },
2799
+ "bgIsolation": {
2800
+ "type": "string",
2801
+ "enum": [
2802
+ "worktree",
2803
+ "none"
2804
+ ],
2805
+ "default": "worktree",
2806
+ "description": "Isolation mode for background sessions. \"worktree\" blocks Edit/Write in main checkout until EnterWorktree is called; \"none\" lets background jobs edit the working copy directly without EnterWorktree, for repos where worktrees are impractical. See https://code.claude.com/docs/en/settings#worktree-settings"
2666
2807
  }
2667
2808
  }
2668
2809
  },
2810
+ "parentSettingsBehavior": {
2811
+ "type": "string",
2812
+ "enum": [
2813
+ "first-wins",
2814
+ "merge"
2815
+ ],
2816
+ "default": "first-wins",
2817
+ "description": "(Admin/managed settings only) Controls how SDK managedSettings (parent tier) merge with inherited settings. 'first-wins': first non-empty value applies (default). 'merge': merge arrays and objects. See https://code.claude.com/docs/en/server-managed-settings"
2818
+ },
2669
2819
  "pluginTrustMessage": {
2670
2820
  "type": "string",
2671
2821
  "description": "(Managed settings only) Custom message appended to the plugin trust warning shown before installation. Use to provide organization-specific context about approved plugins. See https://code.claude.com/docs/en/settings#plugin-settings",
@@ -2954,6 +3104,13 @@
2954
3104
  "type": "string"
2955
3105
  },
2956
3106
  "description": "Entries for the auto mode classifier environment section. Replaces the built-in environment context entirely unless the literal string \"$defaults\" is included as an entry, which splices the built-in defaults in at that position."
3107
+ },
3108
+ "hard_deny": {
3109
+ "type": "array",
3110
+ "items": {
3111
+ "type": "string"
3112
+ },
3113
+ "description": "Rules for the auto mode classifier hard-deny section. Hard-deny rules block unconditionally regardless of user intent. Replaces the built-in hard-deny rules entirely unless the literal string \"$defaults\" is included as an entry, which splices the built-in defaults in at that position. See https://code.claude.com/docs/en/permissions"
2957
3114
  }
2958
3115
  }
2959
3116
  },
@@ -3056,6 +3213,27 @@
3056
3213
  "wslInheritsWindowsSettings": {
3057
3214
  "type": "boolean",
3058
3215
  "description": "(Windows managed settings only) When true, Claude Code on WSL reads managed settings from the Windows policy chain in addition to /etc/claude-code, with Windows sources taking priority. Only honored when set in the HKLM registry key or C:\\Program Files\\ClaudeCode\\managed-settings.json, both of which require Windows admin to write. For HKCU policy to also apply on WSL, the flag must additionally be set in HKCU itself. Has no effect on native Windows. See https://code.claude.com/docs/en/settings#available-settings"
3216
+ },
3217
+ "subagentStatusLine": {
3218
+ "type": "object",
3219
+ "additionalProperties": false,
3220
+ "description": "Status line configuration for subagent sessions. See https://code.claude.com/docs/en/statusline#subagent-status-lines",
3221
+ "required": [
3222
+ "type",
3223
+ "command"
3224
+ ],
3225
+ "properties": {
3226
+ "type": {
3227
+ "type": "string",
3228
+ "const": "command",
3229
+ "description": "Must be \"command\""
3230
+ },
3231
+ "command": {
3232
+ "type": "string",
3233
+ "description": "Shell command to run for the subagent status line",
3234
+ "minLength": 1
3235
+ }
3236
+ }
3059
3237
  }
3060
3238
  },
3061
3239
  "title": "Claude Code Settings"
@@ -1,6 +1,6 @@
1
1
  {
2
- "extractedFromClaudeCodeVersion": "2.1.150",
3
- "extractedAt": "2026-05-23T18:30:08.375Z",
2
+ "extractedFromClaudeCodeVersion": "2.1.152",
3
+ "extractedAt": "2026-05-27T07:39:39.197Z",
4
4
  "schema": {
5
5
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6
6
  "title": "Claude Code settings.json",
@@ -573,6 +573,10 @@
573
573
  "type": "boolean",
574
574
  "description": "Disable Remote Control (claude.ai/code, `claude remote-control`, `--remote-control`/`--rc`, auto-start, and the in-session toggle). Typically set in managed settings."
575
575
  },
576
+ "disableWorkflows": {
577
+ "type": "boolean",
578
+ "description": "@internal Disable the Workflows feature (also via CLAUDE_CODE_DISABLE_WORKFLOWS)."
579
+ },
576
580
  "disableSkillShellExecution": {
577
581
  "type": "boolean",
578
582
  "description": "Disable inline shell execution in skills and custom slash commands from user, project, or plugin sources. Commands are replaced with a placeholder instead of being run."
@@ -1882,6 +1886,13 @@
1882
1886
  },
1883
1887
  "description": "Enterprise blocklist of marketplace sources. When set in managed settings, these exact sources are blocked from being added as marketplaces. The check happens BEFORE downloading, so blocked sources never touch the filesystem."
1884
1888
  },
1889
+ "pluginSuggestionMarketplaces": {
1890
+ "type": "array",
1891
+ "items": {
1892
+ "type": "string"
1893
+ },
1894
+ "description": "Marketplace names whose plugins may surface as contextual install suggestions (relevance-based tips), in addition to the official marketplace. Only honored when set in managed settings (policy scope); the key is ignored in user, project, and local settings. A name only takes effect when the marketplace is registered on the machine AND its registered source is also declared in managed settings, either as the extraKnownMarketplaces entry for that name or as an entry of strictKnownMarketplaces. A marketplace registered from a different source under an allowlisted name is ignored."
1895
+ },
1885
1896
  "forceLoginMethod": {
1886
1897
  "enum": [
1887
1898
  "claudeai",
@@ -2374,7 +2385,7 @@
2374
2385
  },
2375
2386
  "showThinkingSummaries": {
2376
2387
  "type": "boolean",
2377
- "description": "Show thinking summaries in the transcript view (ctrl+o). Default: false."
2388
+ "description": "Request API-side thinking summaries and show them in the conversation and in the transcript view (ctrl+o). Set explicitly to override the default for your install."
2378
2389
  },
2379
2390
  "skipDangerousModePermissionPrompt": {
2380
2391
  "type": "boolean",
@@ -1,6 +1,6 @@
1
1
  {
2
- "extractedFromClaudeCodeVersion": "2.1.150",
3
- "extractedAt": "2026-05-23T18:30:08.380Z",
2
+ "extractedFromClaudeCodeVersion": "2.1.152",
3
+ "extractedAt": "2026-05-27T07:39:39.199Z",
4
4
  "schema": {
5
5
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6
6
  "title": "Claude Code SKILL.md frontmatter",
@@ -84,6 +84,60 @@
84
84
  ],
85
85
  "description": "Tools available to the model while this file is active. Comma-separated string or YAML list."
86
86
  },
87
+ "disallowed-tools": {
88
+ "anyOf": [
89
+ {
90
+ "anyOf": [
91
+ {
92
+ "type": "string"
93
+ },
94
+ {
95
+ "type": "number"
96
+ },
97
+ {
98
+ "type": "boolean"
99
+ },
100
+ {
101
+ "type": "null"
102
+ }
103
+ ]
104
+ },
105
+ {
106
+ "type": "array",
107
+ "items": {
108
+ "type": "string"
109
+ }
110
+ }
111
+ ],
112
+ "description": "Tools removed from the model while this file is active. Comma-separated string or YAML list. Cleared when the user sends the next message."
113
+ },
114
+ "disallowedTools": {
115
+ "anyOf": [
116
+ {
117
+ "anyOf": [
118
+ {
119
+ "type": "string"
120
+ },
121
+ {
122
+ "type": "number"
123
+ },
124
+ {
125
+ "type": "boolean"
126
+ },
127
+ {
128
+ "type": "null"
129
+ }
130
+ ]
131
+ },
132
+ {
133
+ "type": "array",
134
+ "items": {
135
+ "type": "string"
136
+ }
137
+ }
138
+ ],
139
+ "description": "Canonical (normalized) alias of `disallowed-tools`."
140
+ },
87
141
  "argument-hint": {
88
142
  "anyOf": [
89
143
  {
package/dist/contracts.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // Auto-generated from contracts/claude-code-contracts.json
2
- // Claude Code v2.1.150 — extracted 2026-05-23T07:05:23.158Z
2
+ // Claude Code v2.1.152 — extracted 2026-05-27T07:39:34.438Z
3
3
  // Do not edit manually. Run: npm run generate-contracts
4
4
  export const TOOLS = new Set([
5
5
  "Agent",
@@ -56,6 +56,7 @@ export const HOOK_EVENTS = new Set([
56
56
  "ElicitationResult",
57
57
  "FileChanged",
58
58
  "InstructionsLoaded",
59
+ "MessageDisplay",
59
60
  "Notification",
60
61
  "PermissionDenied",
61
62
  "PermissionRequest",
@@ -249,6 +250,7 @@ export const SETTINGS_USER_FIELDS = new Set([
249
250
  "disableBackgroundAgents",
250
251
  "disableRemoteControl",
251
252
  "disableSkillShellExecution",
253
+ "disableWorkflows",
252
254
  "disabledMcpjsonServers",
253
255
  "doneMeansMerged",
254
256
  "editorMode",
@@ -283,6 +285,7 @@ export const SETTINGS_USER_FIELDS = new Set([
283
285
  "permissions",
284
286
  "plansDirectory",
285
287
  "pluginConfigs",
288
+ "pluginSuggestionMarketplaces",
286
289
  "pluginTrustMessage",
287
290
  "policyHelper",
288
291
  "prUrlTemplate",
@@ -33,6 +33,12 @@ export const mcpJsonFixer = {
33
33
  orderedServer[field] = serverObj[field];
34
34
  }
35
35
  }
36
+ // gitea#7: URL-based servers with type:"http" rewrite to
37
+ // "streamable-http" (the runtime transport is identical post-v2.1.146;
38
+ // the rename avoids the legacy OAuth-probe code path).
39
+ if (orderedServer.type === "http" && typeof orderedServer.url === "string") {
40
+ orderedServer.type = "streamable-http";
41
+ }
36
42
  sortedServers[serverName] = orderedServer;
37
43
  }
38
44
  else {
@@ -19,6 +19,7 @@ const RULES = [
19
19
  { id: "mcp-json/url-protocol", defaultSeverity: "warning" },
20
20
  { id: "mcp-json/url-valid", defaultSeverity: "error" },
21
21
  { id: "mcp-json/type-matches-transport", defaultSeverity: "warning" },
22
+ { id: "mcp-json/prefer-streamable-http", defaultSeverity: "warning" },
22
23
  { id: "mcp-json/command-args-split", defaultSeverity: "info" },
23
24
  { id: "mcp-json/args-array", defaultSeverity: "error" },
24
25
  { id: "mcp-json/env-object", defaultSeverity: "error" },
@@ -143,6 +144,13 @@ export const mcpJsonLinter = {
143
144
  if ("type" in server && !HTTP_TRANSPORT_TYPES.has(server.type)) {
144
145
  push(diag(config, filePath, "mcp-json/type-matches-transport", "warning", `Server "${name}" has URL but type is "${server.type}" (expected one of ${[...HTTP_TRANSPORT_TYPES].join(", ")})`, sp?.line, sp?.column));
145
146
  }
147
+ // Prefer "streamable-http" over "http" for URL-based MCP servers.
148
+ // Per gitea#7: older Claude Code's "http" transport may trigger an
149
+ // OAuth metadata probe / DCR POST that "streamable-http" skips, and
150
+ // misbehaving upstream proxies can silently fail with "0 tools".
151
+ if (server.type === "http") {
152
+ push(diag(config, filePath, "mcp-json/prefer-streamable-http", "warning", `Server "${name}" uses type "http" — prefer "streamable-http" to avoid OAuth probe edge cases on some upstream proxies`, sp?.line, sp?.column));
153
+ }
146
154
  }
147
155
  // stdio server checks
148
156
  if (hasCommand && !hasUrl) {
@@ -22,6 +22,7 @@ const RULES = [
22
22
  { id: "plugin-json/keywords-no-duplicates", defaultSeverity: "warning" },
23
23
  { id: "plugin-json/no-unknown-fields", defaultSeverity: "info" },
24
24
  { id: "plugin-json/license-spdx", defaultSeverity: "info" },
25
+ { id: "plugin-json/no-inline-mcp-servers", defaultSeverity: "warning" },
25
26
  ];
26
27
  function findKeyPosition(content, key) {
27
28
  const re = new RegExp(`"${key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}"\\s*:`);
@@ -178,6 +179,13 @@ export const pluginJsonLinter = {
178
179
  }
179
180
  }
180
181
  }
182
+ // gitea#9: mcpServers belongs in `.mcp.json` at the plugin root, not as
183
+ // a top-level key in `.claude-plugin/plugin.json`. The legacy shape still
184
+ // loads but uses a different code path and contradicts the official docs.
185
+ if ("mcpServers" in parsed) {
186
+ const p = pos("mcpServers");
187
+ push(diag(config, filePath, "plugin-json/no-inline-mcp-servers", "warning", "\"mcpServers\" should not live inside plugin.json — move to .mcp.json at the plugin root. See https://code.claude.com/docs/en/plugins#plugin-structure-overview", p?.line, p?.column));
188
+ }
181
189
  // license
182
190
  if ("license" in parsed && typeof parsed.license === "string") {
183
191
  if (!SPDX_COMMON.has(parsed.license)) {
@@ -1,4 +1,5 @@
1
- import { basename } from "node:path";
1
+ import { basename, dirname, join } from "node:path";
2
+ import { existsSync, readFileSync } from "node:fs";
2
3
  import { SETTINGS_USER_FIELDS, TOOLS, PERMISSIONS_FIELDS, PERMISSION_MODES, SANDBOX_FIELDS, SANDBOX_NETWORK_FIELDS, SANDBOX_FILESYSTEM_FIELDS, } from "../contracts.js";
3
4
  import { formatAjvError, loadSettingsSchema, summarizeErrors, } from "../plugin-schema.js";
4
5
  import { isRuleEnabled, getRuleSeverity } from "../types.js";
@@ -30,6 +31,7 @@ const RULES = [
30
31
  { id: "settings-json/plugins-boolean", defaultSeverity: "warning" },
31
32
  { id: "settings-json/plugins-format", defaultSeverity: "warning" },
32
33
  { id: "settings-json/skip-prompt-boolean", defaultSeverity: "error" },
34
+ { id: "settings-json/disable-project-mcpjson-shadow", defaultSeverity: "warning" },
33
35
  ];
34
36
  // Expected type for each known sandbox sub-key, and for the nested
35
37
  // network/filesystem objects. Mirrors Claude Code's Zod schema.
@@ -471,6 +473,50 @@ export const settingsJsonLinter = {
471
473
  }
472
474
  }
473
475
  }
476
+ // gitea#8: when this settings.json sits at <plugin-root>/.claude/settings.json
477
+ // and the plugin also ships a <plugin-root>/.mcp.json, Claude Code loads the
478
+ // plugin's MCP servers twice when launched from the plugin dir (once as the
479
+ // plugin, once as project-scope .mcp.json) and dedupes — triggering /doctor
480
+ // "skipped" warnings. The committed suppression is to list each server name
481
+ // in this file's `disabledMcpjsonServers`.
482
+ if (isRuleEnabled(config, "settings-json/disable-project-mcpjson-shadow") &&
483
+ basename(filePath) === "settings.json" &&
484
+ basename(dirname(filePath)) === ".claude") {
485
+ const pluginRoot = dirname(dirname(filePath));
486
+ const pluginJson = join(pluginRoot, ".claude-plugin", "plugin.json");
487
+ const mcpJson = join(pluginRoot, ".mcp.json");
488
+ if (existsSync(pluginJson) && existsSync(mcpJson)) {
489
+ let mcpServerNames = [];
490
+ try {
491
+ const mcp = JSON.parse(readFileSync(mcpJson, "utf-8"));
492
+ if (isPlainObject(mcp.mcpServers)) {
493
+ mcpServerNames = Object.keys(mcp.mcpServers);
494
+ }
495
+ }
496
+ catch { /* ignore — broken .mcp.json is the mcp-json linter's job */ }
497
+ // settings.local.json with the same disable also satisfies the rule.
498
+ let disabled = Array.isArray(parsed.disabledMcpjsonServers)
499
+ ? parsed.disabledMcpjsonServers
500
+ : [];
501
+ const localPath = join(dirname(filePath), "settings.local.json");
502
+ if (existsSync(localPath)) {
503
+ try {
504
+ const local = JSON.parse(readFileSync(localPath, "utf-8"));
505
+ if (Array.isArray(local.disabledMcpjsonServers)) {
506
+ disabled = disabled.concat(local.disabledMcpjsonServers);
507
+ }
508
+ }
509
+ catch { /* ignore */ }
510
+ }
511
+ const disabledSet = new Set(disabled.filter((x) => typeof x === "string"));
512
+ const dp = findKeyPosition(content, "disabledMcpjsonServers");
513
+ for (const name of mcpServerNames) {
514
+ if (!disabledSet.has(name)) {
515
+ push(diag(config, filePath, "settings-json/disable-project-mcpjson-shadow", "warning", `Server "${name}" is declared in .mcp.json but not in .claude/settings.json#disabledMcpjsonServers — when Claude Code is launched from this plugin directory, the MCP server is loaded twice (plugin + project-level), triggering /doctor "skipped" warnings`, dp?.line, dp?.column));
516
+ }
517
+ }
518
+ }
519
+ }
474
520
  // skipDangerousModePermissionPrompt — user-level only
475
521
  if ("skipDangerousModePermissionPrompt" in parsed) {
476
522
  if (typeof parsed.skipDangerousModePermissionPrompt !== "boolean") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudecode-linter",
3
- "version": "2.1.150-patch.1",
3
+ "version": "2.1.152",
4
4
  "description": "Standalone linter for Claude Code plugins and configuration files",
5
5
  "type": "module",
6
6
  "bin": {