@gajae-code/coding-agent 0.13.2 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +215 -8
- package/README.md +2 -0
- package/bin/gajaessi.js +4 -0
- package/dist/types/async/job-manager.d.ts +55 -2
- package/dist/types/async/support.d.ts +14 -0
- package/dist/types/capability/mcp.d.ts +6 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/accounts-cli.d.ts +19 -0
- package/dist/types/cli/args.d.ts +3 -0
- package/dist/types/cli/config-cli.d.ts +6 -0
- package/dist/types/cli/crash-cli.d.ts +10 -0
- package/dist/types/cli/customize-doctor.d.ts +145 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/mcp-cli.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/root-flags.d.ts +12 -0
- package/dist/types/cli/setup-cli.d.ts +3 -1
- package/dist/types/cli/skills-cli.d.ts +2 -1
- package/dist/types/cli/update-cli.d.ts +19 -1
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/accounts.d.ts +40 -0
- package/dist/types/commands/crash.d.ts +24 -0
- package/dist/types/commands/customize.d.ts +22 -0
- package/dist/types/commands/daemon.d.ts +1 -1
- package/dist/types/commands/launch.d.ts +6 -0
- package/dist/types/commands/setup.d.ts +6 -0
- package/dist/types/commands/skills.d.ts +6 -1
- package/dist/types/commands/update.d.ts +7 -0
- package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
- package/dist/types/config/config-schema-version.d.ts +10 -0
- package/dist/types/config/file-lock.d.ts +18 -0
- package/dist/types/config/model-profile-activation.d.ts +3 -1
- package/dist/types/config/model-registry.d.ts +10 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +73 -9
- package/dist/types/config/settings.d.ts +63 -0
- package/dist/types/config/skill-settings-defaults.d.ts +26 -0
- package/dist/types/config/task-delegation.d.ts +39 -0
- package/dist/types/config/update-channel.d.ts +10 -0
- package/dist/types/coordinator-mcp/server.d.ts +5 -1
- package/dist/types/crash/index-store.d.ts +87 -0
- package/dist/types/crash/nudge.d.ts +50 -0
- package/dist/types/crash/record-loader.d.ts +17 -0
- package/dist/types/crash/report.d.ts +134 -0
- package/dist/types/crash/sanitize.d.ts +25 -0
- package/dist/types/cursor.d.ts +13 -2
- package/dist/types/customization/import.d.ts +37 -0
- package/dist/types/customization/index.d.ts +4 -0
- package/dist/types/customization/inventory.d.ts +25 -0
- package/dist/types/customization/mutations.d.ts +32 -0
- package/dist/types/customization/types.d.ts +115 -0
- package/dist/types/daemon/control-types.d.ts +8 -1
- package/dist/types/daemon/operator-contract.d.ts +4 -4
- package/dist/types/discovery/claude.d.ts +39 -1
- package/dist/types/discovery/codex.d.ts +39 -1
- package/dist/types/discovery/index.d.ts +2 -0
- package/dist/types/discovery/mcp-compat.d.ts +30 -0
- package/dist/types/edit/renderer.d.ts +23 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +21 -4
- package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
- package/dist/types/extensibility/hooks/loader.d.ts +19 -5
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
- package/dist/types/extensibility/skill-management.d.ts +107 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
- package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
- package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
- package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
- package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
- package/dist/types/hooks/events.d.ts +60 -0
- package/dist/types/hooks/normalize.d.ts +83 -0
- package/dist/types/hooks/skill-state.d.ts +9 -2
- package/dist/types/main.d.ts +2 -1
- package/dist/types/modes/acp/abort-scope.d.ts +13 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -4
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
- package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
- package/dist/types/modes/components/customization/index.d.ts +1 -0
- package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
- package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
- package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
- package/dist/types/modes/components/oauth-selector.d.ts +10 -4
- package/dist/types/modes/components/pet-capability.d.ts +7 -21
- package/dist/types/modes/components/settings-selector.d.ts +5 -0
- package/dist/types/modes/components/status-line/gh.d.ts +6 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
- package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/theme/defaults/index.d.ts +118 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
- package/dist/types/runtime-mcp/config.d.ts +9 -0
- package/dist/types/runtime-mcp/manager.d.ts +26 -1
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
- package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
- package/dist/types/runtime-mcp/protocol.d.ts +278 -0
- package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
- package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
- package/dist/types/runtime-mcp/types.d.ts +102 -10
- package/dist/types/sdk/acp/adapter.d.ts +26 -5
- package/dist/types/sdk/broker/broker.d.ts +3 -55
- package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
- package/dist/types/sdk/broker/session-index.d.ts +14 -5
- package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
- package/dist/types/sdk/bus/config.d.ts +11 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
- package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
- package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
- package/dist/types/sdk/bus/index.d.ts +85 -99
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
- package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
- package/dist/types/sdk/bus/notification-service.d.ts +52 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
- package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
- package/dist/types/sdk/bus/session-control.d.ts +25 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
- package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
- package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
- package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
- package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
- package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
- package/dist/types/sdk/cli/rows.d.ts +2 -11
- package/dist/types/sdk/cli/session-cli.d.ts +15 -25
- package/dist/types/sdk/client/client.d.ts +97 -1
- package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +18 -5
- package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
- package/dist/types/sdk/host/host.d.ts +15 -1
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/host/session-runtime.d.ts +127 -7
- package/dist/types/sdk/host/types.d.ts +1 -1
- package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
- package/dist/types/sdk/lifecycle/client.d.ts +59 -0
- package/dist/types/sdk/lifecycle/index.d.ts +3 -0
- package/dist/types/sdk/lifecycle/service.d.ts +232 -0
- package/dist/types/sdk/mcp/server.d.ts +9 -6
- package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
- package/dist/types/sdk/prompt-status.d.ts +10 -3
- package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
- package/dist/types/sdk/receipt-state.d.ts +17 -0
- package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
- package/dist/types/sdk/router/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +152 -0
- package/dist/types/sdk/session-list.d.ts +22 -0
- package/dist/types/sdk/session-reconnect.d.ts +43 -1
- package/dist/types/sdk/session.d.ts +34 -1
- package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
- package/dist/types/session/account-inventory.d.ts +86 -0
- package/dist/types/session/agent-session.d.ts +145 -6
- package/dist/types/session/agent-storage.d.ts +10 -0
- package/dist/types/session/coordinator-tool-label.d.ts +28 -0
- package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
- package/dist/types/session/messages.d.ts +1 -1
- package/dist/types/session/secure-token-file.d.ts +3 -0
- package/dist/types/session/session-manager.d.ts +47 -1
- package/dist/types/session/startup-auth-config.d.ts +44 -0
- package/dist/types/session/terminal-abort.d.ts +378 -0
- package/dist/types/session/yield-queue.d.ts +7 -0
- package/dist/types/session-import/claude.d.ts +26 -0
- package/dist/types/session-import/codex.d.ts +88 -0
- package/dist/types/session-import/command.d.ts +35 -0
- package/dist/types/session-import/detect.d.ts +22 -0
- package/dist/types/session-import/index.d.ts +7 -0
- package/dist/types/session-import/provider-codex.d.ts +22 -0
- package/dist/types/session-import/provider-service.d.ts +38 -0
- package/dist/types/session-import/redact.d.ts +23 -0
- package/dist/types/session-import/service.d.ts +47 -0
- package/dist/types/session-import/types.d.ts +120 -0
- package/dist/types/setup/paseo/check.d.ts +16 -0
- package/dist/types/setup/paseo/install-saga.d.ts +115 -0
- package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
- package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
- package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
- package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
- package/dist/types/setup/paseo/provider-config.d.ts +35 -0
- package/dist/types/setup/paseo/remove.d.ts +14 -0
- package/dist/types/setup/paseo/result-types.d.ts +59 -0
- package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
- package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
- package/dist/types/skill-state/active-state.d.ts +5 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
- package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
- package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
- package/dist/types/slash-commands/types.d.ts +7 -1
- package/dist/types/task/executor.d.ts +10 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/tools/ask-answer-registry.d.ts +6 -3
- package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
- package/dist/types/tools/bash.d.ts +2 -6
- package/dist/types/tools/browser/attach.d.ts +11 -0
- package/dist/types/tools/browser/launch.d.ts +20 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/image-gen.d.ts +10 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/monitor.d.ts +1 -1
- package/dist/types/tools/skill-discovery.d.ts +8 -1
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
- package/dist/types/utils/herdr-pane.d.ts +76 -0
- package/package.json +19 -9
- package/scripts/build-binary.ts +2 -1
- package/scripts/build-sdk-package-smoke.ts +2 -13
- package/scripts/capture-sticky-viewport-showcase.ts +0 -1
- package/scripts/compile-args.ts +2 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
- package/scripts/generate-sdk-operation-inventory.ts +28 -0
- package/scripts/generate-telegram-baseline-manifest.ts +1 -0
- package/scripts/generate-tool-catalog.ts +6 -4
- package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
- package/src/async/job-manager.ts +352 -17
- package/src/async/support.ts +25 -0
- package/src/autoresearch/dashboard.ts +28 -13
- package/src/capability/index.ts +3 -1
- package/src/capability/mcp.ts +6 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/accounts-cli.ts +395 -0
- package/src/cli/args.ts +23 -0
- package/src/cli/auth-broker-cli.ts +136 -66
- package/src/cli/auth-gateway-cli.ts +94 -70
- package/src/cli/config-cli.ts +27 -2
- package/src/cli/crash-cli.ts +78 -0
- package/src/cli/customize-doctor.ts +1605 -0
- package/src/cli/daemon-cli.ts +12 -3
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/mcp-cli.ts +128 -60
- package/src/cli/notify-cli.ts +8 -14
- package/src/cli/root-flags.ts +8 -0
- package/src/cli/setup-cli.ts +145 -0
- package/src/cli/skills-cli.ts +38 -2
- package/src/cli/update-cli.ts +167 -12
- package/src/cli.ts +4 -0
- package/src/commands/accounts.ts +71 -0
- package/src/commands/crash.ts +35 -0
- package/src/commands/customize.ts +84 -0
- package/src/commands/daemon.ts +2 -2
- package/src/commands/deep-interview.ts +2 -0
- package/src/commands/launch.ts +1 -0
- package/src/commands/mcp.ts +12 -7
- package/src/commands/ralplan.ts +2 -0
- package/src/commands/sdk.ts +65 -32
- package/src/commands/setup.ts +5 -0
- package/src/commands/skills.ts +14 -4
- package/src/commands/ultragoal.ts +10 -1
- package/src/commands/update.ts +26 -15
- package/src/config/atomic-yaml-patch-worker.ts +57 -0
- package/src/config/atomic-yaml-patch.ts +769 -29
- package/src/config/config-schema-version.ts +10 -0
- package/src/config/file-lock.ts +70 -1
- package/src/config/mcp-schema.json +52 -14
- package/src/config/model-profile-activation.ts +23 -2
- package/src/config/model-profiles.ts +88 -21
- package/src/config/model-registry.ts +147 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +77 -7
- package/src/config/settings.ts +4038 -199
- package/src/config/skill-settings-defaults.ts +41 -3
- package/src/config/task-delegation.ts +87 -0
- package/src/config/update-channel.ts +23 -0
- package/src/coordinator-mcp/server.ts +377 -308
- package/src/crash/index-store.ts +723 -0
- package/src/crash/nudge.ts +89 -0
- package/src/crash/record-loader.ts +149 -0
- package/src/crash/report.ts +551 -0
- package/src/crash/sanitize.ts +129 -0
- package/src/cursor.ts +36 -10
- package/src/customization/import.ts +946 -0
- package/src/customization/index.ts +4 -0
- package/src/customization/inventory.ts +335 -0
- package/src/customization/mutations.ts +141 -0
- package/src/customization/types.ts +223 -0
- package/src/daemon/control-types.ts +8 -1
- package/src/daemon/operator-contract.ts +6 -6
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
- package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
- package/src/discovery/claude-hooks.ts +38 -0
- package/src/discovery/claude.ts +142 -209
- package/src/discovery/codex-hooks.ts +38 -0
- package/src/discovery/codex.ts +132 -198
- package/src/discovery/helpers.ts +8 -1
- package/src/discovery/index.ts +2 -0
- package/src/discovery/mcp-compat.ts +234 -0
- package/src/discovery/mcp-json.ts +6 -0
- package/src/edit/renderer.ts +40 -0
- package/src/edit/streaming.ts +4 -2
- package/src/exec/bash-executor.ts +24 -20
- package/src/export/html/index.ts +51 -2
- package/src/extensibility/extensions/loader.ts +9 -1
- package/src/extensibility/extensions/runner.ts +17 -4
- package/src/extensibility/extensions/types.ts +31 -6
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
- package/src/extensibility/gjc-plugins/installer.ts +9 -5
- package/src/extensibility/gjc-plugins/observability.ts +8 -2
- package/src/extensibility/gjc-plugins/registry.ts +13 -2
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
- package/src/extensibility/gjc-plugins/schema.ts +222 -39
- package/src/extensibility/hooks/loader.ts +154 -10
- package/src/extensibility/runtime-skill-discovery.ts +257 -60
- package/src/extensibility/skill-management.ts +368 -0
- package/src/extensibility/skills.ts +52 -16
- package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
- package/src/gjc-runtime/launch-worktree.ts +56 -2
- package/src/gjc-runtime/linux-proc.ts +7 -1
- package/src/gjc-runtime/ralplan-runtime.ts +100 -164
- package/src/gjc-runtime/session-state-lock.ts +992 -0
- package/src/gjc-runtime/session-state-sidecar.ts +644 -142
- package/src/gjc-runtime/state-writer.ts +39 -14
- package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
- package/src/gjc-runtime/ultragoal-guard.ts +11 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
- package/src/gjc-runtime/workflow-settings.ts +596 -0
- package/src/goals/tools/goal-tool.ts +6 -1
- package/src/hooks/events.ts +291 -0
- package/src/hooks/native-skill-hook.ts +4 -0
- package/src/hooks/normalize.ts +369 -0
- package/src/hooks/skill-state.ts +165 -46
- package/src/internal-urls/docs-index.generated.ts +41 -32
- package/src/main.ts +36 -5
- package/src/migrate/mcp-mapper.ts +25 -2
- package/src/modes/acp/abort-scope.ts +29 -0
- package/src/modes/acp/acp-agent.ts +423 -98
- package/src/modes/components/assistant-message.ts +6 -1
- package/src/modes/components/chrome.ts +4 -3
- package/src/modes/components/customization/customization-dashboard.ts +443 -0
- package/src/modes/components/customization/import-wizard.ts +372 -0
- package/src/modes/components/customization/index.ts +1 -0
- package/src/modes/components/dynamic-theme-text.ts +22 -0
- package/src/modes/components/gajae-pet-widget.ts +607 -193
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/model-selector.ts +1 -6
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +35 -31
- package/src/modes/components/settings-selector.ts +29 -5
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +19 -4
- package/src/modes/components/tool-status-header.ts +13 -3
- package/src/modes/controllers/command-controller.ts +20 -8
- package/src/modes/controllers/extension-ui-controller.ts +56 -257
- package/src/modes/controllers/input-controller.ts +10 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
- package/src/modes/controllers/selector-controller.ts +238 -77
- package/src/modes/controllers/stt-controller.ts +3 -3
- package/src/modes/interactive-mode.ts +88 -16
- package/src/modes/print-mode.ts +35 -6
- package/src/modes/runtime-init.ts +21 -68
- package/src/modes/theme/defaults/index.ts +2 -0
- package/src/modes/theme/defaults/ouroboros.json +118 -0
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +25 -0
- package/src/modes/utils/terminal-bell.ts +15 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/critic.md +1 -1
- package/src/prompts/system/rlm-research.md +1 -1
- package/src/prompts/system/system-prompt.md +0 -2
- package/src/prompts/tools/bash.md +7 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/cron.md +6 -6
- package/src/prompts/tools/read.md +0 -2
- package/src/prompts/tools/skill-discovery.md +4 -2
- package/src/runtime-mcp/client.ts +427 -23
- package/src/runtime-mcp/config.ts +37 -5
- package/src/runtime-mcp/manager-pool.test.ts +56 -0
- package/src/runtime-mcp/manager.ts +52 -2
- package/src/runtime-mcp/oauth-discovery.ts +13 -0
- package/src/runtime-mcp/oauth-flow.ts +46 -1
- package/src/runtime-mcp/pool-key.ts +5 -1
- package/src/runtime-mcp/pool.test.ts +9 -0
- package/src/runtime-mcp/protocol.test.ts +353 -0
- package/src/runtime-mcp/protocol.ts +624 -0
- package/src/runtime-mcp/scope-config.ts +78 -0
- package/src/runtime-mcp/tool-bridge.ts +44 -10
- package/src/runtime-mcp/transports/http.ts +84 -13
- package/src/runtime-mcp/types.ts +123 -12
- package/src/sdk/acp/adapter.ts +328 -97
- package/src/sdk/broker/broker.ts +160 -741
- package/src/sdk/broker/ensure.ts +9 -1
- package/src/sdk/broker/lifecycle.ts +510 -116
- package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
- package/src/sdk/broker/process-incarnation.ts +19 -0
- package/src/sdk/broker/session-index.ts +516 -117
- package/src/sdk/broker/startup-failure.ts +28 -5
- package/src/sdk/broker/transport.ts +1 -13
- package/src/sdk/bus/chat-daemon-cli.ts +4 -2
- package/src/sdk/bus/chat-daemon-control.ts +67 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
- package/src/sdk/bus/config.ts +13 -0
- package/src/sdk/bus/conversation-store.ts +59 -171
- package/src/sdk/bus/daemon-paths.ts +20 -0
- package/src/sdk/bus/discord-conversation.ts +2 -0
- package/src/sdk/bus/discord-daemon.ts +524 -126
- package/src/sdk/bus/discord-live-provider.ts +206 -79
- package/src/sdk/bus/existing-thread-readiness.ts +4 -97
- package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
- package/src/sdk/bus/index.ts +2480 -456
- package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
- package/src/sdk/bus/lifecycle-commands.ts +2 -2
- package/src/sdk/bus/managed-daemon.ts +2 -145
- package/src/sdk/bus/notification-service.ts +196 -0
- package/src/sdk/bus/operator-runtime.ts +1 -1
- package/src/sdk/bus/prompt-reconciliation.ts +24 -15
- package/src/sdk/bus/reconciliation-store.ts +553 -24
- package/src/sdk/bus/session-control.ts +49 -3
- package/src/sdk/bus/slack-conversation.ts +4 -0
- package/src/sdk/bus/slack-daemon.ts +733 -134
- package/src/sdk/bus/slack-live-provider.ts +65 -15
- package/src/sdk/bus/slack-provider.ts +4 -0
- package/src/sdk/bus/slack-thread-binding.ts +9 -104
- package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
- package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
- package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
- package/src/sdk/bus/telegram-daemon-control.ts +3 -13
- package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
- package/src/sdk/bus/telegram-daemon.ts +2552 -2280
- package/src/sdk/bus/telegram-reference.ts +1 -226
- package/src/sdk/bus/telegram-setup.ts +2 -2
- package/src/sdk/bus/threaded-render.ts +1 -0
- package/src/sdk/bus/topic-registry.ts +279 -146
- package/src/sdk/cli/rows.ts +2 -35
- package/src/sdk/cli/session-cli.ts +776 -700
- package/src/sdk/client/client.ts +892 -1
- package/src/sdk/host/control/dispatch.ts +93 -58
- package/src/sdk/host/control/index.ts +1 -1
- package/src/sdk/host/control/operations.ts +18 -10
- package/src/sdk/host/control/runtime-gate.ts +40 -0
- package/src/sdk/host/host.ts +63 -12
- package/src/sdk/host/query/handlers.ts +66 -7
- package/src/sdk/host/reverse-leases.ts +2 -2
- package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
- package/src/sdk/host/session-runtime.test.ts +2787 -34
- package/src/sdk/host/session-runtime.ts +1489 -101
- package/src/sdk/host/surface-policy.ts +12 -8
- package/src/sdk/host/types.ts +1 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
- package/src/sdk/host/websocket-transport.ts +85 -50
- package/src/sdk/index.ts +2 -1
- package/src/sdk/lifecycle/broker-client.ts +53 -0
- package/src/sdk/lifecycle/client.ts +234 -0
- package/src/sdk/lifecycle/index.ts +3 -0
- package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
- package/src/sdk/lifecycle/service.ts +720 -0
- package/src/sdk/mcp/server.ts +226 -188
- package/src/sdk/prompt-deadline-lease.ts +55 -0
- package/src/sdk/prompt-deadline-manager.ts +148 -0
- package/src/sdk/prompt-status.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +272 -129
- package/src/sdk/protocol/operation-registry.ts +71 -8
- package/src/sdk/receipt-state.ts +43 -0
- package/src/sdk/reconciliation-extensions.ts +14 -0
- package/src/sdk/router/index.ts +1 -0
- package/src/sdk/router/session-router.ts +1658 -0
- package/src/sdk/session-list.ts +93 -0
- package/src/sdk/session-reconnect.ts +45 -1
- package/src/sdk/session.ts +716 -120
- package/src/sdk/transport/serve-cli.ts +18 -34
- package/src/session/account-inventory.ts +603 -0
- package/src/session/agent-session.ts +2873 -559
- package/src/session/agent-storage.ts +35 -0
- package/src/session/blob-store.ts +32 -1
- package/src/session/coordinator-tool-label.ts +40 -0
- package/src/session/internal/managed-session-scope.ts +4 -0
- package/src/session/internal/managed-session-storage.ts +199 -31
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +757 -57
- package/src/session/session-storage.ts +25 -16
- package/src/session/startup-auth-config.ts +297 -0
- package/src/session/terminal-abort.ts +1253 -0
- package/src/session/yield-queue.ts +57 -15
- package/src/session-import/claude.ts +334 -0
- package/src/session-import/codex.ts +1033 -0
- package/src/session-import/command.ts +77 -0
- package/src/session-import/detect.ts +133 -0
- package/src/session-import/index.ts +7 -0
- package/src/session-import/provider-codex.ts +327 -0
- package/src/session-import/provider-service.ts +457 -0
- package/src/session-import/redact.ts +128 -0
- package/src/session-import/service.ts +1264 -0
- package/src/session-import/types.ts +148 -0
- package/src/setup/paseo/check.ts +213 -0
- package/src/setup/paseo/install-saga.ts +293 -0
- package/src/setup/paseo/json-publisher.ts +263 -0
- package/src/setup/paseo/orchestration-preferences.ts +86 -0
- package/src/setup/paseo/paseo-ownership.ts +224 -0
- package/src/setup/paseo/paseo-setup.ts +253 -0
- package/src/setup/paseo/provider-config.ts +139 -0
- package/src/setup/paseo/remove.ts +183 -0
- package/src/setup/paseo/result-types.ts +79 -0
- package/src/setup/paseo/setup-deps.ts +175 -0
- package/src/setup/paseo/skills-bridge.ts +260 -0
- package/src/skill-state/active-state.ts +21 -11
- package/src/slash-commands/acp-builtins.ts +9 -1
- package/src/slash-commands/builtin-registry.ts +117 -19
- package/src/slash-commands/helpers/credential-switch.ts +143 -0
- package/src/slash-commands/helpers/mcp.ts +9 -3
- package/src/slash-commands/helpers/usage-report.ts +61 -56
- package/src/slash-commands/types.ts +7 -2
- package/src/task/executor.ts +30 -11
- package/src/task/index.ts +66 -7
- package/src/task/render.ts +23 -9
- package/src/tools/ask-answer-registry.ts +23 -7
- package/src/tools/ask.ts +8 -4
- package/src/tools/bash-sleep-advisory.ts +115 -0
- package/src/tools/bash.ts +98 -18
- package/src/tools/browser/attach.ts +71 -3
- package/src/tools/browser/launch.ts +86 -13
- package/src/tools/browser/profile-discovery.ts +57 -7
- package/src/tools/browser/render.ts +8 -1
- package/src/tools/browser.ts +130 -21
- package/src/tools/computer.enforcement.test.ts +1 -1
- package/src/tools/computer.ts +3 -2
- package/src/tools/cron.ts +12 -1
- package/src/tools/image-gen.ts +349 -142
- package/src/tools/index.ts +8 -0
- package/src/tools/job.ts +33 -6
- package/src/tools/monitor.ts +41 -2
- package/src/tools/skill-discovery.ts +21 -29
- package/src/tools/subagent.ts +142 -24
- package/src/tools/todo-contract.ts +55 -3
- package/src/tools/todo-write.ts +4 -3
- package/src/tools/tool-catalog.generated.ts +6 -6
- package/src/tools/ultragoal-ask-guard.ts +10 -3
- package/src/utils/herdr-pane.ts +345 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/scrapers/index.ts +6 -4
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
- package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
- package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
- package/dist/types/runtime/lazy-service.test.d.ts +0 -1
- package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
- package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
- package/dist/types/runtime-mcp/config.test.d.ts +0 -1
- package/dist/types/runtime-mcp/http.test.d.ts +0 -1
- package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
- package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
- package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
- package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
- package/dist/types/sdk/elevation/audit.d.ts +0 -93
- package/dist/types/sdk/elevation/capability.d.ts +0 -3
- package/dist/types/sdk/elevation/digest.d.ts +0 -72
- package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
- package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
- package/dist/types/sdk/elevation/owner.d.ts +0 -48
- package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
- package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
- package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
- package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
- package/dist/types/skills/skills.test.d.ts +0 -1
- package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
- package/dist/types/tools/descriptors.test.d.ts +0 -1
- package/scripts/g005-daemon-smoke.ts +0 -180
- package/scripts/g011-daemon-path-smoke.ts +0 -153
- package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
- package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
- package/src/sdk/bus/telegram-cli.ts +0 -212
- package/src/sdk/elevation/allowlist.ts +0 -54
- package/src/sdk/elevation/audit.ts +0 -208
- package/src/sdk/elevation/capability.ts +0 -41
- package/src/sdk/elevation/digest.ts +0 -129
- package/src/sdk/elevation/dispatch-receipt.ts +0 -184
- package/src/sdk/elevation/grant-ledger.ts +0 -1142
- package/src/sdk/elevation/owner.ts +0 -109
- package/src/session/auth-broker-config.ts +0 -109
- /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
- /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
- /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
|
@@ -4,6 +4,9 @@ import * as path from "node:path";
|
|
|
4
4
|
import { findRepoRoot } from "../capability/fs";
|
|
5
5
|
import type { Skill as CapabilitySkill } from "../capability/skill";
|
|
6
6
|
import type { SkillsSettings } from "../config/settings-schema";
|
|
7
|
+
import { resolveSkillScopeTrust } from "../config/skill-settings-defaults";
|
|
8
|
+
import { scanClaudeProjectSkills, scanClaudeUserSkills } from "../discovery/claude";
|
|
9
|
+
import { scanCodexProjectSkills, scanCodexUserSkills } from "../discovery/codex";
|
|
7
10
|
import { compareSkillOrder, SOURCE_PATHS, scanSkillsFromDir } from "../discovery/helpers";
|
|
8
11
|
import { CANONICAL_GJC_WORKFLOW_SKILLS } from "../skill-state/canonical-skills";
|
|
9
12
|
import type { Skill } from "./skills";
|
|
@@ -18,6 +21,21 @@ export interface RuntimeSkillDiscoveryCandidate {
|
|
|
18
21
|
useWhen?: string[];
|
|
19
22
|
}
|
|
20
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Human-readable diagnostics collected while scanning, so an empty or partial
|
|
26
|
+
* result is explainable: protected-name collisions with bundled workflow
|
|
27
|
+
* skills, skills filtered by include/ignore/disable policy, invalid frontmatter,
|
|
28
|
+
* and scan warnings. Bounded to avoid flooding tool output.
|
|
29
|
+
*/
|
|
30
|
+
export interface RuntimeSkillDiscoveryDiagnostics {
|
|
31
|
+
messages: string[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface RuntimeSkillDiscoveryResult {
|
|
35
|
+
candidates: RuntimeSkillDiscoveryCandidate[];
|
|
36
|
+
diagnostics: RuntimeSkillDiscoveryDiagnostics;
|
|
37
|
+
}
|
|
38
|
+
|
|
21
39
|
export interface DiscoverRuntimeSkillsOptions {
|
|
22
40
|
cwd: string;
|
|
23
41
|
home?: string;
|
|
@@ -33,6 +51,7 @@ function getRuntimeHome(): string {
|
|
|
33
51
|
|
|
34
52
|
const DEFAULT_LIMIT = 20;
|
|
35
53
|
const MAX_LIMIT = 50;
|
|
54
|
+
const MAX_DIAGNOSTICS = 10;
|
|
36
55
|
const BUILT_IN_SKILL_NAMES = new Set<string>(CANONICAL_GJC_WORKFLOW_SKILLS);
|
|
37
56
|
|
|
38
57
|
function normalizeLimit(limit: number | undefined): number {
|
|
@@ -40,22 +59,50 @@ function normalizeLimit(limit: number | undefined): number {
|
|
|
40
59
|
return Math.max(1, Math.min(MAX_LIMIT, Math.trunc(limit)));
|
|
41
60
|
}
|
|
42
61
|
|
|
43
|
-
|
|
62
|
+
interface ProjectScanDir {
|
|
63
|
+
dir: string;
|
|
64
|
+
/** Precedence label used in diagnostics, e.g. "project .gjc/skills". */
|
|
65
|
+
label: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Project skill scan directories in deterministic precedence order: `.gjc/skills`
|
|
70
|
+
* in every ancestor from `cwd` up to the repo root (closest first). Claude/Codex
|
|
71
|
+
* convention layouts are explicit import sources into `.gjc` (see
|
|
72
|
+
* extensibility/skill-management.ts) and are intentionally not scanned here.
|
|
73
|
+
*
|
|
74
|
+
* The walk never enters the home directory, so `~/.gjc/skills` stays a
|
|
75
|
+
* user-scope path and cannot be reclassified as project content.
|
|
76
|
+
*/
|
|
77
|
+
async function getProjectSkillDirs(
|
|
78
|
+
cwd: string,
|
|
79
|
+
home: string,
|
|
80
|
+
): Promise<{ scans: ProjectScanDir[]; repoRoot: string | null }> {
|
|
81
|
+
const scans: ProjectScanDir[] = [];
|
|
82
|
+
const repoRoot = await findRepoRoot(cwd);
|
|
83
|
+
const walkDirs = ancestorDirs(cwd, path.resolve(repoRoot ?? cwd), home);
|
|
84
|
+
for (const dir of walkDirs) {
|
|
85
|
+
scans.push({ dir: path.join(dir, ".gjc", "skills"), label: "project .gjc/skills" });
|
|
86
|
+
}
|
|
87
|
+
return { scans, repoRoot };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Ancestor directories from `cwd` (inclusive) up to `stop` (inclusive), excluding `home`. */
|
|
91
|
+
function ancestorDirs(cwd: string, stop: string, home: string): string[] {
|
|
44
92
|
const dirs: string[] = [];
|
|
45
93
|
let current = path.resolve(cwd);
|
|
94
|
+
const resolvedStop = path.resolve(stop);
|
|
46
95
|
const resolvedHome = path.resolve(home);
|
|
47
|
-
const repoRoot = await findRepoRoot(current);
|
|
48
|
-
const stop = path.resolve(repoRoot ?? current);
|
|
49
96
|
while (true) {
|
|
50
97
|
if (current !== resolvedHome) {
|
|
51
|
-
dirs.push(
|
|
98
|
+
dirs.push(current);
|
|
52
99
|
}
|
|
53
|
-
if (current ===
|
|
100
|
+
if (current === resolvedStop) break;
|
|
54
101
|
const parent = path.dirname(current);
|
|
55
102
|
if (parent === current) break;
|
|
56
103
|
current = parent;
|
|
57
104
|
}
|
|
58
|
-
return
|
|
105
|
+
return dirs;
|
|
59
106
|
}
|
|
60
107
|
|
|
61
108
|
function getUserSkillDirs(home: string): string[] {
|
|
@@ -98,11 +145,10 @@ function toRuntimeSkill(skill: CapabilitySkill, source: RuntimeSkillDiscoverySou
|
|
|
98
145
|
_source: { ...skill._source, providerName: "Runtime skill discovery" },
|
|
99
146
|
};
|
|
100
147
|
}
|
|
148
|
+
|
|
101
149
|
function sourceEnabled(source: RuntimeSkillDiscoverySource, policy: SkillsSettings | undefined): boolean {
|
|
102
150
|
if (policy?.enabled !== true) return false;
|
|
103
|
-
|
|
104
|
-
if (source === "user") return policy.enablePiUser === true;
|
|
105
|
-
return false;
|
|
151
|
+
return resolveSkillScopeTrust(policy, source);
|
|
106
152
|
}
|
|
107
153
|
|
|
108
154
|
function matchesIncludePatterns(name: string, includeSkills: string[] | undefined): boolean {
|
|
@@ -119,18 +165,6 @@ function isDisabledSkill(name: string, disabledExtensions: string[] | undefined)
|
|
|
119
165
|
return (disabledExtensions ?? []).some(id => id === `skill:${name}`);
|
|
120
166
|
}
|
|
121
167
|
|
|
122
|
-
function isAllowedByPolicy(
|
|
123
|
-
skill: CapabilitySkill,
|
|
124
|
-
source: RuntimeSkillDiscoverySource,
|
|
125
|
-
policy: SkillsSettings | undefined,
|
|
126
|
-
): boolean {
|
|
127
|
-
if (BUILT_IN_SKILL_NAMES.has(skill.name)) return false;
|
|
128
|
-
if (!sourceEnabled(source, policy)) return false;
|
|
129
|
-
if (isDisabledSkill(skill.name, policy?.disabledExtensions)) return false;
|
|
130
|
-
if (matchesIgnorePatterns(skill.name, policy?.ignoredSkills)) return false;
|
|
131
|
-
if (!matchesIncludePatterns(skill.name, policy?.includeSkills)) return false;
|
|
132
|
-
return true;
|
|
133
|
-
}
|
|
134
168
|
function matchesQuery(candidate: RuntimeSkillDiscoveryCandidate, query: string): boolean {
|
|
135
169
|
const terms = query.trim().toLowerCase().split(/\s+/).filter(Boolean);
|
|
136
170
|
if (terms.length === 0) return true;
|
|
@@ -149,60 +183,223 @@ async function realPathOrSelf(filePath: string): Promise<string> {
|
|
|
149
183
|
}
|
|
150
184
|
}
|
|
151
185
|
|
|
186
|
+
interface ScanJobResult {
|
|
187
|
+
items: Array<{ skill: CapabilitySkill; source: RuntimeSkillDiscoverySource }>;
|
|
188
|
+
warnings: string[];
|
|
189
|
+
label: string;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function isAllowedByPolicy(skill: CapabilitySkill, policy: SkillsSettings | undefined, diagnostics: string[]): boolean {
|
|
193
|
+
if (BUILT_IN_SKILL_NAMES.has(skill.name)) {
|
|
194
|
+
pushDiagnostic(
|
|
195
|
+
diagnostics,
|
|
196
|
+
`skill "${skill.name}" is a bundled GJC workflow skill and always resolves to the bundled definition; the filesystem copy at ${skill.path} is shadowed`,
|
|
197
|
+
);
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
if (isDisabledSkill(skill.name, policy?.disabledExtensions)) {
|
|
201
|
+
pushDiagnostic(diagnostics, `skill "${skill.name}" is disabled via disabledExtensions; ignoring ${skill.path}`);
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
if (matchesIgnorePatterns(skill.name, policy?.ignoredSkills)) {
|
|
205
|
+
pushDiagnostic(diagnostics, `skill "${skill.name}" is filtered by skills.ignoredSkills; ignoring ${skill.path}`);
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
if (!matchesIncludePatterns(skill.name, policy?.includeSkills)) {
|
|
209
|
+
pushDiagnostic(diagnostics, `skill "${skill.name}" does not match skills.includeSkills; ignoring ${skill.path}`);
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function pushDiagnostic(diagnostics: string[], message: string): void {
|
|
216
|
+
if (diagnostics.length < MAX_DIAGNOSTICS) diagnostics.push(message);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
async function scanProjectOrUserDir(
|
|
220
|
+
ctx: { cwd: string; home: string; repoRoot: string | null },
|
|
221
|
+
dir: string,
|
|
222
|
+
level: "project" | "user",
|
|
223
|
+
label: string,
|
|
224
|
+
source: RuntimeSkillDiscoverySource,
|
|
225
|
+
): Promise<ScanJobResult> {
|
|
226
|
+
const result = await scanSkillsFromDir(ctx, {
|
|
227
|
+
dir,
|
|
228
|
+
providerId: "runtime",
|
|
229
|
+
level,
|
|
230
|
+
requireDescription: true,
|
|
231
|
+
});
|
|
232
|
+
return {
|
|
233
|
+
items: result.items.map(skill => ({ skill, source })),
|
|
234
|
+
warnings: result.warnings ?? [],
|
|
235
|
+
label,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
interface ConventionImportScan {
|
|
240
|
+
host: "Claude Code" | "Codex";
|
|
241
|
+
dir: string;
|
|
242
|
+
skills: CapabilitySkill[];
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Enumerate Claude Code / Codex skill layouts as explicit import candidates.
|
|
247
|
+
* Convention skills are never advertised as invokable candidates (they become
|
|
248
|
+
* ordinary native skills only after an explicit import into `.gjc/skills`), but
|
|
249
|
+
* they are reported as diagnostics so a skill placed in a documented convention
|
|
250
|
+
* location is visibly discoverable — with the exact enablement action — instead
|
|
251
|
+
* of invisible. Foreign user-home layouts are only enumerated when the user
|
|
252
|
+
* scope is trusted and are still never loaded.
|
|
253
|
+
*/
|
|
254
|
+
async function collectConventionImportCandidates(
|
|
255
|
+
ctx: { cwd: string; home: string; repoRoot: string | null },
|
|
256
|
+
source: RuntimeSkillDiscoverySource | "all",
|
|
257
|
+
policy: SkillsSettings | undefined,
|
|
258
|
+
): Promise<ConventionImportScan[]> {
|
|
259
|
+
const scans: ConventionImportScan[] = [];
|
|
260
|
+
const jobs: Array<Promise<void>> = [];
|
|
261
|
+
if ((source === "all" || source === "project") && sourceEnabled("project", policy)) {
|
|
262
|
+
jobs.push(
|
|
263
|
+
scanClaudeProjectSkills(ctx).then(result => {
|
|
264
|
+
scans.push({ host: "Claude Code", dir: ".claude/skills", skills: result.items });
|
|
265
|
+
}),
|
|
266
|
+
scanCodexProjectSkills(ctx).then(result => {
|
|
267
|
+
scans.push({ host: "Codex", dir: ".codex/skills", skills: result.items });
|
|
268
|
+
}),
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
if ((source === "all" || source === "user") && sourceEnabled("user", policy)) {
|
|
272
|
+
jobs.push(
|
|
273
|
+
scanClaudeUserSkills(ctx).then(result => {
|
|
274
|
+
scans.push({ host: "Claude Code", dir: "~/.claude/skills", skills: result.items });
|
|
275
|
+
}),
|
|
276
|
+
scanCodexUserSkills(ctx).then(result => {
|
|
277
|
+
scans.push({ host: "Codex", dir: "~/.codex/skills", skills: result.items });
|
|
278
|
+
}),
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
await Promise.all(jobs);
|
|
282
|
+
return scans;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** Diagnose convention import candidates not already advertised as native candidates. */
|
|
286
|
+
function reportConventionImportCandidates(
|
|
287
|
+
scans: ConventionImportScan[],
|
|
288
|
+
seenNames: Set<string>,
|
|
289
|
+
diagnostics: string[],
|
|
290
|
+
): void {
|
|
291
|
+
for (const scan of scans.sort((a, b) => a.host.localeCompare(b.host) || a.dir.localeCompare(b.dir))) {
|
|
292
|
+
for (const skill of scan.skills) {
|
|
293
|
+
if (seenNames.has(skill.name)) continue;
|
|
294
|
+
seenNames.add(skill.name);
|
|
295
|
+
pushDiagnostic(
|
|
296
|
+
diagnostics,
|
|
297
|
+
`skill "${skill.name}" found at ${skill.path} (${scan.host} convention): import sources are not loaded directly; copy it into a trusted .gjc/skills directory to enable it, e.g. mkdir -p .gjc/skills/${skill.name} && cp ${skill.path} .gjc/skills/${skill.name}/SKILL.md`,
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Explain an empty result that is caused by disabled discovery config rather
|
|
305
|
+
* than by an actually empty skill catalog. Uses the user-facing trust
|
|
306
|
+
* settings; the legacy `skills.enablePiUser` / `skills.enablePiProject`
|
|
307
|
+
* aliases map onto the same effective values. Shared by the skill_discovery
|
|
308
|
+
* tool and `gjc skills discover`.
|
|
309
|
+
*/
|
|
310
|
+
export function describeDisabledSkillScopes(
|
|
311
|
+
source: RuntimeSkillDiscoverySource | "all",
|
|
312
|
+
policy: SkillsSettings | undefined,
|
|
313
|
+
): string | undefined {
|
|
314
|
+
if (policy?.enabled !== true) {
|
|
315
|
+
return "Runtime skill discovery is disabled: `skills.enabled` is false, so no skill directories were searched. Enable it with `gjc config set skills.enabled true`.";
|
|
316
|
+
}
|
|
317
|
+
const skipped: string[] = [];
|
|
318
|
+
const commands: string[] = [];
|
|
319
|
+
if ((source === "all" || source === "project") && !resolveSkillScopeTrust(policy, "project")) {
|
|
320
|
+
skipped.push("project (`skills.trustProjectSkills` is false)");
|
|
321
|
+
commands.push("`gjc config set skills.trustProjectSkills true`");
|
|
322
|
+
}
|
|
323
|
+
if ((source === "all" || source === "user") && !resolveSkillScopeTrust(policy, "user")) {
|
|
324
|
+
skipped.push("user (`skills.trustUserSkills` is false)");
|
|
325
|
+
commands.push("`gjc config set skills.trustUserSkills true`");
|
|
326
|
+
}
|
|
327
|
+
if (skipped.length === 0) return undefined;
|
|
328
|
+
return `Skill discovery skipped disabled scope(s): ${skipped.join(", ")}. Enable them with ${commands.join(" and ")}.`;
|
|
329
|
+
}
|
|
330
|
+
|
|
152
331
|
export async function discoverRuntimeSkills(
|
|
153
332
|
options: DiscoverRuntimeSkillsOptions,
|
|
154
|
-
): Promise<
|
|
333
|
+
): Promise<RuntimeSkillDiscoveryResult> {
|
|
155
334
|
const home = options.home ?? getRuntimeHome();
|
|
156
335
|
const source = options.source ?? "all";
|
|
157
336
|
const policy = options.policy;
|
|
158
|
-
const
|
|
159
|
-
const
|
|
160
|
-
const
|
|
337
|
+
const diagnostics: string[] = [];
|
|
338
|
+
const scanJobs: Array<Promise<ScanJobResult>> = [];
|
|
339
|
+
const projectDirs = await getProjectSkillDirs(options.cwd, home);
|
|
340
|
+
const projectContext = { cwd: options.cwd, home, repoRoot: projectDirs.repoRoot };
|
|
161
341
|
if ((source === "all" || source === "project") && sourceEnabled("project", policy)) {
|
|
162
|
-
for (const dir of
|
|
163
|
-
scanJobs.push(
|
|
164
|
-
scanSkillsFromDir(projectContext, {
|
|
165
|
-
dir,
|
|
166
|
-
providerId: "runtime",
|
|
167
|
-
level: "project",
|
|
168
|
-
requireDescription: true,
|
|
169
|
-
}).then(result => result.items.map(skill => ({ skill, source: "project" as const }))),
|
|
170
|
-
);
|
|
342
|
+
for (const { dir, label } of projectDirs.scans) {
|
|
343
|
+
scanJobs.push(scanProjectOrUserDir(projectContext, dir, "project", label, "project"));
|
|
171
344
|
}
|
|
172
345
|
}
|
|
173
346
|
if ((source === "all" || source === "user") && sourceEnabled("user", policy)) {
|
|
174
347
|
for (const dir of getUserSkillDirs(home)) {
|
|
175
348
|
scanJobs.push(
|
|
176
|
-
|
|
177
|
-
{ cwd: options.cwd, home, repoRoot: home },
|
|
178
|
-
{ dir, providerId: "runtime", level: "user", requireDescription: true },
|
|
179
|
-
).then(result => result.items.map(skill => ({ skill, source: "user" as const }))),
|
|
349
|
+
scanProjectOrUserDir({ cwd: options.cwd, home, repoRoot: home }, dir, "user", `user ${dir}`, "user"),
|
|
180
350
|
);
|
|
181
351
|
}
|
|
182
352
|
}
|
|
183
353
|
|
|
354
|
+
const settled = await Promise.all(scanJobs.map(job => job.catch(error => ({ error: String(error), label: "" }))));
|
|
355
|
+
|
|
184
356
|
const seenNames = new Set<string>();
|
|
185
357
|
const seenPaths = new Set<string>();
|
|
186
358
|
const candidates: RuntimeSkillDiscoveryCandidate[] = [];
|
|
187
|
-
for (const entry of
|
|
188
|
-
if (
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
359
|
+
for (const entry of settled) {
|
|
360
|
+
if ("error" in entry) {
|
|
361
|
+
pushDiagnostic(diagnostics, `skill scan failed: ${entry.error}`);
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
if (entry.label) {
|
|
365
|
+
for (const warning of entry.warnings) {
|
|
366
|
+
pushDiagnostic(diagnostics, `${entry.label}: ${warning}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
for (const item of entry.items) {
|
|
370
|
+
if (!isAllowedByPolicy(item.skill, policy, diagnostics)) continue;
|
|
371
|
+
const realPath = await realPathOrSelf(item.skill.path);
|
|
372
|
+
if (seenPaths.has(realPath) || seenNames.has(item.skill.name)) {
|
|
373
|
+
pushDiagnostic(
|
|
374
|
+
diagnostics,
|
|
375
|
+
`skill "${item.skill.name}" already resolved from a higher-precedence location; ignoring ${item.skill.path}`,
|
|
376
|
+
);
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
seenPaths.add(realPath);
|
|
380
|
+
seenNames.add(item.skill.name);
|
|
381
|
+
|
|
382
|
+
const candidate: RuntimeSkillDiscoveryCandidate = {
|
|
383
|
+
name: item.skill.name,
|
|
384
|
+
description:
|
|
385
|
+
typeof item.skill.frontmatter?.description === "string" ? item.skill.frontmatter.description : "",
|
|
386
|
+
source: item.source,
|
|
387
|
+
path: item.skill.path,
|
|
388
|
+
useWhen: getUseWhen(item.skill),
|
|
389
|
+
};
|
|
390
|
+
if (matchesQuery(candidate, options.query ?? "")) candidates.push(candidate);
|
|
391
|
+
}
|
|
203
392
|
}
|
|
204
393
|
candidates.sort((a, b) => compareSkillOrder(a.name, a.path, b.name, b.path));
|
|
205
|
-
|
|
394
|
+
reportConventionImportCandidates(
|
|
395
|
+
await collectConventionImportCandidates(projectContext, source, policy),
|
|
396
|
+
seenNames,
|
|
397
|
+
diagnostics,
|
|
398
|
+
);
|
|
399
|
+
return {
|
|
400
|
+
candidates: candidates.slice(0, normalizeLimit(options.limit)),
|
|
401
|
+
diagnostics: { messages: diagnostics },
|
|
402
|
+
};
|
|
206
403
|
}
|
|
207
404
|
|
|
208
405
|
export async function findRuntimeSkillByName(
|
|
@@ -214,13 +411,13 @@ export async function findRuntimeSkillByName(
|
|
|
214
411
|
const normalized = name.trim();
|
|
215
412
|
if (!normalized) return undefined;
|
|
216
413
|
const scanJobs: Array<Promise<{ skill: CapabilitySkill; source: RuntimeSkillDiscoverySource }[]>> = [];
|
|
217
|
-
const
|
|
218
|
-
const projectContext = { cwd, home, repoRoot:
|
|
414
|
+
const projectDirs = await getProjectSkillDirs(cwd, home);
|
|
415
|
+
const projectContext = { cwd, home, repoRoot: projectDirs.repoRoot };
|
|
219
416
|
if (sourceEnabled("project", policy)) {
|
|
220
417
|
scanJobs.push(
|
|
221
|
-
...
|
|
418
|
+
...projectDirs.scans.map(scan =>
|
|
222
419
|
scanSkillsFromDir(projectContext, {
|
|
223
|
-
dir,
|
|
420
|
+
dir: scan.dir,
|
|
224
421
|
providerId: "runtime",
|
|
225
422
|
level: "project",
|
|
226
423
|
requireDescription: true,
|
|
@@ -239,7 +436,7 @@ export async function findRuntimeSkillByName(
|
|
|
239
436
|
}
|
|
240
437
|
}
|
|
241
438
|
for (const entry of (await Promise.all(scanJobs)).flat()) {
|
|
242
|
-
if (entry.skill.name === normalized && isAllowedByPolicy(entry.skill,
|
|
439
|
+
if (entry.skill.name === normalized && isAllowedByPolicy(entry.skill, policy, [])) {
|
|
243
440
|
return toRuntimeSkill(entry.skill, entry.source);
|
|
244
441
|
}
|
|
245
442
|
}
|