one-code-extension 0.4.1 → 0.6.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/README.md +16 -5
- package/agents/general-purpose.md +2 -2
- package/docs/guide/README.md +2 -1
- package/docs/guide/bring-your-claude-code-setup.md +60 -9
- package/docs/guide/configuration.md +48 -14
- package/docs/guide/differences-from-claude-code.md +40 -28
- package/docs/guide/doctor.md +20 -13
- package/docs/guide/hooks.md +18 -3
- package/docs/guide/installation.md +26 -4
- package/docs/guide/permissions-modes-and-auto-mode.md +225 -49
- package/docs/guide/providers-and-models.md +137 -54
- package/docs/guide/reference.md +27 -15
- package/docs/guide/sessions-and-context.md +69 -16
- package/docs/guide/skills-plugins-and-mcp.md +57 -20
- package/docs/guide/subagents-and-workflows.md +95 -29
- package/docs/guide/tasks-and-background-work.md +101 -26
- package/docs/guide/terminal-interface.md +24 -12
- package/docs/guide/tools.md +46 -5
- package/docs/guide/troubleshooting.md +13 -9
- package/docs/guide/windows.md +58 -31
- package/extensions/artifacts/gallery.ts +227 -0
- package/extensions/artifacts/index.ts +288 -0
- package/extensions/artifacts/store.ts +570 -0
- package/extensions/artifacts/viewer.ts +199 -0
- package/extensions/ask-user/description.ts +67 -0
- package/extensions/ask-user/dialogs.ts +80 -0
- package/extensions/ask-user/index.ts +37 -33
- package/extensions/ask-user/questions.ts +32 -7
- package/extensions/ask-user/widget.ts +45 -25
- package/extensions/auto-mode/actions.ts +6 -0
- package/extensions/auto-mode/cache.ts +88 -0
- package/extensions/auto-mode/classifier-prompt.ts +5 -4
- package/extensions/auto-mode/classifier.ts +290 -65
- package/extensions/auto-mode/config.ts +72 -20
- package/extensions/auto-mode/decision-log.ts +2 -0
- package/extensions/auto-mode/defaults.ts +1 -1
- package/extensions/auto-mode/denials.ts +124 -0
- package/extensions/auto-mode/git-checkout-programs.ts +187 -0
- package/extensions/auto-mode/git-status-meta.ts +159 -0
- package/extensions/auto-mode/history.ts +189 -0
- package/extensions/auto-mode/instructions.ts +58 -52
- package/extensions/auto-mode/model-select.ts +159 -134
- package/extensions/auto-mode/paths.ts +57 -5
- package/extensions/auto-mode/pause.ts +57 -2
- package/extensions/auto-mode/prompt.ts +37 -21
- package/extensions/auto-mode/read-only-options.ts +724 -0
- package/extensions/auto-mode/resolved-paths-meta.ts +133 -0
- package/extensions/auto-mode/rules.ts +18 -1
- package/extensions/auto-mode/safety-floor.ts +361 -18
- package/extensions/auto-mode/setup-run.ts +20 -14
- package/extensions/auto-mode/shell-analysis.ts +764 -490
- package/extensions/auto-mode/shell-parse.ts +885 -0
- package/extensions/auto-mode/system-note.ts +33 -0
- package/extensions/auto-mode/transcript.ts +80 -51
- package/extensions/background/cron.ts +642 -0
- package/extensions/background/index.ts +614 -248
- package/extensions/background/loop-fire.ts +173 -0
- package/extensions/background/loop-preamble.ts +59 -0
- package/extensions/background/loop-skill.ts +163 -0
- package/extensions/background/monitor-batch.ts +53 -0
- package/extensions/background/noop-fold.ts +128 -0
- package/extensions/background/switch-guard.ts +56 -0
- package/extensions/background/wakeup.ts +178 -55
- package/extensions/bash/background.ts +53 -17
- package/extensions/bash/child.ts +7 -0
- package/extensions/bash/description.ts +188 -0
- package/extensions/bash/guards.ts +15 -67
- package/extensions/bash/index.ts +66 -35
- package/extensions/branding/compaction-keep.ts +63 -0
- package/extensions/branding/declined.ts +22 -0
- package/extensions/branding/index.ts +133 -9
- package/extensions/branding/prompt-editor.ts +53 -6
- package/extensions/branding/queued-edit.ts +31 -0
- package/extensions/branding/replaced-builtins.ts +68 -0
- package/extensions/branding/startup.ts +33 -71
- package/extensions/btw/index.ts +250 -78
- package/extensions/btw/panel.ts +228 -100
- package/extensions/btw/prompt.ts +41 -4
- package/extensions/cache-marks/index.ts +42 -0
- package/extensions/claude-compat/index.ts +7 -11
- package/extensions/claude-context/index.ts +436 -63
- package/extensions/compaction/cut.ts +157 -0
- package/extensions/compaction/index.ts +219 -75
- package/extensions/compaction/kept-thinking.ts +62 -0
- package/extensions/compaction/prompt.ts +15 -12
- package/extensions/context-budget/budget.ts +16 -2
- package/extensions/context-budget/index.ts +35 -15
- package/extensions/context-management/index.ts +36 -28
- package/extensions/doctor/build.ts +59 -8
- package/extensions/doctor/builtins.ts +84 -0
- package/extensions/doctor/cli.ts +7 -1
- package/extensions/doctor/compat.ts +88 -23
- package/extensions/doctor/dependencies.ts +41 -5
- package/extensions/doctor/fix-prompt.ts +9 -2
- package/extensions/doctor/index.ts +102 -58
- package/extensions/doctor/models.ts +102 -63
- package/extensions/doctor/presets.ts +42 -27
- package/extensions/doctor/report.ts +19 -2
- package/extensions/doctor/viewer.ts +49 -27
- package/extensions/effort/index.ts +141 -25
- package/extensions/effort/settings.ts +21 -0
- package/extensions/effort/slider.ts +24 -20
- package/extensions/exit/index.ts +32 -1
- package/extensions/file-tracker/index.ts +420 -42
- package/extensions/file-tracker/replay.ts +137 -24
- package/extensions/file-tracker/restore.ts +66 -0
- package/extensions/file-tracker/results.ts +66 -0
- package/extensions/file-tracker/shell-reads.ts +211 -0
- package/extensions/file-tracker/tracker.ts +45 -15
- package/extensions/footer/footer-line.ts +45 -24
- package/extensions/footer/index.ts +47 -2
- package/extensions/footer/pr.ts +34 -5
- package/extensions/hooks/compaction.ts +7 -0
- package/extensions/hooks/executor.ts +32 -30
- package/extensions/hooks/index.ts +209 -58
- package/extensions/hooks/matcher.ts +3 -0
- package/extensions/hooks/prompt-context.ts +59 -0
- package/extensions/hooks/protocol.ts +41 -3
- package/extensions/hooks/settings.ts +50 -19
- package/extensions/hooks/subagent-bridge.ts +2 -0
- package/extensions/hooks/trust.ts +26 -12
- package/extensions/idle-compact/index.ts +119 -0
- package/extensions/idle-compact/policy.ts +143 -0
- package/extensions/init/index.ts +11 -10
- package/extensions/init/prompt.ts +25 -32
- package/extensions/interrupted/index.ts +13 -1
- package/extensions/kept-thinking/index.ts +27 -0
- package/extensions/ledger/index.ts +46 -0
- package/extensions/ledger/wire.ts +154 -0
- package/extensions/lib/agent-cron.ts +146 -0
- package/extensions/lib/agent-loader.ts +18 -3
- package/extensions/lib/agent-view.ts +85 -0
- package/extensions/lib/anthropic-auth.ts +98 -0
- package/extensions/lib/anthropic-payload.ts +82 -1
- package/extensions/lib/anthropic-server-call.ts +230 -0
- package/extensions/lib/anthropic-server-tools.ts +485 -0
- package/extensions/lib/app-launch.mjs +94 -0
- package/extensions/lib/argument-hints.ts +190 -0
- package/extensions/lib/atomic-write.ts +6 -2
- package/extensions/lib/auto-memory.ts +75 -0
- package/extensions/lib/bash-parser.ts +84 -0
- package/extensions/lib/btw-fork.ts +93 -0
- package/extensions/lib/child-extensions.ts +52 -0
- package/extensions/lib/child-writes.ts +45 -0
- package/extensions/lib/claude-context.ts +515 -100
- package/extensions/lib/claude-external-includes.ts +68 -0
- package/extensions/lib/claude-id.ts +22 -0
- package/extensions/lib/claude-rules.ts +323 -0
- package/extensions/lib/claude-settings.ts +76 -4
- package/extensions/lib/compaction-boundary.ts +36 -0
- package/extensions/lib/compaction-keep.mjs +83 -0
- package/extensions/lib/config-mode.ts +112 -0
- package/extensions/lib/consent-dialogs.ts +63 -0
- package/extensions/lib/consent-preview.ts +5 -1
- package/extensions/lib/consent-stores.ts +48 -0
- package/extensions/lib/context-facts.ts +97 -0
- package/extensions/lib/covered-messages.ts +23 -0
- package/extensions/lib/deferred.ts +359 -25
- package/extensions/lib/dock-rows.ts +60 -0
- package/extensions/lib/empty-tool-result.ts +27 -0
- package/extensions/lib/environment-block.ts +76 -0
- package/extensions/lib/fetch-timeout.ts +24 -6
- package/extensions/{system-prompt → lib}/git-status.ts +51 -13
- package/extensions/lib/git.ts +75 -13
- package/extensions/lib/grammars/LICENSE-tree-sitter-bash +21 -0
- package/extensions/lib/grammars/README.md +2 -0
- package/extensions/lib/grammars/tree-sitter-bash.wasm +0 -0
- package/extensions/lib/guide-docs.ts +45 -0
- package/extensions/lib/headless-output.ts +46 -0
- package/extensions/lib/hook-gate.ts +7 -7
- package/extensions/lib/interrupt.ts +20 -4
- package/extensions/lib/key-input.ts +455 -0
- package/extensions/lib/keys.ts +14 -1
- package/extensions/lib/ledger/fold-memo.ts +49 -0
- package/extensions/lib/ledger/fold.ts +265 -0
- package/extensions/lib/ledger/layout.ts +72 -0
- package/extensions/lib/ledger/plan.ts +102 -0
- package/extensions/lib/ledger/records.ts +276 -0
- package/extensions/lib/ledger/state.ts +47 -0
- package/extensions/lib/ledger/validate.ts +141 -0
- package/extensions/lib/ledger/wire.ts +632 -0
- package/extensions/lib/local-command.ts +71 -19
- package/extensions/lib/mcp-overrides.ts +1 -1
- package/extensions/lib/mcp-share.ts +46 -0
- package/extensions/lib/memory-content.ts +146 -0
- package/extensions/lib/memory-index.ts +18 -0
- package/extensions/lib/memory.ts +134 -123
- package/extensions/lib/model-catalog/huggingface.json +178 -0
- package/extensions/lib/model-catalog/models-dev.json +18533 -0
- package/extensions/lib/model-catalog/openrouter.json +5050 -0
- package/extensions/lib/model-catalog-data.ts +513 -0
- package/extensions/lib/model-catalog.ts +462 -0
- package/extensions/lib/model-choice-warnings.ts +137 -0
- package/extensions/lib/model-pairings.ts +152 -0
- package/extensions/{auto-mode → lib}/model-picker.ts +26 -43
- package/extensions/lib/model-policy.ts +112 -15
- package/extensions/lib/model-tier.ts +283 -355
- package/extensions/lib/model-unusable.ts +1 -1
- package/extensions/lib/newer-model.ts +100 -0
- package/extensions/lib/notices.ts +87 -0
- package/extensions/lib/notifications.ts +357 -73
- package/extensions/lib/one-code-settings.ts +74 -8
- package/extensions/lib/open-browser.ts +63 -0
- package/extensions/lib/openrouter-generation.ts +94 -0
- package/extensions/lib/operation-deadline.ts +30 -0
- package/extensions/lib/original-command.ts +4 -4
- package/extensions/lib/package-version.ts +1 -1
- package/extensions/lib/panel-focus.ts +134 -0
- package/extensions/lib/paths.ts +17 -2
- package/extensions/lib/permission-gate.ts +72 -6
- package/extensions/lib/persisted-output.ts +60 -8
- package/extensions/lib/pi-ai-estimate.ts +19 -3
- package/extensions/lib/pi-version.ts +38 -2
- package/extensions/lib/plan-mode-channels.ts +42 -5
- package/extensions/lib/plugins.ts +26 -17
- package/extensions/lib/powershell-parse-script.ts +208 -0
- package/extensions/lib/powershell-parser.ts +344 -0
- package/extensions/lib/previous-mark.ts +101 -0
- package/extensions/lib/process-state.ts +48 -0
- package/extensions/lib/process-tree.ts +132 -8
- package/extensions/lib/prompt-options.ts +82 -0
- package/extensions/lib/queued-delivery.ts +44 -0
- package/extensions/lib/reminders.ts +370 -358
- package/extensions/lib/replaced-builtins.mjs +199 -0
- package/extensions/lib/replay-call.ts +70 -0
- package/extensions/lib/request-replay.ts +547 -0
- package/extensions/lib/scratchpad.ts +81 -14
- package/extensions/lib/send-now-channel.ts +7 -0
- package/extensions/lib/session-model-tier.ts +51 -0
- package/extensions/lib/session-work.ts +64 -0
- package/extensions/lib/settings-channels.ts +4 -4
- package/extensions/lib/shell-exit-semantics.ts +170 -0
- package/extensions/lib/shell-quote.ts +11 -0
- package/extensions/lib/shell-result.ts +70 -0
- package/extensions/lib/shell-spawn.ts +70 -6
- package/extensions/lib/shell-tool.ts +75 -25
- package/extensions/lib/side-call-cache.ts +124 -0
- package/extensions/lib/side-call-run.ts +96 -0
- package/extensions/lib/side-call-usage.ts +38 -0
- package/extensions/lib/side-call.ts +24 -1
- package/extensions/lib/single-flight.ts +18 -0
- package/extensions/lib/skill-body.ts +42 -0
- package/extensions/lib/skill-scan.ts +63 -24
- package/extensions/lib/spill-file.ts +140 -0
- package/extensions/lib/subagent-handback.ts +112 -0
- package/extensions/lib/system-role.ts +156 -0
- package/extensions/lib/terminal-text.ts +114 -0
- package/extensions/lib/text-width.ts +47 -16
- package/extensions/lib/timer-ops.ts +20 -0
- package/extensions/lib/tool-additions.ts +129 -0
- package/extensions/lib/tool-call-corruption.ts +134 -0
- package/extensions/lib/tool-path.ts +66 -0
- package/extensions/lib/tool-variants.ts +69 -0
- package/extensions/lib/tui-render.ts +255 -27
- package/extensions/lib/turn-budget-layout.ts +159 -0
- package/extensions/lib/update-check.mjs +15 -2
- package/extensions/lib/usage-bus.ts +1 -1
- package/extensions/lib/user-denial.ts +38 -0
- package/extensions/lib/workspace-channel.ts +16 -0
- package/extensions/lib/worktree-channel.ts +31 -3
- package/extensions/lib/worktree-isolation.ts +40 -10
- package/extensions/lsp/client.ts +8 -9
- package/extensions/lsp/index.ts +76 -12
- package/extensions/lsp/keep-alive.ts +1 -1
- package/extensions/lsp/trust.ts +119 -0
- package/extensions/lsp/watcher.ts +1 -1
- package/extensions/mcp/announce.ts +90 -43
- package/extensions/mcp/client.ts +161 -48
- package/extensions/mcp/config.ts +132 -8
- package/extensions/mcp/discovery.ts +19 -0
- package/extensions/mcp/index.ts +220 -121
- package/extensions/mcp/oauth/browser.ts +38 -17
- package/extensions/mcp/oauth/flow.ts +25 -17
- package/extensions/mcp/oauth/provider.ts +14 -8
- package/extensions/mcp/oauth/store.ts +34 -16
- package/extensions/mcp/panel/keys.ts +12 -11
- package/extensions/mcp/panel/render.ts +9 -6
- package/extensions/mcp/schema.ts +104 -5
- package/extensions/mcp/trust.ts +164 -73
- package/extensions/memory/entries.ts +23 -14
- package/extensions/memory/index.ts +134 -28
- package/extensions/memory/open-external.ts +33 -18
- package/extensions/memory/panel.ts +135 -26
- package/extensions/model-default/index.ts +86 -19
- package/extensions/newer-model/index.ts +31 -0
- package/extensions/notebook/description.ts +18 -0
- package/extensions/notebook/index.ts +6 -5
- package/extensions/notebook/notebook.ts +1 -1
- package/extensions/permissions/index.ts +1426 -398
- package/extensions/permissions/matcher.ts +425 -74
- package/extensions/permissions/modes.ts +11 -4
- package/extensions/permissions/panel/host.ts +130 -0
- package/extensions/permissions/panel/keys.ts +48 -0
- package/extensions/permissions/panel/render.ts +450 -0
- package/extensions/permissions/panel/state.ts +550 -0
- package/extensions/permissions/powershell-cmdlets.ts +198 -0
- package/extensions/permissions/powershell-paths.ts +197 -0
- package/extensions/permissions/powershell-rules.ts +207 -280
- package/extensions/permissions/powershell-tree.ts +557 -0
- package/extensions/permissions/project-trust.ts +27 -11
- package/extensions/permissions/protected-paths.ts +14 -2
- package/extensions/permissions/session-grant.ts +6 -0
- package/extensions/permissions/settings.ts +166 -31
- package/extensions/permissions/subagent-gate.ts +25 -0
- package/extensions/permissions/workspace.ts +78 -0
- package/extensions/plan-mode/index.ts +276 -92
- package/extensions/plan-mode/reminder.ts +89 -21
- package/extensions/plan-mode/run-state.ts +26 -0
- package/extensions/plan-mode/texts.ts +177 -0
- package/extensions/plan-mode/viewer.ts +92 -27
- package/extensions/plugins/counts.ts +3 -3
- package/extensions/plugins/index.ts +64 -46
- package/extensions/plugins/install/install.ts +16 -0
- package/extensions/plugins/marketplace/sync.ts +9 -3
- package/extensions/plugins/marketplace/types.ts +3 -1
- package/extensions/plugins/panel/keys.ts +21 -24
- package/extensions/plugins/panel/render.ts +12 -6
- package/extensions/plugins/shell-expand.ts +107 -0
- package/extensions/plugins/template.ts +32 -15
- package/extensions/powershell/child.ts +7 -0
- package/extensions/powershell/description.ts +38 -6
- package/extensions/powershell/guards.ts +1 -1
- package/extensions/powershell/index.ts +14 -7
- package/extensions/recap/index.ts +73 -71
- package/extensions/recap/prompt.ts +2 -2
- package/extensions/recap/scheduler.ts +3 -5
- package/extensions/search-tools/grep-merge.ts +39 -0
- package/extensions/search-tools/index.ts +0 -0
- package/extensions/send-now/chord.ts +62 -0
- package/extensions/send-now/index.ts +133 -0
- package/extensions/session-title/index.ts +3 -0
- package/extensions/session-title/title.ts +4 -1
- package/extensions/skill/announce.ts +30 -0
- package/extensions/skill/code-review.ts +97 -0
- package/extensions/skill/index.ts +469 -132
- package/extensions/skill/invoke.ts +118 -75
- package/extensions/skill/listing.ts +133 -9
- package/extensions/skill/panel/keys.ts +15 -16
- package/extensions/skill/panel/render.ts +5 -2
- package/extensions/skill/panel/state.ts +12 -1
- package/extensions/subagents/agent-args.ts +39 -0
- package/extensions/subagents/agent-description.ts +132 -0
- package/extensions/subagents/agents.ts +146 -31
- package/extensions/subagents/default-model.ts +2 -3
- package/extensions/subagents/delegation-steer.ts +4 -4
- package/extensions/subagents/fork-cache.ts +82 -0
- package/extensions/subagents/guide-agent.ts +189 -0
- package/extensions/subagents/hand-back-review.ts +3 -0
- package/extensions/subagents/index.ts +1594 -852
- package/extensions/subagents/live-runs.ts +26 -6
- package/extensions/subagents/model-select.ts +38 -25
- package/extensions/subagents/outcome.ts +5 -2
- package/extensions/subagents/panel-keys.ts +73 -31
- package/extensions/subagents/panel-render.ts +120 -96
- package/extensions/subagents/panel-widget.ts +60 -89
- package/extensions/subagents/parent-mode.ts +50 -0
- package/extensions/subagents/pending-claim.ts +18 -1
- package/extensions/subagents/runner.ts +135 -80
- package/extensions/subagents/runs.ts +44 -5
- package/extensions/subagents/send-to-main-tool.ts +1 -1
- package/extensions/subagents/session-turns.ts +32 -8
- package/extensions/subagents/shell-panel.ts +36 -178
- package/extensions/subagents/tasks-dialog.ts +170 -0
- package/extensions/subagents/viewport-mirror.ts +95 -0
- package/extensions/subagents/worktree.ts +57 -13
- package/extensions/system-prompt/environment.ts +19 -19
- package/extensions/system-prompt/idle-turn.ts +65 -0
- package/extensions/system-prompt/index.ts +165 -47
- package/extensions/system-prompt/template.ts +34 -51
- package/extensions/system-prompt/tiers/common.ts +23 -64
- package/extensions/system-prompt/tiers/frontier.ts +32 -11
- package/extensions/system-prompt/tiers/low.ts +67 -45
- package/extensions/system-prompt/tiers/mid.ts +96 -38
- package/extensions/system-reminder/index.ts +204 -70
- package/extensions/tasks/descriptions.ts +190 -0
- package/extensions/tasks/index.ts +120 -41
- package/extensions/tasks/store.ts +83 -16
- package/extensions/tool-call-corruption/child.ts +7 -0
- package/extensions/tool-call-corruption/index.ts +237 -0
- package/extensions/tool-search/index.ts +366 -144
- package/extensions/tool-style/index.ts +68 -10
- package/extensions/tool-style/write-description.ts +40 -0
- package/extensions/tool-style/write-render.ts +237 -0
- package/extensions/turn-duration/index.ts +7 -3
- package/extensions/turn-duration/line.ts +47 -4
- package/extensions/web/backends.ts +6 -9
- package/extensions/web/description.ts +50 -0
- package/extensions/web/index.ts +118 -53
- package/extensions/web/native-call.ts +15 -0
- package/extensions/web/native-results.ts +41 -0
- package/extensions/web-fetch/description.ts +42 -0
- package/extensions/web-fetch/extract.ts +53 -6
- package/extensions/web-fetch/index.ts +125 -76
- package/extensions/web-fetch/page-content.ts +19 -0
- package/extensions/web-fetch/response.ts +49 -0
- package/extensions/web-fetch/summarize.ts +9 -10
- package/extensions/workflow/agent-session.ts +108 -18
- package/extensions/workflow/args.ts +24 -0
- package/extensions/workflow/description.ts +67 -0
- package/extensions/workflow/globals.ts +17 -3
- package/extensions/workflow/index.ts +157 -162
- package/extensions/workflow/records.ts +1 -0
- package/extensions/workflow/run-manager.ts +33 -6
- package/extensions/workflow/saved-workflows.ts +3 -2
- package/extensions/workflow/types.ts +22 -1
- package/extensions/workflow/viewer.ts +54 -24
- package/extensions/workflow/widget.ts +20 -0
- package/extensions/worktree/descriptions.ts +91 -0
- package/extensions/worktree/guards.ts +316 -54
- package/extensions/worktree/index.ts +162 -44
- package/extensions/worktree/powershell-guards.ts +167 -0
- package/extensions/worktree/rewrite.ts +14 -16
- package/package.json +21 -7
- package/skills/artifact-design/SKILL.md +85 -0
- package/skills/code-review/SKILL.md +20 -20
- package/skills/code-review/cells/arguments-and-flags.md +19 -0
- package/skills/code-review/cells/high-3x5-recall-verify.md +137 -0
- package/skills/code-review/cells/high-8-inline.md +122 -0
- package/skills/code-review/cells/low-1-pass-max4.md +27 -0
- package/skills/code-review/cells/low-1-pass-min-files-4.md +28 -0
- package/skills/code-review/cells/max-5x5-verify-sweep.md +162 -0
- package/skills/code-review/cells/medium-3x5-verify.md +132 -0
- package/skills/code-review/cells/minimal-prompt.md +32 -0
- package/skills/code-review/cells/xhigh-10-inline-sweep.md +149 -0
- package/skills/code-review/cells/xhigh-5x5-verify-sweep.md +162 -0
- package/skills/fewer-permission-prompts/SKILL.md +1 -1
- package/skills/loop/SKILL.md +11 -0
- package/skills/security-review/SKILL.md +2 -5
- package/skills/simplify/SKILL.md +7 -5
- package/skills/workflow-authoring/SKILL.md +143 -0
- package/themes/onecode-light.json +1 -1
- package/themes/onecode.json +1 -1
- package/types/app.d.ts +58 -0
- package/types/community-packages.d.ts +26 -1
- package/extensions/auto-mode/recoverability.ts +0 -229
- package/extensions/lib/capability-index.ts +0 -466
- package/extensions/lib/model-facts.generated.json +0 -2675
- package/extensions/lib/model-facts.ts +0 -162
- package/extensions/tool-search/announce.ts +0 -42
package/extensions/mcp/config.ts
CHANGED
|
@@ -2,17 +2,36 @@
|
|
|
2
2
|
* MCP server configuration in Claude Code's format (pure).
|
|
3
3
|
*
|
|
4
4
|
* Sources, lowest to highest precedence:
|
|
5
|
+
* plugins' .mcp.json (bare server maps)
|
|
6
|
+
* pi.registerMcpServer() (servers other pi extensions register, pi 0.99+)
|
|
7
|
+
* <agentDir>/mcp.json (pi's own user file, ~/.pi/agent/mcp.json)
|
|
8
|
+
* <cwd>/.pi/mcp.json (pi's own project file)
|
|
5
9
|
* ~/.claude.json (user, global)
|
|
6
10
|
* <cwd>/.mcp.json (project, checked in — walked up to the repo root)
|
|
7
11
|
* <cwd>/.claude/settings.local.json (project, personal)
|
|
8
12
|
*
|
|
13
|
+
* Independent mode (lib/config-mode.ts) reads none of the three Claude Code
|
|
14
|
+
* files: plugins, registered servers and pi's two files only.
|
|
15
|
+
*
|
|
9
16
|
* Every file holds an `mcpServers` object. A stdio server has `command` (plus
|
|
10
17
|
* optional `args`, `env`); a remote one has `url` and optional `type`/`headers`.
|
|
18
|
+
*
|
|
19
|
+
* pi's two files are read because One Code's `/mcp` replaces pi 0.99's
|
|
20
|
+
* built-in MCP, which would otherwise have read them (decisions/mcp.md). Their
|
|
21
|
+
* format is pi's: `enabled: false` turns a server off, a stdio server may set
|
|
22
|
+
* `cwd` (relative to the session directory), and a leading `~/` in `command`,
|
|
23
|
+
* an argument or `cwd` names the home directory. A server with a `!command`
|
|
24
|
+
* value in `env` or `headers` is skipped with a note: running a shell command
|
|
25
|
+
* from a config file to build a credential is not supported. pi's
|
|
26
|
+
* `oauth`/`auth` settings, `exposure`, `timeout` and `description` are
|
|
27
|
+
* ignored. A Claude Code file's server of the same name wins, with a note.
|
|
11
28
|
*/
|
|
12
29
|
|
|
13
30
|
import { existsSync, readFileSync } from "node:fs";
|
|
14
|
-
import { dirname, join } from "node:path";
|
|
15
|
-
import {
|
|
31
|
+
import { dirname, join, resolve } from "node:path";
|
|
32
|
+
import { claudeSourcesOn } from "../lib/config-mode.ts";
|
|
33
|
+
import { claudeJsonPath, expandTilde } from "../lib/paths.ts";
|
|
34
|
+
import { hashServerConfig } from "./trust.ts";
|
|
16
35
|
|
|
17
36
|
export interface StdioServer {
|
|
18
37
|
kind: "stdio";
|
|
@@ -20,7 +39,11 @@ export interface StdioServer {
|
|
|
20
39
|
command: string;
|
|
21
40
|
args: string[];
|
|
22
41
|
env?: Record<string, string>;
|
|
42
|
+
/** Working directory (pi's `mcp.json` only); the session's directory when absent. */
|
|
43
|
+
cwd?: string;
|
|
23
44
|
source: string;
|
|
45
|
+
/** Set for a server read in pi's format: which of pi's sources defined it. */
|
|
46
|
+
piOrigin?: PiOrigin;
|
|
24
47
|
/** Config referenced these environment variables and they are not set. */
|
|
25
48
|
missingEnv?: string[];
|
|
26
49
|
/** Every env var the config references (set or not), for the consent dialog — values are expanded away by parse time. */
|
|
@@ -29,10 +52,13 @@ export interface StdioServer {
|
|
|
29
52
|
|
|
30
53
|
export interface HttpServer {
|
|
31
54
|
kind: "http";
|
|
55
|
+
/** Legacy HTTP+SSE when explicitly configured; otherwise Streamable HTTP. */
|
|
56
|
+
transport?: "sse";
|
|
32
57
|
name: string;
|
|
33
58
|
url: string;
|
|
34
59
|
headers?: Record<string, string>;
|
|
35
60
|
source: string;
|
|
61
|
+
piOrigin?: PiOrigin;
|
|
36
62
|
/** Config referenced these environment variables and they are not set. */
|
|
37
63
|
missingEnv?: string[];
|
|
38
64
|
/** Every env var the config references (set or not), for the consent dialog — values are expanded away by parse time. */
|
|
@@ -41,6 +67,9 @@ export interface HttpServer {
|
|
|
41
67
|
|
|
42
68
|
export type McpServer = StdioServer | HttpServer;
|
|
43
69
|
|
|
70
|
+
/** pi's user `mcp.json`, its project `mcp.json`, or an extension's `pi.registerMcpServer()`. */
|
|
71
|
+
export type PiOrigin = "user" | "project" | "extension";
|
|
72
|
+
|
|
44
73
|
interface RawServer {
|
|
45
74
|
command?: unknown;
|
|
46
75
|
args?: unknown;
|
|
@@ -49,6 +78,26 @@ interface RawServer {
|
|
|
49
78
|
type?: unknown;
|
|
50
79
|
headers?: unknown;
|
|
51
80
|
disabled?: unknown;
|
|
81
|
+
/** pi's `mcp.json`: `false` keeps the entry without connecting. */
|
|
82
|
+
enabled?: unknown;
|
|
83
|
+
/** pi's `mcp.json`: a stdio server's working directory. */
|
|
84
|
+
cwd?: unknown;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** How to read a server from one of pi's own `mcp.json` files. */
|
|
88
|
+
export interface PiFormat {
|
|
89
|
+
home: string;
|
|
90
|
+
/** The session directory a relative `cwd` resolves against. */
|
|
91
|
+
cwd: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Why a pi-format server cannot be loaded, or undefined: a `!command` value
|
|
96
|
+
* in `env` or `headers` (pi runs it in a shell to build the value).
|
|
97
|
+
*/
|
|
98
|
+
export function piFormatProblem(raw: RawServer): string | undefined {
|
|
99
|
+
const values = [...Object.values(asStringRecord(raw.env) ?? {}), ...Object.values(asStringRecord(raw.headers) ?? {})];
|
|
100
|
+
return values.some((value) => value.startsWith("!")) ? "a `!command` value in env or headers is not supported" : undefined;
|
|
52
101
|
}
|
|
53
102
|
|
|
54
103
|
function asStringRecord(value: unknown): Record<string, string> | undefined {
|
|
@@ -100,8 +149,11 @@ export function parseServer(
|
|
|
100
149
|
raw: RawServer,
|
|
101
150
|
source: string,
|
|
102
151
|
env: Record<string, string | undefined>,
|
|
152
|
+
pi?: PiFormat,
|
|
103
153
|
): McpServer | undefined {
|
|
104
154
|
if (raw.disabled === true) return undefined;
|
|
155
|
+
if (pi && raw.enabled === false) return undefined;
|
|
156
|
+
const home = (value: string) => (pi ? expandTilde(value, pi.home) : value);
|
|
105
157
|
|
|
106
158
|
if (typeof raw.url === "string" && raw.url.trim()) {
|
|
107
159
|
const headers = asStringRecord(raw.headers);
|
|
@@ -112,6 +164,7 @@ export function parseServer(
|
|
|
112
164
|
const referenced = referencedEnvVars(raw.url, ...Object.values(headers ?? {}));
|
|
113
165
|
return {
|
|
114
166
|
kind: "http",
|
|
167
|
+
...(raw.type === "sse" ? { transport: "sse" as const } : {}),
|
|
115
168
|
name,
|
|
116
169
|
url: expandEnv(raw.url, env),
|
|
117
170
|
headers: headers
|
|
@@ -125,11 +178,14 @@ export function parseServer(
|
|
|
125
178
|
|
|
126
179
|
if (typeof raw.command === "string" && raw.command.trim()) {
|
|
127
180
|
const args = Array.isArray(raw.args)
|
|
128
|
-
? raw.args.filter((a): a is string => typeof a === "string").map((a) => expandEnv(a, env))
|
|
181
|
+
? raw.args.filter((a): a is string => typeof a === "string").map((a) => home(expandEnv(a, env)))
|
|
129
182
|
: [];
|
|
183
|
+
const rawCwd = pi && typeof raw.cwd === "string" && raw.cwd.trim() ? raw.cwd : undefined;
|
|
184
|
+
const cwd = rawCwd && pi ? resolve(pi.cwd, home(expandEnv(rawCwd, env))) : undefined;
|
|
130
185
|
const rawEnv = asStringRecord(raw.env);
|
|
131
186
|
const missing = [
|
|
132
187
|
...missingEnvVars(raw.command, env),
|
|
188
|
+
...missingEnvVars(rawCwd ?? "", env),
|
|
133
189
|
...(Array.isArray(raw.args) ? raw.args : [])
|
|
134
190
|
.filter((a): a is string => typeof a === "string")
|
|
135
191
|
.flatMap((a) => missingEnvVars(a, env)),
|
|
@@ -137,15 +193,17 @@ export function parseServer(
|
|
|
137
193
|
];
|
|
138
194
|
const referenced = referencedEnvVars(
|
|
139
195
|
raw.command,
|
|
196
|
+
rawCwd ?? "",
|
|
140
197
|
...(Array.isArray(raw.args) ? raw.args.filter((a): a is string => typeof a === "string") : []),
|
|
141
198
|
...Object.values(rawEnv ?? {}),
|
|
142
199
|
);
|
|
143
200
|
return {
|
|
144
201
|
kind: "stdio",
|
|
145
202
|
name,
|
|
146
|
-
command: expandEnv(raw.command, env),
|
|
203
|
+
command: home(expandEnv(raw.command, env)),
|
|
147
204
|
args,
|
|
148
205
|
env: rawEnv ? Object.fromEntries(Object.entries(rawEnv).map(([k, v]) => [k, expandEnv(v, env)])) : undefined,
|
|
206
|
+
...(cwd ? { cwd } : {}),
|
|
149
207
|
source,
|
|
150
208
|
missingEnv: missing.length > 0 ? [...new Set(missing)] : undefined,
|
|
151
209
|
referencedEnv: referenced.length > 0 ? referenced : undefined,
|
|
@@ -171,7 +229,29 @@ export function findProjectConfigs(cwd: string): string[] {
|
|
|
171
229
|
return found.reverse();
|
|
172
230
|
}
|
|
173
231
|
|
|
232
|
+
/**
|
|
233
|
+
* `/mcp` with no servers: where to look when that is unexpected (`/doctor`
|
|
234
|
+
* lists config files that failed validation) and where servers go, by mode.
|
|
235
|
+
* Claude Code names its own CLI and docs here; One Code names its own.
|
|
236
|
+
*/
|
|
237
|
+
export const MCP_GUIDE_URL = "https://github.com/IsuruMaduranga/one-code/blob/master/docs/guide/skills-plugins-and-mcp.md#mcp-servers";
|
|
238
|
+
export function noMcpServersMessage(claudeSources: boolean): string {
|
|
239
|
+
const where = claudeSources ? ".mcp.json in the project, ~/.claude.json, .pi/mcp.json or the agent dir's mcp.json" : ".pi/mcp.json or the agent dir's mcp.json";
|
|
240
|
+
return `No MCP servers configured. Run /doctor if this is unexpected — it lists MCP config files that failed validation. Otherwise, add servers to ${where}; see ${MCP_GUIDE_URL} to learn more.`;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* pi's own `mcp.json` files: the agent dir's and the project's. `configDirName`
|
|
245
|
+
* is pi's `CONFIG_DIR_NAME` (`.pi` unless pi itself is rebranded); callers
|
|
246
|
+
* that import pi pass it.
|
|
247
|
+
*/
|
|
248
|
+
export function piMcpConfigPaths(agentDir: string, cwd: string, configDirName = ".pi"): { user: string; project: string } {
|
|
249
|
+
return { user: join(agentDir, "mcp.json"), project: join(cwd, configDirName, "mcp.json") };
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** Claude Code's MCP files; none in independent mode (lib/config-mode.ts), where pi's two `mcp.json` files remain. */
|
|
174
253
|
export function configPaths(cwd: string, home: string): string[] {
|
|
254
|
+
if (!claudeSourcesOn()) return [];
|
|
175
255
|
return [claudeJsonPath(home), ...findProjectConfigs(cwd), join(cwd, ".claude", "settings.local.json")];
|
|
176
256
|
}
|
|
177
257
|
|
|
@@ -196,6 +276,25 @@ export interface LoadServersOptions {
|
|
|
196
276
|
pluginNames?: ReadonlyMap<string, string>;
|
|
197
277
|
/** Called for a config file that exists but is not valid JSON (review M11: a silent drop read as "no servers configured"). */
|
|
198
278
|
onError?: (path: string, message: string) => void;
|
|
279
|
+
/** pi's own `mcp.json` files (user, then project): read in pi's format, below every Claude Code file. */
|
|
280
|
+
piConfigs?: { user: string; project: string };
|
|
281
|
+
/** Called for a pi-format server that is skipped, or overridden by a Claude Code file's server of the same name. */
|
|
282
|
+
onNote?: (message: string) => void;
|
|
283
|
+
/** Servers other pi extensions registered (`pi.getMcpServers()`): pi's format, below every file; `source` is the extension's path. */
|
|
284
|
+
registered?: readonly RegisteredServer[];
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/** One `pi.getMcpServers()` entry, structurally (pi 0.99's `RegisteredMcpServer`). */
|
|
288
|
+
export interface RegisteredServer {
|
|
289
|
+
name: string;
|
|
290
|
+
config: unknown;
|
|
291
|
+
extensionPath: string;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** The servers other extensions registered (`pi.getMcpServers()`, pi 0.99+); none on an older pi. */
|
|
295
|
+
export function registeredMcpServers(pi: object): RegisteredServer[] {
|
|
296
|
+
const host = pi as { getMcpServers?: () => RegisteredServer[] };
|
|
297
|
+
return typeof host.getMcpServers === "function" ? host.getMcpServers() : [];
|
|
199
298
|
}
|
|
200
299
|
|
|
201
300
|
export function loadServers(
|
|
@@ -206,8 +305,21 @@ export function loadServers(
|
|
|
206
305
|
options: LoadServersOptions = {},
|
|
207
306
|
): McpServer[] {
|
|
208
307
|
const byName = new Map<string, McpServer>();
|
|
209
|
-
|
|
210
|
-
|
|
308
|
+
const piPaths = options.piConfigs ? [options.piConfigs.user, options.piConfigs.project] : [];
|
|
309
|
+
const piFormat: PiFormat = { home, cwd };
|
|
310
|
+
for (const { name, config, extensionPath } of options.registered ?? []) {
|
|
311
|
+
const raw = (config && typeof config === "object" ? config : {}) as RawServer;
|
|
312
|
+
const problem = piFormatProblem(raw);
|
|
313
|
+
if (problem) {
|
|
314
|
+
options.onNote?.(`MCP server "${name}" registered by ${extensionPath} is skipped: ${problem}.`);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
const server = parseServer(name, raw, extensionPath, env, piFormat);
|
|
318
|
+
if (server) byName.set(name, { ...server, piOrigin: "extension" });
|
|
319
|
+
}
|
|
320
|
+
// Plugin configs come first so project and user files can override them,
|
|
321
|
+
// then pi's own files, then Claude Code's.
|
|
322
|
+
for (const path of [...extraPaths, ...piPaths, ...configPaths(cwd, home)]) {
|
|
211
323
|
if (!existsSync(path)) continue;
|
|
212
324
|
let file: Record<string, unknown> | undefined;
|
|
213
325
|
try {
|
|
@@ -219,10 +331,22 @@ export function loadServers(
|
|
|
219
331
|
const servers = serverMapOf(file);
|
|
220
332
|
if (!servers) continue;
|
|
221
333
|
const plugin = options.pluginNames?.get(path);
|
|
334
|
+
const piOrigin: PiOrigin | undefined =
|
|
335
|
+
path === options.piConfigs?.user ? "user" : path === options.piConfigs?.project ? "project" : undefined;
|
|
222
336
|
for (const [rawName, raw] of Object.entries(servers)) {
|
|
223
337
|
const name = plugin ? `plugin:${plugin}:${rawName}` : rawName;
|
|
224
|
-
const
|
|
225
|
-
if (
|
|
338
|
+
const problem = piOrigin ? piFormatProblem(raw ?? {}) : undefined;
|
|
339
|
+
if (problem) {
|
|
340
|
+
options.onNote?.(`MCP server "${name}" in ${path} is skipped: ${problem}.`);
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
const server = parseServer(name, raw ?? {}, path, env, piOrigin ? piFormat : undefined);
|
|
344
|
+
const inherited = byName.get(name);
|
|
345
|
+
// The same server kept in both (common while moving between the two) is not worth a warning.
|
|
346
|
+
if (!piOrigin && server && inherited?.piOrigin && hashServerConfig(server) !== hashServerConfig(inherited)) {
|
|
347
|
+
options.onNote?.(`MCP server "${name}" in ${inherited.source} is overridden by the one in ${path}.`);
|
|
348
|
+
}
|
|
349
|
+
if (server) byName.set(name, piOrigin ? { ...server, piOrigin } : server);
|
|
226
350
|
else byName.delete(name); // an explicit `disabled` entry removes an inherited one
|
|
227
351
|
}
|
|
228
352
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Collect an MCP list response's cursor pages without silently dropping later entries. */
|
|
2
|
+
export async function collectPages<T>(
|
|
3
|
+
fetchPage: (cursor?: string) => Promise<{ items: T[]; nextCursor?: string }>,
|
|
4
|
+
signal?: AbortSignal,
|
|
5
|
+
): Promise<T[]> {
|
|
6
|
+
const items: T[] = [];
|
|
7
|
+
const seen = new Set<string>();
|
|
8
|
+
let cursor: string | undefined;
|
|
9
|
+
while (true) {
|
|
10
|
+
signal?.throwIfAborted();
|
|
11
|
+
const page = await fetchPage(cursor);
|
|
12
|
+
signal?.throwIfAborted();
|
|
13
|
+
for (const item of page.items) items.push(item);
|
|
14
|
+
if (page.nextCursor === undefined) return items;
|
|
15
|
+
if (seen.has(page.nextCursor)) throw new Error("MCP server repeated a pagination cursor; check the server's list implementation.");
|
|
16
|
+
seen.add(page.nextCursor);
|
|
17
|
+
cursor = page.nextCursor;
|
|
18
|
+
}
|
|
19
|
+
}
|